Title: [215444] trunk
Revision
215444
Author
commit-qu...@webkit.org
Date
2017-04-17 17:43:49 -0700 (Mon, 17 Apr 2017)

Log Message

Enable video autoplay when getUserMedia is on
https://bugs.webkit.org/show_bug.cgi?id=170919

Patch by Youenn Fablet <you...@apple.com> on 2017-04-17
Reviewed by Geoffrey Garen.

Source/WebCore:

Test: webrtc/video-autoplay.html

* dom/Document.h:
(WebCore::Document::isCapturing):
* html/HTMLMediaElement.h:
(WebCore::HTMLMediaElement::hasMediaStreamSrcObject):
* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::playbackPermitted): Allowing playback if getUserMedia is capturing audio or video
on the document and if element is rendering MediaStream based content.
* page/MediaProducer.h:
(WebCore::MediaProducer::isCapturing):

LayoutTests:

* webrtc/video-autoplay-expected.txt: Added.
* webrtc/video-autoplay.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (215443 => 215444)


--- trunk/LayoutTests/ChangeLog	2017-04-18 00:14:21 UTC (rev 215443)
+++ trunk/LayoutTests/ChangeLog	2017-04-18 00:43:49 UTC (rev 215444)
@@ -1,3 +1,13 @@
+2017-04-17  Youenn Fablet  <you...@apple.com>
+
+        Enable video autoplay when getUserMedia is on
+        https://bugs.webkit.org/show_bug.cgi?id=170919
+
+        Reviewed by Geoffrey Garen.
+
+        * webrtc/video-autoplay-expected.txt: Added.
+        * webrtc/video-autoplay.html: Added.
+
 2017-04-17  Ryan Haddad  <ryanhad...@apple.com>
 
         Skip webrtc/multi-video.html.

Added: trunk/LayoutTests/webrtc/video-autoplay-expected.txt (0 => 215444)


--- trunk/LayoutTests/webrtc/video-autoplay-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/webrtc/video-autoplay-expected.txt	2017-04-18 00:43:49 UTC (rev 215444)
@@ -0,0 +1,7 @@
+
+
+PASS Ensuring autoplay does not work on regular video elements 
+PASS Ensuring autoplay does not work on regular video elements when getUserMedia is on 
+PASS Local media stream autoplay 
+PASS Remote media stream autoplay 
+

Added: trunk/LayoutTests/webrtc/video-autoplay.html (0 => 215444)


--- trunk/LayoutTests/webrtc/video-autoplay.html	                        (rev 0)
+++ trunk/LayoutTests/webrtc/video-autoplay.html	2017-04-18 00:43:49 UTC (rev 215444)
@@ -0,0 +1,68 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <title>Testing basic video exchange from offerer to receiver</title>
+        <script src=""
+        <script src=""
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="video" autoplay></video>
+        <script src =""
+        <script>
+video = document.getElementById("video");
+
+if (window.internals)
+    internals.setMediaElementRestrictions(video, "RequireUserGestureForVideoRateChange");
+if (window.testRunner)
+    testRunner.setUserMediaPermission(true);
+
+promise_test((test) => {
+    findMediaElement();
+    video.src = "" "content/test");
+    return video.play().then(() => assert_unreached(), (e) => { assert_equals(e.name, 'NotAllowedError')});
+}, "Ensuring autoplay does not work on regular video elements")
+
+promise_test((test) => {
+    return navigator.mediaDevices.getUserMedia({audio: true, video: true}).then((stream) => {
+        findMediaElement();
+        video.src = "" "content/test");
+        return video.play().then(() => assert_unreached(), (e) => { assert_equals(e.name, 'NotAllowedError')});
+    });
+}, "Ensuring autoplay does not work on regular video elements when getUserMedia is on");
+
+promise_test((test) => {
+    return navigator.mediaDevices.getUserMedia({audio: true, video: true}).then((stream) => {
+        video.srcObject = stream;
+        return waitFor(10);
+    }).then(() => {
+        return video.play();
+    });
+}, "Local media stream autoplay");
+
+promise_test((test) => {
+    return navigator.mediaDevices.getUserMedia({audio: true, video: true}).then((stream) => {
+        return new Promise((resolve, reject) => {
+            createConnections((firstConnection) => {
+                firstConnection.addTrack(stream.getVideoTracks()[0], stream);
+                firstConnection.addTrack(stream.getAudioTracks()[0], stream);
+            }, (secondConnection) => {
+                var count = 0;
+                secondConnection._ontrack_ = (trackEvent) => {
+                    if (++count == 2)
+                        resolve(trackEvent.streams[0]);
+                };
+            });
+            setTimeout(() => reject("Test timed out"), 5000);
+        });
+    }).then((stream) => {
+        video.srcObject = stream;
+        return video.play();
+    });
+}, "Remote media stream autoplay");
+
+        </script>
+    </body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (215443 => 215444)


--- trunk/Source/WebCore/ChangeLog	2017-04-18 00:14:21 UTC (rev 215443)
+++ trunk/Source/WebCore/ChangeLog	2017-04-18 00:43:49 UTC (rev 215444)
@@ -1,3 +1,22 @@
+2017-04-17  Youenn Fablet  <you...@apple.com>
+
+        Enable video autoplay when getUserMedia is on
+        https://bugs.webkit.org/show_bug.cgi?id=170919
+
+        Reviewed by Geoffrey Garen.
+
+        Test: webrtc/video-autoplay.html
+
+        * dom/Document.h:
+        (WebCore::Document::isCapturing):
+        * html/HTMLMediaElement.h:
+        (WebCore::HTMLMediaElement::hasMediaStreamSrcObject):
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::playbackPermitted): Allowing playback if getUserMedia is capturing audio or video
+        on the document and if element is rendering MediaStream based content.
+        * page/MediaProducer.h:
+        (WebCore::MediaProducer::isCapturing):
+
 2017-04-17  Alex Christensen  <achristen...@webkit.org>
 
         Fix CMake build.

Modified: trunk/Source/WebCore/dom/Document.h (215443 => 215444)


--- trunk/Source/WebCore/dom/Document.h	2017-04-18 00:14:21 UTC (rev 215443)
+++ trunk/Source/WebCore/dom/Document.h	2017-04-18 00:43:49 UTC (rev 215444)
@@ -1248,6 +1248,7 @@
     WEBCORE_EXPORT void addAudioProducer(MediaProducer*);
     WEBCORE_EXPORT void removeAudioProducer(MediaProducer*);
     MediaProducer::MediaStateFlags mediaState() const { return m_mediaState; }
+    bool isCapturing() const { return MediaProducer::isCapturing(m_mediaState); }
     WEBCORE_EXPORT void updateIsPlayingMedia(uint64_t = HTMLMediaElementInvalidID);
     void pageMutedStateDidChange();
     WeakPtr<Document> createWeakPtr() { return m_weakFactory.createWeakPtr(); }

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (215443 => 215444)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2017-04-18 00:14:21 UTC (rev 215443)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2017-04-18 00:43:49 UTC (rev 215444)
@@ -505,6 +505,10 @@
 
     WEBCORE_EXPORT const MediaResourceLoader* lastMediaResourceLoaderForTesting() const;
 
+#if ENABLE(MEDIA_STREAM)
+    bool hasMediaStreamSrcObject() const { return !!m_mediaStreamSrcObject; }
+#endif
+
 protected:
     HTMLMediaElement(const QualifiedName&, Document&, bool createdByParser);
     virtual ~HTMLMediaElement();

Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (215443 => 215444)


--- trunk/Source/WebCore/html/MediaElementSession.cpp	2017-04-18 00:14:21 UTC (rev 215443)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp	2017-04-18 00:43:49 UTC (rev 215444)
@@ -151,10 +151,10 @@
 SuccessOr<MediaPlaybackDenialReason> MediaElementSession::playbackPermitted(const HTMLMediaElement& element) const
 {
     if (element.document().isMediaDocument() && !element.document().ownerElement())
-        return SuccessOr<MediaPlaybackDenialReason>();
+        return { };
 
     if (pageExplicitlyAllowsElementToAutoplayInline(element))
-        return SuccessOr<MediaPlaybackDenialReason>();
+        return { };
 
     if (requiresFullscreenForVideoPlayback(element) && !fullscreenPermitted(element)) {
         LOG(Media, "MediaElementSession::playbackPermitted - returning FALSE because of fullscreen restriction");
@@ -162,8 +162,11 @@
     }
 
     if (m_restrictions & OverrideUserGestureRequirementForMainContent && updateIsMainContent())
-        return SuccessOr<MediaPlaybackDenialReason>();
+        return { };
 
+    if (element.document().isCapturing() && element.hasMediaStreamSrcObject())
+        return { };
+
     if (m_restrictions & RequireUserGestureForVideoRateChange && element.isVideo() && !ScriptController::processingUserGestureForMedia()) {
         LOG(Media, "MediaElementSession::playbackPermitted - returning FALSE because of video rate change restriction");
         return MediaPlaybackDenialReason::UserGestureRequired;
@@ -179,7 +182,7 @@
         return MediaPlaybackDenialReason::UserGestureRequired;
     }
 
-    return SuccessOr<MediaPlaybackDenialReason>();
+    return { };
 }
 
 bool MediaElementSession::autoplayPermitted() const

Modified: trunk/Source/WebCore/page/MediaProducer.h (215443 => 215444)


--- trunk/Source/WebCore/page/MediaProducer.h	2017-04-18 00:14:21 UTC (rev 215443)
+++ trunk/Source/WebCore/page/MediaProducer.h	2017-04-18 00:43:49 UTC (rev 215444)
@@ -49,6 +49,8 @@
     };
     typedef unsigned MediaStateFlags;
 
+    static bool isCapturing(MediaStateFlags state) { return (state & HasActiveAudioCaptureDevice) || (state & HasActiveVideoCaptureDevice) || (state & HasMutedAudioCaptureDevice) || (state & HasMutedVideoCaptureDevice); }
+
     virtual MediaStateFlags mediaState() const = 0;
 
     enum MutedState {
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to