Changeset 140877 in webkit


Ignore:
Timestamp:
Jan 25, 2013 4:20:45 PM (11 years ago)
Author:
commit-queue@webkit.org
Message:

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

Patch by Dima Gorbik <dgorbik@apple.com> 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.
Location:
trunk
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r140868 r140877  
     12013-01-25  Dima Gorbik  <dgorbik@apple.com>
     2
     3        Support language WebVTT Nodes
     4        https://bugs.webkit.org/show_bug.cgi?id=107907
     5
     6        Reviewed by Eric Carlson.
     7
     8        * media/track/captions-webvtt/styling-lang.vtt: Added.
     9        * media/track/track-css-matching-lang-expected.txt: Added.
     10        * media/track/track-css-matching-lang.html: Added.
     11
    1122013-01-25  Emil A Eklund  <eae@chromium.org>
    213
  • trunk/Source/WebCore/ChangeLog

    r140875 r140877  
     12013-01-25  Dima Gorbik  <dgorbik@apple.com>
     2
     3        Support language WebVTT Nodes
     4        https://bugs.webkit.org/show_bug.cgi?id=107907
     5
     6        Reviewed by Eric Carlson.
     7
     8        Language stack and WebVTT language nodes are added as
     9        required by specs.
     10
     11        Test: media/track/track-css-matching-lang.html
     12
     13        * html/track/TextTrackCue.cpp:
     14        (WebCore::TextTrackCue::copyWebVTTNodeToDOMTree): WebVTT language nodes should be
     15        spans in DOM and the lang attribute should be set for all nodes if applicable.
     16        * html/track/TextTrackCue.h:
     17        (WebCore::TextTrackCue::langElementTagName):
     18        (TextTrackCue):
     19        (WebCore::TextTrackCue::langAttributeName):
     20        * html/track/WebVTTParser.cpp:
     21        (WebCore::WebVTTParser::createDocumentFragmentFromCueText): clear the language stack in case
     22        we use the same parser object for multiple cues that have incorrect syntax.
     23        (WebCore::isLangToken):
     24        (WebCore):
     25        (WebCore::WebVTTParser::constructTreeFromToken): parse lang WebVTT objects.
     26        * html/track/WebVTTParser.h:
     27        (WebVTTParser):
     28
    1292013-01-25  Andy Estes  <aestes@apple.com>
    230
  • trunk/Source/WebCore/html/track/TextTrackCue.cpp

    r140359 r140877  
    505505        RefPtr<Node> clonedNode;
    506506        // Specs require voice and class WebVTT elements to be spans for DOM trees.
    507         if (node->hasTagName(voiceElementTagName()) || node->hasTagName(classElementTagName())) {
     507        if (node->hasTagName(voiceElementTagName()) || node->hasTagName(classElementTagName()) || node->hasTagName(langElementTagName())) {
    508508            clonedNode = HTMLSpanElement::create(spanTag, static_cast<Document*>(m_scriptExecutionContext));
    509509            toElement(clonedNode.get())->setAttribute(classAttr, toElement(node)->getAttribute(classAttr));
    510510            toElement(clonedNode.get())->setAttribute(titleAttr, toElement(node)->getAttribute(voiceAttributeName()));
     511            toElement(clonedNode.get())->setAttribute(langAttr, toElement(node)->getAttribute(langAttributeName()));
    511512        } else
    512513            clonedNode = node->cloneNode(false);
  • trunk/Source/WebCore/html/track/TextTrackCue.h

    r140505 r140877  
    8686    }
    8787
     88    static const QualifiedName& langElementTagName()
     89    {
     90        DEFINE_STATIC_LOCAL(QualifiedName, langTag, (nullAtom, "lang", nullAtom));
     91        return langTag;
     92    }
     93
    8894    static const QualifiedName& voiceElementTagName()
    8995    {
     
    97103        return cTag;
    98104    }
    99    
     105
    100106    static const QualifiedName& voiceAttributeName()
    101107    {
    102108        DEFINE_STATIC_LOCAL(QualifiedName, voiceAttr, (nullAtom, "voice", nullAtom));
     109        return voiceAttr;
     110    }
     111
     112    static const QualifiedName& langAttributeName()
     113    {
     114        DEFINE_STATIC_LOCAL(QualifiedName, voiceAttr, (nullAtom, "lang", nullAtom));
    103115        return voiceAttr;
    104116    }
  • trunk/Source/WebCore/html/track/WebVTTParser.cpp

    r140231 r140877  
    252252    m_token.clear();
    253253   
     254    m_languageStack.clear();
    254255    SegmentedString content(text);
    255256    while (m_tokenizer->nextToken(content, m_token))
     
    342343}
    343344
     345static inline bool isLangToken(WebVTTToken& token)
     346{
     347    return token.name().size() == 4 && token.name()[0] == 'l' && token.name()[1] == 'a' && token.name()[2] == 'n' && token.name()[3] == 'g';
     348}
     349
    344350void WebVTTParser::constructTreeFromToken(Document* document)
    345351{
     
    364370        else if (m_token.name().size() == 1 && m_token.name()[0] == 'v')
    365371            child = WebVTTElement::create(TextTrackCue::voiceElementTagName(), document);
     372        else if (isLangToken(m_token))
     373            child = WebVTTElement::create(TextTrackCue::langElementTagName(), document);
    366374
    367375        if (child) {
     
    370378            if (child->hasTagName(TextTrackCue::voiceElementTagName()))
    371379                child->setAttribute(TextTrackCue::voiceAttributeName(), AtomicString(m_token.annotation().data(), m_token.annotation().size()));
     380            if (child->hasTagName(TextTrackCue::langElementTagName()))
     381                m_languageStack.append(AtomicString(m_token.annotation().data(), m_token.annotation().size()));
     382            if (!m_languageStack.isEmpty())
     383                child->setAttribute(TextTrackCue::langAttributeName(), m_languageStack.last());
    372384            m_currentNode->parserAppendChild(child);
    373385            m_currentNode = child;
     
    379391            || (m_token.name().size() == 1 && m_token.name()[0] == 'c')
    380392            || (m_token.name().size() == 1 && m_token.name()[0] == 'v')) {
     393            if (m_currentNode->parentNode())
     394                m_currentNode = m_currentNode->parentNode();
     395        }
     396        if (isLangToken(m_token)) {
     397            if (m_currentNode->hasTagName(TextTrackCue::langElementTagName()))
     398                m_languageStack.removeLast();
    381399            if (m_currentNode->parentNode())
    382400                m_currentNode = m_currentNode->parentNode();
  • trunk/Source/WebCore/html/track/WebVTTParser.h

    r127300 r140877  
    134134    WebVTTParserClient* m_client;
    135135
     136    Vector<AtomicString> m_languageStack;
    136137    Vector<RefPtr<TextTrackCue> > m_cuelist;
    137138};
Note: See TracChangeset for help on using the changeset viewer.