Title: [218400] trunk
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;
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to