Title: [211904] trunk
Revision
211904
Author
[email protected]
Date
2017-02-08 14:57:38 -0800 (Wed, 08 Feb 2017)

Log Message

[Modern Media Controls] Implement reduced and tight padding modes
https://bugs.webkit.org/show_bug.cgi?id=167933
<rdar://problem/30396994>

Patch by Antoine Quint <[email protected]> on 2017-02-08
Reviewed by Dean Jackson.

Source/WebCore:

The design specs for modern media controls mandate the following for inline media controls:

    - controls at or below 300pt width use a 12pt left margin for the left buttons container,
    and a 12pt right margin for the right buttons container, and 16pth button margin inside
    both containers ("reduced padding mode").

    - when dropping at or below 120pt width, controls use an 8pt left margin for
    the left buttons container, and an 8pt right margin for the right buttons container, and
    12pt button margin inside both containers and a shorter bar (25pt) ("compact mode").

    - in the case of audio controls, at 400pt or less, controls switch to 12pt margins and
    button margins for both buttons containers ("tight padding mode").

The "compact" mode was already implemented as a dedicated MacOSInlineMediaControls subclass.
Since we now have a more generic need to vary the metrics used for inline media controls on
macOS, we add new features to MacOSInlineMediaControls to support varying metrics based on
the controls' "layoutTraits" property.

So MediaController is changed such that it knows to use the new TightPadding and ReducedPadding
layout traits based on the conditions defined above, and _updateControlsIfNeeded() is changed
to set the "layoutTraits" property on the controls whenever called, which in our case is most
relevantly a "resize" event on the shadow root or a TrackEvent on the video tracks (to determine
when we're possibly changing between a video and audio file).

As a result, the "layoutTraits" setter is called on MacOSInlineMediaControls, which updates
the metrics for the various buttons containers, but also notifies the buttons contained
within that layout traits may have changed, since some buttons support a "compact" appearance
that is shorter and require a different image file. To that end, IconButton has been updated
so that it may be notified of a layout traits change through a new layoutTraitsDidChange()
method, that checks whether the current layout traits differ from those last used when loading
the icon.

Tests: media/modern-media-controls/icon-button/icon-button-change-layout-traits.html
       media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles.html
       media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles.html
       media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact.html
       media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding.html
       media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding.html
       media/modern-media-controls/media-controller/media-controller-compact.html
       media/modern-media-controls/media-controller/media-controller-reduced-padding.html
       media/modern-media-controls/media-controller/media-controller-tight-padding.html

* Modules/modern-media-controls/controls/icon-button.js:
(IconButton.prototype.set iconName):
(IconButton.prototype.layoutTraitsDidChange):
(IconButton.prototype._loadImage):
* Modules/modern-media-controls/controls/layout-item.js:
* Modules/modern-media-controls/controls/macos-compact-inline-media-controls.js: Removed.
* Modules/modern-media-controls/controls/macos-inline-media-controls.js:
(MacOSInlineMediaControls.prototype.get layoutTraits):
(MacOSInlineMediaControls.prototype.set layoutTraits):
(MacOSInlineMediaControls.prototype._matchLayoutTraits):
* Modules/modern-media-controls/js-files:
* Modules/modern-media-controls/media/media-controller.js:
(MediaController):
(MediaController.prototype.get layoutTraits):
(MediaController.prototype.handleEvent):
(MediaController.prototype._updateControlsIfNeeded):
(MediaController.prototype._controlsClassForLayoutTraits):
(MediaController.prototype._shouldFadeBetweenControls): Deleted.
(MediaController.prototype._controlsClass): Deleted.
* WebCore.xcodeproj/project.pbxproj:

LayoutTests:

We rewrite the previously-written tests for "compact" mode and add some new tests for
"reduced padding" and "tight padding" modes as well as new support in IconButton to
update the icon based on a change of layout traits.

* media/modern-media-controls/icon-button/icon-button-change-layout-traits-expected.txt: Added.
* media/modern-media-controls/icon-button/icon-button-change-layout-traits.html: Added.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-buttons-styles-expected.txt: Removed.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-constructor-expected.txt: Removed.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-constructor.html: Removed.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-controls-bar-styles-expected.txt: Removed.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-controls-bar-styles.html: Removed.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-layout-expected.txt: Removed.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-layout.html: Removed.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-volume-styles-expected.txt: Removed.
* media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-volume-styles.html: Removed.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles-expected.txt: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles.html: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles-expected.txt: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles.html: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-expected.txt: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact.html: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding-expected.txt: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding.html: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding-expected.txt: Added.
* media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding.html: Added.
* media/modern-media-controls/media-controller/media-controller-compact-expected.txt: Added.
* media/modern-media-controls/media-controller/media-controller-compact.html: Added.
* media/modern-media-controls/media-controller/media-controller-reduced-padding-expected.txt: Added.
* media/modern-media-controls/media-controller/media-controller-reduced-padding.html: Added.
* media/modern-media-controls/media-controller/media-controller-tight-padding-expected.txt: Added.
* media/modern-media-controls/media-controller/media-controller-tight-padding.html: Added.
* platform/ios-simulator/TestExpectations:

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (211903 => 211904)


--- trunk/LayoutTests/ChangeLog	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/LayoutTests/ChangeLog	2017-02-08 22:57:38 UTC (rev 211904)
@@ -1,3 +1,44 @@
+2017-02-08  Antoine Quint  <[email protected]>
+
+        [Modern Media Controls] Implement reduced and tight padding modes
+        https://bugs.webkit.org/show_bug.cgi?id=167933
+        <rdar://problem/30396994>
+
+        Reviewed by Dean Jackson.
+
+        We rewrite the previously-written tests for "compact" mode and add some new tests for
+        "reduced padding" and "tight padding" modes as well as new support in IconButton to
+        update the icon based on a change of layout traits.
+
+        * media/modern-media-controls/icon-button/icon-button-change-layout-traits-expected.txt: Added.
+        * media/modern-media-controls/icon-button/icon-button-change-layout-traits.html: Added.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-buttons-styles-expected.txt: Removed.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-constructor-expected.txt: Removed.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-constructor.html: Removed.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-controls-bar-styles-expected.txt: Removed.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-controls-bar-styles.html: Removed.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-layout-expected.txt: Removed.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-layout.html: Removed.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-volume-styles-expected.txt: Removed.
+        * media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-volume-styles.html: Removed.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles-expected.txt: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles.html: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles-expected.txt: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles.html: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-expected.txt: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact.html: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding-expected.txt: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding.html: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding-expected.txt: Added.
+        * media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding.html: Added.
+        * media/modern-media-controls/media-controller/media-controller-compact-expected.txt: Added.
+        * media/modern-media-controls/media-controller/media-controller-compact.html: Added.
+        * media/modern-media-controls/media-controller/media-controller-reduced-padding-expected.txt: Added.
+        * media/modern-media-controls/media-controller/media-controller-reduced-padding.html: Added.
+        * media/modern-media-controls/media-controller/media-controller-tight-padding-expected.txt: Added.
+        * media/modern-media-controls/media-controller/media-controller-tight-padding.html: Added.
+        * platform/ios-simulator/TestExpectations:
+
 2017-02-08  Youenn Fablet  <[email protected]>
 
         RTCPeerConnection constructor can take null as input

Added: trunk/LayoutTests/media/modern-media-controls/icon-button/icon-button-change-layout-traits-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/icon-button/icon-button-change-layout-traits-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/icon-button/icon-button-change-layout-traits-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,21 @@
+Testing IconButton while changing layout traits.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Setting macOS inline layout traits and setting play icon
+PASS iconButton.element.style.webkitMaskImage.includes("macOS/pause") is true
+PASS iconButton.element.style.width is "22px"
+PASS iconButton.element.style.height is "24px"
+PASS iconButton.element.style.webkitMaskSize is "22px 24px"
+
+Setting macOS inline and compact layout traits and notifying of a layout traits change
+PASS iconButton.element.style.webkitMaskImage.includes("macOS/pause-compact") is true
+PASS iconButton.element.style.width is "11px"
+PASS iconButton.element.style.height is "13px"
+PASS iconButton.element.style.webkitMaskSize is "11px 13px"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/icon-button/icon-button-change-layout-traits.html (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/icon-button/icon-button-change-layout-traits.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/icon-button/icon-button-change-layout-traits.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,48 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<script src="" type="text/_javascript_"></script>
+<body>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing <code>IconButton</code> while changing layout traits.");
+
+const layoutDelegate = {};
+
+const iconButton = new IconButton({ layoutDelegate });
+
+debug("");
+debug("Setting macOS inline layout traits and setting play icon");
+layoutDelegate.layoutTraits = LayoutTraits.macOS;
+iconButton.iconName = Icons.Pause;
+
+let numberOfFrames = 0;
+
+scheduler.frameDidFire = function()
+{
+    numberOfFrames++;
+
+    if (numberOfFrames === 1) {
+        shouldBeTrue('iconButton.element.style.webkitMaskImage.includes("macOS/pause")');
+        shouldBeEqualToString("iconButton.element.style.width", "22px");
+        shouldBeEqualToString("iconButton.element.style.height", "24px");
+        shouldBeEqualToString("iconButton.element.style.webkitMaskSize", "22px 24px");
+
+        debug("");
+        debug("Setting macOS inline and compact layout traits and notifying of a layout traits change");
+        layoutDelegate.layoutTraits = LayoutTraits.macOS | LayoutTraits.Compact;
+        iconButton.layoutTraitsDidChange();
+    } else if (numberOfFrames === 2) {
+        shouldBeTrue('iconButton.element.style.webkitMaskImage.includes("macOS/pause-compact")');
+        shouldBeEqualToString("iconButton.element.style.width", "11px");
+        shouldBeEqualToString("iconButton.element.style.height", "13px");
+        shouldBeEqualToString("iconButton.element.style.webkitMaskSize", "11px 13px");
+
+        finishMediaControlsTest();
+    } 
+};
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,25 @@
+Testing the MacOSInlineMediaControls computed styles in compact mode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PlayPauseButton
+PASS style.height is "25px"
+PASS style.webkitMaskPositionY is "6px"
+
+SkipBackButton
+PASS style.height is "25px"
+PASS style.webkitMaskPositionY is "6px"
+
+MuteButton
+PASS style.height is "25px"
+PASS style.webkitMaskPositionY is "6px"
+
+FullscreenButton
+PASS style.height is "25px"
+PASS style.webkitMaskPositionY is "6.5px"
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Copied: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles.html (from rev 211903, trunk/LayoutTests/media/modern-media-controls/macos-compact-inline-media-controls/macos-compact-inline-media-controls-buttons-styles.html) (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,43 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<script src="" type="text/_javascript_"></script>
+<body>
+<script type="text/_javascript_">
+
+description("Testing the <code>MacOSInlineMediaControls</code> computed styles in compact mode.");
+
+window.jsTestIsAsync = true;
+
+const mediaControls = new MacOSInlineMediaControls({ width: 240 });
+mediaControls.layoutTraits = LayoutTraits.macOS | LayoutTraits.Compact;
+
+const buttonPositions = [
+    [mediaControls.playPauseButton, 6],
+    [mediaControls.skipBackButton, 6],
+    [mediaControls.muteButton, 6],
+    [mediaControls.fullscreenButton, 6.5]
+];
+
+let style;
+scheduler.frameDidFire = function()
+{
+    document.body.appendChild(mediaControls.element);
+
+    if (buttonPositions.some(buttonPosition => buttonPosition[0].width == 0))
+        return;
+
+    for (let [button, y] of buttonPositions) {
+        style = window.getComputedStyle(button.element);
+        debug(button.constructor.name);
+        shouldBeEqualToString("style.height", "25px");
+        shouldBeEqualToString("style.webkitMaskPositionY", `${y}px`);
+        debug("");
+    }
+
+    mediaControls.element.remove();
+    finishMediaControlsTest();
+};
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,11 @@
+Testing the MacOSInlineMediaControls computed styles in compact mode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS mediaControls.controlsBar.element.getBoundingClientRect().height is 25
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles.html (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,38 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<script src="" type="text/_javascript_"></script>
+<body>
+<style type="text/css" media="screen">
+    
+.media-controls {
+    position: absolute;
+    top: 0;
+    left: 0;
+}
+    
+</style>
+<script type="text/_javascript_">
+
+description("Testing the <code>MacOSInlineMediaControls</code> computed styles in compact mode.");
+
+window.jsTestIsAsync = true;
+
+const mediaControls = new MacOSInlineMediaControls({ width: 240 });
+mediaControls.layoutTraits = LayoutTraits.macOS | LayoutTraits.Compact;
+
+let bounds;
+scheduler.frameDidFire = function()
+{
+    document.body.appendChild(mediaControls.element);
+
+    shouldBe("mediaControls.controlsBar.element.getBoundingClientRect().height", "25");
+
+    mediaControls.element.remove();
+
+    debug("");
+    finishMediaControlsTest();
+};
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,18 @@
+Testing MacOSInlineMediaControls in compact mode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS mediaControls.element.classList.contains('compact') is true
+PASS mediaControls.rightContainer.buttons is [mediaControls.muteButton, mediaControls.fullscreenButton]
+PASS mediaControls.leftContainer.leftMargin is 8
+PASS mediaControls.leftContainer.rightMargin is 12
+PASS mediaControls.leftContainer.buttonMargin is 12
+PASS mediaControls.rightContainer.leftMargin is 12
+PASS mediaControls.rightContainer.rightMargin is 8
+PASS mediaControls.rightContainer.buttonMargin is 12
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact.html (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,24 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<script src="" type="text/_javascript_"></script>
+<body>
+<script type="text/_javascript_">
+
+description("Testing <code>MacOSInlineMediaControls</code> in compact mode.");
+
+const mediaControls = new MacOSInlineMediaControls({ width: 240 });
+mediaControls.layoutTraits = LayoutTraits.macOS | LayoutTraits.Compact;
+
+shouldBeTrue("mediaControls.element.classList.contains('compact')");
+shouldBe("mediaControls.rightContainer.buttons", "[mediaControls.muteButton, mediaControls.fullscreenButton]");
+shouldBe("mediaControls.leftContainer.leftMargin", "8");
+shouldBe("mediaControls.leftContainer.rightMargin", "12");
+shouldBe("mediaControls.leftContainer.buttonMargin", "12");
+shouldBe("mediaControls.rightContainer.leftMargin", "12");
+shouldBe("mediaControls.rightContainer.rightMargin", "8");
+shouldBe("mediaControls.rightContainer.buttonMargin", "12");
+debug("");
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,16 @@
+Testing MacOSInlineMediaControls with reduced padding.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS mediaControls.leftContainer.leftMargin is 12
+PASS mediaControls.leftContainer.rightMargin  is 16
+PASS mediaControls.leftContainer.buttonMargin is 16
+PASS mediaControls.rightContainer.leftMargin  is 0
+PASS mediaControls.rightContainer.rightMargin is 12
+PASS mediaControls.rightContainer.buttonMargin  is 16
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding.html (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,22 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<script src="" type="text/_javascript_"></script>
+<body>
+<script type="text/_javascript_">
+
+description("Testing <code>MacOSInlineMediaControls</code> with reduced padding.");
+
+const mediaControls = new MacOSInlineMediaControls({ width: 300 });
+mediaControls.layoutTraits = LayoutTraits.macOS | LayoutTraits.ReducedPadding;
+
+shouldBe("mediaControls.leftContainer.leftMargin", "12");
+shouldBe("mediaControls.leftContainer.rightMargin ", "16");
+shouldBe("mediaControls.leftContainer.buttonMargin", "16");
+shouldBe("mediaControls.rightContainer.leftMargin ", "0");
+shouldBe("mediaControls.rightContainer.rightMargin", "12");
+shouldBe("mediaControls.rightContainer.buttonMargin ", "16");
+debug("");
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,16 @@
+Testing MacOSInlineMediaControls with tight padding.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS mediaControls.leftContainer.leftMargin is 12
+PASS mediaControls.leftContainer.rightMargin  is 12
+PASS mediaControls.leftContainer.buttonMargin is 12
+PASS mediaControls.rightContainer.leftMargin  is 12
+PASS mediaControls.rightContainer.rightMargin is 12
+PASS mediaControls.rightContainer.buttonMargin  is 12
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding.html (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,22 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<script src="" type="text/_javascript_"></script>
+<body>
+<script type="text/_javascript_">
+
+description("Testing <code>MacOSInlineMediaControls</code> with tight padding.");
+
+const mediaControls = new MacOSInlineMediaControls({ width: 400 });
+mediaControls.layoutTraits = LayoutTraits.macOS | LayoutTraits.TightPadding;
+
+shouldBe("mediaControls.leftContainer.leftMargin", "12");
+shouldBe("mediaControls.leftContainer.rightMargin ", "12");
+shouldBe("mediaControls.leftContainer.buttonMargin", "12");
+shouldBe("mediaControls.rightContainer.leftMargin ", "12");
+shouldBe("mediaControls.rightContainer.rightMargin", "12");
+shouldBe("mediaControls.rightContainer.buttonMargin ", "12");
+debug("");
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-compact-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-compact-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-compact-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,11 @@
+Testing the MediaController sizing behavior with compact mode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS !!(mediaController.controls.layoutTraits & LayoutTraits.Compact) became true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+

Added: trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-compact.html (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-compact.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-compact.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,20 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<body>
+<video src="" style="width: 240px;" controls autoplay></video>
+<div id="shadow"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>MediaController</code> sizing behavior with compact mode.");
+
+const shadowRoot = document.querySelector("div#shadow").attachShadow({ mode: "open" });
+const media = document.querySelector("video");
+const mediaController = createControls(shadowRoot, media, null);
+
+shouldBecomeEqual("!!(mediaController.controls.layoutTraits & LayoutTraits.Compact)", "true", finishJSTest);
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-reduced-padding-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-reduced-padding-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-reduced-padding-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,11 @@
+Testing the MediaController sizing behavior with reduced padding mode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS !!(mediaController.controls.layoutTraits & LayoutTraits.ReducedPadding) became true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+

Added: trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-reduced-padding.html (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-reduced-padding.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-reduced-padding.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,20 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<body>
+<video src="" style="width: 300px;" controls autoplay></video>
+<div id="shadow"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>MediaController</code> sizing behavior with reduced padding mode.");
+
+const shadowRoot = document.querySelector("div#shadow").attachShadow({ mode: "open" });
+const media = document.querySelector("video");
+const mediaController = createControls(shadowRoot, media, null);
+
+shouldBecomeEqual("!!(mediaController.controls.layoutTraits & LayoutTraits.ReducedPadding)", "true", finishJSTest);
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-tight-padding-expected.txt (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-tight-padding-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-tight-padding-expected.txt	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,11 @@
+Testing the MediaController sizing behavior with tight padding mode.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS !!(mediaController.controls.layoutTraits & LayoutTraits.TightPadding) became true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
+

Added: trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-tight-padding.html (0 => 211904)


--- trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-tight-padding.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/media-controller/media-controller-tight-padding.html	2017-02-08 22:57:38 UTC (rev 211904)
@@ -0,0 +1,20 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<body>
+<audio src="" style="width: 400px;" controls autoplay></audio>
+<div id="shadow"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>MediaController</code> sizing behavior with tight padding mode.");
+
+const shadowRoot = document.querySelector("div#shadow").attachShadow({ mode: "open" });
+const media = document.querySelector("audio");
+const mediaController = createControls(shadowRoot, media, null);
+
+shouldBecomeEqual("!!(mediaController.controls.layoutTraits & LayoutTraits.TightPadding)", "true", finishJSTest);
+
+</script>
+<script src=""
+</body>

Modified: trunk/LayoutTests/platform/ios-simulator/TestExpectations (211903 => 211904)


--- trunk/LayoutTests/platform/ios-simulator/TestExpectations	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/LayoutTests/platform/ios-simulator/TestExpectations	2017-02-08 22:57:38 UTC (rev 211904)
@@ -2835,7 +2835,16 @@
 webkit.org/b/166062 media/modern-media-controls/placard-support/placard-support-airplay.html [ Skip ]
 webkit.org/b/166062 media/modern-media-controls/audio/audio-controls-buttons.html [ Skip ]
 
-# There is no compact mode on iOS
+# There is no compact, reduced padding or tight padding mode on iOS.
+media/modern-media-controls/icon-button/icon-button-change-layout-traits.html [ Skip ]
+media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles.html [ Skip ]
+media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles.html [ Skip ]
+media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact.html [ Skip ]
+media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding.html [ Skip ]
+media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding.html [ Skip ]
+media/modern-media-controls/media-controller/media-controller-compact.html [ Skip ]
+media/modern-media-controls/media-controller/media-controller-reduced-padding.html [ Skip ]
+media/modern-media-controls/media-controller/media-controller-tight-padding.html [ Skip ]
 media/modern-media-controls/media-controller/media-controller-toggle-compact-mode.html [ Skip ]
 
 # New Encrypted Media API not enabled on iOS

Modified: trunk/Source/WebCore/ChangeLog (211903 => 211904)


--- trunk/Source/WebCore/ChangeLog	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/Source/WebCore/ChangeLog	2017-02-08 22:57:38 UTC (rev 211904)
@@ -1,3 +1,74 @@
+2017-02-08  Antoine Quint  <[email protected]>
+
+        [Modern Media Controls] Implement reduced and tight padding modes
+        https://bugs.webkit.org/show_bug.cgi?id=167933
+        <rdar://problem/30396994>
+
+        Reviewed by Dean Jackson.
+
+        The design specs for modern media controls mandate the following for inline media controls:
+
+            - controls at or below 300pt width use a 12pt left margin for the left buttons container,
+            and a 12pt right margin for the right buttons container, and 16pth button margin inside
+            both containers ("reduced padding mode").
+
+            - when dropping at or below 120pt width, controls use an 8pt left margin for
+            the left buttons container, and an 8pt right margin for the right buttons container, and
+            12pt button margin inside both containers and a shorter bar (25pt) ("compact mode").
+
+            - in the case of audio controls, at 400pt or less, controls switch to 12pt margins and
+            button margins for both buttons containers ("tight padding mode").
+
+        The "compact" mode was already implemented as a dedicated MacOSInlineMediaControls subclass.
+        Since we now have a more generic need to vary the metrics used for inline media controls on
+        macOS, we add new features to MacOSInlineMediaControls to support varying metrics based on
+        the controls' "layoutTraits" property.
+
+        So MediaController is changed such that it knows to use the new TightPadding and ReducedPadding
+        layout traits based on the conditions defined above, and _updateControlsIfNeeded() is changed
+        to set the "layoutTraits" property on the controls whenever called, which in our case is most
+        relevantly a "resize" event on the shadow root or a TrackEvent on the video tracks (to determine
+        when we're possibly changing between a video and audio file).
+
+        As a result, the "layoutTraits" setter is called on MacOSInlineMediaControls, which updates
+        the metrics for the various buttons containers, but also notifies the buttons contained
+        within that layout traits may have changed, since some buttons support a "compact" appearance
+        that is shorter and require a different image file. To that end, IconButton has been updated
+        so that it may be notified of a layout traits change through a new layoutTraitsDidChange()
+        method, that checks whether the current layout traits differ from those last used when loading
+        the icon.
+
+        Tests: media/modern-media-controls/icon-button/icon-button-change-layout-traits.html
+               media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-buttons-styles.html
+               media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact-controls-bar-styles.html
+               media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-compact.html
+               media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-reduced-padding.html
+               media/modern-media-controls/macos-inline-media-controls/macos-inline-media-controls-tight-padding.html
+               media/modern-media-controls/media-controller/media-controller-compact.html
+               media/modern-media-controls/media-controller/media-controller-reduced-padding.html
+               media/modern-media-controls/media-controller/media-controller-tight-padding.html
+
+        * Modules/modern-media-controls/controls/icon-button.js:
+        (IconButton.prototype.set iconName):
+        (IconButton.prototype.layoutTraitsDidChange):
+        (IconButton.prototype._loadImage):
+        * Modules/modern-media-controls/controls/layout-item.js:
+        * Modules/modern-media-controls/controls/macos-compact-inline-media-controls.js: Removed.
+        * Modules/modern-media-controls/controls/macos-inline-media-controls.js:
+        (MacOSInlineMediaControls.prototype.get layoutTraits):
+        (MacOSInlineMediaControls.prototype.set layoutTraits):
+        (MacOSInlineMediaControls.prototype._matchLayoutTraits):
+        * Modules/modern-media-controls/js-files:
+        * Modules/modern-media-controls/media/media-controller.js:
+        (MediaController):
+        (MediaController.prototype.get layoutTraits):
+        (MediaController.prototype.handleEvent):
+        (MediaController.prototype._updateControlsIfNeeded):
+        (MediaController.prototype._controlsClassForLayoutTraits):
+        (MediaController.prototype._shouldFadeBetweenControls): Deleted.
+        (MediaController.prototype._controlsClass): Deleted.
+        * WebCore.xcodeproj/project.pbxproj:
+
 2017-02-08  Aakash Jain  <[email protected]>
 
         Move private methods from WKGraphics.h to a separate header file

Modified: trunk/Source/WebCore/Modules/modern-media-controls/controls/icon-button.js (211903 => 211904)


--- trunk/Source/WebCore/Modules/modern-media-controls/controls/icon-button.js	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/Source/WebCore/Modules/modern-media-controls/controls/icon-button.js	2017-02-08 22:57:38 UTC (rev 211904)
@@ -36,6 +36,7 @@
 
         this._image = null;
         this._iconName = "";
+        this._iconLayoutTraits = LayoutTraits.Unknown;
 
         if (!!iconName)
             this.iconName = iconName;
@@ -53,17 +54,7 @@
         if (this._iconName === iconName)
             return;
 
-        if (this._image)
-            this._image.removeEventListener("load", this);
-
-        this._image = iconService.imageForIconNameAndLayoutTraits(iconName, this.layoutTraits);
-
-        this._iconName = iconName;
-
-        if (this._image.complete)
-            this._updateImage();
-        else
-            this._image.addEventListener("load", this);
+        this._loadImage(iconName);
     }
 
     get on()
@@ -75,6 +66,12 @@
         this.element.classList.toggle("on", flag);
     }
 
+    layoutTraitsDidChange()
+    {
+        if (this._iconLayoutTraits !== this.layoutTraits)
+            this._loadImage(this._iconName);
+    }
+
     // Protected
 
     handleEvent(event)
@@ -95,6 +92,22 @@
 
     // Private
 
+    _loadImage(iconName)
+    {
+        if (this._image)
+            this._image.removeEventListener("load", this);
+
+        this._iconLayoutTraits = this.layoutTraits;
+        this._image = iconService.imageForIconNameAndLayoutTraits(iconName, this._iconLayoutTraits);
+
+        this._iconName = iconName;
+
+        if (this._image.complete)
+            this._updateImage();
+        else
+            this._image.addEventListener("load", this);
+    }
+
     _imageDidLoad()
     {
         this._image.removeEventListener("load", this);

Modified: trunk/Source/WebCore/Modules/modern-media-controls/controls/layout-item.js (211903 => 211904)


--- trunk/Source/WebCore/Modules/modern-media-controls/controls/layout-item.js	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/Source/WebCore/Modules/modern-media-controls/controls/layout-item.js	2017-02-08 22:57:38 UTC (rev 211904)
@@ -24,11 +24,13 @@
  */
 
 const LayoutTraits = {
-    Unknown     : 0,
-    macOS       : 1 << 0,
-    iOS         : 1 << 1,
-    Fullscreen  : 1 << 2,
-    Compact     : 1 << 3
+    Unknown        : 0,
+    macOS          : 1 << 0,
+    iOS            : 1 << 1,
+    Fullscreen     : 1 << 2,
+    Compact        : 1 << 3,
+    ReducedPadding : 1 << 4,
+    TightPadding   : 1 << 5
 };
 
 class LayoutItem extends LayoutNode

Deleted: trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-compact-inline-media-controls.js (211903 => 211904)


--- trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-compact-inline-media-controls.js	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-compact-inline-media-controls.js	2017-02-08 22:57:38 UTC (rev 211904)
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-class MacOSCompactInlineMediaControls extends MacOSInlineMediaControls
-{
-
-    constructor(options = {})
-    {
-        options.layoutTraits = LayoutTraits.macOS | LayoutTraits.Compact;
-
-        super(options);
-
-        this.element.classList.add("compact");
-
-        this.leftContainer.leftMargin = 8;
-        this.leftContainer.rightMargin = 12;
-        this.leftContainer.buttonMargin = 12;
-
-        this.rightContainer.buttons = [this.muteButton, this.fullscreenButton];
-        this.rightContainer.leftMargin = 12;
-        this.rightContainer.rightMargin = 8;
-        this.rightContainer.buttonMargin = 12;
-    }
-
-}

Modified: trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-inline-media-controls.js (211903 => 211904)


--- trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-inline-media-controls.js	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/Source/WebCore/Modules/modern-media-controls/controls/macos-inline-media-controls.js	2017-02-08 22:57:38 UTC (rev 211904)
@@ -38,10 +38,11 @@
         });
 
         this.rightContainer = new ButtonsContainer({
-            buttons: [this.muteButton, this.airplayButton, this.pipButton, this.tracksButton, this.fullscreenButton],
             cssClassName: "right"
         });
 
+        this._matchLayoutTraits();
+
         this._volumeSliderContainer = new LayoutNode(`<div class="volume-slider-container">`);
         this._volumeSliderContainer.children = [this.volumeSlider];
         this._volumeSliderContainer.visible = false;
@@ -57,6 +58,20 @@
 
     // Public
 
+    get layoutTraits()
+    {
+        return this._layoutTraits;
+    }
+
+    set layoutTraits(layoutTraits)
+    {
+        if (this._layoutTraits === layoutTraits)
+            return;
+
+        this._layoutTraits = layoutTraits;
+        this._matchLayoutTraits();
+    }
+
     layout()
     {
         super.layout();
@@ -133,4 +148,52 @@
             this.layout();
     }
 
+    // Private
+
+    _matchLayoutTraits()
+    {
+        if (!this.leftContainer || !this.rightContainer)
+            return;
+
+        const layoutTraits = this.layoutTraits;
+        if (layoutTraits & LayoutTraits.Compact) {
+            this.leftContainer.leftMargin = 8;
+            this.leftContainer.rightMargin = 12;
+            this.leftContainer.buttonMargin = 12;
+            this.rightContainer.leftMargin = 12;
+            this.rightContainer.rightMargin = 8;
+            this.rightContainer.buttonMargin = 12;
+        } else if (layoutTraits & LayoutTraits.TightPadding) {
+            this.leftContainer.leftMargin = 12;
+            this.leftContainer.rightMargin = 12;
+            this.leftContainer.buttonMargin = 12;
+            this.rightContainer.leftMargin = 12;
+            this.rightContainer.rightMargin = 12;
+            this.rightContainer.buttonMargin = 12;
+        } else if (layoutTraits & LayoutTraits.ReducedPadding) {
+            this.leftContainer.leftMargin = 12;
+            this.leftContainer.rightMargin = 16;
+            this.leftContainer.buttonMargin = 16;
+            this.rightContainer.leftMargin = 0;
+            this.rightContainer.rightMargin = 12;
+            this.rightContainer.buttonMargin = 16;
+        } else {
+            this.leftContainer.leftMargin = 24;
+            this.leftContainer.rightMargin = 24;
+            this.leftContainer.buttonMargin = 24;
+            this.rightContainer.leftMargin = 24;
+            this.rightContainer.rightMargin = 24;
+            this.rightContainer.buttonMargin = 24;
+        }
+
+        if (layoutTraits & LayoutTraits.Compact)
+            this.rightContainer.buttons = [this.muteButton, this.fullscreenButton];
+        else
+            this.rightContainer.buttons = [this.muteButton, this.airplayButton, this.pipButton, this.tracksButton, this.fullscreenButton];
+
+        this.leftContainer.buttons.forEach(button => button.layoutTraitsDidChange());
+        this.rightContainer.buttons.forEach(button => button.layoutTraitsDidChange());
+
+        this.element.classList.toggle("compact", layoutTraits & LayoutTraits.Compact);
+    }
 }

Modified: trunk/Source/WebCore/Modules/modern-media-controls/js-files (211903 => 211904)


--- trunk/Source/WebCore/Modules/modern-media-controls/js-files	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/Source/WebCore/Modules/modern-media-controls/js-files	2017-02-08 22:57:38 UTC (rev 211904)
@@ -33,7 +33,6 @@
 controls/ios-inline-media-controls.js
 controls/macos-media-controls.js
 controls/macos-inline-media-controls.js
-controls/macos-compact-inline-media-controls.js
 controls/macos-fullscreen-media-controls.js
 controls/placard.js
 controls/airplay-placard.js

Modified: trunk/Source/WebCore/Modules/modern-media-controls/media/media-controller.js (211903 => 211904)


--- trunk/Source/WebCore/Modules/modern-media-controls/media/media-controller.js	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/Source/WebCore/Modules/modern-media-controls/media/media-controller.js	2017-02-08 22:57:38 UTC (rev 211904)
@@ -24,6 +24,8 @@
  */
 
 const CompactModeMaxWidth = 241;
+const ReducedPaddingMaxWidth = 300;
+const AudioTightPaddingMaxWidth = 400;
 
 class MediaController
 {
@@ -47,6 +49,9 @@
 
         shadowRoot.addEventListener("resize", this);
 
+        media.videoTracks.addEventListener("addtrack", this);
+        media.videoTracks.addEventListener("removetrack", this);
+
         if (media.webkitSupportsPresentationMode)
             media.addEventListener("webkitpresentationmodechanged", this);
         else
@@ -62,9 +67,17 @@
         } else if (this.media.webkitDisplayingFullscreen)
             return traits | LayoutTraits.Fullscreen;
 
-        if (this._controlsWidth() <= CompactModeMaxWidth)
+        const controlsWidth = this._controlsWidth();
+        if (controlsWidth <= CompactModeMaxWidth)
             return traits | LayoutTraits.Compact;
 
+        const isAudio = this.media instanceof HTMLAudioElement || this.media.videoTracks.length === 0;
+        if (isAudio && controlsWidth <= AudioTightPaddingMaxWidth)
+            return traits | LayoutTraits.TightPadding;
+
+        if (!isAudio && controlsWidth <= ReducedPaddingMaxWidth)
+            return traits | LayoutTraits.ReducedPadding;
+
         return traits;
     }
 
@@ -83,10 +96,11 @@
 
     handleEvent(event)
     {
-        if (event.type === "resize" && event.currentTarget === this.shadowRoot) {
-            this._updateControlsSize();
+        if (event instanceof TrackEvent && event.currentTarget === this.media.videoTracks)
             this._updateControlsIfNeeded();
-        } else if (event.type === "click" && event.currentTarget === this.container)
+        else if (event.type === "resize" && event.currentTarget === this.shadowRoot)
+            this._updateControlsIfNeeded();
+        else if (event.type === "click" && event.currentTarget === this.container)
             this._containerWasClicked(event);
         else if (event.currentTarget === this.media) {
             this._updateControlsIfNeeded();
@@ -106,10 +120,14 @@
 
     _updateControlsIfNeeded()
     {
+        const layoutTraits = this.layoutTraits;
         const previousControls = this.controls;
-        const ControlsClass = this._controlsClass();
-        if (previousControls && previousControls.constructor === ControlsClass)
+        const ControlsClass = this._controlsClassForLayoutTraits(layoutTraits);
+        if (previousControls && previousControls.constructor === ControlsClass) {
+            this.controls.layoutTraits = layoutTraits;
+            this._updateControlsSize();
             return;
+        }
 
         // Before we reset the .controls property, we need to destroy the previous
         // supporting objects so we don't leak.
@@ -124,13 +142,13 @@
             this.controls.controlsBar.autoHideDelay = this.shadowRoot.host.dataset.autoHideDelay;
 
         if (previousControls) {
-            if (this._shouldFadeBetweenControls(previousControls, this.controls))
-                this.controls.fadeIn();
+            this.controls.fadeIn();
             this.container.replaceChild(this.controls.element, previousControls.element);
             this.controls.usesLTRUserInterfaceLayoutDirection = previousControls.usesLTRUserInterfaceLayoutDirection;
         } else
             this.container.appendChild(this.controls.element);        
 
+        this.controls.layoutTraits = layoutTraits;
         this._updateControlsSize();
 
         this._supportingObjects = [AirplaySupport, ControlsVisibilitySupport, FullscreenSupport, MuteSupport, PiPSupport, PlacardSupport, PlaybackSupport, ScrubbingSupport, SeekBackwardSupport, SeekForwardSupport, SkipBackSupport, StartSupport, StatusSupport, TimeLabelsSupport, TracksSupport, VolumeSupport, VolumeDownSupport, VolumeUpSupport].map(SupportClass => {
@@ -138,14 +156,6 @@
         }, this);
     }
 
-    _shouldFadeBetweenControls(previousControls, newControls)
-    {
-        // We don't fade when toggling between the various macOS inline modes.
-        if (previousControls instanceof MacOSInlineMediaControls && newControls instanceof MacOSInlineMediaControls)
-            return false;
-        return true;
-    }
-
     _updateControlsSize()
     {
         this.controls.width = this._controlsWidth();
@@ -163,15 +173,12 @@
             window.requestAnimationFrame(() => this.host.setPreparedToReturnVideoLayerToInline(this.media.webkitPresentationMode !== PiPMode));
     }
 
-    _controlsClass()
+    _controlsClassForLayoutTraits(layoutTraits)
     {
-        const layoutTraits = this.layoutTraits;
         if (layoutTraits & LayoutTraits.iOS)
             return IOSInlineMediaControls;
         if (layoutTraits & LayoutTraits.Fullscreen)
             return MacOSFullscreenMediaControls;
-        if (layoutTraits & LayoutTraits.Compact)
-            return MacOSCompactInlineMediaControls;
         return MacOSInlineMediaControls;
     }
 

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (211903 => 211904)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-02-08 22:50:18 UTC (rev 211903)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2017-02-08 22:57:38 UTC (rev 211904)
@@ -10195,7 +10195,6 @@
 		7177E2481DB80D2F00919A0B /* start-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode._javascript_; path = "start-support.js"; sourceTree = "<group>"; };
 		717F618B1E43D61A00F37024 /* controls-bar.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "controls-bar.css"; sourceTree = "<group>"; };
 		717F618C1E43D61A00F37024 /* macos-compact-inline-media-controls.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "macos-compact-inline-media-controls.css"; sourceTree = "<group>"; };
-		717F618D1E43D61A00F37024 /* macos-compact-inline-media-controls.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode._javascript_; path = "macos-compact-inline-media-controls.js"; sourceTree = "<group>"; };
 		717F618E1E43D61A00F37024 /* text-tracks.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "text-tracks.css"; sourceTree = "<group>"; };
 		717F618F1E43D66500F37024 /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; };
 		717F61901E43D66500F37024 /* [email protected] */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "[email protected]"; sourceTree = "<group>"; };
@@ -18446,7 +18445,6 @@
 				716FA0E51DB26591007323CC /* layout-item.js */,
 				716FA0E61DB26591007323CC /* layout-node.js */,
 				717F618C1E43D61A00F37024 /* macos-compact-inline-media-controls.css */,
-				717F618D1E43D61A00F37024 /* macos-compact-inline-media-controls.js */,
 				712157C01DCCCA0700AA7A92 /* macos-fullscreen-media-controls.css */,
 				712157C11DCCCA0700AA7A92 /* macos-fullscreen-media-controls.js */,
 				716FA0E71DB26591007323CC /* macos-inline-media-controls.css */,
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to