Title: [140877] trunk
Revision
140877
Author
[email protected]
Date
2013-01-25 16:20:45 -0800 (Fri, 25 Jan 2013)

Log Message

Support language WebVTT Nodes
https://bugs.webkit.org/show_bug.cgi?id=107907

Patch by Dima Gorbik <[email protected]> on 2013-01-25
Reviewed by Eric Carlson.

Source/WebCore:

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):

LayoutTests:

* 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.

Modified Paths

Added Paths

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;
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to