Title: [208585] trunk
Revision
208585
Author
grao...@webkit.org
Date
2016-11-11 01:48:37 -0800 (Fri, 11 Nov 2016)

Log Message

[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:

Modified Paths

Added Paths

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

Reply via email to