WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Proposed fix 0.5
patch (text/plain), 22.10 KB, created by
Dima Gorbik
on 2013-01-30 17:37:39 PST
(
hide
)
Description:
Proposed fix 0.5
Filename:
MIME Type:
Creator:
Dima Gorbik
Created:
2013-01-30 17:37:39 PST
Size:
22.10 KB
patch
obsolete
>diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 08ec4a1..b3de100 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,12 @@ >+2013-01-28 Dima Gorbik <dgorbik@apple.com> >+ >+ REGRESSION(r140231): media track layout tests crashing >+ https://bugs.webkit.org/show_bug.cgi?id=107579 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * platform/chromium/TestExpectations: >+ > 2013-01-30 Philip Rogers <pdr@google.com> > > Update chromium-mac svg/zoom test expectations after r141303 >diff --git a/LayoutTests/platform/chromium/TestExpectations b/LayoutTests/platform/chromium/TestExpectations >index d7b0d3a..026eefe 100644 >--- a/LayoutTests/platform/chromium/TestExpectations >+++ b/LayoutTests/platform/chromium/TestExpectations >@@ -101,11 +101,6 @@ webkit.org/b/107587 [ Win7 Debug ] platform/chromium/virtual/gpu/fast/hidpi/focu > crbug.com/24182 [ Mac Debug ] fast/frames/remove-frame-with-scrollbars-crash.html [ Pass Slow ] > crbug.com/24182 [ Mac Debug ] fast/forms/post-popup-no-multiple-windows.html [ Pass Slow ] > >-# Crashing after r140231, see bug https://bugs.webkit.org/show_bug.cgi?id=107579 >-webkit.org/b/106853 [ Debug ] media/track/track-css-cue-lifetime.html [ Pass Timeout Crash ] >-webkit.org/b/108024 [ Debug ] media/track/track-css-matching-timestamps.html [ Crash ] >-webkit.org/b/108024 [ Debug ] media/track/track-css-matching-lang.html [ Crash ] >- > # These tests started being slow when we switched to DRT. > webkit.org/b/90488 [ Debug ] inspector [ Pass Slow ] > webkit.org/b/90488 [ Debug ] http/tests/inspector [ Pass Slow ] >@@ -4339,9 +4334,6 @@ webkit.org/b/107316 [ Win Debug ] fast/inline/fixed-pos-moves-with-abspos-inline > webkit.org/b/107328 http/tests/cache/cancel-multiple-post-xhrs.html [ Missing ] > webkit.org/b/107341 [ Debug ] inspector/profiler/memory-instrumentation-cached-images.html [ Failure ] > >-webkit.org/b/107579 [ Debug ] media/track/track-css-matching.html [ Crash ] >-webkit.org/b/107579 [ Debug ] media/track/track-css-property-whitelist.html [ Crash ] >- > webkit.org/b/108163 [ Debug ] platform/chromium/virtual/deferred/fast/images/icon-0colors.html [ Crash ] > > # New clamping logic in the tile shader will causes slight diffs. These images must be rebaselined. >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index e548b32..37be471 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,49 @@ >+2013-01-28 Dima Gorbik <dgorbik@apple.com> >+ >+ REGRESSION(r140231): media track layout tests crashing >+ https://bugs.webkit.org/show_bug.cgi?id=107579 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ We were using non-standard element names with HTMLElement, which made v8 try to cast >+ WebVTTElements to HTMLUnknownElements which was not possible. Subclassing Element instead >+ of HTMLElement, though this requires building HTMLElements from WebVTTElements for creating >+ a DOM tree. The code has been refactored to move WebVTT node type to QuialifiedName mappings >+ inside the WebVTTElement class. All WebVTTElements in the shadow dom tree now are in the >+ namespace defined by 'NullAtom'. This prevents regular styles from being applied to <b>, <i> >+ and similar tags. Those have to be styled separately without reusing existing QualifiedNames >+ and their styles. https://bugs.webkit.org/show_bug.cgi?id=107214 >+ >+ Unskipping tests to cover this. >+ >+ * css/SelectorChecker.cpp: >+ (WebCore::SelectorChecker::checkOne): >+ * css/StyleResolver.cpp: >+ (WebCore::StyleResolver::collectMatchingRules): >+ (WebCore::StyleResolver::canShareStyleWithElement): >+ * html/track/TextTrackCue.cpp: >+ (WebCore::TextTrackCue::copyWebVTTNodeToDOMTree): >+ (WebCore::TextTrackCue::getCueAsHTML): >+ (WebCore::TextTrackCue::createCueRenderingTree): >+ (WebCore::TextTrackCue::markFutureAndPastNodes): >+ * html/track/TextTrackCue.h: >+ (WebCore::TextTrackCue::cueShadowPseudoId): >+ * html/track/WebVTTElement.cpp: >+ (WebCore::nodeTypeToTagName): get a QualifiedName to use in the shadow DOM tree. >+ (WebCore::WebVTTElement::WebVTTElement): >+ (WebCore::WebVTTElement::create): >+ (WebCore::WebVTTElement::cloneElementWithoutAttributesAndChildren): >+ (WebCore::WebVTTElement::createEquivalentHTMLElement): create an HTMLElement to use in the DOM tree. >+ * html/track/WebVTTElement.h: >+ (WebCore::WebVTTElement::setWebVTTNodeType): >+ (WebCore::WebVTTElement::webVTTNodeType): >+ (WebCore::WebVTTElement::isPastNode): >+ (WebCore::WebVTTElement::setIsPastNode): >+ (WebCore::WebVTTElement::voiceAttributeName): >+ * html/track/WebVTTParser.cpp: >+ (WebCore::tokenToNodeType): determine a WebVTT node type for the token. >+ (WebCore::WebVTTParser::constructTreeFromToken): >+ > 2013-01-30 Mark Lam <mark.lam@apple.com> > > DatabaseContext should implement ThreadSafeRefCounted. >diff --git a/Source/WebCore/css/SelectorChecker.cpp b/Source/WebCore/css/SelectorChecker.cpp >index 1f5e0c0..fab7049 100644 >--- a/Source/WebCore/css/SelectorChecker.cpp >+++ b/Source/WebCore/css/SelectorChecker.cpp >@@ -869,9 +869,9 @@ bool SelectorChecker::checkOne(const SelectorCheckingContext& context, const Sib > return element->isOutOfRange(); > #if ENABLE(VIDEO_TRACK) > case CSSSelector::PseudoFutureCue: >- return (element->isWebVTTElement() && toWebVTTElement(element)->webVTTNodeType() == WebVTTNodeTypeFuture); >+ return (element->isWebVTTElement() && !toWebVTTElement(element)->isPastNode()); > case CSSSelector::PseudoPastCue: >- return (element->isWebVTTElement() && toWebVTTElement(element)->webVTTNodeType() == WebVTTNodeTypePast); >+ return (element->isWebVTTElement() && toWebVTTElement(element)->isPastNode()); > #endif > > case CSSSelector::PseudoHorizontal: >diff --git a/Source/WebCore/css/StyleResolver.cpp b/Source/WebCore/css/StyleResolver.cpp >index 885385f..8253823 100644 >--- a/Source/WebCore/css/StyleResolver.cpp >+++ b/Source/WebCore/css/StyleResolver.cpp >@@ -669,7 +669,7 @@ void StyleResolver::collectMatchingRules(const MatchRequest& matchRequest, RuleR > } > > #if ENABLE(VIDEO_TRACK) >- if (m_element->isWebVTTElement() && toWebVTTElement(m_element)->webVTTNodeType()) >+ if (m_element->isWebVTTElement()) > collectMatchingRulesForList(matchRequest.ruleSet->cuePseudoRules(), matchRequest, ruleRange); > #endif > // Check whether other types of rules are applicable in the current tree scope. Criteria for this: >@@ -1270,7 +1270,7 @@ bool StyleResolver::canShareStyleWithElement(StyledElement* element) const > if (element->isWebVTTElement() != m_element->isWebVTTElement()) > return false; > >- if (element->isWebVTTElement() && m_element->isWebVTTElement() && toWebVTTElement(element)->webVTTNodeType() != toWebVTTElement(m_element)->webVTTNodeType()) >+ if (element->isWebVTTElement() && m_element->isWebVTTElement() && toWebVTTElement(element)->isPastNode() != toWebVTTElement(m_element)->isPastNode()) > return false; > #endif > >diff --git a/Source/WebCore/html/track/TextTrackCue.cpp b/Source/WebCore/html/track/TextTrackCue.cpp >index b06426b..f3b9353 100644 >--- a/Source/WebCore/html/track/TextTrackCue.cpp >+++ b/Source/WebCore/html/track/TextTrackCue.cpp >@@ -504,15 +504,10 @@ void TextTrackCue::copyWebVTTNodeToDOMTree(ContainerNode* webVTTNode, ContainerN > { > 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()) || 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 >+ if (node->isWebVTTElement()) >+ clonedNode = toWebVTTElement(node)->createEquivalentHTMLElement(ownerDocument()); >+ else > clonedNode = node->cloneNode(false); >- > parent->appendChild(clonedNode, ASSERT_NO_EXCEPTION); > if (node->isContainerNode()) > copyWebVTTNodeToDOMTree(toContainerNode(node), toContainerNode(clonedNode.get())); >@@ -522,8 +517,7 @@ void TextTrackCue::copyWebVTTNodeToDOMTree(ContainerNode* webVTTNode, ContainerN > PassRefPtr<DocumentFragment> TextTrackCue::getCueAsHTML() > { > createWebVTTNodeTree(); >- Document* document = static_cast<Document*>(m_scriptExecutionContext); >- RefPtr<DocumentFragment> clonedFragment = DocumentFragment::create(document); >+ RefPtr<DocumentFragment> clonedFragment = DocumentFragment::create(ownerDocument()); > copyWebVTTNodeToDOMTree(m_webVTTNodeTree.get(), clonedFragment.get()); > return clonedFragment.release(); > } >@@ -532,8 +526,7 @@ PassRefPtr<DocumentFragment> TextTrackCue::createCueRenderingTree() > { > RefPtr<DocumentFragment> clonedFragment; > createWebVTTNodeTree(); >- Document* document = static_cast<Document*>(m_scriptExecutionContext); >- clonedFragment = DocumentFragment::create(document); >+ clonedFragment = DocumentFragment::create(ownerDocument()); > m_webVTTNodeTree->cloneChildNodes(clonedFragment.get()); > return clonedFragment.release(); > } >@@ -709,7 +702,7 @@ void TextTrackCue::markFutureAndPastNodes(ContainerNode* root, double previousTi > } > > if (child->isWebVTTElement()) { >- toWebVTTElement(child)->setWebVTTNodeType(isPastNode ? WebVTTNodeTypePast : WebVTTNodeTypeFuture); >+ toWebVTTElement(child)->setIsPastNode(isPastNode); > // Make an elemenet id match a cue id for style matching purposes. > if (!m_id.isEmpty()) > toElement(child)->setIdAttribute(AtomicString(m_id.characters(), m_id.length())); >diff --git a/Source/WebCore/html/track/TextTrackCue.h b/Source/WebCore/html/track/TextTrackCue.h >index 287abed..38517ab 100644 >--- a/Source/WebCore/html/track/TextTrackCue.h >+++ b/Source/WebCore/html/track/TextTrackCue.h >@@ -85,36 +85,6 @@ public: > 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)); >- return vTag; >- } >- >- static const QualifiedName& classElementTagName() >- { >- 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(); >diff --git a/Source/WebCore/html/track/WebVTTElement.cpp b/Source/WebCore/html/track/WebVTTElement.cpp >index 2e897c3..9863358 100644 >--- a/Source/WebCore/html/track/WebVTTElement.cpp >+++ b/Source/WebCore/html/track/WebVTTElement.cpp >@@ -33,20 +33,89 @@ > > namespace WebCore { > >-WebVTTElement::WebVTTElement(const QualifiedName& tagName, Document* document) >- : HTMLElement(tagName, document) >- , m_webVTTNodeType(WebVTTNodeTypeNone) >+static QualifiedName& nodeTypeToTagName(WebVTTNodeType nodeType) > { >+ DEFINE_STATIC_LOCAL(QualifiedName, cTag, (nullAtom, "c", nullAtom)); >+ DEFINE_STATIC_LOCAL(QualifiedName, vTag, (nullAtom, "v", nullAtom)); >+ DEFINE_STATIC_LOCAL(QualifiedName, langTag, (nullAtom, "lang", nullAtom)); >+ DEFINE_STATIC_LOCAL(QualifiedName, bTag, (nullAtom, "b", nullAtom)); >+ DEFINE_STATIC_LOCAL(QualifiedName, uTag, (nullAtom, "u", nullAtom)); >+ DEFINE_STATIC_LOCAL(QualifiedName, iTag, (nullAtom, "i", nullAtom)); >+ DEFINE_STATIC_LOCAL(QualifiedName, rubyTag, (nullAtom, "ruby", nullAtom)); >+ DEFINE_STATIC_LOCAL(QualifiedName, rtTag, (nullAtom, "rt", nullAtom)); >+ switch (nodeType) { >+ case WebVTTNodeTypeClass: >+ return cTag; >+ case WebVTTNodeTypeItalic: >+ return iTag; >+ case WebVTTNodeTypeLanguage: >+ return langTag; >+ case WebVTTNodeTypeBold: >+ return bTag; >+ case WebVTTNodeTypeUnderline: >+ return uTag; >+ case WebVTTNodeTypeRuby: >+ return rubyTag; >+ case WebVTTNodeTypeRubyText: >+ return rtTag; >+ case WebVTTNodeTypeVoice: >+ return vTag; >+ case WebVTTNodeTypeNone: >+ default: >+ ASSERT_NOT_REACHED(); >+ return cTag; // Make the compiler happy. >+ } > } > >-PassRefPtr<WebVTTElement> WebVTTElement::create(const QualifiedName& tagName, Document* document) >+WebVTTElement::WebVTTElement(WebVTTNodeType nodeType, Document* document) >+ : Element(nodeTypeToTagName(nodeType), document, CreateElement) >+ , m_isPastNode(0) >+ , m_webVTTNodeType(nodeType) > { >- return adoptRef(new WebVTTElement(tagName, document)); >+} >+ >+PassRefPtr<WebVTTElement> WebVTTElement::create(WebVTTNodeType nodeType, Document* document) >+{ >+ return adoptRef(new WebVTTElement(nodeType, document)); > } > > PassRefPtr<Element> WebVTTElement::cloneElementWithoutAttributesAndChildren() > { >- return create(tagQName(), document()); >+ return create(static_cast<WebVTTNodeType>(m_webVTTNodeType), document()); >+} >+ >+PassRefPtr<HTMLElement> WebVTTElement::createEquivalentHTMLElement(Document* document) >+{ >+ RefPtr<HTMLElement> htmlElement; >+ switch (m_webVTTNodeType) { >+ case WebVTTNodeTypeClass: >+ case WebVTTNodeTypeLanguage: >+ case WebVTTNodeTypeVoice: >+ htmlElement = HTMLElement::create(HTMLNames::spanTag, document); >+ htmlElement.get()->setAttribute(HTMLNames::titleAttr, getAttribute(voiceAttributeName())); >+ break; >+ case WebVTTNodeTypeItalic: >+ htmlElement = HTMLElement::create(HTMLNames::iTag, document); >+ break; >+ case WebVTTNodeTypeBold: >+ htmlElement = HTMLElement::create(HTMLNames::bTag, document); >+ break; >+ case WebVTTNodeTypeUnderline: >+ htmlElement = HTMLElement::create(HTMLNames::uTag, document); >+ break; >+ case WebVTTNodeTypeRuby: >+ htmlElement = HTMLElement::create(HTMLNames::rubyTag, document); >+ break; >+ case WebVTTNodeTypeRubyText: >+ htmlElement = HTMLElement::create(HTMLNames::rtTag, document); >+ break; >+ default: >+ ASSERT_NOT_REACHED(); >+ } >+ >+ htmlElement.get()->setAttribute(HTMLNames::langAttr, getAttribute(langAttributeName())); >+ htmlElement.get()->setAttribute(HTMLNames::classAttr, getAttribute(HTMLNames::classAttr)); >+ return htmlElement; > } > > } // namespace WebCore >diff --git a/Source/WebCore/html/track/WebVTTElement.h b/Source/WebCore/html/track/WebVTTElement.h >index d3fe1b2..82f970f1 100644 >--- a/Source/WebCore/html/track/WebVTTElement.h >+++ b/Source/WebCore/html/track/WebVTTElement.h >@@ -31,22 +31,51 @@ namespace WebCore { > > enum WebVTTNodeType { > WebVTTNodeTypeNone = 0, >- WebVTTNodeTypeFuture, >- WebVTTNodeTypePast >+ WebVTTNodeTypeClass, >+ WebVTTNodeTypeItalic, >+ WebVTTNodeTypeLanguage, >+ WebVTTNodeTypeBold, >+ WebVTTNodeTypeUnderline, >+ WebVTTNodeTypeRuby, >+ WebVTTNodeTypeRubyText, >+ WebVTTNodeTypeVoice > }; > >-class WebVTTElement : public HTMLElement { >+class WebVTTElement : public Element { > public: >+ static PassRefPtr<WebVTTElement> create(const WebVTTNodeType, Document*); > static PassRefPtr<WebVTTElement> create(const QualifiedName&, Document*); >+ PassRefPtr<HTMLElement> createEquivalentHTMLElement(Document*); >+ > virtual PassRefPtr<Element> cloneElementWithoutAttributesAndChildren() OVERRIDE; > >- void setWebVTTNodeType(WebVTTNodeType type) { m_webVTTNodeType = type; } >- WebVTTNodeType webVTTNodeType() const { return m_webVTTNodeType; } >+ void setWebVTTNodeType(WebVTTNodeType type) { m_webVTTNodeType = static_cast<unsigned>(type); } >+ WebVTTNodeType webVTTNodeType() const { return static_cast<WebVTTNodeType>(m_webVTTNodeType); } >+ >+ bool isPastNode() const { return m_isPastNode; } >+ void setIsPastNode(bool value) { m_isPastNode = value; } >+ > virtual bool isWebVTTElement() const OVERRIDE { return true; } > >+ 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; >+ } >+ > private: > WebVTTElement(const QualifiedName&, Document*); >- WebVTTNodeType m_webVTTNodeType; >+ WebVTTElement(WebVTTNodeType, Document*); >+ >+ unsigned m_isPastNode : 1; >+ unsigned m_webVTTNodeType : 4; >+ > }; > > inline WebVTTElement* toWebVTTElement(Node* node) >diff --git a/Source/WebCore/html/track/WebVTTParser.cpp b/Source/WebCore/html/track/WebVTTParser.cpp >index 6a18c0c..f835060 100644 >--- a/Source/WebCore/html/track/WebVTTParser.cpp >+++ b/Source/WebCore/html/track/WebVTTParser.cpp >@@ -342,9 +342,33 @@ double WebVTTParser::collectTimeStamp(const String& line, unsigned* position) > return (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + (value4 * secondsPerMillisecond); > } > >-static inline bool isLangToken(WebVTTToken& token) >+static WebVTTNodeType tokenToNodeType(WebVTTToken& token) > { >- return token.name().size() == 4 && token.name()[0] == 'l' && token.name()[1] == 'a' && token.name()[2] == 'n' && token.name()[3] == 'g'; >+ switch (token.name().size()) { >+ case 1: >+ if (token.name()[0] == 'c') >+ return WebVTTNodeTypeClass; >+ if (token.name()[0] == 'v') >+ return WebVTTNodeTypeVoice; >+ if (token.name()[0] == 'b') >+ return WebVTTNodeTypeBold; >+ if (token.name()[0] == 'i') >+ return WebVTTNodeTypeItalic; >+ if (token.name()[0] == 'u') >+ return WebVTTNodeTypeUnderline; >+ break; >+ case 2: >+ if (token.name()[0] == 'r' && token.name()[1] == 't') >+ return WebVTTNodeTypeRubyText; >+ break; >+ case 4: >+ if (token.name()[0] == 'r' && token.name()[1] == 'u' && token.name()[2] == 'b' && token.name()[3] == 'y') >+ return WebVTTNodeTypeRuby; >+ if (token.name()[0] == 'l' && token.name()[1] == 'a' && token.name()[2] == 'n' && token.name()[3] == 'g') >+ return WebVTTNodeTypeLanguage; >+ break; >+ } >+ return WebVTTNodeTypeNone; > } > > void WebVTTParser::constructTreeFromToken(Document* document) >@@ -363,43 +387,36 @@ void WebVTTParser::constructTreeFromToken(Document* document) > } > case WebVTTTokenTypes::StartTag: { > RefPtr<WebVTTElement> child; >- if (isRecognizedTag(tokenTagName)) >- child = WebVTTElement::create(tagName, document); >- else if (m_token.name().size() == 1 && m_token.name()[0] == 'c') >- 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); >- >+ WebVTTNodeType nodeType = tokenToNodeType(m_token); >+ if (nodeType != WebVTTNodeTypeNone) >+ child = WebVTTElement::create(nodeType, 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())) >+ >+ if (child->webVTTNodeType() == WebVTTNodeTypeVoice) >+ child->setAttribute(WebVTTElement::voiceAttributeName(), AtomicString(m_token.annotation().data(), m_token.annotation().size())); >+ else if (child->webVTTNodeType() == WebVTTNodeTypeLanguage) > m_languageStack.append(AtomicString(m_token.annotation().data(), m_token.annotation().size())); >+ > if (!m_languageStack.isEmpty()) >- child->setAttribute(TextTrackCue::langAttributeName(), m_languageStack.last()); >+ child->setAttribute(WebVTTElement::langAttributeName(), m_languageStack.last()); >+ > m_currentNode->parserAppendChild(child); > m_currentNode = child; > } > break; > } >- case WebVTTTokenTypes::EndTag: >- if (isRecognizedTag(tokenTagName) >- || (m_token.name().size() == 1 && m_token.name()[0] == 'c') >- || (m_token.name().size() == 1 && m_token.name()[0] == 'v')) { >- if (m_currentNode->parentNode()) >- m_currentNode = m_currentNode->parentNode(); >- } >- if (isLangToken(m_token)) { >- if (m_currentNode->hasTagName(TextTrackCue::langElementTagName())) >+ case WebVTTTokenTypes::EndTag: { >+ WebVTTNodeType nodeType = tokenToNodeType(m_token); >+ if (nodeType != WebVTTNodeTypeNone) { >+ if (nodeType == WebVTTNodeTypeLanguage && m_currentNode->isWebVTTElement() && toWebVTTElement(m_currentNode.get())->webVTTNodeType() == WebVTTNodeTypeLanguage) > m_languageStack.removeLast(); > if (m_currentNode->parentNode()) > m_currentNode = m_currentNode->parentNode(); > } > break; >+ } > case WebVTTTokenTypes::TimestampTag: { > unsigned position = 0; > double time = collectTimeStamp(m_token.characters().data(), &position);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
eric.carlson
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 107579
:
184592
|
184597
|
185106
|
185600
|
185635
|
185875