Title: [123671] trunk/Source/WebCore
Revision
123671
Author
k...@webkit.org
Date
2012-07-25 15:59:58 -0700 (Wed, 25 Jul 2012)

Log Message

Read tag names and attributes from the saved tokens in HTMLTreeBuilder::resetInsertionModeAppropriately.
https://bugs.webkit.org/show_bug.cgi?id=92240

Reviewed by Adam Barth.

This is a follow-up patch for r123577. Added ItemType enum to HTMLStackItem to handle
the context element case.

No new tests, covered by existing tests.

* html/parser/HTMLStackItem.h:
(WebCore::HTMLStackItem::create):
(WebCore::HTMLStackItem::HTMLStackItem):
* html/parser/HTMLTreeBuilder.cpp:
(WebCore::HTMLTreeBuilder::HTMLTreeBuilder):
(WebCore::HTMLTreeBuilder::resetInsertionModeAppropriately):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (123670 => 123671)


--- trunk/Source/WebCore/ChangeLog	2012-07-25 22:41:16 UTC (rev 123670)
+++ trunk/Source/WebCore/ChangeLog	2012-07-25 22:59:58 UTC (rev 123671)
@@ -1,3 +1,22 @@
+2012-07-25  Kwang Yul Seo  <sk...@company100.net>
+
+        Read tag names and attributes from the saved tokens in HTMLTreeBuilder::resetInsertionModeAppropriately.
+        https://bugs.webkit.org/show_bug.cgi?id=92240
+
+        Reviewed by Adam Barth.
+
+        This is a follow-up patch for r123577. Added ItemType enum to HTMLStackItem to handle
+        the context element case.
+
+        No new tests, covered by existing tests.
+
+        * html/parser/HTMLStackItem.h:
+        (WebCore::HTMLStackItem::create):
+        (WebCore::HTMLStackItem::HTMLStackItem):
+        * html/parser/HTMLTreeBuilder.cpp:
+        (WebCore::HTMLTreeBuilder::HTMLTreeBuilder):
+        (WebCore::HTMLTreeBuilder::resetInsertionModeAppropriately):
+
 2012-07-25  Nico Weber  <tha...@chromium.org>
 
         [chromium/mac] Remove mac_bundle_resources section from WebCore.gyp

Modified: trunk/Source/WebCore/html/parser/HTMLStackItem.h (123670 => 123671)


--- trunk/Source/WebCore/html/parser/HTMLStackItem.h	2012-07-25 22:41:16 UTC (rev 123670)
+++ trunk/Source/WebCore/html/parser/HTMLStackItem.h	2012-07-25 22:59:58 UTC (rev 123671)
@@ -40,10 +40,15 @@
 
 class HTMLStackItem : public RefCounted<HTMLStackItem> {
 public:
-    // DocumentFragment case.
-    static PassRefPtr<HTMLStackItem> create(PassRefPtr<ContainerNode> node)
+    enum ItemType {
+        ItemForContextElement,
+        ItemForDocumentFragmentNode
+    };
+
+    // Used by document fragment node and context element.
+    static PassRefPtr<HTMLStackItem> create(PassRefPtr<ContainerNode> node, ItemType type)
     {
-        return adoptRef(new HTMLStackItem(node));
+        return adoptRef(new HTMLStackItem(node, type));
     }
 
     // Used by HTMLElementStack and HTMLFormattingElementList.
@@ -66,14 +71,24 @@
     bool hasTagName(const QualifiedName& name) const { return m_token->name() == name.localName() && m_namespaceURI == name.namespaceURI(); }
 
 private:
-    HTMLStackItem(PassRefPtr<ContainerNode> node)
+    HTMLStackItem(PassRefPtr<ContainerNode> node, ItemType type)
         : m_node(node)
-        , m_isDocumentFragmentNode(true)
     {
-        // Create a fake token for a document fragment node. This looks ugly but required for performance
-        // because we want to use m_token->name() in localName(), hasLocalName() and hasTagName() without
-        // checking m_isDocumentFragmentNode flag.
-        m_token = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, nullAtom);
+        switch (type) {
+        case ItemForDocumentFragmentNode:
+            // Create a fake token for a document fragment node. This looks ugly but required for performance
+            // because we want to use m_token->name() in localName(), hasLocalName() and hasTagName() without
+            // checking m_isDocumentFragmentNode flag.
+            m_token = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, nullAtom);
+            m_isDocumentFragmentNode = true;
+            break;
+        case ItemForContextElement:
+            // Create a fake token for a context element for the same reason as above.
+            m_token = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, m_node->localName());
+            m_namespaceURI = m_node->namespaceURI();
+            m_isDocumentFragmentNode = false;
+            break;
+        }
     }
 
     HTMLStackItem(PassRefPtr<ContainerNode> node, PassRefPtr<AtomicHTMLToken> token, const AtomicString& namespaceURI = HTMLNames::xhtmlNamespaceURI)

Modified: trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp (123670 => 123671)


--- trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp	2012-07-25 22:41:16 UTC (rev 123670)
+++ trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp	2012-07-25 22:59:58 UTC (rev 123671)
@@ -381,7 +381,7 @@
         // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#fragment-case
         // For efficiency, we skip step 4.2 ("Let root be a new html element with no attributes")
         // and instead use the DocumentFragment as a root node.
-        m_tree.openElements()->pushRootNode(HTMLStackItem::create(fragment));
+        m_tree.openElements()->pushRootNode(HTMLStackItem::create(fragment, HTMLStackItem::ItemForDocumentFragmentNode));
         resetInsertionModeAppropriately();
         m_tree.setForm(closestFormAncestor(contextElement));
     }
@@ -1632,41 +1632,41 @@
     bool last = false;
     HTMLElementStack::ElementRecord* nodeRecord = m_tree.openElements()->topRecord();
     while (1) {
-        ContainerNode* node = nodeRecord->node();
-        if (node == m_tree.openElements()->rootNode()) {
+        RefPtr<HTMLStackItem> item = nodeRecord->stackItem();
+        if (item->node() == m_tree.openElements()->rootNode()) {
             ASSERT(isParsingFragment());
             last = true;
-            node = m_fragmentContext.contextElement();
+            item = HTMLStackItem::create(m_fragmentContext.contextElement(), HTMLStackItem::ItemForContextElement);
         }
-        if (node->hasTagName(selectTag)) {
+        if (item->hasTagName(selectTag)) {
             ASSERT(isParsingFragment());
             return setInsertionMode(InSelectMode);
         }
-        if (node->hasTagName(tdTag) || node->hasTagName(thTag))
+        if (item->hasTagName(tdTag) || item->hasTagName(thTag))
             return setInsertionMode(InCellMode);
-        if (node->hasTagName(trTag))
+        if (item->hasTagName(trTag))
             return setInsertionMode(InRowMode);
-        if (node->hasTagName(tbodyTag) || node->hasTagName(theadTag) || node->hasTagName(tfootTag))
+        if (item->hasTagName(tbodyTag) || item->hasTagName(theadTag) || item->hasTagName(tfootTag))
             return setInsertionMode(InTableBodyMode);
-        if (node->hasTagName(captionTag))
+        if (item->hasTagName(captionTag))
             return setInsertionMode(InCaptionMode);
-        if (node->hasTagName(colgroupTag)) {
+        if (item->hasTagName(colgroupTag)) {
             ASSERT(isParsingFragment());
             return setInsertionMode(InColumnGroupMode);
         }
-        if (node->hasTagName(tableTag))
+        if (item->hasTagName(tableTag))
             return setInsertionMode(InTableMode);
-        if (node->hasTagName(headTag)) {
+        if (item->hasTagName(headTag)) {
             ASSERT(isParsingFragment());
             return setInsertionMode(InBodyMode);
         }
-        if (node->hasTagName(bodyTag))
+        if (item->hasTagName(bodyTag))
             return setInsertionMode(InBodyMode);
-        if (node->hasTagName(framesetTag)) {
+        if (item->hasTagName(framesetTag)) {
             ASSERT(isParsingFragment());
             return setInsertionMode(InFramesetMode);
         }
-        if (node->hasTagName(htmlTag)) {
+        if (item->hasTagName(htmlTag)) {
             ASSERT(isParsingFragment());
             return setInsertionMode(BeforeHeadMode);
         }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to