Title: [100453] trunk
Revision
100453
Author
eric.carl...@apple.com
Date
2011-11-16 08:05:45 -0800 (Wed, 16 Nov 2011)

Log Message

addTrack() must throw an exception if 'kind' is unknown
https://bugs.webkit.org/show_bug.cgi?id=71915

Reviewed by Philippe Normand.

Source/WebCore: 

Tests: media/track/track-addtrack-kind.html
       media/track/track-kind.html

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::textTrackKindChanged): New. Will be implemented for 62885.
(WebCore::HTMLMediaElement::addTrack): Throw if  'kind' is not a known value.
(WebCore::HTMLMediaElement::addTextTrack): Call textTracks(), it will allocate the track
    list object if necessary.
(WebCore::HTMLMediaElement::textTracks): Never return NULL, a TextTrackList with no tracks
    is allowed.
* html/HTMLMediaElement.h:
(WebCore::HTMLMediaElement::addTrack): Add variants to deal with optional parameters plus
    a mandatory ExceptionCode parameter.
* html/HTMLMediaElement.idl: addTrack can generate an exception.

* html/HTMLTrackElement.cpp:
(WebCore::HTMLTrackElement::attributeChanged): kind, label, and srclang attribute changes should
    percolate down the the TextTrack.
(WebCore::HTMLTrackElement::kind): Return the TextTrack kind because it is not necessarily the
    same as the attribute value.
(WebCore::HTMLTrackElement::ensureTrack): Only pass legal 'kind' keywords to create a TextTrack.
(WebCore::HTMLTrackElement::textTrackKindChanged): Notify parent element, if any.
* html/HTMLTrackElement.h:

* html/TextTrack.cpp:
(WebCore::TextTrack::subtitlesKeyword): New, return legal kind attribute value.
(WebCore::TextTrack::captionsKeyword): Ditto.
(WebCore::TextTrack::descriptionsKeyword): Ditto.
(WebCore::TextTrack::chaptersKeyword): Ditto.
(WebCore::TextTrack::metadataKeyword): Ditto.
(WebCore::TextTrack::TextTrack): Call setKind to make sure m_kind is always set to legal value.
(WebCore::TextTrack::isValidKindKeyword): New, validate 'kind' value.
(WebCore::TextTrack::setKind): Only allow legal values.
* html/TextTrack.h:
(WebCore::TextTrack::kind):
(WebCore::TextTrack::label):
(WebCore::TextTrack::setLabel):
(WebCore::TextTrack::language):
(WebCore::TextTrack::setLanguage):
(WebCore::TextTrack::readyState):
(WebCore::TextTrack::mode):

LayoutTests: 

* media/track/track-addtrack-kind-expected.txt: Added.
* media/track/track-addtrack-kind.html: Added.
* media/track/track-kind-expected.txt: Added.
* media/track/track-kind.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (100452 => 100453)


--- trunk/LayoutTests/ChangeLog	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/LayoutTests/ChangeLog	2011-11-16 16:05:45 UTC (rev 100453)
@@ -1,3 +1,15 @@
+2011-11-16  Eric Carlson  <eric.carl...@apple.com>
+
+        addTrack() must throw an exception if 'kind' is unknown
+        https://bugs.webkit.org/show_bug.cgi?id=71915
+
+        Reviewed by Philippe Normand.
+
+        * media/track/track-addtrack-kind-expected.txt: Added.
+        * media/track/track-addtrack-kind.html: Added.
+        * media/track/track-kind-expected.txt: Added.
+        * media/track/track-kind.html: Added.
+
 2011-11-16  Alexander Pavlov  <apav...@chromium.org>
 
         Unreviewed, test fix after http://trac.webkit.org/changeset/100273.

Added: trunk/LayoutTests/media/track/track-addtrack-kind-expected.txt (0 => 100453)


--- trunk/LayoutTests/media/track/track-addtrack-kind-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-addtrack-kind-expected.txt	2011-11-16 16:05:45 UTC (rev 100453)
@@ -0,0 +1,21 @@
+Tests that the addTrack() only accepts known 'kind' values.
+
+++ Test invalid 'kind'.
+EXPECTED (video.textTracks.length == '0') OK
+TEST(video.addTrack('kaptions')) THROWS(DOMException.SYNTAX_ERR) OK
+EXPECTED (video.textTracks.length == '0') OK
+
+++ Test all valid 'kind' keywords.
+RUN(video.addTrack('subtitles'))
+EXPECTED (video.textTracks.length == '1') OK
+RUN(video.addTrack('captions'))
+EXPECTED (video.textTracks.length == '2') OK
+RUN(video.addTrack('descriptions'))
+EXPECTED (video.textTracks.length == '3') OK
+RUN(video.addTrack('chapters'))
+EXPECTED (video.textTracks.length == '4') OK
+RUN(video.addTrack('metadata'))
+EXPECTED (video.textTracks.length == '5') OK
+
+END OF TEST
+

Added: trunk/LayoutTests/media/track/track-addtrack-kind.html (0 => 100453)


--- trunk/LayoutTests/media/track/track-addtrack-kind.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-addtrack-kind.html	2011-11-16 16:05:45 UTC (rev 100453)
@@ -0,0 +1,46 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+        <script src=""
+        <script src=""
+        <script>
+
+            var trackCount = 0;
+
+            function addTrack(type)
+            {
+                run("video.addTrack('" + type + "')");
+                testExpected("video.textTracks.length", ++trackCount);
+            }
+
+            function start()
+            {
+                findMediaElement();
+
+                consoleWrite("<em>++ Test invalid 'kind'.</em>");
+                testExpected("video.textTracks.length", 0);
+                testException("video.addTrack('kaptions')", "DOMException.SYNTAX_ERR");
+                testExpected("video.textTracks.length", 0);
+                consoleWrite("");
+
+                consoleWrite("<em>++ Test all valid 'kind' keywords.</em>");
+                addTrack("subtitles");
+                addTrack("captions");
+                addTrack("descriptions");
+                addTrack("chapters");
+                addTrack("metadata");
+
+                consoleWrite("");
+                endTest();
+            }
+
+        </script>
+    </head>
+    <body _onload_="start()">
+        <p>Tests that the addTrack() only accepts known 'kind' values.</p>
+        <video>
+        </video>
+    </body>
+</html>

Added: trunk/LayoutTests/media/track/track-kind-expected.txt (0 => 100453)


--- trunk/LayoutTests/media/track/track-kind-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-kind-expected.txt	2011-11-16 16:05:45 UTC (rev 100453)
@@ -0,0 +1,95 @@
+Tests that the 'addtrack' event is fired when a TextTrack is created.
+
+
+++ Test default attribute value
+EXPECTED (trackElement.getAttribute('kind') == 'null') OK
+EXPECTED (trackElement.kind == 'subtitles') OK
+EXPECTED (video.textTracks[0].kind == 'subtitles') OK
+
+*** Set to bogus value, should return default
+set via DOM
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.kind = 'english-metadata')
+EXPECTED (trackElement.getAttribute('kind') == 'english-metadata') OK
+EXPECTED (trackElement.kind == 'subtitles') OK
+EXPECTED (trackElement.track.kind == 'subtitles') OK
+and via attribute
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.setAttribute('kind', 'english-metadata'))
+EXPECTED (trackElement.kind == 'subtitles') OK
+EXPECTED (trackElement.track.kind == 'subtitles') OK
+EXPECTED (trackElement.getAttribute('kind') == 'english-metadata') OK
+
+*** Set to known values
+++ 'subtitles'
+set via DOM
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.kind = 'subtitles')
+EXPECTED (trackElement.getAttribute('kind') == 'subtitles') OK
+EXPECTED (trackElement.kind == 'subtitles') OK
+EXPECTED (trackElement.track.kind == 'subtitles') OK
+and via attribute
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.setAttribute('kind', 'subtitles'))
+EXPECTED (trackElement.kind == 'subtitles') OK
+EXPECTED (trackElement.track.kind == 'subtitles') OK
+EXPECTED (trackElement.getAttribute('kind') == 'subtitles') OK
+
+++ 'captions'
+set via DOM
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.kind = 'captions')
+EXPECTED (trackElement.getAttribute('kind') == 'captions') OK
+EXPECTED (trackElement.kind == 'captions') OK
+EXPECTED (trackElement.track.kind == 'captions') OK
+and via attribute
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.setAttribute('kind', 'captions'))
+EXPECTED (trackElement.kind == 'captions') OK
+EXPECTED (trackElement.track.kind == 'captions') OK
+EXPECTED (trackElement.getAttribute('kind') == 'captions') OK
+
+++ 'descriptions'
+set via DOM
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.kind = 'descriptions')
+EXPECTED (trackElement.getAttribute('kind') == 'descriptions') OK
+EXPECTED (trackElement.kind == 'descriptions') OK
+EXPECTED (trackElement.track.kind == 'descriptions') OK
+and via attribute
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.setAttribute('kind', 'descriptions'))
+EXPECTED (trackElement.kind == 'descriptions') OK
+EXPECTED (trackElement.track.kind == 'descriptions') OK
+EXPECTED (trackElement.getAttribute('kind') == 'descriptions') OK
+
+++ 'chapters'
+set via DOM
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.kind = 'chapters')
+EXPECTED (trackElement.getAttribute('kind') == 'chapters') OK
+EXPECTED (trackElement.kind == 'chapters') OK
+EXPECTED (trackElement.track.kind == 'chapters') OK
+and via attribute
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.setAttribute('kind', 'chapters'))
+EXPECTED (trackElement.kind == 'chapters') OK
+EXPECTED (trackElement.track.kind == 'chapters') OK
+EXPECTED (trackElement.getAttribute('kind') == 'chapters') OK
+
+++ 'metadata'
+set via DOM
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.kind = 'metadata')
+EXPECTED (trackElement.getAttribute('kind') == 'metadata') OK
+EXPECTED (trackElement.kind == 'metadata') OK
+EXPECTED (trackElement.track.kind == 'metadata') OK
+and via attribute
+RUN(trackElement.removeAttribute('kind'))
+RUN(trackElement.setAttribute('kind', 'metadata'))
+EXPECTED (trackElement.kind == 'metadata') OK
+EXPECTED (trackElement.track.kind == 'metadata') OK
+EXPECTED (trackElement.getAttribute('kind') == 'metadata') OK
+
+END OF TEST
+

Added: trunk/LayoutTests/media/track/track-kind.html (0 => 100453)


--- trunk/LayoutTests/media/track/track-kind.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-kind.html	2011-11-16 16:05:45 UTC (rev 100453)
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+    <head>
+
+        <script src=""
+        <script src=""
+        <script>
+
+            var trackElement;
+            function setKind(value)
+            {
+                consoleWrite("<b> set via DOM</b>");
+                run("trackElement.removeAttribute('kind')");
+                run("trackElement.kind = '" + value + "'");
+                testExpected("trackElement.getAttribute('kind')", value);
+                testExpected("trackElement.kind", value);
+                testExpected("trackElement.track.kind", value);
+                consoleWrite("<b> and via attribute</b>");
+                run("trackElement.removeAttribute('kind')");
+                run("trackElement.setAttribute('kind', '" + value + "')");
+                testExpected("trackElement.kind", value);
+                testExpected("trackElement.track.kind", value);
+                testExpected("trackElement.getAttribute('kind')", value);
+                consoleWrite("");
+
+            }
+
+            function start()
+            {
+                findMediaElement();
+                consoleWrite("");
+
+                trackElement = document.getElementById('track_1');
+
+                consoleWrite("<b>++ Test default attribute value</b>");
+                testExpected("trackElement.getAttribute('kind')", null);
+                testExpected("trackElement.kind", "subtitles");
+                testExpected("video.textTracks[0].kind", "subtitles");
+                consoleWrite("");
+
+                consoleWrite("<b>*** Set to bogus value, should return default</b>");
+                consoleWrite("<b> set via DOM</b>");
+                var value = "english-metadata"
+                run("trackElement.removeAttribute('kind')");
+                run("trackElement.kind = '" + value + "'");
+                testExpected("trackElement.getAttribute('kind')", value);
+                testExpected("trackElement.kind", "subtitles");
+                testExpected("trackElement.track.kind", "subtitles");
+                consoleWrite("<b> and via attribute</b>");
+                run("trackElement.removeAttribute('kind')");
+                run("trackElement.setAttribute('kind', '" + value + "')");
+                testExpected("trackElement.kind", "subtitles");
+                testExpected("trackElement.track.kind", "subtitles");
+                testExpected("trackElement.getAttribute('kind')", value);
+                consoleWrite("");
+
+                consoleWrite("<b>*** Set to known values</b>");
+                consoleWrite("<b>++ 'subtitles'</b>");
+                setKind("subtitles");
+
+                consoleWrite("<b>++ 'captions'</b>");
+                setKind("captions");
+
+                consoleWrite("<b>++ 'descriptions'</b>");
+                setKind("descriptions");
+
+                consoleWrite("<b>++ 'chapters'</b>");
+                setKind("chapters");
+
+                consoleWrite("<b>++ 'metadata'</b>");
+                setKind("metadata");
+
+                endTest();
+            }
+
+        </script>
+    </head>
+    <body _onload_="start()">
+        <p>Tests that the 'addtrack' event is fired when a TextTrack is created.</p>
+        <video>
+            <track id=track_1>
+        </video>
+    </body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (100452 => 100453)


--- trunk/Source/WebCore/ChangeLog	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/Source/WebCore/ChangeLog	2011-11-16 16:05:45 UTC (rev 100453)
@@ -1,3 +1,52 @@
+2011-11-16  Eric Carlson  <eric.carl...@apple.com>
+
+        addTrack() must throw an exception if 'kind' is unknown
+        https://bugs.webkit.org/show_bug.cgi?id=71915
+
+        Reviewed by Philippe Normand.
+
+        Tests: media/track/track-addtrack-kind.html
+               media/track/track-kind.html
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::textTrackKindChanged): New. Will be implemented for 62885.
+        (WebCore::HTMLMediaElement::addTrack): Throw if  'kind' is not a known value.
+        (WebCore::HTMLMediaElement::addTextTrack): Call textTracks(), it will allocate the track
+            list object if necessary.
+        (WebCore::HTMLMediaElement::textTracks): Never return NULL, a TextTrackList with no tracks
+            is allowed.
+        * html/HTMLMediaElement.h:
+        (WebCore::HTMLMediaElement::addTrack): Add variants to deal with optional parameters plus
+            a mandatory ExceptionCode parameter.
+        * html/HTMLMediaElement.idl: addTrack can generate an exception.
+
+        * html/HTMLTrackElement.cpp:
+        (WebCore::HTMLTrackElement::attributeChanged): kind, label, and srclang attribute changes should
+            percolate down the the TextTrack.
+        (WebCore::HTMLTrackElement::kind): Return the TextTrack kind because it is not necessarily the
+            same as the attribute value.
+        (WebCore::HTMLTrackElement::ensureTrack): Only pass legal 'kind' keywords to create a TextTrack.
+        (WebCore::HTMLTrackElement::textTrackKindChanged): Notify parent element, if any.
+        * html/HTMLTrackElement.h:
+
+        * html/TextTrack.cpp:
+        (WebCore::TextTrack::subtitlesKeyword): New, return legal kind attribute value.
+        (WebCore::TextTrack::captionsKeyword): Ditto.
+        (WebCore::TextTrack::descriptionsKeyword): Ditto.
+        (WebCore::TextTrack::chaptersKeyword): Ditto.
+        (WebCore::TextTrack::metadataKeyword): Ditto.
+        (WebCore::TextTrack::TextTrack): Call setKind to make sure m_kind is always set to legal value.
+        (WebCore::TextTrack::isValidKindKeyword): New, validate 'kind' value.
+        (WebCore::TextTrack::setKind): Only allow legal values.
+        * html/TextTrack.h:
+        (WebCore::TextTrack::kind):
+        (WebCore::TextTrack::label):
+        (WebCore::TextTrack::setLabel):
+        (WebCore::TextTrack::language):
+        (WebCore::TextTrack::setLanguage):
+        (WebCore::TextTrack::readyState):
+        (WebCore::TextTrack::mode):
+
 2011-11-16  Andreas Kling  <kl...@webkit.org>
 
         CSSValue: Clean up initial value construction.

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (100452 => 100453)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2011-11-16 16:05:45 UTC (rev 100453)
@@ -931,6 +931,11 @@
     // FIXME(62885): Implement.
 }
 
+void HTMLMediaElement::textTrackKindChanged(TextTrack*)
+{
+    // FIXME(62885): Implement.
+}
+
 void HTMLMediaElement::textTrackAddCues(TextTrack*, const TextTrackCueList* cues) 
 {
     for (size_t i = 0; i < cues->length(); ++i)
@@ -2069,23 +2074,38 @@
 }
 
 #if ENABLE(VIDEO_TRACK)
-PassRefPtr<TextTrack> HTMLMediaElement::addTrack(const String& kind, const String& label, const String& language)
+PassRefPtr<TextTrack> HTMLMediaElement::addTrack(const String& kind, const String& label, const String& language, ExceptionCode& ec)
 {
     if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
         return 0;
 
-    // FIXME(71915): addTrack should throw a SyntaxError exception if 'kind' is an unknown value.
+    // 4.8.10.12.4 Text track API
+    // The addTextTrack(kind, label, language) method of media elements, when invoked, must run the following steps:
+    
+    // 1. If kind is not one of the following strings, then throw a SyntaxError exception and abort these steps
+    if (!TextTrack::isValidKindKeyword(kind)) {
+        ec = SYNTAX_ERR;
+        return 0;
+    }
+
+    // 2. If the label argument was omitted, let label be the empty string.
+    // 3. If the language argument was omitted, let language be the empty string.
+    // 4. Create a new TextTrack object.
     RefPtr<TextTrack> textTrack = TextTrack::create(ActiveDOMObject::scriptExecutionContext(), this, kind, label, language);
+
+    // 5. Create a new text track corresponding to the new object, and set its text track kind to kind, its text 
+    // track label to label, its text track language to language, its text track readiness state to the text track
+    // loaded state, its text track mode to the text track hidden mode, and its text track list of cues to an empty list.
+    
+    // 6. Add the new text track to the media element's list of text tracks.
     addTextTrack(textTrack);
+
     return textTrack.release();
 }
 
 void HTMLMediaElement::addTextTrack(PassRefPtr<TextTrack> track)
 {
-    if (!m_textTracks)
-        m_textTracks = TextTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
-    m_textTracks->append(track);
-
+    textTracks()->append(track);
     configureTextTracks();
 }
 
@@ -2130,15 +2150,15 @@
     }
 }
 
-TextTrackList* HTMLMediaElement::textTracks() const 
+TextTrackList* HTMLMediaElement::textTracks() 
 {
     if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
         return 0;
 
-    if (m_textTracks)
-        return m_textTracks.get();
+    if (!m_textTracks)
+        m_textTracks = TextTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
 
-    return 0;
+    return m_textTracks.get();
 }
 
 void HTMLMediaElement::trackWasAdded(HTMLTrackElement* trackElement)

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (100452 => 100453)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2011-11-16 16:05:45 UTC (rev 100453)
@@ -188,9 +188,12 @@
     float percentLoaded() const;
 
 #if ENABLE(VIDEO_TRACK)
-    PassRefPtr<TextTrack> addTrack(const String& kind, const String& label = "", const String& language = "");
-    TextTrackList* textTracks() const;
+    PassRefPtr<TextTrack> addTrack(const String& kind, const String& label, const String& language, ExceptionCode&);
+    PassRefPtr<TextTrack> addTrack(const String& kind, const String& label, ExceptionCode& ec) { return addTrack(kind, label, emptyString(), ec); }
+    PassRefPtr<TextTrack> addTrack(const String& kind, ExceptionCode& ec) { return addTrack(kind, emptyString(), emptyString(), ec); }
 
+    TextTrackList* textTracks();
+
     void addTextTrack(PassRefPtr<TextTrack>);
 
     virtual void trackWasAdded(HTMLTrackElement*);
@@ -198,6 +201,7 @@
 
     // TextTrackClient
     virtual void textTrackReadyStateChanged(TextTrack*);
+    virtual void textTrackKindChanged(TextTrack*);
     virtual void textTrackModeChanged(TextTrack*);
     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*);
     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*);

Modified: trunk/Source/WebCore/html/HTMLMediaElement.idl (100452 => 100453)


--- trunk/Source/WebCore/html/HTMLMediaElement.idl	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/Source/WebCore/html/HTMLMediaElement.idl	2011-11-16 16:05:45 UTC (rev 100453)
@@ -112,7 +112,8 @@
 #endif
 
 #if defined(ENABLE_VIDEO_TRACK) && ENABLE_VIDEO_TRACK
-    [EnabledAtRuntime=webkitVideoTrack] TextTrack addTrack(in DOMString kind, in [Optional] DOMString label, in [Optional] DOMString language);
+    [EnabledAtRuntime=webkitVideoTrack] TextTrack addTrack(in DOMString kind, in [Optional] DOMString label, in [Optional] DOMString language)
+        raises (DOMException);
     readonly attribute [EnabledAtRuntime=webkitVideoTrack] TextTrackList textTracks;
 #endif
 

Modified: trunk/Source/WebCore/html/HTMLTrackElement.cpp (100452 => 100453)


--- trunk/Source/WebCore/html/HTMLTrackElement.cpp	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/Source/WebCore/html/HTMLTrackElement.cpp	2011-11-16 16:05:45 UTC (rev 100453)
@@ -95,7 +95,15 @@
     if (attrName == srcAttr) {
         if (!getAttribute(srcAttr).isEmpty() && mediaElement())
             scheduleLoad();
-    }
+
+    // 4.8.10.12.3 Sourcing out-of-band text tracks
+    // As the kind, label, and srclang attributes are set, changed, or removed, the text track must update accordingly...
+    } else if (attrName == kindAttr)
+        track()->setKind(attr->value());
+    else if (attrName == labelAttr)
+        track()->setLabel(attr->value());
+    else if (attrName == srclangAttr)
+        track()->setLanguage(attr->value());
 }
 
 KURL HTMLTrackElement::src() const
@@ -108,9 +116,9 @@
     setAttribute(srcAttr, url);
 }
 
-String HTMLTrackElement::kind() const
+String HTMLTrackElement::kind()
 {
-    return getAttribute(kindAttr);
+    return track()->kind();
 }
 
 void HTMLTrackElement::setKind(const String& kind)
@@ -153,8 +161,13 @@
     if (!RuntimeEnabledFeatures::webkitVideoTrackEnabled())
         return 0;
 
-    if (!m_track)
-        m_track = LoadableTextTrack::create(this, kind(), label(), srclang(), isDefault());
+    if (!m_track) {
+        // The kind attribute is an enumerated attribute, limited only to know values. It defaults to 'subtitles' if missing or invalid.
+        String kind = getAttribute(kindAttr);
+        if (!TextTrack::isValidKindKeyword(kind))
+            kind = TextTrack::subtitlesKeyword();
+        m_track = LoadableTextTrack::create(this, kind, label(), srclang(), isDefault());
+    }
     return m_track.get();
 }
 
@@ -203,12 +216,18 @@
         return parent->textTrackReadyStateChanged(track);
 }
     
+void HTMLTrackElement::textTrackKindChanged(TextTrack* track)
+{
+    if (HTMLMediaElement* parent = mediaElement())
+        return parent->textTrackKindChanged(track);
+}
+
 void HTMLTrackElement::textTrackModeChanged(TextTrack* track)
 {
     if (HTMLMediaElement* parent = mediaElement())
         return parent->textTrackModeChanged(track);
 }
-    
+
 void HTMLTrackElement::textTrackAddCues(TextTrack* track, const TextTrackCueList* cues)
 {
     if (HTMLMediaElement* parent = mediaElement())

Modified: trunk/Source/WebCore/html/HTMLTrackElement.h (100452 => 100453)


--- trunk/Source/WebCore/html/HTMLTrackElement.h	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/Source/WebCore/html/HTMLTrackElement.h	2011-11-16 16:05:45 UTC (rev 100453)
@@ -40,16 +40,20 @@
     static PassRefPtr<HTMLTrackElement> create(const QualifiedName&, Document*);
 
     KURL src() const;
-    String kind() const;
+    void setSrc(const String&);
+
+    String kind();
+    void setKind(const String&);
+
     String srclang() const;
+    void setSrclang(const String&);
+
     String label() const;
+    void setLabel(const String&);
 
     bool isDefault() const;
-    void setKind(const String&);
-    void setSrc(const String&);
-    void setSrclang(const String&);
-    void setLabel(const String&);
     void setIsDefault(bool);
+
     TextTrack* track();
     
     void scheduleLoad();
@@ -77,6 +81,7 @@
     // TextTrackClient
     virtual void textTrackReadyStateChanged(TextTrack*);
     virtual void textTrackModeChanged(TextTrack*);
+    virtual void textTrackKindChanged(TextTrack*);
     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*);
     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*);
     virtual void textTrackAddCue(TextTrack*, PassRefPtr<TextTrackCue>);

Modified: trunk/Source/WebCore/html/TextTrack.cpp (100452 => 100453)


--- trunk/Source/WebCore/html/TextTrack.cpp	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/Source/WebCore/html/TextTrack.cpp	2011-11-16 16:05:45 UTC (rev 100453)
@@ -41,15 +41,45 @@
 
 namespace WebCore {
 
+const AtomicString& TextTrack::subtitlesKeyword()
+{
+    DEFINE_STATIC_LOCAL(const AtomicString, subtitles, ("subtitles"));
+    return subtitles;
+}
+
+const AtomicString& TextTrack::captionsKeyword()
+{
+    DEFINE_STATIC_LOCAL(const AtomicString, captions, ("captions"));
+    return captions;
+}
+
+const AtomicString& TextTrack::descriptionsKeyword()
+{
+    DEFINE_STATIC_LOCAL(const AtomicString, descriptions, ("descriptions"));
+    return descriptions;
+}
+
+const AtomicString& TextTrack::chaptersKeyword()
+{
+    DEFINE_STATIC_LOCAL(const AtomicString, chapters, ("chapters"));
+    return chapters;
+}
+
+const AtomicString& TextTrack::metadataKeyword()
+{
+    DEFINE_STATIC_LOCAL(const AtomicString, metadata, ("metadata"));
+    return metadata;
+}
+
 TextTrack::TextTrack(ScriptExecutionContext* context, TextTrackClient* client, const String& kind, const String& label, const String& language)
     : TrackBase(context, TrackBase::TextTrack)
-    , m_kind(kind)
     , m_label(label)
     , m_language(language)
     , m_readyState(TextTrack::NONE)
-    , m_mode(TextTrack::SHOWING)
+    , m_mode(TextTrack::HIDDEN)
     , m_client(client)
 {
+    setKind(kind);
 }
 
 TextTrack::~TextTrack()
@@ -59,24 +89,33 @@
     clearClient();
 }
 
-String TextTrack::kind() const
+bool TextTrack::isValidKindKeyword(const String& value)
 {
-    return m_kind;
-}
+    if (equalIgnoringCase(value, subtitlesKeyword()))
+        return true;
+    if (equalIgnoringCase(value, captionsKeyword()))
+        return true;
+    if (equalIgnoringCase(value, descriptionsKeyword()))
+        return true;
+    if (equalIgnoringCase(value, chaptersKeyword()))
+        return true;
+    if (equalIgnoringCase(value, metadataKeyword()))
+        return true;
 
-String TextTrack::label() const
-{
-    return m_label;
+    return false;
 }
 
-String TextTrack::language() const
+void TextTrack::setKind(const String& kind)
 {
-    return m_language;
-}
+    String oldKind = m_kind;
 
-TextTrack::ReadyState TextTrack::readyState() const
-{
-    return m_readyState;
+    if (isValidKindKeyword(kind))
+        m_kind = kind;
+    else
+        m_kind = subtitlesKeyword();
+
+    if (m_client && oldKind != m_kind)
+        m_client->textTrackKindChanged(this);
 }
 
 void TextTrack::setReadyState(ReadyState state)
@@ -86,11 +125,6 @@
         m_client->textTrackReadyStateChanged(this);
 }
 
-TextTrack::Mode TextTrack::mode() const
-{
-    return m_mode;
-}
-
 void TextTrack::setMode(unsigned short mode, ExceptionCode& ec)
 {
     // 4.8.10.12.5 On setting the mode, if the new value is not either 0, 1, or 2,

Modified: trunk/Source/WebCore/html/TextTrack.h (100452 => 100453)


--- trunk/Source/WebCore/html/TextTrack.h	2011-11-16 15:58:42 UTC (rev 100452)
+++ trunk/Source/WebCore/html/TextTrack.h	2011-11-16 16:05:45 UTC (rev 100453)
@@ -28,6 +28,7 @@
 
 #if ENABLE(VIDEO_TRACK)
 
+#include "ExceptionCode.h"
 #include "TrackBase.h"
 #include <wtf/PassOwnPtr.h>
 #include <wtf/RefCounted.h>
@@ -39,12 +40,11 @@
 class TextTrackCue;
 class TextTrackCueList;
 
-typedef int ExceptionCode;
-
 class TextTrackClient {
 public:
     virtual ~TextTrackClient() { }
     virtual void textTrackReadyStateChanged(TextTrack*) = 0;
+    virtual void textTrackKindChanged(TextTrack*) = 0;
     virtual void textTrackModeChanged(TextTrack*) = 0;
     virtual void textTrackAddCues(TextTrack*, const TextTrackCueList*) = 0;
     virtual void textTrackRemoveCues(TextTrack*, const TextTrackCueList*) = 0;
@@ -60,15 +60,27 @@
     }
     virtual ~TextTrack();
 
-    String kind() const;
-    String label() const;
-    String language() const;
+    String kind() const { return m_kind; }
+    void setKind(const String&);
 
+    static const AtomicString& subtitlesKeyword();
+    static const AtomicString& captionsKeyword();
+    static const AtomicString& descriptionsKeyword();
+    static const AtomicString& chaptersKeyword();
+    static const AtomicString& metadataKeyword();
+    static bool isValidKindKeyword(const String&);
+
+    String label() const { return m_label; }
+    void setLabel(const String& label) { m_label = label; }
+
+    String language() const { return m_language; }
+    void setLanguage(const String& language) { m_language = language; }
+
     enum ReadyState { NONE = 0, LOADING = 1, LOADED = 2, HTML_ERROR = 3 };
-    ReadyState readyState() const;
+    ReadyState readyState() const { return m_readyState; }
 
     enum Mode { DISABLED = 0, HIDDEN = 1, SHOWING = 2 };
-    Mode mode() const;
+    Mode mode() const { return m_mode; }
     void setMode(unsigned short, ExceptionCode&);
 
     TextTrackCueList* cues();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to