Changeset 99984 in webkit


Ignore:
Timestamp:
Nov 11, 2011 9:33:51 AM (13 years ago)
Author:
eric.carlson@apple.com
Message:

Implement TextTrackList and the textTracks attribute of HTMLMediaElement
https://bugs.webkit.org/show_bug.cgi?id=71123

Reviewed by Sam Weinig.

Source/WebCore:

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

media/track/tracklist-is-reachable.html

  • CMakeLists.txt: Add new files for TextTrackList.
  • DerivedSources.cpp: Ditto.
  • DerivedSources.make: Ditto.
  • DerivedSources.pri: Ditto.
  • GNUmakefile.list.am: Ditto.
  • Target.pri: Ditto.
  • WebCore.gypi: Ditto.
  • WebCore.xcodeproj/project.pbxproj: Ditto.
  • bindings/js/JSBindingsAllInOne.cpp: Ditto.
  • bindings/js/JSTextTrackListCustom.cpp: Added.

(WebCore::JSTextTrackListOwner::isReachableFromOpaqueRoots):

  • dom/EventTargetFactory.in: Add TextTrackList, conditional on VIDEO_TRACK.
  • html/HTMLAudioElement.cpp:

(WebCore::HTMLAudioElement::createForJSConstructor): Update for scheduleLoad change.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::~HTMLMediaElement): Update for m_textTracks change from

generic Vector to TextTrackList.

(WebCore::HTMLMediaElement::attributeChanged): Ditto.
(WebCore::HTMLMediaElement::insertedIntoDocument): Update for scheduleLoad change.
(WebCore::HTMLMediaElement::scheduleLoad): Add a parameter so caller can specify if

the main resource or a text track should be loaded.

(WebCore::HTMLMediaElement::loadTimerFired): Update to allow text track loading.
(WebCore::HTMLMediaElement::loadInternal): Don't call loadTextTracks.
(WebCore::HTMLMediaElement::isSafeToLoadURL): Log when CSP denies load.
(WebCore::HTMLMediaElement::playInternal): Update for scheduleLoad change.
(WebCore::HTMLMediaElement::pauseInternal): Ditto.
(WebCore::HTMLMediaElement::addTrack): Update for m_textTracks change from

generic Vector to TextTrackList.

(WebCore::HTMLMediaElement::addTextTrack): New, add track to m_textTracks and configure.
(WebCore::HTMLMediaElement::configureTextTracks): New, add comments about what this should

do eventually.

(WebCore::HTMLMediaElement::textTracks): New, return TextTrackList.
(WebCore::HTMLMediaElement::trackWasAdded): Bail if runtime feature is not enabled, schedule

asynchronous text track load.

(WebCore::HTMLMediaElement::trackWillBeRemoved): Minor cleanup.
(WebCore::HTMLMediaElement::selectNextSourceChild): Ditto.
(WebCore::HTMLMediaElement::sourceWasAdded): Update for scheduleLoad change.

  • html/HTMLMediaElement.h:
  • html/HTMLMediaElement.idl: Add textTracks attribute.
  • html/HTMLTrackElement.cpp:

(WebCore::HTMLTrackElement::insertedIntoTree): Use new mediaElement() method.
(WebCore::HTMLTrackElement::willRemove): Ditto.
(WebCore::HTMLTrackElement::attributeChanged): When 'src' is changed, call scheduleLoad

instead of HTMLMediaElement

(WebCore::HTMLTrackElement::isDefault): hasAttribute -> fastHasAttribute.
(WebCore::HTMLTrackElement::track): Allocate track if necessary.
(WebCore::HTMLTrackElement::scheduleLoad): New, tell the track to schedule a load.
(WebCore::HTMLTrackElement::canLoadUrl): New, check security policy to see if it is OK

to load a text track. If so, dispatch 'beforeload' event to give it a chance to disallow
load.

(WebCore::HTMLTrackElement::loadingCompleted): Renamed from textTrackLoadingCompleted.
(WebCore::HTMLTrackElement::textTrackReadyStateChanged): New, TextTrackLoadingClient interface

used to inform parent of TextTrack state changes.

(WebCore::HTMLTrackElement::textTrackModeChanged): Ditto.
(WebCore::HTMLTrackElement::textTrackAddCues): Ditto.
(WebCore::HTMLTrackElement::textTrackRemoveCues): Ditto.
(WebCore::HTMLTrackElement::textTrackAddCue): Ditto.
(WebCore::HTMLTrackElement::textTrackRemoveCue): Ditto.
(WebCore::HTMLTrackElement::mediaElement): New, return parent element.

  • html/HTMLTrackElement.h:
  • html/LoadableTextTrack.cpp:

(WebCore::LoadableTextTrack::LoadableTextTrack): Initialize new instance variables.
(WebCore::LoadableTextTrack::scheduleLoad): New, prime a timer to kick off loading.
(WebCore::LoadableTextTrack::loadTimerFired): Cancel current load, if any, check to see if

new url is allowed to load, and start new load.

(WebCore::LoadableTextTrack::cueLoadingCompleted):

  • html/LoadableTextTrack.h:

(WebCore::LoadableTextTrackClient::~LoadableTextTrackClient): TextTrackLoadingClient -> LoadableTextTrackClient
(WebCore::LoadableTextTrackClient::canLoadUrl):
(WebCore::LoadableTextTrackClient::loadingCompleted):
(WebCore::LoadableTextTrack::create):

  • html/TextTrack.cpp:

(WebCore::TextTrack::TextTrack): setClient(0) -> clearClient().

  • html/TextTrack.h:

(WebCore::TextTrack::clearClient): Renamed from setClient, because it is only used to clear the client pointer.

  • html/TextTrackCueList.cpp:

(WebCore::TextTrackCueList::add): Get rid of a compiler warning that breaks the OS X build.

  • html/track/TextTrackList.cpp: Added. Implement the TextTrackList object.

(TextTrackList::TextTrackList):
(TextTrackList::~TextTrackList):
(TextTrackList::length):
(TextTrackList::item):
(TextTrackList::append):
(TextTrackList::remove):
(TextTrackList::interfaceName):
(TextTrackList::scheduleAddTrackEvent):
(TextTrackList::asyncEventTimerFired):

  • html/track/TextTrackList.h: Added.

(WebCore::TextTrackList::create):
(WebCore::TextTrackList::scriptExecutionContext):
(WebCore::TextTrackList::clearOwner):
(WebCore::TextTrackList::owner):
(WebCore::TextTrackList::refEventTarget):
(WebCore::TextTrackList::derefEventTarget):
(WebCore::TextTrackList::eventTargetData):
(WebCore::TextTrackList::ensureEventTargetData):

  • html/track/TextTrackList.idl: Added.
  • loader/TextTrackLoader.cpp:

(WebCore::TextTrackLoader::cancelLoad): New, cancel pending or in progress load and delete loader.
(WebCore::TextTrackLoader::notifyFinished): Call cancelLoad.
(WebCore::TextTrackLoader::load): Ditto.

  • loader/TextTrackLoader.h:
  • page/DOMWindow.idl: Add TextTrackList.

LayoutTests:

  • media/track/track-add-track-expected.txt: Added.
  • media/track/track-add-track.html: Added.
  • media/track/tracklist-is-reachable-expected.txt: Added.
  • media/track/tracklist-is-reachable.html: Added.
Location:
trunk
Files:
8 added
28 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r99982 r99984  
     12011-11-11  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Implement TextTrackList and the textTracks attribute of HTMLMediaElement
     4        https://bugs.webkit.org/show_bug.cgi?id=71123
     5
     6        Reviewed by Sam Weinig.
     7
     8        * media/track/track-add-track-expected.txt: Added.
     9        * media/track/track-add-track.html: Added.
     10        * media/track/tracklist-is-reachable-expected.txt: Added.
     11        * media/track/tracklist-is-reachable.html: Added.
     12
    1132011-11-11  Gavin Peters  <gavinp@chromium.org>
    214
  • trunk/Source/WebCore/CMakeLists.txt

    r99893 r99984  
    302302    html/canvas/Uint8Array.idl
    303303
     304    html/track/TextTrackList.idl
    304305    html/track/TrackEvent.idl
    305306
     
    20612062        html/TextTrackCueIndex.cpp
    20622063        html/TextTrackCueList.cpp
     2064        html/track/TextTrackList.cpp
    20632065        html/track/TrackBase.cpp
    20642066        html/track/TrackEvent.cpp
  • trunk/Source/WebCore/ChangeLog

    r99983 r99984  
     12011-11-11  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Implement TextTrackList and the textTracks attribute of HTMLMediaElement
     4        https://bugs.webkit.org/show_bug.cgi?id=71123
     5
     6        Reviewed by Sam Weinig.
     7
     8        Test: media/track/track-add-track.html
     9              media/track/tracklist-is-reachable.html
     10
     11        * CMakeLists.txt: Add new files for TextTrackList.
     12        * DerivedSources.cpp: Ditto.
     13        * DerivedSources.make: Ditto.
     14        * DerivedSources.pri: Ditto.
     15        * GNUmakefile.list.am: Ditto.
     16        * Target.pri: Ditto.
     17        * WebCore.gypi: Ditto.
     18        * WebCore.xcodeproj/project.pbxproj: Ditto.
     19        * bindings/js/JSBindingsAllInOne.cpp: Ditto.
     20
     21        * bindings/js/JSTextTrackListCustom.cpp: Added.
     22        (WebCore::JSTextTrackListOwner::isReachableFromOpaqueRoots):
     23
     24        * dom/EventTargetFactory.in: Add TextTrackList, conditional on VIDEO_TRACK.
     25
     26        * html/HTMLAudioElement.cpp:
     27        (WebCore::HTMLAudioElement::createForJSConstructor): Update for scheduleLoad change.
     28
     29        * html/HTMLMediaElement.cpp:
     30        (WebCore::HTMLMediaElement::~HTMLMediaElement): Update for m_textTracks change from
     31            generic Vector to TextTrackList.
     32        (WebCore::HTMLMediaElement::attributeChanged): Ditto.
     33        (WebCore::HTMLMediaElement::insertedIntoDocument): Update for scheduleLoad change.
     34        (WebCore::HTMLMediaElement::scheduleLoad): Add a parameter so caller can specify if
     35            the main resource or a text track should be loaded.
     36        (WebCore::HTMLMediaElement::loadTimerFired): Update to allow text track loading.
     37        (WebCore::HTMLMediaElement::loadInternal): Don't call loadTextTracks.
     38        (WebCore::HTMLMediaElement::isSafeToLoadURL): Log when CSP denies load.
     39        (WebCore::HTMLMediaElement::playInternal): Update for scheduleLoad change.
     40        (WebCore::HTMLMediaElement::pauseInternal): Ditto.
     41        (WebCore::HTMLMediaElement::addTrack): Update for m_textTracks change from
     42            generic Vector to TextTrackList.
     43        (WebCore::HTMLMediaElement::addTextTrack): New, add track to m_textTracks and configure.
     44        (WebCore::HTMLMediaElement::configureTextTracks): New, add comments about what this should
     45            do eventually.
     46        (WebCore::HTMLMediaElement::textTracks): New, return TextTrackList.
     47        (WebCore::HTMLMediaElement::trackWasAdded): Bail if runtime feature is not enabled, schedule
     48            asynchronous text track load.
     49        (WebCore::HTMLMediaElement::trackWillBeRemoved): Minor cleanup.
     50        (WebCore::HTMLMediaElement::selectNextSourceChild): Ditto.
     51        (WebCore::HTMLMediaElement::sourceWasAdded): Update for scheduleLoad change.
     52        * html/HTMLMediaElement.h:
     53        * html/HTMLMediaElement.idl: Add textTracks attribute.
     54
     55        * html/HTMLTrackElement.cpp:
     56        (WebCore::HTMLTrackElement::insertedIntoTree): Use new mediaElement() method.
     57        (WebCore::HTMLTrackElement::willRemove): Ditto.
     58        (WebCore::HTMLTrackElement::attributeChanged): When 'src' is changed, call scheduleLoad
     59            instead of HTMLMediaElement
     60        (WebCore::HTMLTrackElement::isDefault): hasAttribute -> fastHasAttribute.
     61        (WebCore::HTMLTrackElement::track): Allocate track if necessary.
     62        (WebCore::HTMLTrackElement::scheduleLoad): New, tell the track to schedule a load.
     63        (WebCore::HTMLTrackElement::canLoadUrl): New, check security policy to see if it is OK
     64            to load a text track. If so, dispatch 'beforeload' event to give it a chance to disallow
     65            load.
     66        (WebCore::HTMLTrackElement::loadingCompleted): Renamed from textTrackLoadingCompleted.
     67        (WebCore::HTMLTrackElement::textTrackReadyStateChanged): New, TextTrackLoadingClient interface
     68            used to inform parent of TextTrack state changes.
     69        (WebCore::HTMLTrackElement::textTrackModeChanged): Ditto.
     70        (WebCore::HTMLTrackElement::textTrackAddCues): Ditto.
     71        (WebCore::HTMLTrackElement::textTrackRemoveCues): Ditto.
     72        (WebCore::HTMLTrackElement::textTrackAddCue): Ditto.
     73        (WebCore::HTMLTrackElement::textTrackRemoveCue): Ditto.
     74        (WebCore::HTMLTrackElement::mediaElement): New, return parent element.
     75        * html/HTMLTrackElement.h:
     76
     77        * html/LoadableTextTrack.cpp:
     78        (WebCore::LoadableTextTrack::LoadableTextTrack): Initialize new instance variables.
     79        (WebCore::LoadableTextTrack::scheduleLoad): New, prime a timer to kick off loading.
     80        (WebCore::LoadableTextTrack::loadTimerFired): Cancel current load, if any, check to see if
     81            new url is allowed to load, and start new load.
     82        (WebCore::LoadableTextTrack::cueLoadingCompleted):
     83        * html/LoadableTextTrack.h:
     84        (WebCore::LoadableTextTrackClient::~LoadableTextTrackClient): TextTrackLoadingClient -> LoadableTextTrackClient
     85        (WebCore::LoadableTextTrackClient::canLoadUrl):
     86        (WebCore::LoadableTextTrackClient::loadingCompleted):
     87        (WebCore::LoadableTextTrack::create):
     88
     89        * html/TextTrack.cpp:
     90        (WebCore::TextTrack::TextTrack): setClient(0) -> clearClient().
     91        * html/TextTrack.h:
     92        (WebCore::TextTrack::clearClient): Renamed from setClient, because it is only used to clear the client pointer.
     93
     94        * html/TextTrackCueList.cpp:
     95        (WebCore::TextTrackCueList::add): Get rid of a compiler warning that breaks the OS X build.
     96
     97        * html/track/TextTrackList.cpp: Added. Implement the TextTrackList object.
     98        (TextTrackList::TextTrackList):
     99        (TextTrackList::~TextTrackList):
     100        (TextTrackList::length):
     101        (TextTrackList::item):
     102        (TextTrackList::append):
     103        (TextTrackList::remove):
     104        (TextTrackList::interfaceName):
     105        (TextTrackList::scheduleAddTrackEvent):
     106        (TextTrackList::asyncEventTimerFired):
     107        * html/track/TextTrackList.h: Added.
     108        (WebCore::TextTrackList::create):
     109        (WebCore::TextTrackList::scriptExecutionContext):
     110        (WebCore::TextTrackList::clearOwner):
     111        (WebCore::TextTrackList::owner):
     112        (WebCore::TextTrackList::refEventTarget):
     113        (WebCore::TextTrackList::derefEventTarget):
     114        (WebCore::TextTrackList::eventTargetData):
     115        (WebCore::TextTrackList::ensureEventTargetData):
     116        * html/track/TextTrackList.idl: Added.
     117
     118        * loader/TextTrackLoader.cpp:
     119        (WebCore::TextTrackLoader::cancelLoad): New, cancel pending or in progress load and delete loader.
     120        (WebCore::TextTrackLoader::notifyFinished): Call cancelLoad.
     121        (WebCore::TextTrackLoader::load): Ditto.
     122        * loader/TextTrackLoader.h:
     123        * page/DOMWindow.idl: Add TextTrackList.
     124
    11252011-11-11  Pavel Feldman  <pfeldman@google.com>
    2126
  • trunk/Source/WebCore/DerivedSources.cpp

    r99261 r99984  
    442442#include "JSTextTrackCue.cpp"
    443443#include "JSTextTrackCueList.cpp"
     444#include "JSTextTrackList.cpp"
    444445#include "JSTrackEvent.cpp"
    445446#endif
  • trunk/Source/WebCore/DerivedSources.make

    r99261 r99984  
    511511    TextTrackCue \
    512512    TextTrackCueList \
     513    TextTrackList \
    513514    TimeRanges \
    514515    Touch \
  • trunk/Source/WebCore/DerivedSources.pri

    r99825 r99984  
    591591    html/TextTrackCue.idl \
    592592    html/TextTrackCueList.idl \
     593    html/track/TextTrackList.idl \
    593594    html/track/TrackEvent.idl \
    594595}
  • trunk/Source/WebCore/GNUmakefile.list.am

    r99893 r99984  
    505505        DerivedSources/WebCore/JSTextTrackCueList.cpp \
    506506        DerivedSources/WebCore/JSTextTrackCueList.h \
     507        DerivedSources/WebCore/JSTextTrackList.cpp \
     508        DerivedSources/WebCore/JSTextTrackList.h \
    507509        DerivedSources/WebCore/JSTimeRanges.cpp \
    508510        DerivedSources/WebCore/JSTimeRanges.h \
     
    851853        Source/WebCore/bindings/js/JSStyleSheetListCustom.cpp \
    852854        Source/WebCore/bindings/js/JSTextCustom.cpp \
     855        Source/WebCore/bindings/js/JSTextTrackListCustom.cpp \
    853856        Source/WebCore/bindings/js/JSTouchCustom.cpp \
    854857        Source/WebCore/bindings/js/JSTouchListCustom.cpp \
     
    19811984        Source/WebCore/html/TimeRanges.cpp \
    19821985        Source/WebCore/html/TimeRanges.h \
     1986        Source/WebCore/html/track/TextTrackList.cpp \
     1987        Source/WebCore/html/track/TextTrackList.h \
    19831988        Source/WebCore/html/track/TrackBase.cpp \
    19841989        Source/WebCore/html/track/TrackBase.h \
  • trunk/Source/WebCore/Target.pri

    r99968 r99984  
    18941894    html/shadow/MediaControlElements.h \
    18951895    html/shadow/DetailsMarkerControl.h \
     1896    html/track/TextTrackList.h \
    18961897    html/track/TrackBase.h \
    18971898    html/track/TrackEvent.h \
     
    35713572            bindings/js/JSTrackCustom.h \
    35723573            bindings/js/JSTrackEventCustom.cpp
     3574            bindings/js/JSTextTrackListCustom.cpp
    35733575    }
    35743576}
  • trunk/Source/WebCore/WebCore.gypi

    r99893 r99984  
    13741374            'html/canvas/WebGLVertexArrayObjectOES.idl',
    13751375            'html/canvas/WebKitLoseContext.idl',
     1376            'html/track/TextTrackList.idl',
    13761377            'html/track/TrackEvent.idl',
    13771378            'inspector/InjectedScriptHost.idl',
     
    19381939            'bindings/js/JSStyleSheetListCustom.cpp',
    19391940            'bindings/js/JSTextCustom.cpp',
     1941            'bindings/js/JSTextTrackListCustom.cpp',
    19401942            'bindings/js/JSTouchCustom.cpp',
    19411943            'bindings/js/JSTouchListCustom.cpp',
     
    57955797            'html/shadow/TextControlInnerElements.cpp',
    57965798            'html/shadow/TextControlInnerElements.h',
     5799            'html/track/TextTrackList.cpp',
    57975800            'html/track/TrackBase.cpp',
    57985801            'html/track/TrackEvent.cpp',
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r99930 r99984  
    102102                0753860214489E9800B78452 /* CachedTextTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0753860014489E9800B78452 /* CachedTextTrack.cpp */; };
    103103                0753860314489E9800B78452 /* CachedTextTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0753860114489E9800B78452 /* CachedTextTrack.h */; };
    104                 07689D6E145B52CC001CD132 /* JSTrackEventCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07689D6D145B52CC001CD132 /* JSTrackEventCustom.cpp */; };
     104                076970861463AD8700F502CF /* TextTrackList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 076970841463AD8700F502CF /* TextTrackList.cpp */; };
     105                076970871463AD8700F502CF /* TextTrackList.h in Headers */ = {isa = PBXBuildFile; fileRef = 076970851463AD8700F502CF /* TextTrackList.h */; };
    105106                076F0D0E12B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 076F0D0A12B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.h */; };
    106107                07846342145B151A00A58DF1 /* JSTrackEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07846340145B151A00A58DF1 /* JSTrackEvent.cpp */; };
     
    108109                07846385145B1B8E00A58DF1 /* JSTrackCustom.h in Headers */ = {isa = PBXBuildFile; fileRef = 07846384145B1B8E00A58DF1 /* JSTrackCustom.h */; };
    109110                07B0113F1032242200FBDC33 /* AccessibilityMediaControls.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B0113E1032242200FBDC33 /* AccessibilityMediaControls.h */; };
     111                07B5A2DB1464320A00A81ECE /* JSTextTrackList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B5A2D91464320A00A81ECE /* JSTextTrackList.cpp */; };
     112                07B5A2DC1464320A00A81ECE /* JSTextTrackList.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B5A2DA1464320A00A81ECE /* JSTextTrackList.h */; };
     113                07B5A30D14687D7100A81ECE /* JSTextTrackListCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B5A30C14687D7100A81ECE /* JSTextTrackListCustom.cpp */; };
     114                07BDD6EC1469B4C2009C9F85 /* JSTrackEventCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B5A30A14687B8400A81ECE /* JSTrackEventCustom.cpp */; };
    110115                0806E57A12893045007CED32 /* SVGMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 0806E57912893045007CED32 /* SVGMatrix.h */; settings = {ATTRIBUTES = (Private, ); }; };
    111116                080E49261255F3BD00EFCA27 /* SVGTextLayoutEngineBaseline.h in Headers */ = {isa = PBXBuildFile; fileRef = 080E49221255F3BD00EFCA27 /* SVGTextLayoutEngineBaseline.h */; };
     
    71197124                0753860014489E9800B78452 /* CachedTextTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CachedTextTrack.cpp; sourceTree = "<group>"; };
    71207125                0753860114489E9800B78452 /* CachedTextTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CachedTextTrack.h; sourceTree = "<group>"; };
    7121                 07689D6D145B52CC001CD132 /* JSTrackEventCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTrackEventCustom.cpp; sourceTree = "<group>"; };
     7126                076970841463AD8700F502CF /* TextTrackList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextTrackList.cpp; sourceTree = "<group>"; };
     7127                076970851463AD8700F502CF /* TextTrackList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackList.h; sourceTree = "<group>"; };
    71227128                076F0D0912B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaPlayerPrivateAVFoundation.cpp; sourceTree = "<group>"; };
    71237129                076F0D0A12B8192700C26AA4 /* MediaPlayerPrivateAVFoundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlayerPrivateAVFoundation.h; sourceTree = "<group>"; };
     
    71287134                07AFE5900F1446BD00841617 /* mediaControlsQuickTime.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = mediaControlsQuickTime.css; sourceTree = "<group>"; };
    71297135                07B0113E1032242200FBDC33 /* AccessibilityMediaControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilityMediaControls.h; sourceTree = "<group>"; };
     7136                07B5A2D91464320A00A81ECE /* JSTextTrackList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackList.cpp; sourceTree = "<group>"; };
     7137                07B5A2DA1464320A00A81ECE /* JSTextTrackList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSTextTrackList.h; sourceTree = "<group>"; };
     7138                07B5A3061468537100A81ECE /* TextTrackList.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TextTrackList.idl; sourceTree = "<group>"; };
     7139                07B5A30A14687B8400A81ECE /* JSTrackEventCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTrackEventCustom.cpp; sourceTree = "<group>"; };
     7140                07B5A30C14687D7100A81ECE /* JSTextTrackListCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextTrackListCustom.cpp; sourceTree = "<group>"; };
    71307141                0806E57912893045007CED32 /* SVGMatrix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGMatrix.h; sourceTree = "<group>"; };
    71317142                080E49211255F3BD00EFCA27 /* SVGTextLayoutEngineBaseline.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTextLayoutEngineBaseline.cpp; sourceTree = "<group>"; };
     
    1781717828                                070756D914239B4C00414161 /* JSTextTrackCueList.cpp */,
    1781817829                                070756DA14239B4E00414161 /* JSTextTrackCueList.h */,
     17830                                07B5A2D91464320A00A81ECE /* JSTextTrackList.cpp */,
     17831                                07B5A2DA1464320A00A81ECE /* JSTextTrackList.h */,
    1781917832                                E44614120CD6826900FADA75 /* JSTimeRanges.cpp */,
    1782017833                                E44614130CD6826900FADA75 /* JSTimeRanges.h */,
     
    1850518518                        isa = PBXGroup;
    1850618519                        children = (
     18520                                076970841463AD8700F502CF /* TextTrackList.cpp */,
     18521                                076970851463AD8700F502CF /* TextTrackList.h */,
     18522                                07B5A3061468537100A81ECE /* TextTrackList.idl */,
    1850718523                                070334D8145A006F008D8D45 /* TrackBase.cpp */,
    1850818524                                070334D61459FFD5008D8D45 /* TrackBase.h */,
     
    1957919595                        isa = PBXGroup;
    1958019596                        children = (
    19581                                 A85F22081430377D007CC884 /* JSPopStateEventCustom.cpp */,
    1958219597                                BC275CB211C5E85C00C9206C /* JSArrayBufferCustom.cpp */,
    1958319598                                86243D0011BC31F700CC006A /* JSArrayBufferViewHelper.h */,
     
    1967519690                                1A750DD30A90E729000FF215 /* JSNodeIteratorCustom.cpp */,
    1967619691                                BCD9C2610C17AA67005C90A2 /* JSNodeListCustom.cpp */,
     19692                                A85F22081430377D007CC884 /* JSPopStateEventCustom.cpp */,
    1967719693                                E1AD12D51295D0BD00ACA989 /* JSProcessingInstructionCustom.cpp */,
    1967819694                                4998AED313FC417F0090B1AA /* JSRequestAnimationFrameCallbackCustom.cpp */,
     
    1968819704                                B2C96D8C0B3AF2B7005E80EC /* JSSVGPathSegCustom.cpp */,
    1968919705                                1A2C40AA0DEB55AA005AF19E /* JSTextCustom.cpp */,
     19706                                07B5A30C14687D7100A81ECE /* JSTextTrackListCustom.cpp */,
    1969019707                                070334E8145A1F35008D8D45 /* JSTrackCustom.cpp */,
    1969119708                                07846384145B1B8E00A58DF1 /* JSTrackCustom.h */,
    19692                                 07689D6D145B52CC001CD132 /* JSTrackEventCustom.cpp */,
     19709                                07B5A30A14687B8400A81ECE /* JSTrackEventCustom.cpp */,
    1969319710                                516BB7920CE91E6800512F79 /* JSTreeWalkerCustom.cpp */,
    1969419711                                49EECF7710508D9C00099FAB /* JSUint16ArrayCustom.cpp */,
     
    2465024667                                CAE9F910146441F000C245B0 /* CSSAspectRatioValue.h in Headers */,
    2465124668                                976F36EB14686225005E93B4 /* SecurityContext.h in Headers */,
     24669                                076970871463AD8700F502CF /* TextTrackList.h in Headers */,
     24670                                07B5A2DC1464320A00A81ECE /* JSTextTrackList.h in Headers */,
    2465224671                                7134496E146941B300720312 /* SVGLengthContext.h in Headers */,
    2465324672                                974D2DA5146A535D00D51F8B /* SecurityPolicy.h in Headers */,
     
    2750527524                                070334E9145A1F36008D8D45 /* JSTrackCustom.cpp in Sources */,
    2750627525                                07846342145B151A00A58DF1 /* JSTrackEvent.cpp in Sources */,
    27507                                 07689D6E145B52CC001CD132 /* JSTrackEventCustom.cpp in Sources */,
    2750827526                                2D8FEBDC143E3EF70072502B /* CSSCrossfadeValue.cpp in Sources */,
    2750927527                                08F859D41463F9CD0067D933 /* SVGImageCache.cpp in Sources */,
     
    2751327531                                CDEA76351460B71A008B31F1 /* Clock.cpp in Sources */,
    2751427532                                976F36EA14686225005E93B4 /* SecurityContext.cpp in Sources */,
     27533                                076970861463AD8700F502CF /* TextTrackList.cpp in Sources */,
     27534                                07B5A2DB1464320A00A81ECE /* JSTextTrackList.cpp in Sources */,
     27535                                07B5A30D14687D7100A81ECE /* JSTextTrackListCustom.cpp in Sources */,
     27536                                07BDD6EC1469B4C2009C9F85 /* JSTrackEventCustom.cpp in Sources */,
    2751527537                                7134496D146941B300720312 /* SVGLengthContext.cpp in Sources */,
    2751627538                                974D2DA4146A535D00D51F8B /* SecurityPolicy.cpp in Sources */,
  • trunk/Source/WebCore/bindings/gobject/GNUmakefile.am

    r99261 r99984  
    410410webkitgtk_built_h_api += \
    411411        $(top_builddir)/DerivedSources/webkit/WebKitDOMTextTrack.h \
     412        $(top_builddir)/DerivedSources/webkit/WebKitDOMTextTrackList.h \
    412413        $(top_builddir)/DerivedSources/webkit/WebKitDOMTextTrackCue.h \
    413414        $(top_builddir)/DerivedSources/webkit/WebKitDOMTextTrackCueList.h \
     
    416417        DerivedSources/webkit/WebKitDOMTextTrack.cpp \
    417418        DerivedSources/webkit/WebKitDOMTextTrackPrivate.h \
     419        DerivedSources/webkit/WebKitDOMTextTrackList.cpp \
     420        DerivedSources/webkit/WebKitDOMTextTrackListPrivate.h \
    418421        DerivedSources/webkit/WebKitDOMTextTrackCue.cpp \
    419422        DerivedSources/webkit/WebKitDOMTextTrackCuePrivate.h \
  • trunk/Source/WebCore/bindings/gobject/WebKitHTMLElementWrapperFactory.cpp

    r99261 r99984  
    162162#include "webkit/WebKitDOMTextTrackCueListPrivate.h"
    163163#include "webkit/WebKitDOMTextTrackCuePrivate.h"
     164#include "webkit/WebKitDOMTextTrackListPrivate.h"
    164165#include "webkit/WebKitDOMTextTrackPrivate.h"
    165166#include "webkit/WebKitDOMTrackEventPrivate.h"
  • trunk/Source/WebCore/bindings/js/JSBindingsAllInOne.cpp

    r99261 r99984  
    139139#include "JSStyleSheetListCustom.cpp"
    140140#include "JSTextCustom.cpp"
     141#include "JSTextTrackListCustom.cpp"
    141142#include "JSTouchCustom.cpp"
    142143#include "JSTouchListCustom.cpp"
  • trunk/Source/WebCore/dom/EventTargetFactory.in

    r98412 r99984  
    2222SharedWorkerContext conditional=SHARED_WORKERS
    2323SVGElementInstance conditional=SVG
     24TextTrackList conditional=VIDEO_TRACK
    2425WebSocket conditional=WEB_SOCKETS
    2526Worker conditional=WORKERS
  • trunk/Source/WebCore/html/HTMLAudioElement.cpp

    r61293 r99984  
    5353    if (!src.isNull()) {
    5454        audio->setSrc(src);
    55         audio->scheduleLoad();
     55        audio->scheduleLoad(HTMLMediaElement::MediaResource);
    5656    }
    5757    return audio.release();
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r99742 r99984  
    9090#include "HTMLTrackElement.h"
    9191#include "RuntimeEnabledFeatures.h"
     92#include "TextTrackList.h"
    9293#endif
    9394
     
    174175    , m_cachedTimeWallClockUpdateTime(0)
    175176    , m_minimumWallClockTimeToCacheMediaTime(0)
     177    , m_pendingLoadFlags(0)
    176178    , m_playing(false)
    177179    , m_isWaitingUntilMediaCanStart(false)
     
    199201    , m_audioSourceNode(0)
    200202#endif
     203#if ENABLE(VIDEO_TRACK)
     204    , m_textTracks(0)
     205#endif
    201206{
    202207    LOG(Media, "HTMLMediaElement::HTMLMediaElement");
     
    226231    document()->unregisterForPrivateBrowsingStateChangedCallbacks(this);
    227232#if ENABLE(VIDEO_TRACK)
    228     for (unsigned i = 0; i < m_textTracks.size(); ++i)
    229         m_textTracks[i]->setClient(0);
     233    if (m_textTracks)
     234        m_textTracks->clearOwner();
     235    if (m_textTracks) {
     236        for (unsigned i = 0; i < m_textTracks->length(); ++i)
     237            m_textTracks->item(i)->clearClient();
     238    }
    230239#endif
    231240}
     
    269278        // Trigger a reload, as long as the 'src' attribute is present.
    270279        if (!getAttribute(srcAttr).isEmpty())
    271             scheduleLoad();
     280            scheduleLoad(MediaResource);
    272281    } else if (attrName == controlsAttr)
    273282        configureMediaControls();
     
    382391void HTMLMediaElement::insertedIntoDocument()
    383392{
    384     LOG(Media, "HTMLMediaElement::removedFromDocument");
     393    LOG(Media, "HTMLMediaElement::insertedIntoDocument");
    385394    HTMLElement::insertedIntoDocument();
    386395    if (!getAttribute(srcAttr).isEmpty() && m_networkState == NETWORK_EMPTY)
    387         scheduleLoad();
     396        scheduleLoad(MediaResource);
    388397}
    389398
     
    424433}
    425434
    426 void HTMLMediaElement::scheduleLoad()
     435void HTMLMediaElement::scheduleLoad(LoadType loadType)
    427436{
    428437    LOG(Media, "HTMLMediaElement::scheduleLoad");
     438
     439    if ((loadType & MediaResource) && !(m_pendingLoadFlags & MediaResource)) {
    429440#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
    430     createMediaPlayerProxy();
    431 #endif
    432 
    433     if (m_loadTimer.isActive())
    434         return;
    435     prepareForLoad();
    436     m_loadTimer.startOneShot(0);
     441        createMediaPlayerProxy();
     442#endif
     443       
     444        prepareForLoad();
     445        m_pendingLoadFlags |= MediaResource;
     446    }
     447
     448#if ENABLE(VIDEO_TRACK)
     449    if (loadType & TextTrackResource)
     450        m_pendingLoadFlags |= TextTrackResource;
     451#endif
     452
     453    if (!m_loadTimer.isActive())
     454        m_loadTimer.startOneShot(0);
    437455}
    438456
     
    440458{
    441459    // Schedule the timer to try the next <source> element WITHOUT resetting state ala prepareForLoad.
     460    m_pendingLoadFlags |= MediaResource;
    442461    m_loadTimer.startOneShot(0);
    443462}
     
    475494void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*)
    476495{
    477     if (m_loadState == LoadingFromSourceElement)
    478         loadNextSourceChild();
    479     else
    480         loadInternal();
     496    if (m_pendingLoadFlags & MediaResource) {
     497        if (m_loadState == LoadingFromSourceElement)
     498            loadNextSourceChild();
     499        else
     500            loadInternal();
     501    }
     502
     503#if ENABLE(VIDEO_TRACK)
     504    if (m_pendingLoadFlags & TextTrackResource)
     505        configureTextTracks();
     506#endif
     507
     508    m_pendingLoadFlags = 0;
    481509}
    482510
     
    634662
    635663    selectMediaResource();
    636 #if ENABLE(VIDEO_TRACK)
    637     loadTextTracks();
    638 #endif
    639664}
    640665
     
    838863
    839864#if ENABLE(VIDEO_TRACK)
    840 void HTMLMediaElement::loadTextTracks()
    841 {
    842     if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
    843         return;
    844 
    845     for (Node* node = firstChild(); node; node = node->nextSibling()) {
    846         if (node->hasTagName(trackTag))
    847             loadNextTextTrack(static_cast<HTMLTrackElement*>(node));
    848     }
    849 }
    850 
    851 void HTMLMediaElement::loadNextTextTrack(HTMLTrackElement* track)
    852 {
    853     // FIXME(71124): This should schedule an *asynchronous* load.
    854     track->load(ActiveDOMObject::scriptExecutionContext(), this);
    855     RefPtr<TextTrack> textTrack = track->track();
    856     if (textTrack)
    857         m_textTracks.append(textTrack.release());
    858    
    859     // FIXME(71123): Set the text track mode accordingly.
    860 }
    861 
    862865void HTMLMediaElement::textTrackReadyStateChanged(TextTrack*)
    863866{
     
    870873}
    871874
    872 void HTMLMediaElement::textTrackCreated(TextTrack*)
     875void HTMLMediaElement::textTrackAddCues(TextTrack*, const TextTrackCueList*)
    873876{
    874877    // FIXME(62885): Implement.
    875878}
    876879
    877 void HTMLMediaElement::textTrackAddCues(TextTrack*, const TextTrackCueList*)
     880void HTMLMediaElement::textTrackRemoveCues(TextTrack*, const TextTrackCueList*)
    878881{
    879882    // FIXME(62885): Implement.
    880883}
    881884
    882 void HTMLMediaElement::textTrackRemoveCues(TextTrack*, const TextTrackCueList*)
     885void HTMLMediaElement::textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>)
    883886{
    884887    // FIXME(62885): Implement.
    885888}
    886889
    887 void HTMLMediaElement::textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>)
     890void HTMLMediaElement::textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>)
    888891{
    889892    // FIXME(62885): Implement.
    890893}
    891894
    892 void HTMLMediaElement::textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>)
    893 {
    894     // FIXME(62885): Implement.
    895 }
    896 
    897 #endif
    898 
    899 bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidSourceAction actionIfInvalid)
     895#endif
     896
     897bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidURLAction actionIfInvalid)
    900898{
    901899    if (!url.isValid()) {
     
    912910    }
    913911
    914     if (!document()->contentSecurityPolicy()->allowMediaFromSource(url))
     912    if (!document()->contentSecurityPolicy()->allowMediaFromSource(url)) {
     913        LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%s) -> rejected by Content Security Policy", urlForLogging(url).utf8().data());
    915914        return false;
     915    }
    916916
    917917    return true;
     
    16711671    // 4.8.10.9. Playing the media resource
    16721672    if (!m_player || m_networkState == NETWORK_EMPTY)
    1673         scheduleLoad();
     1673        scheduleLoad(MediaResource);
    16741674
    16751675    if (endedPlayback()) {
     
    17101710    // 4.8.10.9. Playing the media resource
    17111711    if (!m_player || m_networkState == NETWORK_EMPTY)
    1712         scheduleLoad();
     1712        scheduleLoad(MediaResource);
    17131713
    17141714    m_autoplaying = false;
     
    19901990PassRefPtr<TextTrack> HTMLMediaElement::addTrack(const String& kind, const String& label, const String& language)
    19911991{
     1992    if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
     1993        return 0;
     1994
     1995    // FIXME(71915): addTrack should throw a SyntaxError exception if 'kind' is an unknown value.
    19921996    RefPtr<TextTrack> textTrack = TextTrack::create(this, kind, label, language);
    1993     m_textTracks.append(textTrack);
     1997    addTextTrack(textTrack);
    19941998    return textTrack.release();
    19951999}
    19962000
    1997 void HTMLMediaElement::trackWasAdded(HTMLTrackElement* track)
    1998 {
     2001void HTMLMediaElement::addTextTrack(PassRefPtr<TextTrack> track)
     2002{
     2003    if (!m_textTracks)
     2004        m_textTracks = TextTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
     2005    m_textTracks->append(track);
     2006
     2007    configureTextTracks();
     2008}
     2009
     2010void HTMLMediaElement::configureTextTracks()
     2011{
     2012    if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
     2013        return;
     2014
     2015    // 4.8.10.12.3 Sourcing out-of-band text tracks
     2016   
     2017    // When a text track corresponding to a track element is added to a media element's list of text tracks,
     2018    // the user agent must set the text track mode appropriately, as determined by the following conditions:
     2019   
     2020    // * If the text track kind is subtitles or captions and the user has indicated an interest in having a
     2021    // track with this text track kind, text track language, and text track label enabled, and there is no
     2022    // other text track in the media element's list of text tracks with a text track kind of either subtitles
     2023    // or captions whose text track mode is showing
     2024    // * If the text track kind is descriptions and the user has indicated an interest in having text
     2025    // descriptions with this text track language and text track label enabled, and there is no other text
     2026    // track in the media element's list of text tracks with a text track kind of descriptions whose text
     2027    // track mode is showing
     2028    //    Let the text track mode be showing.
     2029    //    If there is a text track in the media element's list of text tracks whose text track mode is showing
     2030    //    by default, the user agent must furthermore change that text track's text track mode to hidden.
     2031   
     2032    // * If the text track kind is chapters and the text track language is one that the user agent has reason
     2033    // to believe is appropriate for the user, and there is no other text track in the media element's list of
     2034    // text tracks with a text track kind of chapters whose text track mode is showing
     2035    //    Let the text track mode be showing.
     2036   
     2037    // * If the track element has a default attribute specified, and there is no other text track in the media
     2038    // element's list of text tracks whose text track mode is showing or showing by default
     2039    //    Let the text track mode be showing by default.
     2040   
     2041    // Otherwise
     2042    //    Let the text track mode be disabled.
     2043   
     2044    // FIXME(71123): Until the above logic has been implemented, just tell all text tracks to load.
     2045    for (Node* node = firstChild(); node; node = node->nextSibling()) {
     2046        if (node->hasTagName(trackTag))
     2047            static_cast<HTMLTrackElement*>(node)->scheduleLoad();
     2048    }
     2049}
     2050
     2051TextTrackList* HTMLMediaElement::textTracks() const
     2052{
     2053    if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
     2054        return 0;
     2055
     2056    if (m_textTracks)
     2057        return m_textTracks.get();
     2058
     2059    return 0;
     2060}
     2061
     2062void HTMLMediaElement::trackWasAdded(HTMLTrackElement* trackElement)
     2063{
     2064    if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
     2065        return;
     2066
    19992067#if !LOG_DISABLED
    2000     if (track->hasTagName(trackTag)) {
    2001         KURL url = track->getNonEmptyURLAttribute(srcAttr);
     2068    if (trackElement->hasTagName(trackTag)) {
     2069        KURL url = trackElement->getNonEmptyURLAttribute(srcAttr);
    20022070        LOG(Media, "HTMLMediaElement::trackWasAdded - 'src' is %s", urlForLogging(url).utf8().data());
    20032071    }
    20042072#endif
    2005     loadNextTextTrack(track);
     2073
     2074    // 4.8.10.12.3 Sourcing out-of-band text tracks
     2075    // When a track element's parent element changes and the new parent is a media element,
     2076    // then the user agent must add the track element's corresponding text track to the
     2077    // media element's list of text tracks ... [continues in TextTrackList::append]
     2078    RefPtr<TextTrack> textTrack = trackElement->track();
     2079    if (!textTrack)
     2080        return;
     2081    addTextTrack(textTrack);   
     2082    scheduleLoad(TextTrackResource);
    20062083}
    20072084 
    2008 void HTMLMediaElement::trackWillBeRemoved(HTMLTrackElement* track)
     2085void HTMLMediaElement::trackWillBeRemoved(HTMLTrackElement* trackElement)
    20092086{
    20102087#if !LOG_DISABLED
    2011     if (track->hasTagName(trackTag)) {
    2012         KURL url = track->getNonEmptyURLAttribute(srcAttr);
     2088    if (trackElement->hasTagName(trackTag)) {
     2089        KURL url = trackElement->getNonEmptyURLAttribute(srcAttr);
    20132090        LOG(Media, "HTMLMediaElement::trackWillBeRemoved - 'src' is %s", urlForLogging(url).utf8().data());
    20142091    }
    20152092#endif
    2016 }
    2017 
    2018 void HTMLMediaElement::trackSourceChanged(HTMLTrackElement* track)
    2019 {
    2020 #if !LOG_DISABLED
    2021     if (track->hasTagName(trackTag)) {
    2022         KURL url = track->getNonEmptyURLAttribute(srcAttr);
    2023         LOG(Media, "HTMLMediaElement::trackSourceChanged - 'src' is %s", urlForLogging(url).utf8().data());
    2024     }
    2025 #endif
    2026     loadNextTextTrack(track);
     2093
     2094    RefPtr<TextTrack> textTrack = trackElement->track();
     2095    if (!textTrack)
     2096        return;
     2097
     2098    // 4.8.10.12.3 Sourcing out-of-band text tracks
     2099    // When a track element's parent element changes and the old parent was a media element,
     2100    // then the user agent must remove the track element's corresponding text track from the
     2101    // media element's list of text tracks.
     2102    m_textTracks->remove(textTrack);
    20272103}
    20282104#endif
     
    20432119}
    20442120
    2045 KURL HTMLMediaElement::selectNextSourceChild(ContentType *contentType, InvalidSourceAction actionIfInvalid)
     2121KURL HTMLMediaElement::selectNextSourceChild(ContentType *contentType, InvalidURLAction actionIfInvalid)
    20462122{
    20472123#if !LOG_DISABLED
     
    21552231    // the media element's resource selection algorithm.
    21562232    if (networkState() == HTMLMediaElement::NETWORK_EMPTY) {
    2157         scheduleLoad();
     2233        scheduleLoad(MediaResource);
    21582234        return;
    21592235    }
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r98860 r99984  
    5454class MediaError;
    5555class KURL;
     56class TextTrackList;
    5657class TimeRanges;
    5758class Uint8Array;
     
    9091#endif
    9192
    92     void scheduleLoad();
     93    enum LoadType {
     94        MediaResource = 1 << 0,
     95        TextTrackResource = 1 << 1
     96    };
     97    void scheduleLoad(LoadType);
    9398   
    9499    MediaPlayer::MovieLoadType movieLoadType() const;
     
    182187#if ENABLE(VIDEO_TRACK)
    183188    PassRefPtr<TextTrack> addTrack(const String& kind, const String& label = "", const String& language = "");
     189    TextTrackList* textTracks() const;
     190
     191    void addTextTrack(PassRefPtr<TextTrack>);
     192
    184193    virtual void trackWasAdded(HTMLTrackElement*);
    185194    virtual void trackWillBeRemoved(HTMLTrackElement*);
    186     virtual void trackSourceChanged(HTMLTrackElement*);
     195
     196    // TextTrackClient
     197    virtual void textTrackReadyStateChanged(TextTrack*);
     198    virtual void textTrackModeChanged(TextTrack*);
     199    virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*);
     200    virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*);
     201    virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>);
     202    virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>);
    187203#endif
    188204
     
    230246    AudioSourceProvider* audioSourceProvider();
    231247#endif
     248
     249    enum InvalidURLAction { DoNothing, Complain };
     250    bool isSafeToLoadURL(const KURL&, InvalidURLAction);
    232251
    233252protected:
     
    350369    void prepareToPlay();
    351370
    352     enum InvalidSourceAction { DoNothing, Complain };
    353     bool isSafeToLoadURL(const KURL&, InvalidSourceAction);
    354     KURL selectNextSourceChild(ContentType*, InvalidSourceAction);
     371    KURL selectNextSourceChild(ContentType*, InvalidURLAction);
    355372    void mediaLoadingFailed(MediaPlayer::NetworkState);
    356373
    357374#if ENABLE(VIDEO_TRACK)
    358     void loadTextTracks();
    359     void loadNextTextTrack(HTMLTrackElement*);
    360 
    361     // TextTrackClient
    362     virtual void textTrackReadyStateChanged(TextTrack*);
    363     virtual void textTrackModeChanged(TextTrack*);
    364     virtual void textTrackCreated(TextTrack*);
    365     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*);
    366     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*);
    367     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>);
    368     virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>);
     375    void configureTextTracks();
    369376#endif
    370377
     
    472479    mutable double m_cachedTimeWallClockUpdateTime;
    473480    mutable double m_minimumWallClockTimeToCacheMediaTime;
     481   
     482    typedef unsigned PendingLoadFlags;
     483    PendingLoadFlags m_pendingLoadFlags;
    474484
    475485    bool m_playing : 1;
     
    515525
    516526#if ENABLE(VIDEO_TRACK)
    517     Vector<RefPtr<TextTrack> > m_textTracks;
     527    RefPtr<TextTrackList> m_textTracks;
    518528#endif
    519529};
  • trunk/Source/WebCore/html/HTMLMediaElement.idl

    r98238 r99984  
    114114#if defined(ENABLE_VIDEO_TRACK) && ENABLE_VIDEO_TRACK
    115115    [EnabledAtRuntime=webkitVideoTrack] TextTrack addTrack(in DOMString kind, in [Optional] DOMString label, in [Optional] DOMString language);
     116    readonly attribute [EnabledAtRuntime=webkitVideoTrack] TextTrackList textTracks;
    116117#endif
    117118};
  • trunk/Source/WebCore/html/HTMLTrackElement.cpp

    r99742 r99984  
    3333#include "HTMLNames.h"
    3434#include "Logging.h"
     35#include "RuntimeEnabledFeatures.h"
    3536#include "ScriptEventListener.h"
    3637
     
    5051HTMLTrackElement::~HTMLTrackElement()
    5152{
     53    if (m_track)
     54        m_track->clearClient();
    5255}
    5356
     
    6063{
    6164    HTMLElement::insertedIntoTree(deep);
    62     Element* parent = parentElement();
    63     if (parent && parent->isMediaElement())
    64         static_cast<HTMLMediaElement*>(parentNode())->trackWasAdded(this);
     65
     66    if (HTMLMediaElement* parent = mediaElement())
     67        parent->trackWasAdded(this);
    6568}
    6669
    6770void HTMLTrackElement::willRemove()
    6871{
    69     Element* parent = parentElement();
    70     if (parent && parent->isMediaElement())
    71         static_cast<HTMLMediaElement*>(parentNode())->trackWillBeRemoved(this);
     72    if (HTMLMediaElement* parent = mediaElement())
     73        parent->trackWillBeRemoved(this);
     74
    7275    HTMLElement::willRemove();
    7376}
     
    9194    const QualifiedName& attrName = attr->name();
    9295    if (attrName == srcAttr) {
    93         if (!getAttribute(srcAttr).isEmpty() && parentNode())
    94             static_cast<HTMLMediaElement*>(parentNode())->trackSourceChanged(this);
     96        if (!getAttribute(srcAttr).isEmpty() && mediaElement())
     97            scheduleLoad();
    9598    }
    9699}
     
    138141bool HTMLTrackElement::isDefault() const
    139142{
    140     return hasAttribute(defaultAttr);
     143    return fastHasAttribute(defaultAttr);
    141144}
    142145
     
    146149}
    147150
    148 TextTrack* HTMLTrackElement::track() const
    149 {
    150     if (m_track)
    151         return m_track.get();
    152     return 0;
     151LoadableTextTrack* HTMLTrackElement::ensureTrack()
     152{
     153    if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
     154        return 0;
     155
     156    if (!m_track)
     157        m_track = LoadableTextTrack::create(this, kind(), label(), srclang(), isDefault());
     158    return m_track.get();
     159}
     160
     161TextTrack* HTMLTrackElement::track()
     162{
     163    return ensureTrack();
    153164}
    154165
     
    158169}
    159170
    160 void HTMLTrackElement::load(ScriptExecutionContext* context, TextTrackClient* trackClient)
    161 {
    162     m_track = LoadableTextTrack::create(trackClient, this, kind(), label(), srclang(), isDefault());
    163 
    164     if (hasAttribute(srcAttr))
    165         m_track->load(getNonEmptyURLAttribute(srcAttr), context);
    166 }
    167 
    168 void HTMLTrackElement::textTrackLoadingCompleted(LoadableTextTrack*, bool loadingFailed)
     171void HTMLTrackElement::scheduleLoad()
     172{
     173    if (!mediaElement())
     174        return;
     175
     176    if (!fastHasAttribute(srcAttr))
     177        return;
     178
     179    ensureTrack()->scheduleLoad(getNonEmptyURLAttribute(srcAttr));
     180}
     181
     182bool HTMLTrackElement::canLoadUrl(LoadableTextTrack*, const KURL& url)
     183{
     184    HTMLMediaElement* parent = mediaElement();
     185    if (!parent)
     186        return false;
     187
     188    if (!parent->isSafeToLoadURL(url, HTMLMediaElement::Complain))
     189        return false;
     190   
     191    return dispatchBeforeLoadEvent(url.string());
     192}
     193
     194void HTMLTrackElement::didCompleteLoad(LoadableTextTrack*, bool loadingFailed)
    169195{
    170196    ExceptionCode ec = 0;
    171197    dispatchEvent(Event::create(loadingFailed ? eventNames().errorEvent : eventNames().loadEvent, false, false), ec);
    172198}
     199   
     200void HTMLTrackElement::textTrackReadyStateChanged(TextTrack* track)
     201{
     202    if (HTMLMediaElement* parent = mediaElement())
     203        return parent->textTrackReadyStateChanged(track);
     204}
     205   
     206void HTMLTrackElement::textTrackModeChanged(TextTrack* track)
     207{
     208    if (HTMLMediaElement* parent = mediaElement())
     209        return parent->textTrackModeChanged(track);
     210}
     211   
     212void HTMLTrackElement::textTrackAddCues(TextTrack* track, const TextTrackCueList* cues)
     213{
     214    if (HTMLMediaElement* parent = mediaElement())
     215        return parent->textTrackAddCues(track, cues);
     216}
     217   
     218void HTMLTrackElement::textTrackRemoveCues(TextTrack* track, const TextTrackCueList* cues)
     219{
     220    if (HTMLMediaElement* parent = mediaElement())
     221        return parent->textTrackAddCues(track, cues);
     222}
     223   
     224void HTMLTrackElement::textTrackAddCue(TextTrack* track, PassRefPtr<TextTrackCue> cue)
     225{
     226    if (HTMLMediaElement* parent = mediaElement())
     227        return parent->textTrackAddCue(track, cue);
     228}
     229   
     230void HTMLTrackElement::textTrackRemoveCue(TextTrack* track, PassRefPtr<TextTrackCue> cue)
     231{
     232    if (HTMLMediaElement* parent = mediaElement())
     233        return parent->textTrackRemoveCue(track, cue);
     234}
     235
     236HTMLMediaElement* HTMLTrackElement::mediaElement() const
     237{
     238    Element* parent = parentElement();
     239    if (parent && parent->isMediaElement())
     240        return static_cast<HTMLMediaElement*>(parentNode());
     241
     242    return 0;
     243}
    173244
    174245#if ENABLE(MICRODATA)
  • trunk/Source/WebCore/html/HTMLTrackElement.h

    r98860 r99984  
    3434namespace WebCore {
    3535
    36 class HTMLTrackElement : public HTMLElement, private TextTrackLoadingClient {
     36class HTMLMediaElement;
     37
     38class HTMLTrackElement : public HTMLElement, public TextTrackClient {
    3739public:
    3840    static PassRefPtr<HTMLTrackElement> create(const QualifiedName&, Document*);
     
    4951    void setLabel(const String&);
    5052    void setIsDefault(bool);
    51     TextTrack* track() const;
     53    TextTrack* track();
    5254   
    53     void load(ScriptExecutionContext*, TextTrackClient*);
     55    void scheduleLoad();
     56    virtual bool canLoadUrl(LoadableTextTrack*, const KURL&);
     57    virtual void didCompleteLoad(LoadableTextTrack*, bool /* loadingFailed */);
    5458
    5559private:
    56 
    57     // TextTrackLoadingClient
    58     virtual void textTrackLoadingCompleted(LoadableTextTrack*, bool);
    59 
    6060    HTMLTrackElement(const QualifiedName&, Document*);
    6161    virtual ~HTMLTrackElement();
    62    
     62
    6363    virtual void parseMappedAttribute(Attribute*);
    6464    virtual void attributeChanged(Attribute*, bool preserveDecls);
     
    7373#endif
    7474
     75    HTMLMediaElement* mediaElement() const;
     76
     77    // TextTrackClient
     78    virtual void textTrackReadyStateChanged(TextTrack*);
     79    virtual void textTrackModeChanged(TextTrack*);
     80    virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*);
     81    virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*);
     82    virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>);
     83    virtual void textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue>);
     84
     85    LoadableTextTrack* ensureTrack();
     86
    7587    RefPtr<LoadableTextTrack> m_track;
    7688};
  • trunk/Source/WebCore/html/LoadableTextTrack.cpp

    r99234 r99984  
    3030#include "LoadableTextTrack.h"
    3131
     32#include "HTMLTrackElement.h"
     33#include "ScriptEventListener.h"
    3234#include "TextTrackCueList.h"
    3335
    3436namespace WebCore {
    3537
    36 LoadableTextTrack::LoadableTextTrack(TextTrackClient* trackClient, TextTrackLoadingClient* loadingClient, const String& kind, const String& label, const String& language, bool isDefault)
    37     : TextTrack(trackClient, kind, label, language)
    38     , m_loadingClient(loadingClient)
     38LoadableTextTrack::LoadableTextTrack(HTMLTrackElement* track, const String& kind, const String& label, const String& language, bool isDefault)
     39    : TextTrack(track, kind, label, language)
     40    , m_trackElement(track)
     41    , m_loadTimer(this, &LoadableTextTrack::loadTimerFired)
    3942    , m_isDefault(isDefault)
    4043{
     
    4548}
    4649
    47 void LoadableTextTrack::load(const KURL& url, ScriptExecutionContext* context)
     50void LoadableTextTrack::clearClient()
    4851{
    49     if (!m_loader)
    50         m_loader = TextTrackLoader::create(this, context);
    51     m_loader->load(url);
     52    m_trackElement = 0;
     53    TextTrack::clearClient();
     54}
     55
     56void LoadableTextTrack::scheduleLoad(const KURL& url)
     57{
     58    m_url = url;
     59    if (!m_loadTimer.isActive())
     60        m_loadTimer.startOneShot(0);
     61}
     62
     63void LoadableTextTrack::loadTimerFired(Timer<LoadableTextTrack>*)
     64{
     65    setReadyState(TextTrack::LOADING);
     66   
     67    if (m_loader)
     68        m_loader->cancelLoad();
     69
     70    if (!m_trackElement || !m_trackElement->canLoadUrl(this, m_url)) {
     71        setReadyState(TextTrack::HTML_ERROR);
     72        return;
     73    }
     74
     75    m_loader = TextTrackLoader::create(this, static_cast<ScriptExecutionContext*>(m_trackElement->document()));
     76    m_loader->load(m_url);
    5277}
    5378
     
    83108    loadingFailed ? setReadyState(TextTrack::HTML_ERROR) : setReadyState(TextTrack::LOADED);
    84109
    85     if (m_loadingClient)
    86         m_loadingClient->textTrackLoadingCompleted(this, loadingFailed);
     110    if (m_trackElement)
     111        m_trackElement->didCompleteLoad(this, loadingFailed);
    87112}
    88113
  • trunk/Source/WebCore/html/LoadableTextTrack.h

    r98000 r99984  
    3838class HTMLTrackElement;
    3939class LoadableTextTrack;
    40 class ScriptExecutionContext;
    4140
    42 class TextTrackLoadingClient {
     41class LoadableTextTrackClient : public TextTrackClient {
    4342public:
    44     virtual ~TextTrackLoadingClient() { }
     43    virtual ~LoadableTextTrackClient() { }
    4544   
    46     virtual void textTrackLoadingCompleted(LoadableTextTrack*, bool /* loadingFailed */) = 0;
     45    virtual bool canLoadUrl(LoadableTextTrack*, const KURL&) { return false; }
     46    virtual void loadingCompleted(LoadableTextTrack*, bool /* loadingFailed */) { }
    4747};
    4848
    4949class LoadableTextTrack : public TextTrack, private TextTrackLoaderClient {
    5050public:
    51     static PassRefPtr<LoadableTextTrack> create(TextTrackClient* trackClient, TextTrackLoadingClient* loadingClient, const String& kind, const String& label, const String& language, bool isDefault)
     51    static PassRefPtr<LoadableTextTrack> create(HTMLTrackElement* track, const String& kind, const String& label, const String& language, bool isDefault)
    5252    {
    53         return adoptRef(new LoadableTextTrack(trackClient, loadingClient, kind, label, language, isDefault));
     53        return adoptRef(new LoadableTextTrack(track, kind, label, language, isDefault));
    5454    }
    5555    virtual ~LoadableTextTrack();
    5656
    57     void load(const KURL&, ScriptExecutionContext*);
    58     bool supportsType(const String&);
     57    void scheduleLoad(const KURL&);
     58
     59    virtual void clearClient();
    5960
    6061private:
     
    6566    virtual void cueLoadingCompleted(TextTrackLoader*, bool loadingFailed);
    6667
    67     LoadableTextTrack(TextTrackClient*, TextTrackLoadingClient*, const String& kind, const String& label, const String& language, bool isDefault);
     68    LoadableTextTrack(HTMLTrackElement*, const String& kind, const String& label, const String& language, bool isDefault);
    6869
     70    void loadTimerFired(Timer<LoadableTextTrack>*);
     71
     72    HTMLTrackElement* m_trackElement;
     73    Timer<LoadableTextTrack> m_loadTimer;
    6974    OwnPtr<TextTrackLoader> m_loader;
    70     TextTrackLoadingClient* m_loadingClient;
     75    KURL m_url;
    7176    bool m_isDefault;
    7277};
  • trunk/Source/WebCore/html/TextTrack.cpp

    r99645 r99984  
    5656    if (m_client)
    5757        m_client->textTrackRemoveCues(this, m_cues.get());
    58     setClient(0);
     58    clearClient();
    5959}
    6060
  • trunk/Source/WebCore/html/TextTrack.h

    r99645 r99984  
    4747    virtual void textTrackReadyStateChanged(TextTrack*) = 0;
    4848    virtual void textTrackModeChanged(TextTrack*) = 0;
    49     virtual void textTrackCreated(TextTrack*) = 0;
    5049    virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) = 0;
    5150    virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) = 0;
     
    7978    void modeChanged();
    8079
     80    virtual void clearClient() { m_client = 0; }
    8181    TextTrackClient* client() { return m_client; }
    82     void setClient(TextTrackClient* client) { m_client = client; }
    8382
    8483    void addCue(PassRefPtr<TextTrackCue>, ExceptionCode&);
    8584    void removeCue(PassRefPtr<TextTrackCue>, ExceptionCode&);
    8685   
    87     virtual void newCuesLoaded();
    88     virtual void fetchNewestCues(Vector<TextTrackCue*>&);
     86    void newCuesLoaded();
     87    void fetchNewestCues(Vector<TextTrackCue*>&);
    8988
    9089protected:
  • trunk/Source/WebCore/html/TextTrackCueList.cpp

    r99234 r99984  
    7070void TextTrackCueList::add(PassRefPtr<TextTrackCue> cue, size_t start, size_t end)
    7171{
    72     ASSERT(start >= 0 && start <= m_list.size());
    73     ASSERT(end >= 0 && end <= m_list.size());
     72    ASSERT(start <= m_list.size());
     73    ASSERT(end <= m_list.size());
    7474
    7575    // Maintain text track cue order:
  • trunk/Source/WebCore/loader/TextTrackLoader.cpp

    r98911 r99984  
    6767    if (m_state >= Finished)
    6868        m_client->cueLoadingCompleted(this, m_state == Failed);
     69}
     70
     71void TextTrackLoader::cancelLoad()
     72{
     73    if (m_cachedCueData) {
     74        m_cachedCueData->removeClient(this);
     75        m_cachedCueData = 0;
     76    }
    6977}
    7078
     
    143151        m_cueLoadTimer.startOneShot(0);
    144152   
    145     m_cachedCueData->removeClient(this);
    146     m_cachedCueData = 0;
     153    cancelLoad();
    147154}
    148155
     
    152159        return false;
    153160   
    154     if (m_cachedCueData) {
    155         m_cachedCueData->removeClient(this);
    156         m_cachedCueData = 0;
    157     }
     161    cancelLoad();
    158162   
    159163    ASSERT(m_scriptExecutionContext->isDocument());
  • trunk/Source/WebCore/loader/TextTrackLoader.h

    r98000 r99984  
    6363   
    6464    bool load(const KURL&);
     65    void cancelLoad();
    6566    void getNewCues(Vector<RefPtr<TextTrackCue> >& outputCues);
    6667   
  • trunk/Source/WebCore/page/DOMWindow.idl

    r99750 r99984  
    614614        attribute [EnabledAtRuntime=webkitVideoTrack] TextTrackCueConstructor TextTrackCue; // Usable with the new operator
    615615        attribute [EnabledAtRuntime=webkitVideoTrack] TextTrackCueListConstructor TextTrackCueList;
     616        attribute [EnabledAtRuntime=webkitVideoTrack] TextTrackListConstructor TextTrackList;
    616617        attribute [EnabledAtRuntime=webkitVideoTrack] TrackEventConstructor TrackEvent;
    617618#endif
Note: See TracChangeset for help on using the changeset viewer.