Title: [240537] trunk
Revision
240537
Author
jer.no...@apple.com
Date
2019-01-25 17:46:50 -0800 (Fri, 25 Jan 2019)

Log Message

<video> elements not in the DOM should be allowed to AirPlay
https://bugs.webkit.org/show_bug.cgi?id=193837
Source/WebCore:

<rdar://42559491>

Reviewed by Eric Carlson.

Test: media/airplay-allows-buffering.html

Some websites will switch between <video> elements backed by MSE to one backed by
a media file in order to implement an AirPlay control. But when a <video> element is
removed from the DOM and paused, further buffering is blocked. For some ports (namely
Cocoa ones), this keeps AirPlay from engaging. Relax this buffering restriction for
elements who have been asked to play wirelessly, but whose wireless playback has not
started yet.

* html/MediaElementSession.cpp:
(WebCore::MediaElementSession::dataBufferingPermitted const):
(WebCore::MediaElementSession::setShouldPlayToPlaybackTarget):

LayoutTests:

Reviewed by Eric Carlson.

* media/airplay-allows-buffering-expected.txt: Added.
* media/airplay-allows-buffering.html: Added.
* platform/ios/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (240536 => 240537)


--- trunk/LayoutTests/ChangeLog	2019-01-26 01:40:24 UTC (rev 240536)
+++ trunk/LayoutTests/ChangeLog	2019-01-26 01:46:50 UTC (rev 240537)
@@ -1,3 +1,14 @@
+2019-01-25  Jer Noble  <jer.no...@apple.com>
+
+        <video> elements not in the DOM should be allowed to AirPlay
+        https://bugs.webkit.org/show_bug.cgi?id=193837
+
+        Reviewed by Eric Carlson.
+
+        * media/airplay-allows-buffering-expected.txt: Added.
+        * media/airplay-allows-buffering.html: Added.
+        * platform/ios/TestExpectations:
+
 2019-01-25  Simon Fraser  <simon.fra...@apple.com>
 
         Fix failing scrollingcoordinator/scrolling-tree/remove-scrolling-role.html

Added: trunk/LayoutTests/media/airplay-allows-buffering-expected.txt (0 => 240537)


--- trunk/LayoutTests/media/airplay-allows-buffering-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/airplay-allows-buffering-expected.txt	2019-01-26 01:46:50 UTC (rev 240537)
@@ -0,0 +1,13 @@
+EVENT(load)
+RUN(internals.setMockMediaPlaybackTargetPickerEnabled(true))
+RUN(video.src = "" 'content/test'))
+EVENT(loadedmetadata)
+RUN(video.parentNode.removeChild(video))
+EXPECTED (internals.elementShouldBufferData(video) == 'false') OK
+RUN(video.webkitShowPlaybackTargetPicker())
+RUN(internals.setMockMediaPlaybackTargetPickerState('Sleepy TV', 'DeviceAvailable'))
+EVENT(webkitcurrentplaybacktargetiswirelesschanged)
+EXPECTED (video.webkitCurrentPlaybackTargetIsWireless == 'true') OK
+EXPECTED (internals.elementShouldBufferData(video) == 'true') OK
+END OF TEST
+

Added: trunk/LayoutTests/media/airplay-allows-buffering.html (0 => 240537)


--- trunk/LayoutTests/media/airplay-allows-buffering.html	                        (rev 0)
+++ trunk/LayoutTests/media/airplay-allows-buffering.html	2019-01-26 01:46:50 UTC (rev 240537)
@@ -0,0 +1,37 @@
+<!DOCTYPE html><!-- webkit-test-runner [ enableModernMediaControls=false ] -->
+<html>
+<head>
+    <title>airplay-allows-buffering</title>
+    <script src=""
+    <script src=""
+    <script>
+
+    waitFor(window, 'load').then(async event => { 
+        findMediaElement();
+
+        run('internals.setMockMediaPlaybackTargetPickerEnabled(true)');
+
+        run(`video.src = "" 'content/test')`);
+        await waitFor(video, 'loadedmetadata');
+
+        run(`video.parentNode.removeChild(video)`);
+        await testExpectedEventually('internals.elementShouldBufferData(video)', false);
+
+        run(`video.webkitShowPlaybackTargetPicker()`);
+        await sleepFor(100);
+
+        run(`internals.setMockMediaPlaybackTargetPickerState('Sleepy TV', 'DeviceAvailable')`);
+        await waitFor(video, 'webkitcurrentplaybacktargetiswirelesschanged');
+        testExpected('video.webkitCurrentPlaybackTargetIsWireless', true);
+
+        await testExpectedEventually('internals.elementShouldBufferData(video)', true);
+
+        endTest();
+    });
+
+    </script>
+</head>
+<body>
+    <video controls preload='metadata'></video>
+</body>
+</html>

Modified: trunk/LayoutTests/platform/ios/TestExpectations (240536 => 240537)


--- trunk/LayoutTests/platform/ios/TestExpectations	2019-01-26 01:40:24 UTC (rev 240536)
+++ trunk/LayoutTests/platform/ios/TestExpectations	2019-01-26 01:46:50 UTC (rev 240537)
@@ -2457,6 +2457,7 @@
 platform/ios/media/video-interruption-suspendunderlock.html [ Skip ]
 
 media/accessibility-closed-captions-has-aria-owns.html
+media/airplay-allows-buffering.html
 media/airplay-autoplay.html
 media/airplay-target-availability.html
 media/audio-delete-while-slider-thumb-clicked.html

Modified: trunk/Source/WebCore/ChangeLog (240536 => 240537)


--- trunk/Source/WebCore/ChangeLog	2019-01-26 01:40:24 UTC (rev 240536)
+++ trunk/Source/WebCore/ChangeLog	2019-01-26 01:46:50 UTC (rev 240537)
@@ -1,3 +1,24 @@
+2019-01-25  Jer Noble  <jer.no...@apple.com>
+
+        <video> elements not in the DOM should be allowed to AirPlay
+        https://bugs.webkit.org/show_bug.cgi?id=193837
+        <rdar://42559491>
+
+        Reviewed by Eric Carlson.
+
+        Test: media/airplay-allows-buffering.html
+
+        Some websites will switch between <video> elements backed by MSE to one backed by
+        a media file in order to implement an AirPlay control. But when a <video> element is
+        removed from the DOM and paused, further buffering is blocked. For some ports (namely
+        Cocoa ones), this keeps AirPlay from engaging. Relax this buffering restriction for
+        elements who have been asked to play wirelessly, but whose wireless playback has not
+        started yet.
+
+        * html/MediaElementSession.cpp:
+        (WebCore::MediaElementSession::dataBufferingPermitted const):
+        (WebCore::MediaElementSession::setShouldPlayToPlaybackTarget):
+
 2019-01-25  Keith Rollin  <krol...@apple.com>
 
         Update Xcode projects with "Check .xcfilelists" build phase

Modified: trunk/Source/WebCore/html/MediaElementSession.cpp (240536 => 240537)


--- trunk/Source/WebCore/html/MediaElementSession.cpp	2019-01-26 01:40:24 UTC (rev 240536)
+++ trunk/Source/WebCore/html/MediaElementSession.cpp	2019-01-26 01:46:50 UTC (rev 240537)
@@ -385,6 +385,11 @@
     if (shouldOverrideBackgroundLoadingRestriction())
         return true;
 
+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+    if (m_shouldPlayToPlaybackTarget)
+        return true;
+#endif
+
     if (m_elementIsHiddenUntilVisibleInViewport || m_elementIsHiddenBecauseItWasRemovedFromDOM || m_element.elementIsHidden())
         return false;
 
@@ -683,6 +688,7 @@
 {
     INFO_LOG(LOGIDENTIFIER, shouldPlay);
     m_shouldPlayToPlaybackTarget = shouldPlay;
+    updateClientDataBuffering();
     client().setShouldPlayToPlaybackTarget(shouldPlay);
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to