Changeset 166238 in webkit


Ignore:
Timestamp:
Mar 25, 2014 9:51:40 AM (10 years ago)
Author:
Brent Fulgham
Message:

Prevent 'removetrack' events from firing when all inband text tracks are removed.
https://bugs.webkit.org/show_bug.cgi?id=130704

Reviewed by Eric Carlson.

Source/WebCore:

Test: media/track/track-remove-track.html

Based on the Blink change (patch by acolwell@chromium.org):
https://codereview.chromium.org/177243018/

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::prepareForLoad): Reorder steps to match W3C specification.
(WebCore::HTMLMediaElement::noneSupported): Forget tracks as required by specification.
(WebCore::HTMLMediaElement::mediaLoadingFailed): Forget tracks as required by specification.
(WebCore::HTMLMediaElement::removeTextTrack): Only request the 'removetracks' event if
requested by caller.
(WebCore::HTMLMediaElement::removeAllInbandTracks): Renamed to 'forgetResourceSpecificTracks'
(WebCore::HTMLMediaElement::noneSupported): Specify that we want the 'removetracks' event
fired for this use case.
(WebCore::HTMLMediaElement::prepareForLoad): Switch to new 'forgetResourceSpecificTracks' name.

  • html/HTMLMediaElement.h:
  • html/track/TextTrackList.cpp:

(TextTrackList::remove): Only fire the 'removetrack' event if the caller requests it.

  • html/track/TextTrackList.h: Add default argument to fire the 'removetrack' event

when removing a track.

  • html/track/TrackListBase.cpp:

(TrackListBase::remove): Only fire the 'removetrack' event if the caller requests it.

  • html/track/TrackListBase.h: Add default argument to fire the 'removetrack' event.

LayoutTests:

Based on the Blink change (patch by acolwell@chromium.org):
https://codereview.chromium.org/177243018/

  • media/track/track-remove-track-expected.txt: Added.
  • media/track/track-remove-track.html: Added.
Location:
trunk
Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r166237 r166238  
     12014-03-24  Brent Fulgham  <bfulgham@apple.com>
     2
     3        Prevent 'removetrack' events from firing when all inband text tracks are removed.
     4        https://bugs.webkit.org/show_bug.cgi?id=130704
     5
     6        Reviewed by Eric Carlson.
     7
     8        Based on the Blink change (patch by acolwell@chromium.org):
     9        https://codereview.chromium.org/177243018/
     10
     11        * media/track/track-remove-track-expected.txt: Added.
     12        * media/track/track-remove-track.html: Added.
     13
    1142014-03-25  Alexey Proskuryakov  <ap@apple.com>
    215
  • trunk/Source/WebCore/ChangeLog

    r166236 r166238  
     12014-03-24  Brent Fulgham  <bfulgham@apple.com>
     2
     3        Prevent 'removetrack' events from firing when all inband text tracks are removed.
     4        https://bugs.webkit.org/show_bug.cgi?id=130704
     5
     6        Reviewed by Eric Carlson.
     7
     8        Test: media/track/track-remove-track.html
     9
     10        Based on the Blink change (patch by acolwell@chromium.org):
     11        https://codereview.chromium.org/177243018/
     12
     13        * html/HTMLMediaElement.cpp:
     14        (WebCore::HTMLMediaElement::prepareForLoad): Reorder steps to match W3C specification.
     15        (WebCore::HTMLMediaElement::noneSupported): Forget tracks as required by specification.
     16        (WebCore::HTMLMediaElement::mediaLoadingFailed): Forget tracks as required by specification.
     17        (WebCore::HTMLMediaElement::removeTextTrack): Only request the 'removetracks' event if
     18        requested by caller.
     19        (WebCore::HTMLMediaElement::removeAllInbandTracks): Renamed to 'forgetResourceSpecificTracks'
     20        (WebCore::HTMLMediaElement::noneSupported): Specify that we want the 'removetracks' event
     21        fired for this use case.
     22        (WebCore::HTMLMediaElement::prepareForLoad): Switch to new 'forgetResourceSpecificTracks' name.
     23        * html/HTMLMediaElement.h:
     24        * html/track/TextTrackList.cpp:
     25        (TextTrackList::remove): Only fire the 'removetrack' event if the caller requests it.
     26        * html/track/TextTrackList.h: Add default argument to fire the 'removetrack' event
     27        when removing a track.
     28        * html/track/TrackListBase.cpp:
     29        (TrackListBase::remove): Only fire the 'removetrack' event if the caller requests it.
     30        * html/track/TrackListBase.h: Add default argument to fire the 'removetrack' event.
     31
    1322014-03-25  David Kilzer  <ddkilzer@apple.com>
    233
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r165916 r166238  
    979979    // 4 - If the media element's networkState is not set to NETWORK_EMPTY, then run these substeps
    980980    if (m_networkState != NETWORK_EMPTY) {
     981        // 4.1 - Queue a task to fire a simple event named emptied at the media element.
     982        scheduleEvent(eventNames().emptiedEvent);
     983
     984        // 4.2 - If a fetching process is in progress for the media element, the user agent should stop it.
    981985        m_networkState = NETWORK_EMPTY;
     986
     987        // 4.3 - Forget the media element's media-resource-specific tracks.
     988        forgetResourceSpecificTracks();
     989
     990        // 4.4 - If readyState is not set to HAVE_NOTHING, then set it to that state.
    982991        m_readyState = HAVE_NOTHING;
    983992        m_readyStateMaximum = HAVE_NOTHING;
     993
     994        // 4.5 - If the paused attribute is false, then set it to true.
     995        m_paused = true;
     996
     997        // 4.6 - If seeking is true, set it to false.
     998        m_seeking = false;
     999
     1000        // 4.7 - Set the current playback position to 0.
     1001        //       Set the official playback position to 0.
     1002        //       If this changed the official playback position, then queue a task to fire a simple event named timeupdate at the media element.
     1003        // FIXME: Add support for firing this event. e.g., scheduleEvent(eventNames().timeUpdateEvent);
     1004
     1005        // 4.8 - Set the initial playback position to 0.
     1006        // FIXME: Make this less subtle. The position only becomes 0 because of the createMediaPlayer() call
     1007        // above.
    9841008        refreshCachedTime();
    985         m_paused = true;
    986         m_seeking = false;
     1009
    9871010        invalidateCachedTime();
    988         scheduleEvent(eventNames().emptiedEvent);
     1011
     1012        // 4.9 - Set the timeline offset to Not-a-Number (NaN).
     1013        // 4.10 - Update the duration attribute to Not-a-Number (NaN).
     1014
    9891015        updateMediaController();
    9901016#if ENABLE(VIDEO_TRACK)
     
    10121038
    10131039    m_playedTimeRanges = TimeRanges::create();
     1040
     1041    // FIXME: Investigate whether these can be moved into m_networkState != NETWORK_EMPTY block above
     1042    // so they are closer to the relevant spec steps.
    10141043    m_lastSeekTime = 0;
    10151044
     
    17931822
    17941823    // 6.2 - Forget the media element's media-resource-specific text tracks.
     1824    forgetResourceSpecificTracks();
    17951825
    17961826    // 6.3 - Set the element's networkState attribute to the NETWORK_NO_SOURCE value.
     
    19181948    if (m_readyState < HAVE_METADATA && m_loadState == LoadingFromSourceElement) {
    19191949       
     1950        // resource selection algorithm
     1951        // Step 9.Otherwise.9 - Failed with elements: Queue a task, using the DOM manipulation task source, to fire a simple event named error at the candidate element.
    19201952        if (m_currentSourceNode)
    19211953            m_currentSourceNode->scheduleErrorEvent();
     
    19231955            LOG(Media, "HTMLMediaElement::setNetworkState - error event not sent, <source> was removed");
    19241956       
     1957        // 9.Otherwise.10 - Asynchronously await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorithm says the synchronous section has ended.
     1958       
     1959        // 9.Otherwise.11 - Forget the media element's media-resource-specific tracks.
     1960        forgetResourceSpecificTracks();
     1961
    19251962        if (havePotentialSourceChild()) {
    19261963            LOG(Media, "HTMLMediaElement::setNetworkState - scheduling next <source>");
     
    33663403}
    33673404
    3368 void HTMLMediaElement::removeTextTrack(TextTrack* track)
     3405void HTMLMediaElement::removeTextTrack(TextTrack* track, bool scheduleEvent)
    33693406{
    33703407    if (!RuntimeEnabledFeatures::sharedFeatures().webkitVideoTrackEnabled())
     
    33763413        textTrackRemoveCues(track, cues);
    33773414    track->clearClient();
    3378     m_textTracks->remove(track);
     3415    m_textTracks->remove(track, scheduleEvent);
    33793416
    33803417    closeCaptionTracksChanged();
     
    33893426}
    33903427
    3391 void HTMLMediaElement::removeAllInbandTracks()
     3428void HTMLMediaElement::forgetResourceSpecificTracks()
    33923429{
    33933430    while (m_audioTracks &&  m_audioTracks->length())
     
    34003437
    34013438            if (track->trackType() == TextTrack::InBand)
    3402                 removeTextTrack(track);
     3439                removeTextTrack(track, false);
    34033440        }
    34043441    }
     
    45204557
    45214558#if ENABLE(VIDEO_TRACK)
    4522     removeAllInbandTracks();
     4559    forgetResourceSpecificTracks();
    45234560#endif
    45244561
     
    54255462
    54265463#if ENABLE(VIDEO_TRACK)
    5427     removeAllInbandTracks();
     5464    forgetResourceSpecificTracks();
    54285465#endif
    54295466    m_player = MediaPlayer::create(this);
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r165928 r166238  
    291291    void addVideoTrack(PassRefPtr<VideoTrack>);
    292292    void removeAudioTrack(AudioTrack*);
    293     void removeTextTrack(TextTrack*);
     293    void removeTextTrack(TextTrack*, bool scheduleEvent = true);
    294294    void removeVideoTrack(VideoTrack*);
    295     void removeAllInbandTracks();
     295    void forgetResourceSpecificTracks();
    296296    void closeCaptionTracksChanged();
    297297    void notifyMediaPlayerOfTextTrackChanges();
  • trunk/Source/WebCore/html/track/TextTrackList.cpp

    r165676 r166238  
    196196}
    197197
    198 void TextTrackList::remove(TrackBase* track)
     198void TextTrackList::remove(TrackBase* track, bool scheduleEvent)
    199199{
    200200    TextTrack* textTrack = toTextTrack(track);
     
    220220    RefPtr<TrackBase> trackRef = (*tracks)[index];
    221221    tracks->remove(index);
    222     scheduleRemoveTrackEvent(trackRef.release());
     222
     223    if (scheduleEvent)
     224        scheduleRemoveTrackEvent(trackRef.release());
    223225}
    224226
  • trunk/Source/WebCore/html/track/TextTrackList.h

    r165676 r166238  
    5353
    5454    void append(PassRefPtr<TextTrack>);
    55     virtual void remove(TrackBase*) override;
     55    virtual void remove(TrackBase*, bool scheduleEvent = true) override;
    5656
    5757    // EventTarget
  • trunk/Source/WebCore/html/track/TrackListBase.cpp

    r165676 r166238  
    5959}
    6060
    61 void TrackListBase::remove(TrackBase* track)
     61void TrackListBase::remove(TrackBase* track, bool scheduleEvent)
    6262{
    6363    size_t index = m_inbandTracks.find(track);
     
    7171    m_inbandTracks.remove(index);
    7272
    73     scheduleRemoveTrackEvent(trackRef.release());
     73    if (scheduleEvent)
     74        scheduleRemoveTrackEvent(trackRef.release());
    7475}
    7576
  • trunk/Source/WebCore/html/track/TrackListBase.h

    r165676 r166238  
    4949    virtual unsigned length() const;
    5050    virtual bool contains(TrackBase*) const;
    51     virtual void remove(TrackBase*);
     51    virtual void remove(TrackBase*, bool scheduleEvent = true);
    5252
    5353    // EventTarget
Note: See TracChangeset for help on using the changeset viewer.