Title: [136978] trunk
Revision
136978
Author
[email protected]
Date
2012-12-07 13:30:12 -0800 (Fri, 07 Dec 2012)

Log Message

Captions menu doesn't update to track changes
https://bugs.webkit.org/show_bug.cgi?id=104393

Reviewed by Dean Jackson.

Source/WebCore: 

Flag the captions menu as needing an update when tracks are added or removed. Don't actually
change the menu until it needs to be displayed.

No new tests, media/video-controls-captions-trackmenu.html was updated to test this.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::addTextTrack): Call closedCaptionTracksChanged().
(WebCore::HTMLMediaElement::didRemoveTrack): Ditto.
(WebCore::HTMLMediaElement::configureTextTracks): Ditto.

* html/shadow/MediaControlElements.cpp:
(WebCore::MediaControlClosedCaptionsTrackListElement::MediaControlClosedCaptionsTrackListElement):
    Intialize m_trackListHasChanged.
(WebCore::MediaControlClosedCaptionsTrackListElement::updateDisplay): Call rebuildTrackListMenu if
    the track list has changed.
(WebCore::MediaControlClosedCaptionsTrackListElement::rebuildTrackListMenu): Renamed from resetTrackListMenu.
* html/shadow/MediaControlElements.h:
(WebCore::MediaControlClosedCaptionsTrackListElement::resetTrackListMenu): Just set m_trackListHasChanged.

* html/shadow/MediaControls.h:
(WebCore::MediaControls::closedCaptionTracksChanged): New, do nothing for base class.

* html/shadow/MediaControlsApple.cpp:
(WebCore::MediaControlsApple::toggleClosedCaptionTrackList): Update the track list before 
    showing it.
(WebCore::MediaControlsApple::closedCaptionTracksChanged):
* html/shadow/MediaControlsApple.h:

LayoutTests: 

Test to ensure that the captions menu is updated as tracks added and removed.

* media/video-controls-captions-trackmenu-expected.txt:
* media/video-controls-captions-trackmenu.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (136977 => 136978)


--- trunk/LayoutTests/ChangeLog	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/LayoutTests/ChangeLog	2012-12-07 21:30:12 UTC (rev 136978)
@@ -1,3 +1,15 @@
+2012-12-07  Eric Carlson  <[email protected]>
+
+        Captions menu doesn't update to track changes
+        https://bugs.webkit.org/show_bug.cgi?id=104393
+
+        Reviewed by Dean Jackson.
+
+        Test to ensure that the captions menu is updated as tracks added and removed.
+
+        * media/video-controls-captions-trackmenu-expected.txt:
+        * media/video-controls-captions-trackmenu.html:
+
 2012-12-07  Stephen White  <[email protected]>
 
         CSS url() filters with forward references don't work

Modified: trunk/LayoutTests/media/video-controls-captions-trackmenu-expected.txt (136977 => 136978)


--- trunk/LayoutTests/media/video-controls-captions-trackmenu-expected.txt	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/LayoutTests/media/video-controls-captions-trackmenu-expected.txt	2012-12-07 21:30:12 UTC (rev 136978)
@@ -1,24 +1,33 @@
 Test that we are able to trigger the list of captions, and select from the list.
 
 EVENT(canplaythrough)
+
+*** Add another text track.
+RUN(video.addTextTrack("captions", "Commentary", "ru"))
+
 *** Set the user language preference.
 RUN(internals.setUserPreferredLanguages(['en']))
+
 *** Click the CC button.
 *** Turning captions on
-Found tracklist menu and list of tracks OK
-Found four available tracks in menu OK
-EXPECTED (video.textTracks.length == '3') OK
+Found 5 menu items OK
+EXPECTED (video.textTracks.length == '4') OK
 Track 0 should be disabled
 EXPECTED (video.textTracks[0].mode == 'disabled') OK
 Track 1 should be showing
 EXPECTED (video.textTracks[1].mode == 'showing') OK
 Track 2 should be disabled
 EXPECTED (video.textTracks[2].mode == 'disabled') OK
+Track 3 should be disabled
+EXPECTED (video.textTracks[3].mode == 'disabled') OK
 EXPECTED (textTrackDisplayElement(video, 'display').innerText == 'Lorem') OK
+
+*** Remove a track.
+RUN(video.removeChild(document.querySelectorAll("track")[0]))
+
 *** Click the CC button.
-*** Turning captions on
-Found tracklist menu and list of tracks OK
-Found four available tracks in menu OK
+*** Turning captions off
+Found 4 menu items OK
 EXPECTED (video.textTracks.length == '3') OK
 Track 0 should be disabled
 EXPECTED (video.textTracks[0].mode == 'disabled') OK
@@ -27,6 +36,5 @@
 Track 2 should be disabled
 EXPECTED (video.textTracks[2].mode == 'disabled') OK
 No text track cue with display id '-webkit-media-text-track-display' is currently visible
-No text track cue with display id '-webkit-media-text-track-display' is currently visible
 END OF TEST
 

Modified: trunk/LayoutTests/media/video-controls-captions-trackmenu.html (136977 => 136978)


--- trunk/LayoutTests/media/video-controls-captions-trackmenu.html	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/LayoutTests/media/video-controls-captions-trackmenu.html	2012-12-07 21:30:12 UTC (rev 136978)
@@ -13,7 +13,7 @@
 
             function clickCCButton()
             {
-                consoleWrite("*** Click the CC button.");
+                consoleWrite("<br>*** Click the CC button.");
                 eventSender.mouseMoveTo(captionsButtonCoordinates[0], captionsButtonCoordinates[1]);
                 eventSender.mouseDown();
                 eventSender.mouseUp();
@@ -21,8 +21,11 @@
 
             function startTest()
             {
+                consoleWrite("<br>*** Add another text track.");
+                run('video.addTextTrack("captions", "Commentary", "ru")');
+
                 if (window.eventSender) {
-                    consoleWrite("*** Set the user language preference.");
+                    consoleWrite("<br>*** Set the user language preference.");
                     run("internals.setUserPreferredLanguages(['en'])");
 
                     try {
@@ -36,7 +39,7 @@
                 }
             }
 
-            function selectCaptionMenuItem(index, nextStep)
+            function trackMenuList()
             {
                 var trackListElement;
                 try {
@@ -45,24 +48,36 @@
                     failTest(exception.description);
                     return;
                 }
-                // Track list should have a <ul> with four <li> children (One of them is "Off").
+                // Track list should have a <ul> with five <li> children (One of them is "Off").
                 var trackList = trackListElement.querySelector("ul");
                 if (!trackList) {
                     failTest("Could not find a child ul element in track list menu");
                     return;
                 }
-                logResult(true, "Found tracklist menu and list of tracks");
                 var trackListItems = trackList.querySelectorAll("li");
                 if (!trackListItems) {
                     failTest("Could not find a child li elements in track list menu");
                     return;
                 }
-                if (trackListItems.length != 4) {
-                    failTest("Expected 4 tracks in menu but found " + trackListItems.length);
+
+                return trackListItems;
+            }
+
+            function testMenu()
+            {
+                var trackListItems = trackMenuList();
+                var expectedItemCount = video.textTracks.length + 1;
+                if (trackListItems.length != expectedItemCount) {
+                    failTest("Expected " + expectedItemCount + " items in menu but found " + trackListItems.length);
                     return;
                 }
-                logResult(true, "Found four available tracks in menu");
+                logResult(true, "Found " + expectedItemCount + " menu items");
+            }
+
+            function selectCaptionMenuItem(index, nextStep)
+            {
                 // Click on the selected item
+                var trackListItems = trackMenuList();
                 var selectedTrackItem = trackListItems[index];
                 var boundingRect = selectedTrackItem.getBoundingClientRect();
                 var x = boundingRect.left + boundingRect.width / 2;
@@ -70,7 +85,7 @@
                 eventSender.mouseMoveTo(x, y);
                 eventSender.mouseDown();
                 eventSender.mouseUp();
-                window.setTimeout(nextStep, 100);
+                window.setTimeout(function() { testMenu(); nextStep(); }, 100);
             }
 
             function turnCaptionsOn()
@@ -82,22 +97,27 @@
 
             function testCaptionsVisible()
             {
-                testExpected("video.textTracks.length", 3);
+                testExpected("video.textTracks.length", 4);
                 consoleWrite("Track 0 should be disabled");
                 testExpected("video.textTracks[0].mode", "disabled");
                 consoleWrite("Track 1 should be showing");
                 testExpected("video.textTracks[1].mode", "showing");
                 consoleWrite("Track 2 should be disabled");
                 testExpected("video.textTracks[2].mode", "disabled");
+                consoleWrite("Track 3 should be disabled");
+                testExpected("video.textTracks[3].mode", "disabled");
                 testExpected("textTrackDisplayElement(video, 'display').innerText", "Lorem");
+
+                consoleWrite("<br>*** Remove a track.");
+                run('video.removeChild(document.querySelectorAll("track")[0])');
+
                 clickCCButton();
                 window.setTimeout(turnCaptionsOff, 100);
             }
 
             function turnCaptionsOff()
             {
-                consoleWrite("*** Turning captions on");
-                // Click the Off button
+                consoleWrite("*** Turning captions off");
                 selectCaptionMenuItem(0, testCaptionsDisabled);
             }
 
@@ -111,7 +131,6 @@
                 consoleWrite("Track 2 should be disabled");
                 testExpected("video.textTracks[2].mode", "disabled");
                 testExpected("textTrackDisplayElement(video, 'display').innerText", "Lorem");
-                testExpected("textTrackDisplayElement(video, 'display').innerText", "Lorem");
                 endTest();
             }
 

Modified: trunk/Source/WebCore/ChangeLog (136977 => 136978)


--- trunk/Source/WebCore/ChangeLog	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/Source/WebCore/ChangeLog	2012-12-07 21:30:12 UTC (rev 136978)
@@ -1,3 +1,38 @@
+2012-12-07  Eric Carlson  <[email protected]>
+
+        Captions menu doesn't update to track changes
+        https://bugs.webkit.org/show_bug.cgi?id=104393
+
+        Reviewed by Dean Jackson.
+
+        Flag the captions menu as needing an update when tracks are added or removed. Don't actually
+        change the menu until it needs to be displayed.
+
+        No new tests, media/video-controls-captions-trackmenu.html was updated to test this.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::addTextTrack): Call closedCaptionTracksChanged().
+        (WebCore::HTMLMediaElement::didRemoveTrack): Ditto.
+        (WebCore::HTMLMediaElement::configureTextTracks): Ditto.
+
+        * html/shadow/MediaControlElements.cpp:
+        (WebCore::MediaControlClosedCaptionsTrackListElement::MediaControlClosedCaptionsTrackListElement):
+            Intialize m_trackListHasChanged.
+        (WebCore::MediaControlClosedCaptionsTrackListElement::updateDisplay): Call rebuildTrackListMenu if
+            the track list has changed.
+        (WebCore::MediaControlClosedCaptionsTrackListElement::rebuildTrackListMenu): Renamed from resetTrackListMenu.
+        * html/shadow/MediaControlElements.h:
+        (WebCore::MediaControlClosedCaptionsTrackListElement::resetTrackListMenu): Just set m_trackListHasChanged.
+
+        * html/shadow/MediaControls.h:
+        (WebCore::MediaControls::closedCaptionTracksChanged): New, do nothing for base class.
+
+        * html/shadow/MediaControlsApple.cpp:
+        (WebCore::MediaControlsApple::toggleClosedCaptionTrackList): Update the track list before 
+            showing it.
+        (WebCore::MediaControlsApple::closedCaptionTracksChanged):
+        * html/shadow/MediaControlsApple.h:
+
 2012-12-07  Stephen White  <[email protected]>
 
         CSS url() filters with forward references don't work

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (136977 => 136978)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2012-12-07 21:30:12 UTC (rev 136978)
@@ -2804,6 +2804,9 @@
     // ... its text track mode to the text track hidden mode, and its text track list of cues to an empty list ...
     textTrack->setMode(TextTrack::hiddenKeyword());
 
+    if (hasMediaControls())
+        mediaControls()->closedCaptionTracksChanged();
+
     return textTrack.release();
 }
 
@@ -2877,6 +2880,9 @@
         endIgnoringTrackDisplayUpdateRequests();
     }
 
+    if (hasMediaControls())
+        mediaControls()->closedCaptionTracksChanged();
+
     size_t index = m_textTracksWhenResourceSelectionBegan.find(textTrack.get());
     if (index != notFound)
         m_textTracksWhenResourceSelectionBegan.remove(index);
@@ -3072,6 +3078,9 @@
         configureTextTrackGroup(metadataTracks);
     if (otherTracks.tracks.size())
         configureTextTrackGroup(otherTracks);
+
+    if (hasMediaControls())
+        mediaControls()->closedCaptionTracksChanged();
 }
 #endif
 

Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.cpp (136977 => 136978)


--- trunk/Source/WebCore/html/shadow/MediaControlElements.cpp	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.cpp	2012-12-07 21:30:12 UTC (rev 136978)
@@ -727,6 +727,7 @@
 MediaControlClosedCaptionsTrackListElement::MediaControlClosedCaptionsTrackListElement(Document* document, MediaControls* controls)
     : MediaControlDivElement(document, MediaClosedCaptionsTrackList)
     , m_controls(controls)
+    , m_trackListHasChanged(true)
 {
 }
 
@@ -795,6 +796,9 @@
     if (!trackList || !trackList->length())
         return;
 
+    if (m_trackListHasChanged)
+        rebuildTrackListMenu();
+    
     bool captionsVisible = mediaElement->closedCaptionsVisible();
     for (unsigned i = 0, length = menuItems.size(); i < length; ++i) {
         RefPtr<Element> trackItem = menuItems[i];
@@ -819,13 +823,15 @@
 #endif
 }
 
-void MediaControlClosedCaptionsTrackListElement::resetTrackListMenu()
+void MediaControlClosedCaptionsTrackListElement::rebuildTrackListMenu()
 {
 #if ENABLE(VIDEO_TRACK)
     // Remove any existing content.
     removeChildren();
     menuItems.clear();
 
+    m_trackListHasChanged = false;
+
     if (!mediaController()->hasClosedCaptions())
         return;
 

Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.h (136977 => 136978)


--- trunk/Source/WebCore/html/shadow/MediaControlElements.h	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.h	2012-12-07 21:30:12 UTC (rev 136978)
@@ -302,17 +302,20 @@
     virtual bool willRespondToMouseClickEvents() OVERRIDE { return true; }
 
     void updateDisplay();
-    void resetTrackListMenu();
+    void resetTrackListMenu() { m_trackListHasChanged = true; }
 
 private:
     MediaControlClosedCaptionsTrackListElement(Document*, MediaControls*);
 
+    void rebuildTrackListMenu();
+
     virtual const AtomicString& shadowPseudoId() const OVERRIDE;
     virtual void defaultEventHandler(Event*) OVERRIDE;
 
     typedef Vector<RefPtr<Element> > TrackMenuItems;
     TrackMenuItems menuItems;
     MediaControls* m_controls;
+    bool m_trackListHasChanged;
 };
 
 // ----------------------------

Modified: trunk/Source/WebCore/html/shadow/MediaControls.h (136977 => 136978)


--- trunk/Source/WebCore/html/shadow/MediaControls.h	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/Source/WebCore/html/shadow/MediaControls.h	2012-12-07 21:30:12 UTC (rev 136978)
@@ -89,6 +89,7 @@
 
     virtual void changedClosedCaptionsVisibility();
     virtual void toggleClosedCaptionTrackList() { }
+    virtual void closedCaptionTracksChanged() { }
 
     virtual void enteredFullscreen();
     virtual void exitedFullscreen();

Modified: trunk/Source/WebCore/html/shadow/MediaControlsApple.cpp (136977 => 136978)


--- trunk/Source/WebCore/html/shadow/MediaControlsApple.cpp	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/Source/WebCore/html/shadow/MediaControlsApple.cpp	2012-12-07 21:30:12 UTC (rev 136978)
@@ -488,11 +488,20 @@
     if (m_closedCaptionsContainer) {
         if (m_closedCaptionsContainer->isShowing())
             m_closedCaptionsContainer->hide();
-        else
+        else {
+            if (m_closedCaptionsTrackList)
+                m_closedCaptionsTrackList->updateDisplay();
             m_closedCaptionsContainer->show();
+        }
     }
 }
 
+void MediaControlsApple::closedCaptionTracksChanged()
+{
+    if (m_closedCaptionsTrackList)
+        m_closedCaptionsTrackList->resetTrackListMenu();
 }
 
+}
+
 #endif

Modified: trunk/Source/WebCore/html/shadow/MediaControlsApple.h (136977 => 136978)


--- trunk/Source/WebCore/html/shadow/MediaControlsApple.h	2012-12-07 21:26:48 UTC (rev 136977)
+++ trunk/Source/WebCore/html/shadow/MediaControlsApple.h	2012-12-07 21:30:12 UTC (rev 136978)
@@ -59,12 +59,12 @@
     virtual void updateStatusDisplay() OVERRIDE;
 
     virtual void changedClosedCaptionsVisibility() OVERRIDE;
-    void toggleClosedCaptionTrackList();
+    virtual void toggleClosedCaptionTrackList() OVERRIDE;
+    virtual void closedCaptionTracksChanged() OVERRIDE;
 
 private:
     MediaControlsApple(Document*);
 
-
     MediaControlRewindButtonElement* m_rewindButton;
     MediaControlReturnToRealtimeButtonElement* m_returnToRealTimeButton;
     MediaControlStatusDisplayElement* m_statusDisplay;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to