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 {