Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect Firefox support for screen sharing

Firefox, since version 52, will support screen sharing via:

navigator.mediaDevices.getUserMedia({ video: { mediaSource: 'screen' }}) 
  .then(stream => { ... });

Check out this test page to see it in action.

I would like to know whether there is a way to detect whether a browser supports { mediaSource: 'screen' }?

I would like to only give the option to share the screen with users that have the ability to share. So I'd like to be able to feature detect this.

like image 801
philnash Avatar asked Sep 07 '17 16:09

philnash


1 Answers

Updated answer: getDisplayMedia is now the correct API for screen-sharing, with support in all major browsers for a couple of years now (in Firefox since 66+). So the correct API is:

await navigator.mediaDevices.getUserMedia({video: true});

And the correct way to feature detect it is:

console.log(navigator.mediaDevices &&
            "getDisplayMedia" in navigator.mediaDevices);

This is false on mobile where support is lacking (Firefox for Android & Chrome for Android).

It's also false over insecure http (non-https) connections where navigator.mediaDevices itself is undefined, an object considered a "powerful feature".

Answer for really old Firefox < 66:

⚠️ Do not rely on this answer in newer browsers, as this constraint is going away!

a way to detect whether a browser supports { mediaSource: 'screen' }?

The pedantic answer is the following will tell you if the mediaSource constraint is supported:

console.log(!!navigator.mediaDevices.getSupportedConstraints().mediaSource);

Unfortunately, mediaSource is non-standard, and only implemented in Firefox. Firefox is as of this writing the only browser to enable screen-sharing without a plugin.

Chrome has a different non-standard API using chromeMediaSource available as a plug-in, using an older constraints syntax, but it (rightly) does not appear in the new getSupportedConstraints.

It's a bit of a mess still. Long-term browsers may end up implementing getDisplayMedia instead.

like image 188
jib Avatar answered Sep 30 '22 08:09

jib