Title: [226872] branches/safari-605-branch

Diff

Modified: branches/safari-605-branch/LayoutTests/ChangeLog (226871 => 226872)


--- branches/safari-605-branch/LayoutTests/ChangeLog	2018-01-12 06:31:03 UTC (rev 226871)
+++ branches/safari-605-branch/LayoutTests/ChangeLog	2018-01-12 06:31:07 UTC (rev 226872)
@@ -1,5 +1,24 @@
 2018-01-11  Jason Marcell  <jmarc...@apple.com>
 
+        Cherry-pick r226796. rdar://problem/36450730
+
+    2018-01-11  Antoine Quint  <grao...@apple.com>
+
+            Only listen to webkitplaybacktargetavailabilitychanged when media controls are visible to the user
+            https://bugs.webkit.org/show_bug.cgi?id=181547
+            <rdar://problem/35947650>
+
+            Reviewed by Eric Carlson.
+
+            Add a test that checks that enabling AirPlay routes when the controls are not visible to the user
+            does not incur any change, and that making the controls visible again shows the controls in the
+            expected state.
+
+            * media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls-expected.txt: Added.
+            * media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls.html: Added.
+
+2018-01-11  Jason Marcell  <jmarc...@apple.com>
+
         Cherry-pick r226795. rdar://problem/36450750
 
     2018-01-11  Antoine Quint  <grao...@apple.com>

Added: branches/safari-605-branch/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls-expected.txt (0 => 226872)


--- branches/safari-605-branch/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls-expected.txt	                        (rev 0)
+++ branches/safari-605-branch/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls-expected.txt	2018-01-12 06:31:07 UTC (rev 226872)
@@ -0,0 +1,28 @@
+Testing AirPlaySupport stops listening to webkitplaybacktargetavailabilitychanged events when the controls are not visible to the user.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+Starting test.
+PASS controls.visible is true
+PASS controls.faded is false
+
+Now we wait for the controls to fade after a period of inactivity.
+PASS controls.faded became true
+
+Before turning AirPlay routes on, we check the AirPlay control state.
+PASS controls.airplayButton.enabled is false
+
+Making AirPlay routes available.
+PASS controls.airplayButton.enabled is false
+
+We pause the media so that controls can show again.
+
+Media paused, the AirPlay button should be enabled now that controls are visible.
+PASS controls.faded is false
+PASS controls.airplayButton.enabled became true
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: branches/safari-605-branch/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls.html (0 => 226872)


--- branches/safari-605-branch/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls.html	                        (rev 0)
+++ branches/safari-605-branch/LayoutTests/media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls.html	2018-01-12 06:31:07 UTC (rev 226872)
@@ -0,0 +1,88 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<body>
+<video src="" style="width: 320px; height: 240px;" autoplay controls></video>
+<div id="host"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing <code>AirPlaySupport</code> stops listening to webkitplaybacktargetavailabilitychanged events when the controls are not visible to the user.");
+
+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.");
+    shouldBeTrue("controls.visible");
+    shouldBeFalse("controls.faded");
+
+    debug("");
+    debug("Now we wait for the controls to fade after a period of inactivity.");
+    shouldBecomeEqual("controls.faded", "true", makeAirPlayAvailable);
+}
+
+function makeAirPlayAvailable()
+{
+    debug("");
+    debug("Before turning AirPlay routes on, we check the AirPlay control state.");
+    shouldBeFalse("controls.airplayButton.enabled");
+
+    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);
+
+    shouldBeFalse("controls.airplayButton.enabled");
+
+    debug("");
+    debug("We pause the media so that controls can show again.");
+    media.addEventListener("pause", mediaDidPause);
+    media.pause();
+}
+
+function mediaDidPause()
+{
+    debug("");
+    debug("Media paused, the AirPlay button should be enabled now that controls are visible.");
+    shouldBeFalse("controls.faded");
+    shouldBecomeEqual("controls.airplayButton.enabled", "true", finishTest);
+}
+
+function finishTest()
+{
+    debug("");
+    container.remove();
+    media.remove();
+    finishJSTest();
+}
+
+</script>
+<script src=""
+</body>

Modified: branches/safari-605-branch/Source/WebCore/ChangeLog (226871 => 226872)


--- branches/safari-605-branch/Source/WebCore/ChangeLog	2018-01-12 06:31:03 UTC (rev 226871)
+++ branches/safari-605-branch/Source/WebCore/ChangeLog	2018-01-12 06:31:07 UTC (rev 226872)
@@ -1,5 +1,37 @@
 2018-01-11  Jason Marcell  <jmarc...@apple.com>
 
+        Cherry-pick r226796. rdar://problem/36450730
+
+    2018-01-11  Antoine Quint  <grao...@apple.com>
+
+            Only listen to webkitplaybacktargetavailabilitychanged when media controls are visible to the user
+            https://bugs.webkit.org/show_bug.cgi?id=181547
+            <rdar://problem/35947650>
+
+            Reviewed by Eric Carlson.
+
+            Because listening to "webkitplaybacktargetavailabilitychanged" events incurs some higher power usage on iOS,
+            we only listen to such events when controls are visible to the user. In other words, the MediaControls need to
+            have both "visible" set to "true" and "faded" set to "false". To support this, we add a delegate method on
+            MediaControls such that it can tell the MediaController that the "visible" property changed. With this message,
+            MediaController can inform its MediaControllerSupport objects that user visibility of the controls changed, which
+            lets AirplaySupport disable itself when controls are no longer visible.
+
+            Test: media/modern-media-controls/airplay-support/airplay-support-disable-event-listeners-with-hidden-controls.html
+
+            * Modules/modern-media-controls/controls/media-controls.js:
+            (MediaControls.prototype.set visible):
+            * Modules/modern-media-controls/media/airplay-support.js:
+            (AirplaySupport.prototype.controlsUserVisibilityDidChange):
+            * Modules/modern-media-controls/media/media-controller-support.js:
+            (MediaControllerSupport.prototype.controlsUserVisibilityDidChange):
+            * Modules/modern-media-controls/media/media-controller.js:
+            (MediaController.prototype.mediaControlsVisibilityDidChange):
+            (MediaController.prototype.mediaControlsFadedStateDidChange):
+            (MediaController.prototype._controlsUserVisibilityDidChange):
+
+2018-01-11  Jason Marcell  <jmarc...@apple.com>
+
         Cherry-pick r226795. rdar://problem/36450750
 
     2018-01-11  Antoine Quint  <grao...@apple.com>

Modified: branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/controls/media-controls.js (226871 => 226872)


--- branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/controls/media-controls.js	2018-01-12 06:31:03 UTC (rev 226871)
+++ branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/controls/media-controls.js	2018-01-12 06:31:07 UTC (rev 226872)
@@ -86,6 +86,9 @@
 
         if (flag)
             this.layout();
+
+        if (this.delegate && typeof this.delegate.mediaControlsVisibilityDidChange === "function")
+            this.delegate.mediaControlsVisibilityDidChange();
     }
 
     get faded()

Modified: branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/airplay-support.js (226871 => 226872)


--- branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/airplay-support.js	2018-01-12 06:31:03 UTC (rev 226871)
+++ branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/airplay-support.js	2018-01-12 06:31:07 UTC (rev 226872)
@@ -43,6 +43,15 @@
         this.mediaController.media.webkitShowPlaybackTargetPicker();
     }
 
+    controlsUserVisibilityDidChange()
+    {
+        const controls = this.mediaController.controls;
+        if (controls.visible && !controls.faded)
+            this.enable();
+        else
+            this.disable();
+    }
+
     handleEvent(event)
     {
         if (event.type === "webkitplaybacktargetavailabilitychanged")

Modified: branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/media-controller-support.js (226871 => 226872)


--- branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/media-controller-support.js	2018-01-12 06:31:03 UTC (rev 226871)
+++ branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/media-controller-support.js	2018-01-12 06:31:07 UTC (rev 226872)
@@ -90,6 +90,11 @@
         // Implemented by subclasses.
     }
 
+    controlsUserVisibilityDidChange()
+    {
+        // Implement by subclasses.
+    }
+
     handleEvent(event)
     {
         // Implemented by subclasses.

Modified: branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/media-controller.js (226871 => 226872)


--- branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/media-controller.js	2018-01-12 06:31:03 UTC (rev 226871)
+++ branches/safari-605-branch/Source/WebCore/Modules/modern-media-controls/media/media-controller.js	2018-01-12 06:31:07 UTC (rev 226872)
@@ -124,8 +124,14 @@
         this.controls.usesLTRUserInterfaceLayoutDirection = flag;
     }
 
+    mediaControlsVisibilityDidChange()
+    {
+        this._controlsUserVisibilityDidChange();
+    }
+
     mediaControlsFadedStateDidChange()
     {
+        this._controlsUserVisibilityDidChange();
         this._updateTextTracksClassList();
     }
 
@@ -286,6 +292,14 @@
         this.host.textTrackContainer.classList.toggle("visible-controls-bar", !this.controls.faded);
     }
 
+    _controlsUserVisibilityDidChange()
+    {
+        if (!this.controls || !this._supportingObjects)
+            return;
+
+        this._supportingObjects.forEach(supportingObject => supportingObject.controlsUserVisibilityDidChange());
+    }
+
     _updateiOSFullscreenProperties()
     {
         // On iOS, we want to make sure not to update controls when we're in fullscreen since the UI
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to