- 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];