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