Diff
Modified: trunk/LayoutTests/ChangeLog (140876 => 140877)
--- trunk/LayoutTests/ChangeLog 2013-01-26 00:19:49 UTC (rev 140876)
+++ trunk/LayoutTests/ChangeLog 2013-01-26 00:20:45 UTC (rev 140877)
@@ -1,3 +1,14 @@
+2013-01-25 Dima Gorbik <[email protected]>
+
+ Support language WebVTT Nodes
+ https://bugs.webkit.org/show_bug.cgi?id=107907
+
+ Reviewed by Eric Carlson.
+
+ * media/track/captions-webvtt/styling-lang.vtt: Added.
+ * media/track/track-css-matching-lang-expected.txt: Added.
+ * media/track/track-css-matching-lang.html: Added.
+
2013-01-25 Emil A Eklund <[email protected]>
Unreviewed chromium svg rebaseline.
Added: trunk/LayoutTests/media/track/captions-webvtt/styling-lang.vtt (0 => 140877)
--- trunk/LayoutTests/media/track/captions-webvtt/styling-lang.vtt (rev 0)
+++ trunk/LayoutTests/media/track/captions-webvtt/styling-lang.vtt 2013-01-26 00:20:45 UTC (rev 140877)
@@ -0,0 +1,5 @@
+WEBVTT
+
+1
+00:00.000 --> 00:01.000
+<lang en><c>English<lang ru><c> Русский<lang en><c> English again</c></lang></c></lang></c></lang>
Added: trunk/LayoutTests/media/track/track-css-matching-lang-expected.txt (0 => 140877)
--- trunk/LayoutTests/media/track/track-css-matching-lang-expected.txt (rev 0)
+++ trunk/LayoutTests/media/track/track-css-matching-lang-expected.txt 2013-01-26 00:20:45 UTC (rev 140877)
@@ -0,0 +1,8 @@
+Test that cues are being matched properly by the lang attribute.
+EVENT(canplaythrough)
+EVENT(seeked)
+EXPECTED (getComputedStyle(cueNode).color == 'rgb(0, 128, 0)') OK
+EXPECTED (getComputedStyle(cueNode).color == 'rgb(255, 0, 0)') OK
+EXPECTED (getComputedStyle(cueNode).color == 'rgb(0, 128, 0)') OK
+END OF TEST
+
Added: trunk/LayoutTests/media/track/track-css-matching-lang.html (0 => 140877)
--- trunk/LayoutTests/media/track/track-css-matching-lang.html (rev 0)
+++ trunk/LayoutTests/media/track/track-css-matching-lang.html 2013-01-26 00:20:45 UTC (rev 140877)
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+ <script src=""
+ <script src=""
+ <script src=""
+
+ <style>
+ ::cue(c[lang="ru"]) { color: red; }
+ ::cue(c[lang="en"]) { color: green; }
+ </style>
+
+ <script>
+
+ var cueNode;
+ var seekedCount = 0;
+ var seekTimes = [0.1];
+
+ var info = [["rgb(0, 128, 0)", "rgb(255, 0, 0)", "rgb(0, 128, 0)"]];
+
+ function seeked()
+ {
+ if (testEnded)
+ return;
+
+ cueNode = textTrackDisplayElement(video, 'all-nodes').firstElementChild.firstElementChild;
+ testExpected("getComputedStyle(cueNode).color", info[seekedCount][0]);
+ cueNode = cueNode.firstElementChild.firstElementChild;
+ testExpected("getComputedStyle(cueNode).color", info[seekedCount][1]);
+ cueNode = cueNode.firstElementChild.firstElementChild;
+ testExpected("getComputedStyle(cueNode).color", info[seekedCount][2]);
+
+ if (++seekedCount == info.length)
+ endTest();
+ else {
+ consoleWrite("");
+ run("video.currentTime = " + seekTimes[seekedCount]);
+ }
+ }
+
+ function loaded()
+ {
+ consoleWrite("Test that cues are being matched properly by the lang attribute.");
+ findMediaElement();
+ video.src = "" '../content/test');
+ video.id = "testvideo";
+ waitForEvent('seeked', seeked);
+ waitForEvent('canplaythrough', function() { video.currentTime = seekTimes[0]; });
+ }
+
+ </script>
+ </head>
+ <body _onload_="loaded()">
+ <video controls >
+ <track src="" kind="captions" default>
+ </video>
+ </body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (140876 => 140877)
--- trunk/Source/WebCore/ChangeLog 2013-01-26 00:19:49 UTC (rev 140876)
+++ trunk/Source/WebCore/ChangeLog 2013-01-26 00:20:45 UTC (rev 140877)
@@ -1,3 +1,31 @@
+2013-01-25 Dima Gorbik <[email protected]>
+
+ Support language WebVTT Nodes
+ https://bugs.webkit.org/show_bug.cgi?id=107907
+
+ Reviewed by Eric Carlson.
+
+ Language stack and WebVTT language nodes are added as
+ required by specs.
+
+ Test: media/track/track-css-matching-lang.html
+
+ * html/track/TextTrackCue.cpp:
+ (WebCore::TextTrackCue::copyWebVTTNodeToDOMTree): WebVTT language nodes should be
+ spans in DOM and the lang attribute should be set for all nodes if applicable.
+ * html/track/TextTrackCue.h:
+ (WebCore::TextTrackCue::langElementTagName):
+ (TextTrackCue):
+ (WebCore::TextTrackCue::langAttributeName):
+ * html/track/WebVTTParser.cpp:
+ (WebCore::WebVTTParser::createDocumentFragmentFromCueText): clear the language stack in case
+ we use the same parser object for multiple cues that have incorrect syntax.
+ (WebCore::isLangToken):
+ (WebCore):
+ (WebCore::WebVTTParser::constructTreeFromToken): parse lang WebVTT objects.
+ * html/track/WebVTTParser.h:
+ (WebVTTParser):
+
2013-01-25 Andy Estes <[email protected]>
Wrap content filtering code in an object
Modified: trunk/Source/WebCore/html/track/TextTrackCue.cpp (140876 => 140877)
--- trunk/Source/WebCore/html/track/TextTrackCue.cpp 2013-01-26 00:19:49 UTC (rev 140876)
+++ trunk/Source/WebCore/html/track/TextTrackCue.cpp 2013-01-26 00:20:45 UTC (rev 140877)
@@ -504,10 +504,11 @@
for (Node* node = webVTTNode->firstChild(); node; node = node->nextSibling()) {
RefPtr<Node> clonedNode;
// Specs require voice and class WebVTT elements to be spans for DOM trees.
- if (node->hasTagName(voiceElementTagName()) || node->hasTagName(classElementTagName())) {
+ if (node->hasTagName(voiceElementTagName()) || node->hasTagName(classElementTagName()) || node->hasTagName(langElementTagName())) {
clonedNode = HTMLSpanElement::create(spanTag, static_cast<Document*>(m_scriptExecutionContext));
toElement(clonedNode.get())->setAttribute(classAttr, toElement(node)->getAttribute(classAttr));
toElement(clonedNode.get())->setAttribute(titleAttr, toElement(node)->getAttribute(voiceAttributeName()));
+ toElement(clonedNode.get())->setAttribute(langAttr, toElement(node)->getAttribute(langAttributeName()));
} else
clonedNode = node->cloneNode(false);
Modified: trunk/Source/WebCore/html/track/TextTrackCue.h (140876 => 140877)
--- trunk/Source/WebCore/html/track/TextTrackCue.h 2013-01-26 00:19:49 UTC (rev 140876)
+++ trunk/Source/WebCore/html/track/TextTrackCue.h 2013-01-26 00:20:45 UTC (rev 140877)
@@ -85,6 +85,12 @@
return cue;
}
+ static const QualifiedName& langElementTagName()
+ {
+ DEFINE_STATIC_LOCAL(QualifiedName, langTag, (nullAtom, "lang", nullAtom));
+ return langTag;
+ }
+
static const QualifiedName& voiceElementTagName()
{
DEFINE_STATIC_LOCAL(QualifiedName, vTag, (nullAtom, "v", nullAtom));
@@ -96,13 +102,19 @@
DEFINE_STATIC_LOCAL(QualifiedName, cTag, (nullAtom, "c", nullAtom));
return cTag;
}
-
+
static const QualifiedName& voiceAttributeName()
{
DEFINE_STATIC_LOCAL(QualifiedName, voiceAttr, (nullAtom, "voice", nullAtom));
return voiceAttr;
}
+ static const QualifiedName& langAttributeName()
+ {
+ DEFINE_STATIC_LOCAL(QualifiedName, voiceAttr, (nullAtom, "lang", nullAtom));
+ return voiceAttr;
+ }
+
virtual ~TextTrackCue();
static const AtomicString& allNodesShadowPseudoId();
Modified: trunk/Source/WebCore/html/track/WebVTTParser.cpp (140876 => 140877)
--- trunk/Source/WebCore/html/track/WebVTTParser.cpp 2013-01-26 00:19:49 UTC (rev 140876)
+++ trunk/Source/WebCore/html/track/WebVTTParser.cpp 2013-01-26 00:20:45 UTC (rev 140877)
@@ -251,6 +251,7 @@
m_tokenizer->reset();
m_token.clear();
+ m_languageStack.clear();
SegmentedString content(text);
while (m_tokenizer->nextToken(content, m_token))
constructTreeFromToken(document);
@@ -341,6 +342,11 @@
return (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (value4 * secondsPerMillisecond);
}
+static inline bool isLangToken(WebVTTToken& token)
+{
+ return token.name().size() == 4 && token.name()[0] == 'l' && token.name()[1] == 'a' && token.name()[2] == 'n' && token.name()[3] == 'g';
+}
+
void WebVTTParser::constructTreeFromToken(Document* document)
{
AtomicString tokenTagName(m_token.name().data(), m_token.name().size());
@@ -363,12 +369,18 @@
child = WebVTTElement::create(TextTrackCue::classElementTagName(), document);
else if (m_token.name().size() == 1 && m_token.name()[0] == 'v')
child = WebVTTElement::create(TextTrackCue::voiceElementTagName(), document);
+ else if (isLangToken(m_token))
+ child = WebVTTElement::create(TextTrackCue::langElementTagName(), document);
if (child) {
if (m_token.classes().size() > 0)
child->setAttribute(classAttr, AtomicString(m_token.classes().data(), m_token.classes().size()));
if (child->hasTagName(TextTrackCue::voiceElementTagName()))
child->setAttribute(TextTrackCue::voiceAttributeName(), AtomicString(m_token.annotation().data(), m_token.annotation().size()));
+ if (child->hasTagName(TextTrackCue::langElementTagName()))
+ m_languageStack.append(AtomicString(m_token.annotation().data(), m_token.annotation().size()));
+ if (!m_languageStack.isEmpty())
+ child->setAttribute(TextTrackCue::langAttributeName(), m_languageStack.last());
m_currentNode->parserAppendChild(child);
m_currentNode = child;
}
@@ -381,6 +393,12 @@
if (m_currentNode->parentNode())
m_currentNode = m_currentNode->parentNode();
}
+ if (isLangToken(m_token)) {
+ if (m_currentNode->hasTagName(TextTrackCue::langElementTagName()))
+ m_languageStack.removeLast();
+ if (m_currentNode->parentNode())
+ m_currentNode = m_currentNode->parentNode();
+ }
break;
case WebVTTTokenTypes::TimestampTag: {
unsigned position = 0;
Modified: trunk/Source/WebCore/html/track/WebVTTParser.h (140876 => 140877)
--- trunk/Source/WebCore/html/track/WebVTTParser.h 2013-01-26 00:19:49 UTC (rev 140876)
+++ trunk/Source/WebCore/html/track/WebVTTParser.h 2013-01-26 00:20:45 UTC (rev 140877)
@@ -133,6 +133,7 @@
WebVTTParserClient* m_client;
+ Vector<AtomicString> m_languageStack;
Vector<RefPtr<TextTrackCue> > m_cuelist;
};