[HTMLTemplateElement] prevent </template> from matching "template" in a non-HTML...
authorrafaelw@chromium.org <rafaelw@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 17 Mar 2013 23:58:31 +0000 (23:58 +0000)
committerrafaelw@chromium.org <rafaelw@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 17 Mar 2013 23:58:31 +0000 (23:58 +0000)
https://bugs.webkit.org/show_bug.cgi?id=112487

Reviewed by Adam Barth.

Source/WebCore:

When processing an end template tag, the parser now pops until a "template" tag is parsed, but now ensures that
the "template" it pops is in the HTML namespace.

Tests added to the html5lib test suite.

* html/parser/HTMLElementStack.cpp:
(WebCore::HTMLElementStack::popUntil):
(WebCore):
(WebCore::HTMLElementStack::popUntilPopped):
* html/parser/HTMLElementStack.h:
(HTMLElementStack):
* html/parser/HTMLTreeBuilder.cpp:
(WebCore::HTMLTreeBuilder::processTemplateEndTag):

LayoutTests:

* html5lib/resources/template.dat:

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

LayoutTests/ChangeLog
LayoutTests/html5lib/resources/template.dat
Source/WebCore/ChangeLog
Source/WebCore/html/parser/HTMLElementStack.cpp
Source/WebCore/html/parser/HTMLElementStack.h
Source/WebCore/html/parser/HTMLTreeBuilder.cpp

index b09af31..d8e2f14 100644 (file)
@@ -1,3 +1,12 @@
+2013-03-17  Rafael Weinstein  <rafaelw@chromium.org>
+
+        [HTMLTemplateElement] prevent </template> from matching "template" in a non-HTML tags on the stack of open elements
+        https://bugs.webkit.org/show_bug.cgi?id=112487
+
+        Reviewed by Adam Barth.
+
+        * html5lib/resources/template.dat:
+
 2013-03-17  Simon Fraser  <simon.fraser@apple.com>
 
         fast/frames/flattening/frameset-flattening-subframesets.html is flakey
index 691d5e0..65aa9b5 100644 (file)
 |   <body>
 |     <span>
 |       "Foo"
+
+#data
+<template><svg><template>
+#errors
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <svg svg>
+|           <svg template>
+|   <body>
+
+#data
+<template><svg><foo><template><foreignObject><div></template><div>
+#errors
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <svg svg>
+|           <svg foo>
+|             <svg template>
+|               <svg foreignObject>
+|                 <div>
+|   <body>
+|     <div>
index 6ff9e8b..1f0ca04 100644 (file)
@@ -1,3 +1,24 @@
+2013-03-17  Rafael Weinstein  <rafaelw@chromium.org>
+
+        [HTMLTemplateElement] prevent </template> from matching "template" in a non-HTML tags on the stack of open elements
+        https://bugs.webkit.org/show_bug.cgi?id=112487
+
+        Reviewed by Adam Barth.
+
+        When processing an end template tag, the parser now pops until a "template" tag is parsed, but now ensures that
+        the "template" it pops is in the HTML namespace.
+
+        Tests added to the html5lib test suite.
+
+        * html/parser/HTMLElementStack.cpp:
+        (WebCore::HTMLElementStack::popUntil):
+        (WebCore):
+        (WebCore::HTMLElementStack::popUntilPopped):
+        * html/parser/HTMLElementStack.h:
+        (HTMLElementStack):
+        * html/parser/HTMLTreeBuilder.cpp:
+        (WebCore::HTMLTreeBuilder::processTemplateEndTag):
+
 2013-03-17  Adam Barth  <abarth@webkit.org>
 
         Legacy CSS vendor prefixes should only work for Dashboard
index e3aa78e..6bb5fb2 100644 (file)
@@ -220,8 +220,15 @@ void HTMLElementStack::pop()
 void HTMLElementStack::popUntil(const AtomicString& tagName)
 {
     while (!topStackItem()->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() will ASSERT if a <body>, <head> or <html> will be popped.
+        pop();
+    }
+}
+
+void HTMLElementStack::popUntil(const QualifiedName& tagName)
+{
+    while (!topStackItem()->hasTagName(tagName)) {
+        // pop() will ASSERT if a <body>, <head> or <html> will be popped.
         pop();
     }
 }
@@ -232,6 +239,12 @@ void HTMLElementStack::popUntilPopped(const AtomicString& tagName)
     pop();
 }
 
+void HTMLElementStack::popUntilPopped(const QualifiedName& tagName)
+{
+    popUntil(tagName);
+    pop();
+}
+
 void HTMLElementStack::popUntilNumberedHeaderElementPopped()
 {
     while (!topStackItem()->isNumberedHeaderElement())
index 0b31928..5be211a 100644 (file)
@@ -116,6 +116,11 @@ public:
     void popUntil(const AtomicString& tagName);
     void popUntil(Element*);
     void popUntilPopped(const AtomicString& tagName);
+
+    // FIXME: These are fixes for https://www.w3.org/Bugs/Public/show_bug.cgi?id=21292
+    void popUntil(const QualifiedName&);
+    void popUntilPopped(const QualifiedName&);
+
     void popUntilPopped(Element*);
     void popUntilNumberedHeaderElementPopped();
     void popUntilTableScopeMarker(); // "clear the stack back to a table context" in the spec.
index 953329b..b8cc848 100644 (file)
@@ -967,7 +967,7 @@ bool HTMLTreeBuilder::processTemplateEndTag(AtomicHTMLToken* token)
     m_tree.generateImpliedEndTags();
     if (!m_tree.currentStackItem()->hasLocalName(token->name()))
         parseError(token);
-    m_tree.openElements()->popUntilPopped(token->name());
+    m_tree.openElements()->popUntilPopped(templateTag);
     m_tree.activeFormattingElements()->clearToLastMarker();
     m_templateInsertionModes.removeLast();
     resetInsertionModeAppropriately();