Title: [137844] trunk
Revision
137844
Author
eric.carl...@apple.com
Date
2012-12-16 11:26:12 -0800 (Sun, 16 Dec 2012)

Log Message

Remove in-band text tracks when media element's src changes
https://bugs.webkit.org/show_bug.cgi?id=105081

Reviewed by Sam Weinig.

Source/WebCore:

No new tests, media/track/track-in-band.html was updated to test this change.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::mediaPlayerDidRemoveTrack): Move some code into removeTrack.
(WebCore::HTMLMediaElement::removeTrack): New, remove a track and all of its cues.
(WebCore::HTMLMediaElement::removeAllInbandTracks): New, remove all in-band tracks.
(WebCore::HTMLMediaElement::clearMediaPlayer): Call removeAllInbandTracks.
* html/HTMLMediaElement.h:

* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::~MediaPlayerPrivateAVFoundationObjC):
(WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad): Call clearTextTracks.
(WebCore::MediaPlayerPrivateAVFoundationObjC::clearTextTracks): Remove all tracks from client.

LayoutTests:

Extend test to verify that all in-band tracks are removed from the media element
when its src changes.

* media/track/track-in-band-expected.txt:
* media/track/track-in-band.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (137843 => 137844)


--- trunk/LayoutTests/ChangeLog	2012-12-16 18:36:45 UTC (rev 137843)
+++ trunk/LayoutTests/ChangeLog	2012-12-16 19:26:12 UTC (rev 137844)
@@ -1,3 +1,16 @@
+2012-12-16  Eric Carlson  <eric.carl...@apple.com>
+
+        Remove in-band text tracks when media element's src changes
+        https://bugs.webkit.org/show_bug.cgi?id=105081
+
+        Reviewed by Sam Weinig.
+
+        Extend test to verify that all in-band tracks are removed from the media element
+        when its src changes.
+
+        * media/track/track-in-band-expected.txt:
+        * media/track/track-in-band.html:
+
 2012-12-16  Christophe Dumez  <christophe.du...@intel.com>
 
         Unreviewed EFL gardening.

Modified: trunk/LayoutTests/media/track/track-in-band-expected.txt (137843 => 137844)


--- trunk/LayoutTests/media/track/track-in-band-expected.txt	2012-12-16 18:36:45 UTC (rev 137843)
+++ trunk/LayoutTests/media/track/track-in-band-expected.txt	2012-12-16 19:26:12 UTC (rev 137844)
@@ -1,12 +1,15 @@
 In-band text tracks.
 
+EVENT(addtrack)
+EXPECTED (event.track == 'video.textTracks[0]') OK
+
+EVENT(addtrack)
+EXPECTED (event.track == 'video.textTracks[1]') OK
+
 EVENT(canplaythrough)
 
 ** Check initial in-band track states
 EXPECTED (video.textTracks.length == '2') OK
-EXPECTED (addtrackEventCount == '2') OK
-
-
 RUN(inbandTrack1 = video.textTracks[0])
 RUN(inbandTrack2 = video.textTracks[1])
 EXPECTED (inbandTrack1.mode == 'disabled') OK
@@ -27,5 +30,10 @@
 EXPECTED (video.textTracks[1] == 'addTrack') OK
 EXPECTED (video.textTracks[2] == 'inbandTrack1') OK
 EXPECTED (video.textTracks[3] == 'inbandTrack2') OK
+
+** Unload video file, check track count
+RUN(video.src = '')
+EXPECTED (video.textTracks.length == '2') OK
+
 END OF TEST
 

Modified: trunk/LayoutTests/media/track/track-in-band.html (137843 => 137844)


--- trunk/LayoutTests/media/track/track-in-band.html	2012-12-16 18:36:45 UTC (rev 137843)
+++ trunk/LayoutTests/media/track/track-in-band.html	2012-12-16 19:26:12 UTC (rev 137844)
@@ -9,6 +9,14 @@
 
             var addtrackEventCount = 0;
 
+            function trackAdded(event)
+            {
+                consoleWrite("EVENT(" + event.type + ")");
+                compareTracks("event.track", "video.textTracks[" + addtrackEventCount + "]");
+                ++addtrackEventCount;
+                consoleWrite("");
+            }
+
             function compareTracks(track1, track2)
             {
                 var equal = (eval(track1) == eval(track2));
@@ -19,9 +27,6 @@
             {
                 consoleWrite("<br><i>** Check initial in-band track states<" + "/i>");
                 testExpected("video.textTracks.length", 2);
-                testExpected("addtrackEventCount", 2);
-                consoleWrite("<br>");
-
                 run("inbandTrack1 = video.textTracks[0]");
                 run("inbandTrack2 = video.textTracks[1]");
                 testExpected("inbandTrack1.mode", "disabled");
@@ -44,13 +49,19 @@
                 compareTracks("video.textTracks[1]", "addTrack");
                 compareTracks("video.textTracks[2]", "inbandTrack1");
                 compareTracks("video.textTracks[3]", "inbandTrack2");
+
+                consoleWrite("<br><i>** Unload video file, check track count<" + "/i>");
+                run("video.src = ''");
+                testExpected("video.textTracks.length", 2);
+
+                consoleWrite("");
                 endTest();
             }
 
             function setup()
             {
                 findMediaElement();
-                video.textTracks.addEventListener("addtrack", function() { ++addtrackEventCount; });
+                video.textTracks.addEventListener("addtrack", trackAdded);
                 video.src = '';
                 waitForEvent('canplaythrough', canplaythrough);
             }

Modified: trunk/Source/WebCore/ChangeLog (137843 => 137844)


--- trunk/Source/WebCore/ChangeLog	2012-12-16 18:36:45 UTC (rev 137843)
+++ trunk/Source/WebCore/ChangeLog	2012-12-16 19:26:12 UTC (rev 137844)
@@ -1,3 +1,25 @@
+2012-12-16  Eric Carlson  <eric.carl...@apple.com>
+
+        Remove in-band text tracks when media element's src changes
+        https://bugs.webkit.org/show_bug.cgi?id=105081
+
+        Reviewed by Sam Weinig.
+
+        No new tests, media/track/track-in-band.html was updated to test this change.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::mediaPlayerDidRemoveTrack): Move some code into removeTrack.
+        (WebCore::HTMLMediaElement::removeTrack): New, remove a track and all of its cues.
+        (WebCore::HTMLMediaElement::removeAllInbandTracks): New, remove all in-band tracks.
+        (WebCore::HTMLMediaElement::clearMediaPlayer): Call removeAllInbandTracks.
+        * html/HTMLMediaElement.h:
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::~MediaPlayerPrivateAVFoundationObjC):
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad): Call clearTextTracks.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::clearTextTracks): Remove all tracks from client.
+
 2012-12-16  Simon Fraser  <simon.fra...@apple.com>
 
         Fix assertions when doing a full repaint of compositing layers

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (137843 => 137844)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2012-12-16 18:36:45 UTC (rev 137843)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2012-12-16 19:26:12 UTC (rev 137844)
@@ -2768,14 +2768,32 @@
     if (!textTrack)
         return;
 
-    m_textTracks->remove(textTrack.get());
-    TextTrackCueList* cues = textTrack->cues();
-    if (cues) {
-        beginIgnoringTrackDisplayUpdateRequests();
-        for (size_t i = 0; i < cues->length(); ++i)
-            textTrackRemoveCue(cues->item(i)->track(), cues->item(i));
-        endIgnoringTrackDisplayUpdateRequests();
+    removeTrack(textTrack.get());
+}
+
+void HTMLMediaElement::removeTrack(TextTrack* track)
+{
+    beginIgnoringTrackDisplayUpdateRequests();
+    m_textTracks->remove(track);
+    TextTrackCueList* cues = track->cues();
+    if (cues)
+        textTrackRemoveCues(track, cues);
+    endIgnoringTrackDisplayUpdateRequests();
+}
+
+void HTMLMediaElement::removeAllInbandTracks()
+{
+    if (!m_textTracks)
+        return;
+
+    beginIgnoringTrackDisplayUpdateRequests();
+    for (int i = m_textTracks->length() - 1; i >= 0; --i) {
+        TextTrack* track = m_textTracks->item(i);
+
+        if (track->trackType() == TextTrack::InBand)
+            removeTrack(track);
     }
+    endIgnoringTrackDisplayUpdateRequests();
 }
 
 PassRefPtr<TextTrack> HTMLMediaElement::addTextTrack(const String& kind, const String& label, const String& language, ExceptionCode& ec)
@@ -3786,6 +3804,10 @@
 
 void HTMLMediaElement::clearMediaPlayer(int flags)
 {
+#if ENABLE(VIDEO_TRACK)
+    removeAllInbandTracks();
+#endif
+
 #if !ENABLE(PLUGIN_PROXY_FOR_VIDEO)
 
 #if ENABLE(MEDIA_SOURCE)

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (137843 => 137844)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2012-12-16 18:36:45 UTC (rev 137843)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2012-12-16 19:26:12 UTC (rev 137844)
@@ -218,6 +218,9 @@
     TextTrackList* textTracks();
     CueList currentlyActiveCues() const { return m_currentlyActiveCues; }
 
+    void removeTrack(TextTrack*);
+    void removeAllInbandTracks();
+
     virtual void didAddTrack(HTMLTrackElement*);
     virtual void didRemoveTrack(HTMLTrackElement*);
 

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (137843 => 137844)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h	2012-12-16 18:36:45 UTC (rev 137843)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h	2012-12-16 19:26:12 UTC (rev 137844)
@@ -155,6 +155,7 @@
     virtual void setCurrentTrack(InbandTextTrackPrivateAVF*) OVERRIDE;
     virtual InbandTextTrackPrivateAVF* currentTrack() OVERRIDE;
     void processTextTracks();
+    void clearTextTracks();
 #endif
 
     RetainPtr<AVURLAsset> m_avAsset;

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (137843 => 137844)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm	2012-12-16 18:36:45 UTC (rev 137843)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm	2012-12-16 19:26:12 UTC (rev 137844)
@@ -199,7 +199,6 @@
 MediaPlayerPrivateAVFoundationObjC::~MediaPlayerPrivateAVFoundationObjC()
 {
     cancelLoad();
-    [m_objcObserver.get() disconnect];
 }
 
 void MediaPlayerPrivateAVFoundationObjC::cancelLoad()
@@ -208,6 +207,7 @@
     tearDownVideoRendering();
 
     [[NSNotificationCenter defaultCenter] removeObserver:m_objcObserver.get()];
+    [m_objcObserver.get() disconnect];
 
     // Tell our observer to do nothing when our cancellation of pending loading calls its completion handler.
     setIgnoreLoadStateChanges(true);
@@ -217,6 +217,8 @@
     }
 
 #if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
+    clearTextTracks();
+
     if (m_legibleOutput) {
         if (m_avPlayerItem)
             [m_avPlayerItem.get() removeOutput:m_legibleOutput.get()];
@@ -1192,7 +1194,13 @@
 #endif
 
 #if HAVE(AVFOUNDATION_TEXT_TRACK_SUPPORT)
-    
+
+void MediaPlayerPrivateAVFoundationObjC::clearTextTracks()
+{
+    for (unsigned i = 0; i < m_textTracks.size(); ++i)
+        player()->removeTextTrack(m_textTracks[i].get());
+}
+
 void MediaPlayerPrivateAVFoundationObjC::processTextTracks()
 {
     AVMediaSelectionGroupType *legibleGroup = [m_avAsset.get() mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible];
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to