- 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;
+ }
+
}