Diff
Modified: trunk/LayoutTests/ChangeLog (208584 => 208585)
--- trunk/LayoutTests/ChangeLog 2016-11-11 08:33:34 UTC (rev 208584)
+++ trunk/LayoutTests/ChangeLog 2016-11-11 09:48:37 UTC (rev 208585)
@@ -1,3 +1,21 @@
+2016-11-11 Antoine Quint <grao...@apple.com>
+
+ [Modern Media Controls] Media Controller: media tracks control support
+ https://bugs.webkit.org/show_bug.cgi?id=164618
+ <rdar://problem/27989483>
+
+ Reviewed by Dean Jackson.
+
+ Adding new tests to check that we enable the media tracks button when we have text tracks
+ or multiple audio tracks, and that it's disabled otherwise.
+
+ * media/modern-media-controls/tracks-support/tracks-support-audio-tracks-expected.txt: Added.
+ * media/modern-media-controls/tracks-support/tracks-support-audio-tracks.html: Added.
+ * media/modern-media-controls/tracks-support/tracks-support-no-tracks-expected.txt: Added.
+ * media/modern-media-controls/tracks-support/tracks-support-no-tracks.html: Added.
+ * media/modern-media-controls/tracks-support/tracks-support-text-tracks-expected.txt: Added.
+ * media/modern-media-controls/tracks-support/tracks-support-text-tracks.html: Added.
+
2016-11-10 Yusuke Suzuki <utatane....@gmail.com>
[DOMJIT] Document#body should have DOMJIT patchpoint
Added: trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-audio-tracks-expected.txt (0 => 208585)
--- trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-audio-tracks-expected.txt (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-audio-tracks-expected.txt 2016-11-11 09:48:37 UTC (rev 208585)
@@ -0,0 +1,11 @@
+Testing the TracksSupport behavior with audio tracks.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS mediaController.controls.tracksButton.enabled is true
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-audio-tracks.html (0 => 208585)
--- trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-audio-tracks.html (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-audio-tracks.html 2016-11-11 09:48:37 UTC (rev 208585)
@@ -0,0 +1,26 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<body>
+<video src="" style="width: 320px; height: 240px;"></video>
+<div id="shadow"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>TracksSupport</code> behavior with audio tracks.");
+
+const shadowRoot = document.querySelector("div#shadow").attachShadow({ mode: "open" });
+const media = document.querySelector("video");
+const mediaController = createControls(shadowRoot, media, null);
+
+media.addEventListener("loadedmetadata", function() {
+ shouldBeTrue("mediaController.controls.tracksButton.enabled");
+ debug("");
+ shadowRoot.host.remove();
+ media.remove();
+ finishJSTest();
+});
+
+</script>
+<script src=""
+</body>
Added: trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-no-tracks-expected.txt (0 => 208585)
--- trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-no-tracks-expected.txt (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-no-tracks-expected.txt 2016-11-11 09:48:37 UTC (rev 208585)
@@ -0,0 +1,11 @@
+Testing the TracksSupport behavior with no tracks.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS mediaController.controls.tracksButton.enabled is false
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-no-tracks.html (0 => 208585)
--- trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-no-tracks.html (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-no-tracks.html 2016-11-11 09:48:37 UTC (rev 208585)
@@ -0,0 +1,26 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<body>
+<video src="" style="width: 320px; height: 240px;"></video>
+<div id="shadow"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>TracksSupport</code> behavior with no tracks.");
+
+const shadowRoot = document.querySelector("div#shadow").attachShadow({ mode: "open" });
+const media = document.querySelector("video");
+const mediaController = createControls(shadowRoot, media, null);
+
+media.addEventListener("loadedmetadata", function() {
+ shouldBeFalse("mediaController.controls.tracksButton.enabled");
+ debug("");
+ shadowRoot.host.remove();
+ media.remove();
+ finishJSTest();
+});
+
+</script>
+<script src=""
+</body>
Added: trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-text-tracks-expected.txt (0 => 208585)
--- trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-text-tracks-expected.txt (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-text-tracks-expected.txt 2016-11-11 09:48:37 UTC (rev 208585)
@@ -0,0 +1,11 @@
+Testing the TracksSupport behavior with text tracks.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS mediaController.controls.tracksButton.enabled is true
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-text-tracks.html (0 => 208585)
--- trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-text-tracks.html (rev 0)
+++ trunk/LayoutTests/media/modern-media-controls/tracks-support/tracks-support-text-tracks.html 2016-11-11 09:48:37 UTC (rev 208585)
@@ -0,0 +1,26 @@
+<script src=""
+<script src="" type="text/_javascript_"></script>
+<body>
+<video src="" style="width: 320px; height: 240px;"></video>
+<div id="shadow"></div>
+<script type="text/_javascript_">
+
+window.jsTestIsAsync = true;
+
+description("Testing the <code>TracksSupport</code> behavior with text tracks.");
+
+const shadowRoot = document.querySelector("div#shadow").attachShadow({ mode: "open" });
+const media = document.querySelector("video");
+const mediaController = createControls(shadowRoot, media, null);
+
+media.addEventListener("loadedmetadata", function() {
+ shouldBeTrue("mediaController.controls.tracksButton.enabled");
+ debug("");
+ shadowRoot.host.remove();
+ media.remove();
+ finishJSTest();
+});
+
+</script>
+<script src=""
+</body>
Modified: trunk/Source/WebCore/ChangeLog (208584 => 208585)
--- trunk/Source/WebCore/ChangeLog 2016-11-11 08:33:34 UTC (rev 208584)
+++ trunk/Source/WebCore/ChangeLog 2016-11-11 09:48:37 UTC (rev 208585)
@@ -1,3 +1,30 @@
+2016-11-11 Antoine Quint <grao...@apple.com>
+
+ [Modern Media Controls] Media Controller: media tracks control support
+ https://bugs.webkit.org/show_bug.cgi?id=164618
+ <rdar://problem/27989483>
+
+ Reviewed by Dean Jackson.
+
+ We introduce the TracksSupport class to only enable the media tracks button
+ in the media controls when text tracks and/or multiple audio tracks are available.
+
+ Tests: media/modern-media-controls/tracks-support/tracks-support-audio-tracks.html
+ media/modern-media-controls/tracks-support/tracks-support-no-tracks.html
+ media/modern-media-controls/tracks-support/tracks-support-text-tracks.html
+
+ * Modules/modern-media-controls/js-files:
+ * Modules/modern-media-controls/media/media-controller.js:
+ (MediaController.prototype._updateControlsIfNeeded):
+ * Modules/modern-media-controls/media/tracks-support.js: Added.
+ (TracksSupport):
+ (TracksSupport.prototype.destroy):
+ (TracksSupport.prototype.get control):
+ (TracksSupport.prototype.get mediaEvents):
+ (TracksSupport.prototype.buttonWasClicked):
+ (TracksSupport.prototype.syncControl):
+ * WebCore.xcodeproj/project.pbxproj:
+
2016-11-10 Yusuke Suzuki <utatane....@gmail.com>
[DOMJIT] DOMJIT accessor attribute in IDL should say like DOMJIT=Getter
Modified: trunk/Source/WebCore/Modules/modern-media-controls/js-files (208584 => 208585)
--- trunk/Source/WebCore/Modules/modern-media-controls/js-files 2016-11-11 08:33:34 UTC (rev 208584)
+++ trunk/Source/WebCore/Modules/modern-media-controls/js-files 2016-11-11 09:48:37 UTC (rev 208585)
@@ -43,6 +43,7 @@
media/skip-back-support.js
media/start-support.js
media/status-support.js
+media/tracks-support.js
media/volume-support.js
media/media-controller.js
main.js
Modified: trunk/Source/WebCore/Modules/modern-media-controls/media/media-controller.js (208584 => 208585)
--- trunk/Source/WebCore/Modules/modern-media-controls/media/media-controller.js 2016-11-11 08:33:34 UTC (rev 208584)
+++ trunk/Source/WebCore/Modules/modern-media-controls/media/media-controller.js 2016-11-11 09:48:37 UTC (rev 208585)
@@ -92,7 +92,7 @@
this._updateControlsSize();
- this._supportingObjects = [AirplaySupport, ElapsedTimeSupport, FullscreenSupport, MuteSupport, PiPSupport, PlacardSupport, PlaybackSupport, RemainingTimeSupport, ScrubbingSupport, SkipBackSupport, StartSupport, StatusSupport, VolumeSupport].map(SupportClass => {
+ this._supportingObjects = [AirplaySupport, ElapsedTimeSupport, FullscreenSupport, MuteSupport, PiPSupport, PlacardSupport, PlaybackSupport, RemainingTimeSupport, ScrubbingSupport, SkipBackSupport, StartSupport, StatusSupport, TracksSupport, VolumeSupport].map(SupportClass => {
return new SupportClass(this);
}, this);
}
Added: trunk/Source/WebCore/Modules/modern-media-controls/media/tracks-support.js (0 => 208585)
--- trunk/Source/WebCore/Modules/modern-media-controls/media/tracks-support.js (rev 0)
+++ trunk/Source/WebCore/Modules/modern-media-controls/media/tracks-support.js 2016-11-11 09:48:37 UTC (rev 208585)
@@ -0,0 +1,84 @@
+/*
+ * 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 TracksSupport extends MediaControllerSupport
+{
+
+ constructor(mediaController)
+ {
+ super(mediaController);
+
+ if (!this.control)
+ return;
+
+ const media = mediaController.media;
+ for (let tracks of [media.audioTracks, media.textTracks]) {
+ for (let eventType of ["addtrack", "removetrack"])
+ tracks.addEventListener(eventType, this);
+ }
+ }
+
+ // Public
+
+ destroy()
+ {
+ super.destroy();
+
+ const media = mediaController.media;
+ for (let tracks of [media.audioTracks, media.textTracks]) {
+ for (let eventType of ["addtrack", "removetrack"])
+ tracks.removeEventListener(eventType, this);
+ }
+ }
+
+ // Protected
+
+ get control()
+ {
+ return this.mediaController.controls.tracksButton;
+ }
+
+ get mediaEvents()
+ {
+ return ["loadedmetadata"];
+ }
+
+ buttonWasClicked(control)
+ {
+ // FIXME: Show tracks menu.
+ }
+
+ syncControl()
+ {
+ const media = this.mediaController.media;
+ const host = this.mediaController.host;
+
+ const textTracks = host ? host.sortedTrackListForMenu(media.textTracks) : media.textTracks;
+ const audioTracks = host ? host.sortedTrackListForMenu(media.audioTracks) : media.audioTracks;
+
+ this.control.enabled = (textTracks && textTracks.length > 0) || (audioTracks && audioTracks.length > 1);
+ }
+
+}
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (208584 => 208585)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2016-11-11 08:33:34 UTC (rev 208584)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2016-11-11 09:48:37 UTC (rev 208585)
@@ -10128,6 +10128,7 @@
71E2183917359FB8006E6E4D /* PlugInsResourcesData.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; path = PlugInsResourcesData.cpp; sourceTree = "<group>"; };
71E623CE151F72A60036E2F4 /* SVGAnimatedIntegerOptionalInteger.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedIntegerOptionalInteger.cpp; sourceTree = "<group>"; };
71E623CF151F72A60036E2F4 /* SVGAnimatedIntegerOptionalInteger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedIntegerOptionalInteger.h; sourceTree = "<group>"; };
+ 71F936F71DD4F99B00922CC7 /* tracks-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode._javascript_; path = "tracks-support.js"; sourceTree = "<group>"; };
71FB967A1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedEnumerationPropertyTearOff.h; sourceTree = "<group>"; };
724ED3291A3A7E5400F5F13C /* EXTBlendMinMax.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EXTBlendMinMax.cpp; sourceTree = "<group>"; };
724ED32A1A3A7E5400F5F13C /* EXTBlendMinMax.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EXTBlendMinMax.h; sourceTree = "<group>"; };
@@ -18043,6 +18044,7 @@
71D2554F1DB900020004D76B /* skip-back-support.js */,
7177E2481DB80D2F00919A0B /* start-support.js */,
71B0460A1DD3C2EE00EE19CF /* status-support.js */,
+ 71F936F71DD4F99B00922CC7 /* tracks-support.js */,
717F90571DC40ED60006F520 /* volume-support.js */,
);
path = media;