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