Title: [231899] trunk
Revision
231899
Author
commit-qu...@webkit.org
Date
2018-05-17 08:34:38 -0700 (Thu, 17 May 2018)

Log Message

[modern-media-controls] AirPlaySupport should be disabled by default
https://bugs.webkit.org/show_bug.cgi?id=185658
<rdar://problem/40272213>

Patch by Antoine Quint <grao...@apple.com> on 2018-05-17
Reviewed by Simon Fraser.

Source/WebCore:

We now only enable AirplaySupport if the controls are visible to the user _and_ media has played.

Test: media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play.html

* Modules/modern-media-controls/media/airplay-support.js:
(AirplaySupport.prototype.enable):
(AirplaySupport.prototype.controlsUserVisibilityDidChange):
(AirplaySupport.prototype._shouldBeEnabled):
(AirplaySupport):

LayoutTests:

Add a new test that checks that we create an AirplaySupport object only after media has started playing.

* media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play-expected.txt: Added.
* media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (231898 => 231899)


--- trunk/LayoutTests/ChangeLog	2018-05-17 15:27:37 UTC (rev 231898)
+++ trunk/LayoutTests/ChangeLog	2018-05-17 15:34:38 UTC (rev 231899)
@@ -1,3 +1,16 @@
+2018-05-17  Antoine Quint  <grao...@apple.com>
+
+        [modern-media-controls] AirPlaySupport should be disabled by default
+        https://bugs.webkit.org/show_bug.cgi?id=185658
+        <rdar://problem/40272213>
+
+        Reviewed by Simon Fraser.
+
+        Add a new test that checks that we create an AirplaySupport object only after media has started playing.
+
+        * media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play-expected.txt: Added.
+        * media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play.html: Added.
+
 2018-05-17  Rob Buis  <rb...@igalia.com>
 
         Remove cssom-remove-shorthand-property.html test

Added: trunk/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play-expected.txt (0 => 231899)


--- trunk/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play-expected.txt	2018-05-17 15:34:38 UTC (rev 231899)
@@ -0,0 +1,23 @@
+Testing AirPlaySupport is only enabled once media has started playing.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Starting test, the media can be played but hasn't started playing.
+
+Making AirPlay routes available.
+
+Airplay routes are available and controls are visible on the screen, but since the media hasn't played yet, AirplaySupport should be disabled.
+PASS controls.airplayButton.uiDelegate is undefined.
+PASS controls.visible is true
+PASS controls.faded is false
+
+We play the media so that the Airplay button can be enabled.
+
+Media played, AirplaySupport should become enabled now.
+PASS !!controls.airplayButton.uiDelegate became true
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play.html (0 => 231899)


--- trunk/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play.html	2018-05-17 15:34:38 UTC (rev 231899)
@@ -0,0 +1,83 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<body>
+<video src="" style="width: 320px; height: 240px;" preload controls></video>
+<div id="host"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing <code>AirPlaySupport</code> is only enabled once media has started playing.");
+
+const container = document.querySelector("div#host");
+const media = document.querySelector("video");
+const mediaController = createControls(container, media, null);
+const controls = mediaController.controls;
+
+controls.autoHideController.autoHideDelay = 100;
+
+media.addEventListener("canplay", startTest);
+
+function startTest()
+{
+    debug("Starting test, the media can be played but hasn't started playing.");
+
+    makeAirPlayAvailable();
+}
+
+function makeAirPlayAvailable()
+{
+    debug("");
+    debug("Making AirPlay routes available.");
+    media.addEventListener("webkitplaybacktargetavailabilitychanged", playbackTargetAvailabilityChangedOnce, true);
+    window.internals.setMockMediaPlaybackTargetPickerEnabled(true);
+}
+
+function playbackTargetAvailabilityChangedOnce(event)
+{
+    media.removeEventListener('webkitplaybacktargetavailabilitychanged', playbackTargetAvailabilityChangedOnce, true);
+    media.addEventListener('webkitplaybacktargetavailabilitychanged', playbackTargetAvailabilityChangedAgain, true);
+
+    window.internals.setMockMediaPlaybackTargetPickerState('Sleepy TV', 'DeviceAvailable');
+}
+
+function playbackTargetAvailabilityChangedAgain(event)
+{
+    // setMockMediaPlaybackTargetPickerState happens asynchronously in WK2 and a
+    // "webkitplaybacktargetavailabilitychanged" is always sent when an event listener
+    // is added, so we may get a "not available" event first.
+    if (event.availability == 'not-available')
+        return;
+
+    media.removeEventListener('webkitplaybacktargetavailabilitychanged', playbackTargetAvailabilityChangedAgain, true);
+
+    debug("");
+    debug("Airplay routes are available and controls are visible on the screen, but since the media hasn't played yet, AirplaySupport should be disabled.");
+    shouldBeUndefined("controls.airplayButton.uiDelegate");
+    shouldBeTrue("controls.visible");
+    shouldBeFalse("controls.faded");
+
+    debug("");
+    debug("We play the media so that the Airplay button can be enabled.");
+    media.addEventListener("play", mediaDidPlay);
+    media.play();
+}
+
+function mediaDidPlay()
+{
+    debug("");
+    debug("Media played, AirplaySupport should become enabled now.");
+    shouldBecomeEqual("!!controls.airplayButton.uiDelegate", "true", finishTest);
+}
+
+function finishTest()
+{
+    debug("");
+    container.remove();
+    media.remove();
+    finishJSTest();
+}
+
+</script>
+<script src=""
+</body>

Modified: trunk/Source/WebCore/ChangeLog (231898 => 231899)


--- trunk/Source/WebCore/ChangeLog	2018-05-17 15:27:37 UTC (rev 231898)
+++ trunk/Source/WebCore/ChangeLog	2018-05-17 15:34:38 UTC (rev 231899)
@@ -1,3 +1,21 @@
+2018-05-17  Antoine Quint  <grao...@apple.com>
+
+        [modern-media-controls] AirPlaySupport should be disabled by default
+        https://bugs.webkit.org/show_bug.cgi?id=185658
+        <rdar://problem/40272213>
+
+        Reviewed by Simon Fraser.
+
+        We now only enable AirplaySupport if the controls are visible to the user _and_ media has played.
+
+        Test: media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-until-play.html
+
+        * Modules/modern-media-controls/media/airplay-support.js:
+        (AirplaySupport.prototype.enable):
+        (AirplaySupport.prototype.controlsUserVisibilityDidChange):
+        (AirplaySupport.prototype._shouldBeEnabled):
+        (AirplaySupport):
+
 2018-05-17  Zalan Bujtas  <za...@apple.com>
 
         [LFC] Replace ASSERT_NOT_REACHED with ASSERT_NOT_IMPLEMENTED_YET where applicable.

Modified: trunk/Source/WebCore/Modules/modern-media-controls/media/airplay-support.js (231898 => 231899)


--- trunk/Source/WebCore/Modules/modern-media-controls/media/airplay-support.js	2018-05-17 15:27:37 UTC (rev 231898)
+++ trunk/Source/WebCore/Modules/modern-media-controls/media/airplay-support.js	2018-05-17 15:34:38 UTC (rev 231899)
@@ -38,6 +38,12 @@
         return ["webkitplaybacktargetavailabilitychanged", "webkitcurrentplaybacktargetiswirelesschanged"];
     }
 
+    enable()
+    {
+        if (this._shouldBeEnabled())
+            super.enable();
+    }
+
     buttonWasPressed(control)
     {
         this.mediaController.media.webkitShowPlaybackTargetPicker();
@@ -45,8 +51,7 @@
 
     controlsUserVisibilityDidChange()
     {
-        const controls = this.mediaController.controls;
-        if (controls.visible && !controls.faded)
+        if (this._shouldBeEnabled())
             this.enable();
         else
             this.disable();
@@ -67,4 +72,15 @@
         this.mediaController.controls.muteButton.enabled = !this.control.on;
     }
 
+    // Private
+
+    _shouldBeEnabled()
+    {
+        if (!this.mediaController.hasPlayed)
+            return false;
+
+        const controls = this.mediaController.controls;
+        return controls.visible && !controls.faded;
+    }
+
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to