Title: [278618] trunk
Revision
278618
Author
[email protected]
Date
2021-06-08 10:27:33 -0700 (Tue, 08 Jun 2021)

Log Message

[Modern Media Controls] upstream new features
https://bugs.webkit.org/show_bug.cgi?id=226736
<rdar://problem/78957464>

Reviewed by Eric Carlson.

Source/WebCore:

 - bring the "Audio"/"Languages" tracks menu to iOS
 - add a new "Playback Speed" menu in the overflow menu on iOS and macOS
 - add support for showing the most relevant `<track kind="chapters">` in the overflow menu on iOS and macOS

Tests: media/modern-media-controls/overflow-button/overflow-button.html
       media/modern-media-controls/overflow-support/chapters.html
       media/modern-media-controls/overflow-support/playback-speed.html

* Modules/mediacontrols/MediaControlsHost.cpp:
(WebCore::MediaControlsHost::showMediaControlsContextMenu):
* Modules/modern-media-controls/media/overflow-support.js:
(OverflowSupport.prototype.get mediaEvents):
(OverflowSupport.prototype.get tracksToMonitor):
(OverflowSupport.prototype.syncControl):
* en.lproj/Localizable.strings:

* rendering/RenderTheme.h:
(WebCore::RenderTheme::mediaControlsScripts):
* rendering/RenderThemeAdwaita.cpp:
(WebCore::RenderThemeAdwaita::mediaControlsScripts):
* rendering/RenderThemeAdwaita.h:
* rendering/RenderThemeCocoa.h:
* rendering/RenderThemeCocoa.mm:
(WebCore::RenderThemeCocoa::purgeCaches):
(WebCore::RenderThemeCocoa::mediaControlsScripts):
* rendering/RenderThemeWin.h:
* rendering/RenderThemeWin.cpp:
(WebCore::RenderThemeWin::mediaControlsScripts):
Drop the "additional script" and lower the inline capacity of the `Vector`.

* testing/Internals.idl:
* testing/Internals.h:
* testing/Internals.cpp:
(WebCore::Internals::setMediaControlsHidePlaybackRates): Added.
* html/HTMLMediaElement.h:
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::setMediaControlsHidePlaybackRates): Added.
Since Playback Rates is always shown, provide a way for tests to turn it off.

Source/WTF:

 - bring the "Audio"/"Languages" tracks menu to iOS
 - add a new "Playback Speed" menu on iOS and macOS in the overflow menu
 - add support for showing the most relevant `<track kind="chapters">` in the overflow menu

* wtf/PlatformEnableCocoa.h:

LayoutTests:

* media/modern-media-controls/overflow-button/overflow-button.html: Added.
* media/modern-media-controls/overflow-button/overflow-button-expected.txt: Added.
* media/modern-media-controls/overflow-support/chapters.html: Added.
* media/modern-media-controls/overflow-support/chapters-expected.txt: Added.
* media/modern-media-controls/overflow-support/playback-speed.html: Added.
* media/modern-media-controls/overflow-support/playback-speed-expected.txt: Added.

* TestExpectations:
* platform/mac-wk2/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (278617 => 278618)


--- trunk/LayoutTests/ChangeLog	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/LayoutTests/ChangeLog	2021-06-08 17:27:33 UTC (rev 278618)
@@ -1,3 +1,21 @@
+2021-06-08  Devin Rousso  <[email protected]>
+
+        [Modern Media Controls] upstream new features
+        https://bugs.webkit.org/show_bug.cgi?id=226736
+        <rdar://problem/78957464>
+
+        Reviewed by Eric Carlson.
+
+        * media/modern-media-controls/overflow-button/overflow-button.html: Added.
+        * media/modern-media-controls/overflow-button/overflow-button-expected.txt: Added.
+        * media/modern-media-controls/overflow-support/chapters.html: Added.
+        * media/modern-media-controls/overflow-support/chapters-expected.txt: Added.
+        * media/modern-media-controls/overflow-support/playback-speed.html: Added.
+        * media/modern-media-controls/overflow-support/playback-speed-expected.txt: Added.
+
+        * TestExpectations:
+        * platform/mac-wk2/TestExpectations:
+
 2021-06-08  Antoine Quint  <[email protected]>
 
         REGRESSION (r256095): Adding a border-radius, border, or box-shadow breaks animations from scale(0)

Modified: trunk/LayoutTests/TestExpectations (278617 => 278618)


--- trunk/LayoutTests/TestExpectations	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/LayoutTests/TestExpectations	2021-06-08 17:27:33 UTC (rev 278618)
@@ -65,6 +65,7 @@
 fast/text/mac [ Skip ]
 scrollingcoordinator [ Skip ]
 media/ios [ Skip ]
+media/modern-media-controls/overflow-support [ Skip ]
 media/modern-media-controls/tracks-support [ Skip ]
 fast/text-autosizing [ Skip ]
 fast/css/variables/env/ios [ Skip ]

Added: trunk/LayoutTests/media/modern-media-controls/overflow-button/overflow-button-expected.txt (0 => 278618)


--- trunk/LayoutTests/media/modern-media-controls/overflow-button/overflow-button-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/overflow-button/overflow-button-expected.txt	2021-06-08 17:27:33 UTC (rev 278618)
@@ -0,0 +1,14 @@
+Testing the OverflowButton class.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS overflowButton.element.localName is "button"
+PASS overflowButton.element.classList.contains("overflow") is true
+PASS overflowButton.iconName is Icons.Overflow
+PASS overflowButton.image.element.style.webkitMaskImage.includes("macOS/Overflow.svg") became true
+PASS iOSOverflowButton.image.element.style.webkitMaskImage.includes("iOS/Overflow.svg") became true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/overflow-button/overflow-button.html (0 => 278618)


--- trunk/LayoutTests/media/modern-media-controls/overflow-button/overflow-button.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/overflow-button/overflow-button.html	2021-06-08 17:27:33 UTC (rev 278618)
@@ -0,0 +1,25 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<script src="" type="text/_javascript_"></script>
+<body>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>OverflowButton</code> class.");
+
+const overflowButton = new OverflowButton({ layoutTraits: LayoutTraits.macOS });
+
+shouldBeEqualToString("overflowButton.element.localName", "button");
+shouldBeTrue('overflowButton.element.classList.contains("overflow")');
+shouldBe("overflowButton.iconName", "Icons.Overflow");
+
+const iOSOverflowButton = new OverflowButton({ layoutTraits: LayoutTraits.iOS });
+
+shouldBecomeEqual('overflowButton.image.element.style.webkitMaskImage.includes("macOS/Overflow.svg")', "true", () => {
+    shouldBecomeEqual('iOSOverflowButton.image.element.style.webkitMaskImage.includes("iOS/Overflow.svg")', "true", finishJSTest);
+});
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/overflow-support/chapters-expected.txt (0 => 278618)


--- trunk/LayoutTests/media/modern-media-controls/overflow-support/chapters-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/overflow-support/chapters-expected.txt	2021-06-08 17:27:33 UTC (rev 278618)
@@ -0,0 +1,14 @@
+Testing the OverflowSupport behavior for Playback Speed.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS shadowRoot.querySelector('button.overflow') became different from null
+PASS shadowRoot.querySelector('button.overflow').getBoundingClientRect().width became different from 0
+Tapping overflow button...
+Selecting first chapter cue...
+PASS media.currentTime is >= 5
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/overflow-support/chapters.html (0 => 278618)


--- trunk/LayoutTests/media/modern-media-controls/overflow-support/chapters.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/overflow-support/chapters.html	2021-06-08 17:27:33 UTC (rev 278618)
@@ -0,0 +1,46 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<meta name="viewport" content="width=device-width">
+<script src=""
+<script src=""
+<script src=""
+<body>
+<video src="" style="position: absolute; left: 0; top: 0; width: 600px;" controls autoplay muted playsinline>
+    <track src="" kind="chapters">
+</video>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>OverflowSupport</code> behavior for Playback Speed.");
+
+const media = document.querySelector("video");
+const shadowRoot = window.internals.shadowRoot(media);
+
+window.internals.setMediaControlsHidePlaybackRates(media, true);
+
+let contextmenu = null;
+
+media.addEventListener("play", function() {
+    media.pause();
+
+    shouldBecomeDifferent("shadowRoot.querySelector('button.overflow')", "null", () => {
+        shouldBecomeDifferent("shadowRoot.querySelector('button.overflow').getBoundingClientRect().width", "0", async () => {
+            debug("Tapping overflow button...");
+            await pressOnElement(shadowRoot.querySelector("button.overflow"));
+            contextmenu = await getTracksContextMenu();
+
+            debug("Selecting first chapter cue...");
+            await UIHelper.chooseMenuAction("ipsum");
+            await UIHelper.waitForContextMenuToHide();
+
+            shouldBeGreaterThanOrEqual("media.currentTime", "5");
+
+            media.remove();
+            finishJSTest();
+        });
+    });
+});
+
+</script>
+<script src=""
+</body>

Added: trunk/LayoutTests/media/modern-media-controls/overflow-support/playback-speed-expected.txt (0 => 278618)


--- trunk/LayoutTests/media/modern-media-controls/overflow-support/playback-speed-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/overflow-support/playback-speed-expected.txt	2021-06-08 17:27:33 UTC (rev 278618)
@@ -0,0 +1,23 @@
+Testing the OverflowSupport behavior for Playback Speed.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS shadowRoot.querySelector('button.overflow') became different from null
+PASS shadowRoot.querySelector('button.overflow').getBoundingClientRect().width became different from 0
+Tapping overflow button...
+PASS checkedItems.length is 1
+PASS checkedItems[0].title is "1×"
+Changing playback speed via _javascript_...
+Tapping overflow button...
+PASS checkedItems.length is 1
+PASS checkedItems[0].title is "2×"
+Selecting '1.5×' playback speed...
+PASS media.playbackRate is 1.5
+Tapping overflow button...
+PASS checkedItems.length is 1
+PASS checkedItems[0].title is "1.5×"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Added: trunk/LayoutTests/media/modern-media-controls/overflow-support/playback-speed.html (0 => 278618)


--- trunk/LayoutTests/media/modern-media-controls/overflow-support/playback-speed.html	                        (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/overflow-support/playback-speed.html	2021-06-08 17:27:33 UTC (rev 278618)
@@ -0,0 +1,66 @@
+<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
+<meta name="viewport" content="width=device-width">
+<script src=""
+<script src=""
+<script src=""
+<body>
+<video src="" style="position: absolute; left: 0; top: 0; width: 600px;" controls autoplay muted playsinline></video>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>OverflowSupport</code> behavior for Playback Speed.");
+
+const multiplicationSign = "\u00d7";
+
+const media = document.querySelector("video");
+const shadowRoot = window.internals.shadowRoot(media);
+
+let contextmenu = null;
+let checkedItems = null;
+
+media.addEventListener("play", function() {
+    media.pause();
+
+    shouldBecomeDifferent("shadowRoot.querySelector('button.overflow')", "null", () => {
+        shouldBecomeDifferent("shadowRoot.querySelector('button.overflow').getBoundingClientRect().width", "0", async () => {
+            debug("Tapping overflow button...");
+            await pressOnElement(shadowRoot.querySelector("button.overflow"));
+            contextmenu = await getTracksContextMenu();
+            checkedItems = contextmenu[0].children.filter((item) => item.checked);
+            shouldBe("checkedItems.length", "1");
+            shouldBeEqualToString("checkedItems[0].title", `1${multiplicationSign}`);
+            await UIHelper.waitForContextMenuToHide();
+
+            debug("Changing playback speed via _javascript_...");
+            media.playbackRate = 2.0;
+
+            debug("Tapping overflow button...");
+            await pressOnElement(shadowRoot.querySelector("button.overflow"));
+            contextmenu = await getTracksContextMenu();
+            checkedItems = contextmenu[0].children.filter((item) => item.checked);
+            shouldBe("checkedItems.length", "1");
+            shouldBeEqualToString("checkedItems[0].title", `2${multiplicationSign}`);
+
+            debug(`Selecting '1.5${multiplicationSign}' playback speed...`);
+            await UIHelper.chooseMenuAction(`1.5${multiplicationSign}`);
+            await UIHelper.waitForContextMenuToHide();
+
+            shouldBe("media.playbackRate", "1.5");
+
+            debug("Tapping overflow button...");
+            await pressOnElement(shadowRoot.querySelector("button.overflow"));
+            contextmenu = await getTracksContextMenu();
+            checkedItems = contextmenu[0].children.filter((item) => item.checked);
+            shouldBe("checkedItems.length", "1");
+            shouldBeEqualToString("checkedItems[0].title", `1.5${multiplicationSign}`);
+
+            media.remove();
+            finishJSTest();
+        });
+    });
+});
+
+</script>
+<script src=""
+</body>

Modified: trunk/LayoutTests/platform/mac-wk2/TestExpectations (278617 => 278618)


--- trunk/LayoutTests/platform/mac-wk2/TestExpectations	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/LayoutTests/platform/mac-wk2/TestExpectations	2021-06-08 17:27:33 UTC (rev 278618)
@@ -19,6 +19,7 @@
 fast/visual-viewport/tiled-drawing [ Pass ]
 fast/web-share [ Pass ]
 imported/w3c/web-platform-tests/web-share [ Pass ]
+media/modern-media-controls/overflow-support [ Pass ]
 media/modern-media-controls/tracks-support [ Pass ]
 scrollingcoordinator [ Pass ]
 scrollingcoordinator/ios [ Skip ]

Modified: trunk/Source/WTF/ChangeLog (278617 => 278618)


--- trunk/Source/WTF/ChangeLog	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WTF/ChangeLog	2021-06-08 17:27:33 UTC (rev 278618)
@@ -1,3 +1,17 @@
+2021-06-08  Devin Rousso  <[email protected]>
+
+        [Modern Media Controls] upstream new features
+        https://bugs.webkit.org/show_bug.cgi?id=226736
+        <rdar://problem/78957464>
+
+        Reviewed by Eric Carlson.
+
+         - bring the "Audio"/"Languages" tracks menu to iOS
+         - add a new "Playback Speed" menu on iOS and macOS in the overflow menu
+         - add support for showing the most relevant `<track kind="chapters">` in the overflow menu
+
+        * wtf/PlatformEnableCocoa.h:
+
 2021-06-08  Sam Weinig  <[email protected]>
 
         Add copy of std::span so that we can use it pre-moving to c++20

Modified: trunk/Source/WTF/wtf/PlatformEnableCocoa.h (278617 => 278618)


--- trunk/Source/WTF/wtf/PlatformEnableCocoa.h	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WTF/wtf/PlatformEnableCocoa.h	2021-06-08 17:27:33 UTC (rev 278618)
@@ -321,7 +321,7 @@
 #define ENABLE_MEDIA_CONTROLS_SCRIPT 1
 #endif
 
-#if !defined(ENABLE_MEDIA_CONTROLS_CONTEXT_MENUS) && PLATFORM(MAC)
+#if !defined(ENABLE_MEDIA_CONTROLS_CONTEXT_MENUS) && (PLATFORM(MAC) || ((PLATFORM(IOS) || PLATFORM(MACCATALYST)) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 150000))
 #define ENABLE_MEDIA_CONTROLS_CONTEXT_MENUS 1
 #endif
 

Modified: trunk/Source/WebCore/ChangeLog (278617 => 278618)


--- trunk/Source/WebCore/ChangeLog	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/ChangeLog	2021-06-08 17:27:33 UTC (rev 278618)
@@ -1,5 +1,52 @@
 2021-06-08  Devin Rousso  <[email protected]>
 
+        [Modern Media Controls] upstream new features
+        https://bugs.webkit.org/show_bug.cgi?id=226736
+        <rdar://problem/78957464>
+
+        Reviewed by Eric Carlson.
+
+         - bring the "Audio"/"Languages" tracks menu to iOS
+         - add a new "Playback Speed" menu in the overflow menu on iOS and macOS
+         - add support for showing the most relevant `<track kind="chapters">` in the overflow menu on iOS and macOS
+
+        Tests: media/modern-media-controls/overflow-button/overflow-button.html
+               media/modern-media-controls/overflow-support/chapters.html
+               media/modern-media-controls/overflow-support/playback-speed.html
+
+        * Modules/mediacontrols/MediaControlsHost.cpp:
+        (WebCore::MediaControlsHost::showMediaControlsContextMenu):
+        * Modules/modern-media-controls/media/overflow-support.js:
+        (OverflowSupport.prototype.get mediaEvents):
+        (OverflowSupport.prototype.get tracksToMonitor):
+        (OverflowSupport.prototype.syncControl):
+        * en.lproj/Localizable.strings:
+
+        * rendering/RenderTheme.h:
+        (WebCore::RenderTheme::mediaControlsScripts):
+        * rendering/RenderThemeAdwaita.cpp:
+        (WebCore::RenderThemeAdwaita::mediaControlsScripts):
+        * rendering/RenderThemeAdwaita.h:
+        * rendering/RenderThemeCocoa.h:
+        * rendering/RenderThemeCocoa.mm:
+        (WebCore::RenderThemeCocoa::purgeCaches):
+        (WebCore::RenderThemeCocoa::mediaControlsScripts):
+        * rendering/RenderThemeWin.h:
+        * rendering/RenderThemeWin.cpp:
+        (WebCore::RenderThemeWin::mediaControlsScripts):
+        Drop the "additional script" and lower the inline capacity of the `Vector`.
+
+        * testing/Internals.idl:
+        * testing/Internals.h:
+        * testing/Internals.cpp:
+        (WebCore::Internals::setMediaControlsHidePlaybackRates): Added.
+        * html/HTMLMediaElement.h:
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::setMediaControlsHidePlaybackRates): Added.
+        Since Playback Rates is always shown, provide a way for tests to turn it off.
+
+2021-06-08  Devin Rousso  <[email protected]>
+
         Require that callsites of `SnapshotOptions` specify a `PixelFormat` and `DestinationColorSpace`
         https://bugs.webkit.org/show_bug.cgi?id=226756
 

Modified: trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp (278617 => 278618)


--- trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp	2021-06-08 17:27:33 UTC (rev 278618)
@@ -55,8 +55,10 @@
 #include "PageGroup.h"
 #include "RenderTheme.h"
 #include "TextTrack.h"
+#include "TextTrackCueList.h"
 #include "TextTrackList.h"
 #include "UserGestureIndicator.h"
+#include "VTTCue.h"
 #include "VoidCallback.h"
 #include <_javascript_Core/JSCJSValueInlines.h>
 #include <wtf/CompletionHandler.h>
@@ -65,10 +67,6 @@
 #include <wtf/UUID.h>
 #include <wtf/Variant.h>
 
-#if USE(APPLE_INTERNAL_SDK)
-#include <WebKitAdditions/MediaControlsHostAdditions.cpp>
-#endif
-
 namespace WebCore {
 
 const AtomString& MediaControlsHost::automaticKeyword()
@@ -358,14 +356,6 @@
 
 #if ENABLE(MEDIA_CONTROLS_CONTEXT_MENUS)
 
-#if !defined(MediaControlsHostAdditions_showMediaControlsContextMenu_MenuData)
-#define MediaControlsHostAdditions_showMediaControlsContextMenu_MenuData
-#endif
-
-#if !defined(MediaControlsHostAdditions_showMediaControlsContextMenu_MenuData_switchOn)
-#define MediaControlsHostAdditions_showMediaControlsContextMenu_MenuData_switchOn
-#endif
-
 #if ENABLE(CONTEXT_MENUS) && USE(ACCESSIBILITY_CONTEXT_MENUS)
 class MediaControlsContextMenuProvider final : public ContextMenuProvider {
 public:
@@ -506,13 +496,22 @@
     enum class PictureInPictureTag { IncludePictureInPicture };
 #endif // ENABLE(VIDEO_PRESENTATION_MODE)
 
+    enum class PlaybackSpeed {
+        x0_5,
+        x1_0,
+        x1_25,
+        x1_5,
+        x2_0,
+    };
+
     using MenuData = Variant<
 #if ENABLE(VIDEO_PRESENTATION_MODE)
         PictureInPictureTag,
 #endif // ENABLE(VIDEO_PRESENTATION_MODE)
         RefPtr<AudioTrack>,
-        RefPtr<TextTrack>
-        MediaControlsHostAdditions_showMediaControlsContextMenu_MenuData
+        RefPtr<TextTrack>,
+        RefPtr<VTTCue>,
+        PlaybackSpeed
     >;
     HashMap<MenuItemIdentifier, MenuData> idMap;
 
@@ -586,10 +585,46 @@
         }
     }
 
-#if defined(MediaControlsHostAdditions_showMediaControlsContextMenu_options)
-    MediaControlsHostAdditions_showMediaControlsContextMenu_options
-#endif
+    if (optionsJSONObject->getBoolean("includeChapters"_s).value_or(false)) {
+        if (auto* textTracks = mediaElement.textTracks(); textTracks && textTracks->length()) {
+            auto& captionPreferences = page->group().captionPreferences();
 
+            for (auto& textTrack : captionPreferences.sortedTrackListForMenu(textTracks, { TextTrack::Kind::Chapters })) {
+                Vector<MenuItem> chapterMenuItems;
+
+                if (auto* cues = textTrack->cues()) {
+                    for (unsigned i = 0; i < cues->length(); ++i) {
+                        auto* cue = cues->item(i);
+                        if (!is<VTTCue>(cue))
+                            continue;
+
+                        auto& vttCue = downcast<VTTCue>(*cue);
+                        chapterMenuItems.append(createMenuItem(makeRefPtr(vttCue), vttCue.text()));
+                    }
+                }
+
+                if (!chapterMenuItems.isEmpty()) {
+                    items.append(createSubmenu(captionPreferences.displayNameForTrack(textTrack.get()), "list.bullet"_s, WTFMove(chapterMenuItems)));
+
+                    /* Only show the first valid chapters track. */
+                    break;
+                }
+            }
+        }
+    }
+
+    if (optionsJSONObject->getBoolean("includePlaybackRates"_s).value_or(false)) {
+        auto playbackRate = mediaElement.playbackRate();
+
+        items.append(createSubmenu(WEB_UI_STRING_KEY("Playback Speed", "Playback Speed (Media Controls Menu)", "Playback Speed media controls context menu title"), "speedometer"_s, {
+            createMenuItem(PlaybackSpeed::x0_5, WEB_UI_STRING_KEY("0.5×", "0.5× (Media Controls Menu Playback Speed)", "0.5× media controls context menu playback speed label"), playbackRate == 0.5),
+            createMenuItem(PlaybackSpeed::x1_0, WEB_UI_STRING_KEY("1×", "1× (Media Controls Menu Playback Speed)", "1× media controls context menu playback speed label"), playbackRate == 1.0),
+            createMenuItem(PlaybackSpeed::x1_25, WEB_UI_STRING_KEY("1.25×", "1.25× (Media Controls Menu Playback Speed)", "1.25× media controls context menu playback speed label"), playbackRate == 1.25),
+            createMenuItem(PlaybackSpeed::x1_5, WEB_UI_STRING_KEY("1.5×", "1.5× (Media Controls Menu Playback Speed)", "1.5× media controls context menu playback speed label"), playbackRate == 1.5),
+            createMenuItem(PlaybackSpeed::x2_0, WEB_UI_STRING_KEY("2×", "2× (Media Controls Menu Playback Speed)", "2× media controls context menu playback speed label"), playbackRate == 2.0),
+        }));
+    }
+
 #if ENABLE(CONTEXT_MENUS) && USE(ACCESSIBILITY_CONTEXT_MENUS)
     if ((items.size() == 1 && items[0].type() == SubmenuType) || optionsJSONObject->getBoolean("promoteSubMenus"_s).value_or(false)) {
         for (auto&& item : std::exchange(items, { })) {
@@ -645,9 +680,42 @@
                         (*textTrack)->setMode(TextTrack::Mode::Disabled);
                 }
                 mediaElement.setSelectedTextTrack(selectedTextTrack.get());
+            },
+            [&] (RefPtr<VTTCue>& cue) {
+                mediaElement.setCurrentTime(cue->startMediaTime());
+            },
+            [&] (PlaybackSpeed playbackSpeed) {
+                switch (playbackSpeed) {
+                case PlaybackSpeed::x0_5:
+                    mediaElement.setDefaultPlaybackRate(0.5);
+                    mediaElement.setPlaybackRate(0.5);
+                    return;
+
+                case PlaybackSpeed::x1_0:
+                    mediaElement.setDefaultPlaybackRate(1.0);
+                    mediaElement.setPlaybackRate(1.0);
+                    return;
+
+                case PlaybackSpeed::x1_25:
+                    mediaElement.setDefaultPlaybackRate(1.25);
+                    mediaElement.setPlaybackRate(1.25);
+                    return;
+
+                case PlaybackSpeed::x1_5:
+                    mediaElement.setDefaultPlaybackRate(1.5);
+                    mediaElement.setPlaybackRate(1.5);
+                    return;
+
+                case PlaybackSpeed::x2_0:
+                    mediaElement.setDefaultPlaybackRate(2.0);
+                    mediaElement.setPlaybackRate(2.0);
+                    return;
+                }
+
+                ASSERT_NOT_REACHED();
             }
-            MediaControlsHostAdditions_showMediaControlsContextMenu_MenuData_switchOn
         );
+
     };
 
     auto bounds = target.boundsInRootViewSpace();

Modified: trunk/Source/WebCore/Modules/modern-media-controls/media/overflow-support.js (278617 => 278618)


--- trunk/Source/WebCore/Modules/modern-media-controls/media/overflow-support.js	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/Modules/modern-media-controls/media/overflow-support.js	2021-06-08 17:27:33 UTC (rev 278618)
@@ -30,16 +30,12 @@
 
     get mediaEvents()
     {
-        let mediaEvents = [];
-        window["WebKitAdditions.OverflowSupport.prototype.get_mediaEvents"]?.(this, mediaEvents);
-        return mediaEvents;
+        return ["loadstart", "loadedmetadata"];
     }
 
     get tracksToMonitor()
     {
-        let tracksToMonitor = [];
-        window["WebKitAdditions.OverflowSupport.prototype.get_tracksToMonitor"]?.(this, tracksToMonitor);
-        return tracksToMonitor;
+        return [this.mediaController.media.textTracks];
     }
 
     get control()
@@ -57,7 +53,19 @@
         this.control.enabled = this.mediaController.canShowMediaControlsContextMenu;
 
         let defaultContextMenuOptions = {};
-        window["WebKitAdditions.OverflowSupport.prototype.syncControl"]?.(this, defaultContextMenuOptions);
+
+        if (!this.mediaController.hidePlaybackRates && (!window.MediaStream || !(this.mediaController.media.srcObject instanceof MediaStream)))
+            defaultContextMenuOptions.includePlaybackRates = true;
+
+        for (let textTrack of this.mediaController.media.textTracks) {
+            if (textTrack.kind !== "chapters")
+                continue;
+
+            if (textTrack.mode === "disabled")
+                textTrack.mode = "hidden";
+            defaultContextMenuOptions.includeChapters = true;
+        }
+
         this.control.defaultContextMenuOptions = defaultContextMenuOptions;
     }
 

Modified: trunk/Source/WebCore/en.lproj/Localizable.strings (278617 => 278618)


--- trunk/Source/WebCore/en.lproj/Localizable.strings	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/en.lproj/Localizable.strings	2021-06-08 17:27:33 UTC (rev 278618)
@@ -97,12 +97,27 @@
 /* Present the element <select multiple> when no <option> items are selected (iOS only) */
 "0 Items" = "0 Items";
 
+/* 0.5× media controls context menu playback speed label */
+"0.5× (Media Controls Menu Playback Speed)" = "0.5×";
+
 /* Present the element <select multiple> when a single <option> is selected (iOS only) */
 "1 Item" = "1 Item";
 
+/* 1× media controls context menu playback speed label */
+"1× (Media Controls Menu Playback Speed)" = "1×";
+
+/* 1.25× media controls context menu playback speed label */
+"1.25× (Media Controls Menu Playback Speed)" = "1.25×";
+
+/* 1.5× media controls context menu playback speed label */
+"1.5× (Media Controls Menu Playback Speed)" = "1.5×";
+
 /* Option in segmented control for choosing list type in text editing */
 "1. 2. 3." = "1. 2. 3.";
 
+/* 2× media controls context menu playback speed label */
+"2× (Media Controls Menu Playback Speed)" = "2×";
+
 /* Menu item title for KEYGEN pop-up menu */
 "2048 (High Grade)" = "2048 (High Grade)";
 
@@ -706,6 +721,9 @@
 /* Media Play context menu item */
 "Play" = "Play";
 
+/* Playback Speed media controls context menu title */
+"Playback Speed (Media Controls Menu)" = "Playback Speed";
+
 /* accessibility help text for enter full screen button */
 "Play movie in full screen mode" = "Play movie in full screen mode";
 

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (278617 => 278618)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2021-06-08 17:27:33 UTC (rev 278618)
@@ -7490,6 +7490,11 @@
     setControllerJSProperty("maximumRightContainerButtonCountOverride", JSC::jsNumber(count));
 }
 
+void HTMLMediaElement::setMediaControlsHidePlaybackRates(bool hidePlaybackRates)
+{
+    setControllerJSProperty("hidePlaybackRates", JSC::jsBoolean(hidePlaybackRates));
+}
+
 unsigned long long HTMLMediaElement::fileSize() const
 {
     if (m_player)

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (278617 => 278618)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2021-06-08 17:27:33 UTC (rev 278618)
@@ -494,6 +494,7 @@
     void userInterfaceLayoutDirectionChanged();
     WEBCORE_EXPORT String getCurrentMediaControlsStatus();
     WEBCORE_EXPORT void setMediaControlsMaximumRightContainerButtonCountOverride(size_t);
+    WEBCORE_EXPORT void setMediaControlsHidePlaybackRates(bool);
     MediaControlsHost* mediaControlsHost() { return m_mediaControlsHost.get(); }
 
     bool isDisablingSleep() const { return m_sleepDisabler.get(); }

Modified: trunk/Source/WebCore/rendering/RenderTheme.h (278617 => 278618)


--- trunk/Source/WebCore/rendering/RenderTheme.h	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/rendering/RenderTheme.h	2021-06-08 17:27:33 UTC (rev 278618)
@@ -86,7 +86,7 @@
 #if ENABLE(VIDEO)
     virtual String mediaControlsStyleSheet() { return String(); }
     virtual String extraMediaControlsStyleSheet() { return String(); }
-    virtual Vector<String, 3> mediaControlsScripts() { return { }; }
+    virtual Vector<String, 2> mediaControlsScripts() { return { }; }
 #if ENABLE(MODERN_MEDIA_CONTROLS)
     virtual String mediaControlsBase64StringForIconNameAndType(const String&, const String&) { return String(); }
     virtual String mediaControlsFormattedStringForDuration(double) { return String(); }

Modified: trunk/Source/WebCore/rendering/RenderThemeAdwaita.cpp (278617 => 278618)


--- trunk/Source/WebCore/rendering/RenderThemeAdwaita.cpp	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/rendering/RenderThemeAdwaita.cpp	2021-06-08 17:27:33 UTC (rev 278618)
@@ -172,7 +172,7 @@
     return StringImpl::createWithoutCopying(mediaControlsAdwaitaUserAgentStyleSheet, sizeof(mediaControlsAdwaitaUserAgentStyleSheet));
 }
 
-Vector<String, 3> RenderThemeAdwaita::mediaControlsScripts()
+Vector<String, 2> RenderThemeAdwaita::mediaControlsScripts()
 {
     return { StringImpl::createWithoutCopying(mediaControlsAdwaitaJavaScript, sizeof(mediaControlsAdwaitaJavaScript)) };
 }

Modified: trunk/Source/WebCore/rendering/RenderThemeAdwaita.h (278617 => 278618)


--- trunk/Source/WebCore/rendering/RenderThemeAdwaita.h	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/rendering/RenderThemeAdwaita.h	2021-06-08 17:27:33 UTC (rev 278618)
@@ -37,7 +37,7 @@
     String extraDefaultStyleSheet() final;
 #if ENABLE(VIDEO)
     String extraMediaControlsStyleSheet() final;
-    Vector<String, 3> mediaControlsScripts() final;
+    Vector<String, 2> mediaControlsScripts() final;
 #endif
 
     bool supportsHover(const RenderStyle&) const final { return true; }

Modified: trunk/Source/WebCore/rendering/RenderThemeCocoa.h (278617 => 278618)


--- trunk/Source/WebCore/rendering/RenderThemeCocoa.h	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/rendering/RenderThemeCocoa.h	2021-06-08 17:27:33 UTC (rev 278618)
@@ -53,13 +53,12 @@
 
 #if ENABLE(VIDEO) && ENABLE(MODERN_MEDIA_CONTROLS)
     String mediaControlsStyleSheet() override;
-    Vector<String, 3> mediaControlsScripts() override;
+    Vector<String, 2> mediaControlsScripts() override;
     String mediaControlsBase64StringForIconNameAndType(const String&, const String&) override;
     String mediaControlsFormattedStringForDuration(double) override;
 
     String m_mediaControlsLocalizedStringsScript;
     String m_mediaControlsScript;
-    String m_mediaControlsAdditionalScript;
     String m_mediaControlsStyleSheet;
     RetainPtr<NSDateComponentsFormatter> m_durationFormatter;
 #endif // ENABLE(VIDEO) && ENABLE(MODERN_MEDIA_CONTROLS)

Modified: trunk/Source/WebCore/rendering/RenderThemeCocoa.mm (278617 => 278618)


--- trunk/Source/WebCore/rendering/RenderThemeCocoa.mm	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/rendering/RenderThemeCocoa.mm	2021-06-08 17:27:33 UTC (rev 278618)
@@ -50,10 +50,6 @@
 #import <pal/cocoa/PassKitSoftLink.h>
 #endif
 
-#if USE(APPLE_INTERNAL_SDK)
-#include <WebKitAdditions/RenderThemeCocoaAdditions.cpp>
-#endif
-
 @interface WebCoreRenderThemeBundle : NSObject
 @end
 
@@ -72,7 +68,6 @@
 #if ENABLE(VIDEO) && ENABLE(MODERN_MEDIA_CONTROLS)
     m_mediaControlsLocalizedStringsScript.clearImplIfNotShared();
     m_mediaControlsScript.clearImplIfNotShared();
-    m_mediaControlsAdditionalScript.clearImplIfNotShared();
     m_mediaControlsStyleSheet.clearImplIfNotShared();
 #endif // ENABLE(VIDEO) && ENABLE(MODERN_MEDIA_CONTROLS)
 
@@ -188,7 +183,7 @@
     return m_mediaControlsStyleSheet;
 }
 
-Vector<String, 3> RenderThemeCocoa::mediaControlsScripts()
+Vector<String, 2> RenderThemeCocoa::mediaControlsScripts()
 {
     // FIXME: Localized strings are not worth having a script. We should make it JSON data etc. instead.
     if (m_mediaControlsLocalizedStringsScript.isEmpty()) {
@@ -199,15 +194,9 @@
     if (m_mediaControlsScript.isEmpty())
         m_mediaControlsScript = StringImpl::createWithoutCopying(ModernMediaControlsJavaScript, sizeof(ModernMediaControlsJavaScript));
 
-#if defined(RenderThemeCocoaAdditions_mediaControlsAdditionalScript)
-    if (m_mediaControlsAdditionalScript.isEmpty())
-        m_mediaControlsAdditionalScript = String(RenderThemeCocoaAdditions_mediaControlsAdditionalScript);
-#endif
-
     return {
         m_mediaControlsLocalizedStringsScript,
         m_mediaControlsScript,
-        m_mediaControlsAdditionalScript,
     };
 }
 

Modified: trunk/Source/WebCore/rendering/RenderThemeWin.cpp (278617 => 278618)


--- trunk/Source/WebCore/rendering/RenderThemeWin.cpp	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/rendering/RenderThemeWin.cpp	2021-06-08 17:27:33 UTC (rev 278618)
@@ -1079,7 +1079,7 @@
 #endif
 }
 
-Vector<String, 3> RenderThemeWin::mediaControlsScripts()
+Vector<String, 2> RenderThemeWin::mediaControlsScripts()
 {
 #if ENABLE(MEDIA_CONTROLS_SCRIPT)
     if (m_mediaControlsScript.isEmpty()) {

Modified: trunk/Source/WebCore/rendering/RenderThemeWin.h (278617 => 278618)


--- trunk/Source/WebCore/rendering/RenderThemeWin.h	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/rendering/RenderThemeWin.h	2021-06-08 17:27:33 UTC (rev 278618)
@@ -121,7 +121,7 @@
 
 #if ENABLE(VIDEO)
     String mediaControlsStyleSheet() override;
-    Vector<String, 3> mediaControlsScripts() override;
+    Vector<String, 2> mediaControlsScripts() override;
 #endif
 
     IntSize meterSizeForBounds(const RenderMeter&, const IntRect&) const override;

Modified: trunk/Source/WebCore/testing/Internals.cpp (278617 => 278618)


--- trunk/Source/WebCore/testing/Internals.cpp	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/testing/Internals.cpp	2021-06-08 17:27:33 UTC (rev 278618)
@@ -4822,6 +4822,11 @@
     mediaElement.setMediaControlsMaximumRightContainerButtonCountOverride(count);
 }
 
+void Internals::setMediaControlsHidePlaybackRates(HTMLMediaElement& mediaElement, bool hidePlaybackRates)
+{
+    mediaElement.setMediaControlsHidePlaybackRates(hidePlaybackRates);
+}
+
 #endif // ENABLE(VIDEO)
 
 #if !PLATFORM(COCOA)

Modified: trunk/Source/WebCore/testing/Internals.h (278617 => 278618)


--- trunk/Source/WebCore/testing/Internals.h	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/testing/Internals.h	2021-06-08 17:27:33 UTC (rev 278618)
@@ -752,6 +752,7 @@
 #if ENABLE(VIDEO)
     String getCurrentMediaControlsStatusForElement(HTMLMediaElement&);
     void setMediaControlsMaximumRightContainerButtonCountOverride(HTMLMediaElement&, size_t);
+    void setMediaControlsHidePlaybackRates(HTMLMediaElement&, bool);
 #endif // ENABLE(VIDEO)
 
     String userVisibleString(const DOMURL&);

Modified: trunk/Source/WebCore/testing/Internals.idl (278617 => 278618)


--- trunk/Source/WebCore/testing/Internals.idl	2021-06-08 17:09:41 UTC (rev 278617)
+++ trunk/Source/WebCore/testing/Internals.idl	2021-06-08 17:27:33 UTC (rev 278618)
@@ -785,6 +785,7 @@
 
     [Conditional=VIDEO] DOMString getCurrentMediaControlsStatusForElement(HTMLMediaElement element);
     [Conditional=VIDEO] undefined setMediaControlsMaximumRightContainerButtonCountOverride(HTMLMediaElement element, unsigned long count);
+    [Conditional=VIDEO] undefined setMediaControlsHidePlaybackRates(HTMLMediaElement element, boolean hidePlaybackRates);
 
     DOMString userVisibleString(DOMURL url);
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to