Title: [201522] trunk
Revision
201522
Author
eric.carl...@apple.com
Date
2016-05-31 13:47:53 -0700 (Tue, 31 May 2016)

Log Message

[Mac] AirPlay route is sometimes reset when changing video.src
https://bugs.webkit.org/show_bug.cgi?id=158226
<rdar://problem/24197592>

Reviewed by Jer Noble.

Source/WebCore:

Test: media/airplay-autoplay.html

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::webkitShowPlaybackTargetPicker): Remove the gesture requirement
  if currently processing a user gesture.
(WebCore::HTMLMediaElement::dispatchEvent): Set m_failedToPlayToWirelessTarget to false when
  dispatching webkitcurrentplaybacktargetiswirelesschanged so an element can succeed after failing.

LayoutTests:

* media/airplay-autoplay-expected.txt: Added.
* media/airplay-autoplay.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (201521 => 201522)


--- trunk/LayoutTests/ChangeLog	2016-05-31 20:32:21 UTC (rev 201521)
+++ trunk/LayoutTests/ChangeLog	2016-05-31 20:47:53 UTC (rev 201522)
@@ -1,3 +1,14 @@
+2016-05-31  Eric Carlson  <eric.carl...@apple.com>
+
+        [Mac] AirPlay route is sometimes reset when changing video.src
+        https://bugs.webkit.org/show_bug.cgi?id=158226
+        <rdar://problem/24197592>
+
+        Reviewed by Jer Noble.
+
+        * media/airplay-autoplay-expected.txt: Added.
+        * media/airplay-autoplay.html: Added.
+
 2016-05-31  Dave Hyatt  <hy...@apple.com>
 
         REGRESSION (r189567): Elements with aspect ratios not handled correctly inside flexbox.

Added: trunk/LayoutTests/media/airplay-autoplay-expected.txt (0 => 201522)


--- trunk/LayoutTests/media/airplay-autoplay-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/airplay-autoplay-expected.txt	2016-05-31 20:47:53 UTC (rev 201522)
@@ -0,0 +1,22 @@
+
+** set video.src
+RUN(video.src = "" 'content/test'))
+
+EVENT(canplaythrough)
+
+** simulate choosing a device from the menu
+RUN(video.webkitShowPlaybackTargetPicker())
+EVENT(webkitcurrentplaybacktargetiswirelesschanged)
+
+** start playing
+RUN(video.play())
+
+EVENT(ended)
+
+** reset video source
+RUN(video.src = "" 'content/test'))
+RUN(video.play())
+
+EVENT(webkitcurrentplaybacktargetiswirelesschanged)
+END OF TEST
+

Added: trunk/LayoutTests/media/airplay-autoplay.html (0 => 201522)


--- trunk/LayoutTests/media/airplay-autoplay.html	                        (rev 0)
+++ trunk/LayoutTests/media/airplay-autoplay.html	2016-05-31 20:47:53 UTC (rev 201522)
@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>AirPlay target should persist across src change</title>
+    <script src=""
+    <script src=""
+    <script>
+
+    var phase = 'video-1';
+
+    if (window.internals) {
+        internals.setMockMediaPlaybackTargetPickerEnabled(true);
+        internals.setMockMediaPlaybackTargetPickerState('', 'Unknown');
+    }
+
+    function start() 
+    {
+        findMediaElement();
+
+        consoleWrite('** set video.src');
+        run(`video.src = "" 'content/test')`);
+        video.addEventListener('webkitcurrentplaybacktargetiswirelesschanged', currentTargetChanged, true);
+        waitForEventOnce('canplaythrough', canplaythrough);
+        waitForEventOnce('ended', ended);
+        consoleWrite('');
+    }
+
+    function canplaythrough()
+    {
+        consoleWrite('<br>** simulate choosing a device from the menu');
+        runWithKeyDown(function() {
+            run(`video.webkitShowPlaybackTargetPicker()`);
+            setTimeout(function() {
+                if (window.internals) {
+                    internals.setMockMediaPlaybackTargetPickerEnabled(true);
+                    internals.setMockMediaPlaybackTargetPickerState('Sleepy TV', 'DeviceAvailable');
+                }
+            }, 100);
+        });
+        video.currentTime = video.duration - 1;
+    }
+
+    function currentTargetChanged(ev)
+    {
+        if (!video.webkitCurrentPlaybackTargetIsWireless)
+            return;
+
+        consoleWrite(`EVENT(${ev.type})`);
+        switch (phase) {
+        case 'video-1':
+            phase = 'video-2';
+            consoleWrite('<br>** start playing');
+            run(`video.play()`);
+            consoleWrite('');
+            break;
+        case 'video-2':
+            endTest();
+            break;
+        }
+    }
+
+    function ended()
+    {
+        consoleWrite('<br>** reset video source');
+        run(`video.src = "" 'content/test')`);
+        run(`video.play()`);
+        consoleWrite('');
+    }
+
+    </script>
+</head>
+<body _onload_="start()">
+    <video controls></video>
+</body>
+</html>

Modified: trunk/LayoutTests/platform/mac/TestExpectations (201521 => 201522)


--- trunk/LayoutTests/platform/mac/TestExpectations	2016-05-31 20:32:21 UTC (rev 201521)
+++ trunk/LayoutTests/platform/mac/TestExpectations	2016-05-31 20:47:53 UTC (rev 201522)
@@ -1293,6 +1293,7 @@
 # WIRELESS_PLAYBACK_TARGET not enabled on Yosemite.
 [ Yosemite ] media/airplay-target-availability.html
 [ Yosemite ] media/controls/airplay-picker.html
+[ Yosemite ] media/airplay-autoplay.html
 
 webkit.org/b/153086 sputnik/Conformance/15_Native_Objects/15.1_The_Global_Object/15.1.3/15.1.3.3_encodeURI/S15.1.3.3_A2.4_T2.html [ Pass Crash ]
 

Modified: trunk/Source/WebCore/ChangeLog (201521 => 201522)


--- trunk/Source/WebCore/ChangeLog	2016-05-31 20:32:21 UTC (rev 201521)
+++ trunk/Source/WebCore/ChangeLog	2016-05-31 20:47:53 UTC (rev 201522)
@@ -1,3 +1,19 @@
+2016-05-31  Eric Carlson  <eric.carl...@apple.com>
+
+        [Mac] AirPlay route is sometimes reset when changing video.src
+        https://bugs.webkit.org/show_bug.cgi?id=158226
+        <rdar://problem/24197592>
+
+        Reviewed by Jer Noble.
+
+        Test: media/airplay-autoplay.html
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::webkitShowPlaybackTargetPicker): Remove the gesture requirement
+          if currently processing a user gesture.
+        (WebCore::HTMLMediaElement::dispatchEvent): Set m_failedToPlayToWirelessTarget to false when
+          dispatching webkitcurrentplaybacktargetiswirelesschanged so an element can succeed after failing.
+
 2016-05-31  Chris Dumez  <cdu...@apple.com>
 
         Regression(r201482): Crash under dispatch_semaphore_wait

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (201521 => 201522)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-05-31 20:32:21 UTC (rev 201521)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2016-05-31 20:47:53 UTC (rev 201522)
@@ -5186,6 +5186,8 @@
 void HTMLMediaElement::webkitShowPlaybackTargetPicker()
 {
     LOG(Media, "HTMLMediaElement::webkitShowPlaybackTargetPicker(%p)", this);
+    if (ScriptController::processingUserGestureForMedia())
+        removeBehaviorsRestrictionsAfterFirstUserGesture();
     m_mediaSession->showPlaybackTargetPicker(*this);
 }
 
@@ -5213,8 +5215,10 @@
 
 bool HTMLMediaElement::dispatchEvent(Event& event)
 {
-    if (event.type() == eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent)
+    if (event.type() == eventNames().webkitcurrentplaybacktargetiswirelesschangedEvent) {
+        m_failedToPlayToWirelessTarget = false;
         scheduleDelayedAction(CheckPlaybackTargetCompatablity);
+    }
     return HTMLElement::dispatchEvent(event);
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to