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();