- Revision
- 218400
- Author
- commit-qu...@webkit.org
- Date
- 2017-06-16 11:55:03 -0700 (Fri, 16 Jun 2017)
Log Message
REGRESSION: AirPlay placard is not shown when in fullscreen
https://bugs.webkit.org/show_bug.cgi?id=173447
<rdar://problem/32803773>
Patch by Antoine Quint <grao...@apple.com> on 2017-06-16
Reviewed by Jon Lee.
Source/WebCore:
We only allowed a placard to be set on inline controls, but that was an oversight: placards
should be displayed in fullscreen as well. As such, we move the "placard" property up from
InlineMediaControls to MediaControls, and update the layout() logic in MacOSFullscreenMediaControls
to display a placard.
Test: media/modern-media-controls/placard-support/placard-support-airplay-fullscreen.html
* Modules/modern-media-controls/controls/inline-media-controls.js:
(InlineMediaControls):
(InlineMediaControls.prototype.layout):
(InlineMediaControls.prototype.get placard): Deleted.
(InlineMediaControls.prototype.set placard): Deleted.
* Modules/modern-media-controls/controls/macos-fullscreen-media-controls.js:
(MacOSFullscreenMediaControls.prototype.layout):
* Modules/modern-media-controls/controls/media-controls.js:
(MediaControls.prototype.get placard):
(MediaControls.prototype.set placard):
(MediaControls.prototype.placardPreventsControlsBarDisplay):
(MediaControls.prototype.layout):
* Modules/modern-media-controls/media/placard-support.js:
(PlacardSupport.prototype._updatePlacard):
(PlacardSupport):
LayoutTests:
Add a new test to check that we display the AirPlay placard on macOS in fullscreen.
* media/modern-media-controls/placard-support/placard-support-airplay-fullscreen-expected.txt: Added.
* media/modern-media-controls/placard-support/placard-support-airplay-fullscreen.html: Added.
* platform/ios-simulator/TestExpectations:
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (218399 => 218400)
--- trunk/LayoutTests/ChangeLog 2017-06-16 18:46:29 UTC (rev 218399)
+++ trunk/LayoutTests/ChangeLog 2017-06-16 18:55:03 UTC (rev 218400)
@@ -1,5 +1,19 @@
2017-06-16 Antoine Quint <grao...@apple.com>
+ REGRESSION: AirPlay placard is not shown when in fullscreen
+ https://bugs.webkit.org/show_bug.cgi?id=173447
+ <rdar://problem/32803773>
+
+ Reviewed by Jon Lee.
+
+ Add a new test to check that we display the AirPlay placard on macOS in fullscreen.
+
+ * media/modern-media-controls/placard-support/placard-support-airplay-fullscreen-expected.txt: Added.
+ * media/modern-media-controls/placard-support/placard-support-airplay-fullscreen.html: Added.
+ * platform/ios-simulator/TestExpectations:
+
+2017-06-16 Antoine Quint <grao...@apple.com>
+
Backdrop blur missing in media controls bar on Sierra
https://bugs.webkit.org/show_bug.cgi?id=173451
Added: trunk/LayoutTests/media/modern-media-controls/placard-support/placard-support-airplay-fullscreen-expected.txt (0 => 218400)
--- trunk/LayoutTests/media/modern-media-controls/placard-support/placard-support-airplay-fullscreen-expected.txt (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/placard-support/placard-support-airplay-fullscreen-expected.txt 2017-06-16 18:55:03 UTC (rev 218400)
@@ -0,0 +1,12 @@
+Testing the PlacardSupport behavior when playing media through AirPlay in fullscreen.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS mediaController.controls.placard is mediaController.controls.airplayPlacard
+PASS mediaController.controls.children.includes(mediaController.controls.airplayPlacard) is true
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/media/modern-media-controls/placard-support/placard-support-airplay-fullscreen.html (0 => 218400)
--- trunk/LayoutTests/media/modern-media-controls/placard-support/placard-support-airplay-fullscreen.html (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/placard-support/placard-support-airplay-fullscreen.html 2017-06-16 18:55:03 UTC (rev 218400)
@@ -0,0 +1,93 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<script src="" type="text/_javascript_"></script>
+<body>
+<style type="text/css" media="screen">
+
+ video, #host {
+ position: absolute;
+ top: 0;
+ left: 0;
+ }
+
+ video {
+ width: 800px;
+ height: 240px;
+ }
+
+</style>
+<video src="" controls></video>
+<div id="host"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>PlacardSupport</code> behavior when playing media through AirPlay in fullscreen.");
+
+const container = document.querySelector("div#host");
+const media = document.querySelector("video");
+const mediaController = createControls(container, media, null);
+
+const button = document.body.appendChild(document.createElement("div"));
+
+media.addEventListener("canplay", enterFullscreen);
+
+function enterFullscreen()
+{
+ media.addEventListener(media.webkitPresentationMode ? "webkitpresentationmodechanged" : "webkitfullscreenchange", makeAirPlayAvailable);
+ button.setAttribute("style", "position: absolute; left: 0; top: 0;");
+ button.innerText = "Enter fullscreen";
+ button.addEventListener("click", () => media.webkitEnterFullscreen());
+ pressOnElement(button);
+}
+
+function makeAirPlayAvailable()
+{
+ 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);
+ enterAirPlay();
+}
+
+function enterAirPlay()
+{
+ media.addEventListener("webkitcurrentplaybacktargetiswirelesschanged", currentPlaybackTargetIsWirelessChanged);
+ media.webkitShowPlaybackTargetPicker();
+}
+
+function currentPlaybackTargetIsWirelessChanged(event)
+{
+ if (!media.webkitCurrentPlaybackTargetIsWireless)
+ return;
+
+ shouldBe("mediaController.controls.placard", "mediaController.controls.airplayPlacard");
+ shouldBeTrue("mediaController.controls.children.includes(mediaController.controls.airplayPlacard)");
+
+ debug("");
+ container.remove();
+ button.remove();
+ media.remove();
+ finishJSTest();
+}
+
+</script>
+<script src=""
+</body>
Modified: trunk/LayoutTests/platform/ios-simulator/TestExpectations (218399 => 218400)
--- trunk/LayoutTests/platform/ios-simulator/TestExpectations 2017-06-16 18:46:29 UTC (rev 218399)
+++ trunk/LayoutTests/platform/ios-simulator/TestExpectations 2017-06-16 18:55:03 UTC (rev 218400)
@@ -115,6 +115,7 @@
# These tests rely on fullscreen which do not use the WebKit media controls on iOS
media/modern-media-controls/controls-visibility-support/controls-visibility-support-fullscreen-on-parent-element.html [ Skip ]
media/modern-media-controls/controls-visibility-support/controls-visibility-support-fullscreen-on-video.html [ Skip ]
+media/modern-media-controls/placard-support/placard-support-airplay-fullscreen.html [ Skip ]
# These tests specifically test iOS-only media controls features
media/modern-media-controls/ios-inline-media-controls/ios-inline-media-controls-button-padding.html [ Pass ]
Modified: trunk/Source/WebCore/ChangeLog (218399 => 218400)
--- trunk/Source/WebCore/ChangeLog 2017-06-16 18:46:29 UTC (rev 218399)
+++ trunk/Source/WebCore/ChangeLog 2017-06-16 18:55:03 UTC (rev 218400)
@@ -1,3 +1,34 @@
+2017-06-16 Antoine Quint <grao...@apple.com>
+
+ REGRESSION: AirPlay placard is not shown when in fullscreen
+ https://bugs.webkit.org/show_bug.cgi?id=173447
+ <rdar://problem/32803773>
+
+ Reviewed by Jon Lee.
+
+ We only allowed a placard to be set on inline controls, but that was an oversight: placards
+ should be displayed in fullscreen as well. As such, we move the "placard" property up from
+ InlineMediaControls to MediaControls, and update the layout() logic in MacOSFullscreenMediaControls
+ to display a placard.
+
+ Test: media/modern-media-controls/placard-support/placard-support-airplay-fullscreen.html
+
+ * Modules/modern-media-controls/controls/inline-media-controls.js:
+ (InlineMediaControls):
+ (InlineMediaControls.prototype.layout):
+ (InlineMediaControls.prototype.get placard): Deleted.
+ (InlineMediaControls.prototype.set placard): Deleted.
+ * Modules/modern-media-controls/controls/macos-fullscreen-media-controls.js:
+ (MacOSFullscreenMediaControls.prototype.layout):
+ * Modules/modern-media-controls/controls/media-controls.js:
+ (MediaControls.prototype.get placard):
+ (MediaControls.prototype.set placard):
+ (MediaControls.prototype.placardPreventsControlsBarDisplay):
+ (MediaControls.prototype.layout):
+ * Modules/modern-media-controls/media/placard-support.js:
+ (PlacardSupport.prototype._updatePlacard):
+ (PlacardSupport):
+
2017-06-16 Jer Noble <jer.no...@apple.com>
[WebRTC] Removing a MediaStreamTrack from a MediaStream reports no recording to WebKit clients
Modified: trunk/Source/WebCore/Modules/modern-media-controls/controls/inline-media-controls.js (218399 => 218400)
--- trunk/Source/WebCore/Modules/modern-media-controls/controls/inline-media-controls.js 2017-06-16 18:46:29 UTC (rev 218399)
+++ trunk/Source/WebCore/Modules/modern-media-controls/controls/inline-media-controls.js 2017-06-16 18:55:03 UTC (rev 218400)
@@ -37,12 +37,6 @@
this.element.classList.add("inline");
- this._placard = null;
-
- this.airplayPlacard = new AirplayPlacard(this);
- this.invalidPlacard = new InvalidPlacard(this);
- this.pipPlacard = new PiPPlacard(this);
-
this.skipBackButton = new SkipBackButton(this);
this.skipForwardButton = new SkipForwardButton(this);
@@ -94,20 +88,6 @@
this.layout();
}
- get placard()
- {
- return this._placard;
- }
-
- set placard(placard)
- {
- if (this._placard === placard)
- return;
-
- this._placard = placard;
- this.layout();
- }
-
// Protected
layout()
@@ -116,12 +96,9 @@
const children = [];
- if (this._placard) {
- this._placard.width = this.width;
- this._placard.height = this.height;
- children.push(this._placard);
- // The AirPlay placard is the only one allowing controls to show as well.
- if (this._placard !== this.airplayPlacard) {
+ if (this.placard) {
+ children.push(this.placard);
+ if (this.placardPreventsControlsBarDisplay()) {
this.children = children;
return;
}
Modified: trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-fullscreen-media-controls.js (218399 => 218400)
--- trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-fullscreen-media-controls.js 2017-06-16 18:46:29 UTC (rev 218399)
+++ trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-fullscreen-media-controls.js 2017-06-16 18:55:03 UTC (rev 218400)
@@ -75,8 +75,6 @@
this.bottomControlsBar.children = [this._leftContainer, this._centerContainer, this._rightContainer];
- this.children = [this.bottomControlsBar];
-
this.bottomControlsBar.element.addEventListener("mousedown", this);
this._backgroundClickDelegateNotifier = new BackgroundClickDelegateNotifier(this);
@@ -100,6 +98,18 @@
{
super.layout();
+ const children = [];
+
+ if (this.placard) {
+ children.push(this.placard);
+ if (this.placardPreventsControlsBarDisplay()) {
+ this.children = children;
+ return;
+ }
+ }
+
+ children.push(this.bottomControlsBar);
+
if (!this._rightContainer)
return;
@@ -125,6 +135,8 @@
this.bottomControlsBar.addChild(this.timeControl);
this.timeControl.width = FullscreenTimeControlWidth;
}
+
+ this.children = children;
}
// Private
Modified: trunk/Source/WebCore/Modules/modern-media-controls/controls/media-controls.js (218399 => 218400)
--- trunk/Source/WebCore/Modules/modern-media-controls/controls/media-controls.js 2017-06-16 18:46:29 UTC (rev 218399)
+++ trunk/Source/WebCore/Modules/modern-media-controls/controls/media-controls.js 2017-06-16 18:55:03 UTC (rev 218400)
@@ -55,6 +55,11 @@
this.autoHideController.fadesWhileIdle = false;
this.autoHideController.hasSecondaryUIAttached = false;
+ this._placard = null;
+ this.airplayPlacard = new AirplayPlacard(this);
+ this.invalidPlacard = new InvalidPlacard(this);
+ this.pipPlacard = new PiPPlacard(this);
+
this.element.addEventListener("focusin", this);
window.addEventListener("dragstart", this, true);
}
@@ -139,6 +144,25 @@
this.markDirtyProperty("scaleFactor");
}
+ get placard()
+ {
+ return this._placard;
+ }
+
+ set placard(placard)
+ {
+ if (this._placard === placard)
+ return;
+
+ this._placard = placard;
+ this.layout();
+ }
+
+ placardPreventsControlsBarDisplay()
+ {
+ return this._placard && this._placard !== this.airplayPlacard;
+ }
+
showTracksPanel()
{
this.element.classList.add("shows-tracks-panel");
@@ -200,6 +224,16 @@
event.preventDefault();
}
+ layout()
+ {
+ super.layout();
+
+ if (this._placard) {
+ this._placard.width = this.width;
+ this._placard.height = this.height;
+ }
+ }
+
commitProperty(propertyName)
{
if (propertyName === "scaleFactor") {
Modified: trunk/Source/WebCore/Modules/modern-media-controls/media/placard-support.js (218399 => 218400)
--- trunk/Source/WebCore/Modules/modern-media-controls/media/placard-support.js 2017-06-16 18:46:29 UTC (rev 218399)
+++ trunk/Source/WebCore/Modules/modern-media-controls/media/placard-support.js 2017-06-16 18:55:03 UTC (rev 218400)
@@ -48,9 +48,6 @@
_updatePlacard()
{
- if (this.mediaController.layoutTraits & LayoutTraits.Fullscreen)
- return;
-
const controls = this.mediaController.controls;
const media = this.mediaController.media;