2010-06-30 Eric Seidel <eric@webkit.org>
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 30 Jun 2010 21:45:19 +0000 (21:45 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 30 Jun 2010 21:45:19 +0000 (21:45 +0000)
        Reviewed by Adam Barth.

        Add new popUntil(tagName) function and deploy
        https://bugs.webkit.org/show_bug.cgi?id=41405

        Add a new popUntil function to share some common code
        between states.  There is more code to share here, but this
        is a start.

        I also filled in a couple similar states to these with the
        hope of sharing more code, but decided to wait for a later
        patch.

        No test changes, since this code doesn't do enough yet to
        pass any more subtests.  Lack of generateImpliedEndTags is the main
        blocking issue.

        * html/HTMLElementStack.cpp:
        (WebCore::HTMLElementStack::popUntil):
        * html/HTMLElementStack.h:
        * html/HTMLTreeBuilder.cpp:
        (WebCore::HTMLTreeBuilder::processEndTag):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@62207 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/html/HTMLElementStack.cpp
WebCore/html/HTMLElementStack.h
WebCore/html/HTMLTreeBuilder.cpp

index 19a534d..ba7b83b 100644 (file)
@@ -1,3 +1,28 @@
+2010-06-30  Eric Seidel  <eric@webkit.org>
+
+        Reviewed by Adam Barth.
+
+        Add new popUntil(tagName) function and deploy
+        https://bugs.webkit.org/show_bug.cgi?id=41405
+
+        Add a new popUntil function to share some common code
+        between states.  There is more code to share here, but this
+        is a start.
+
+        I also filled in a couple similar states to these with the
+        hope of sharing more code, but decided to wait for a later
+        patch.
+
+        No test changes, since this code doesn't do enough yet to
+        pass any more subtests.  Lack of generateImpliedEndTags is the main
+        blocking issue.
+
+        * html/HTMLElementStack.cpp:
+        (WebCore::HTMLElementStack::popUntil):
+        * html/HTMLElementStack.h:
+        * html/HTMLTreeBuilder.cpp:
+        (WebCore::HTMLTreeBuilder::processEndTag):
+
 2010-06-30  Xan Lopez  <xlopez@igalia.com>
 
         Reviewed by Gustavo Noronha.
index 0842965..d01353b 100644 (file)
@@ -77,6 +77,15 @@ void HTMLElementStack::pop()
     popCommon();
 }
 
+void HTMLElementStack::popUntil(const AtomicString& tagName)
+{
+    while (!top()->hasLocalName(tagName)) {
+        // pop() will ASSERT at <body> if callers fail to check that there is an
+        // element with localName |tagName| on the stack of open elements.
+        pop();
+    }
+}
+
 void HTMLElementStack::pushHTMLHtmlElement(PassRefPtr<Element> element)
 {
     ASSERT(element->hasTagName(HTMLNames::htmlTag));
index 7e715ba..253c1af 100644 (file)
@@ -48,6 +48,7 @@ public:
     void pushHTMLBodyElement(PassRefPtr<Element>);
 
     void pop();
+    void popUntil(const AtomicString& tagName);
     void popHTMLHeadElement();
 
     void remove(Element*);
index c2220ed..d1a859d 100644 (file)
@@ -661,8 +661,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
             generateImpliedEndTags();
             if (currentElement()->tagQName() != token.name())
                 parseError(token);
-            while (currentElement()->tagQName() != token.name())
-                m_openElements.pop();
+            m_openElements.popUntil(token.name());
             m_openElements.pop();
         }
         if (token.name() == formTag) {
@@ -681,15 +680,31 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
             return;
         }
         if (token.name() == liTag) {
+            if (!m_openElements.inListItemScope(token.name())) {
+                parseError(token);
+                return;
+            }
             notImplemented();
             return;
         }
         if (token.name() == ddTag || token.name() == dtTag) {
+            if (!m_openElements.inScope(token.name())) {
+                parseError(token);
+                return;
+            }
             notImplemented();
             return;
         }
         if (token.name() == h1Tag || token.name() == h2Tag || token.name() == h3Tag || token.name() == h4Tag || token.name() == h5Tag || token.name() == h6Tag) {
-            notImplemented();
+            if (!m_openElements.inScope(token.name())) {
+                parseError(token);
+                return;
+            }
+            generateImpliedEndTags();
+            if (!currentElement()->hasLocalName(token.name()))
+                parseError(token);
+            m_openElements.popUntil(token.name());
+            m_openElements.pop();
             return;
         }
         if (token.name() == "sarcasm") {
@@ -709,8 +724,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
             generateImpliedEndTags();
             if (currentElement()->tagQName() != token.name())
                 parseError(token);
-            while (currentElement()->tagQName() != token.name())
-                m_openElements.pop();
+            m_openElements.popUntil(token.name());
             m_openElements.pop();
             // FIXME: m_activeFormattingElements should be more interesting
             // object than a vector so we can call this method on it instead
@@ -730,8 +744,7 @@ void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
         notImplemented();
         if (!m_openElements.inScope(token.name()))
             return;
-        while (currentElement()->tagQName() != token.name())
-            m_openElements.pop();
+        m_openElements.popUntil(token.name());
         m_openElements.pop();
         break;
     case InHeadNoscriptMode: