[mediacapture-screen-share] mute and unmute events of MediaStreamTrack should not be fired based on user non-action (#141)

guest271314 has just created a new issue for https://github.com/w3c/mediacapture-screen-share:

== mute and unmute events of MediaStreamTrack should not be fired based on user non-action ==
The specification uses the term "user activation" exactly once

> When the getDisplayMedia() method is called, the User Agent MUST run the following steps:
> 
> If the method call is not triggered by user activation, return a promise rejected with a DOMException object whose name attribute has the value InvalidStateError.

The terms "user action" and "user gesture" are not included in the language of the specification.

Chromium 85 appears to fire `mute` and `unmute` events on `MediaStreamTrack` from `getDisplayMedia()` directly corresponding to user non-action, for example, not moving the cursor on the captured screen, or user action, moving the cursor on the captured screen.

```
      onclick = async e => {
        var input,
          recorder,
          audioTrack,
          videoTrack,
          stream,
          mediaStream,
          chunks = [];

        onclick = null;

        stream = await navigator.mediaDevices.getDisplayMedia({ video: true });

        [videoTrack] = stream.getVideoTracks();
        videoTrack.onended = videoTrack.onmuted = e => console.log(e);
        await videoTrack.applyConstraints({
          resizeMode: 'none',
          cursor: 'never',
          width: window.innerWidth * 0.7,
          height: window.innerHeight,
        });
        video = document.createElement('video');
        video.currentTime = 0;
        video.autoplay = true;
        videoTrack.onunmute = videoTrack.onmute = e => console.log(e);

        video.ontimeupdate = _ => {
          console.log(video.currentTime, 60 * 7 + 60 * 0.5);
          if (video.currentTime > 60 * 7 + 60 * 0.5) {
            recorder.stop();
            videoTrack.stop();
          }
        };
        video.onplay = _ => {
          recorder = new MediaRecorder(stream);
          recorder.start(0);
          recorder.onstop = async e => {
            console.log(
              URL.createObjectURL(new Blob(chunks, { type: 'video/webm' }))
            );
          };
          recorder.ondataavailable = e => {
            if (e.data.size > 0) chunks.push(e.data);
          };
        };
        video.srcObject = stream;
      };
```

The result is a series of unintended consequences impacting other API's, including media file produced by `MediaRecorder`, `timeupdate` event of `HTMLMediaElement` not firing every 50 to 250ms per HTML Standard. The resulting bugs that have  observed so far downstream https://bugs.chromium.org/p/chromium/issues/detail?id=1099280.

Kindly include language in the specification which prohibits implementations from firing `mute` and `unmute` events based on user non-action or user action. 

Please view or discuss this issue at https://github.com/w3c/mediacapture-screen-share/issues/141 using your GitHub account

Received on Thursday, 25 June 2020 14:49:50 UTC