XML error document creation should not fire mutation events
authorjpfau@apple.com <jpfau@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 25 Mar 2012 04:24:36 +0000 (04:24 +0000)
committerjpfau@apple.com <jpfau@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 25 Mar 2012 04:24:36 +0000 (04:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=80765

Reviewed by Adam Barth.

Source/WebCore:

Broke two tests that expected the old behavior, which have now been updated.

* xml/XMLErrors.cpp:
(WebCore::createXHTMLParserErrorHeader):
(WebCore::XMLErrors::insertErrorMessageBlock):

LayoutTests:

Fixed tests that relied on old behavior.

* fast/css/stylesheet-candidate-nodes-crash-expected.txt:
* fast/css/stylesheet-candidate-nodes-crash.xhtml:
* fast/dom/xml-parser-error-message-crash-expected.txt:

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

LayoutTests/ChangeLog
LayoutTests/fast/css/stylesheet-candidate-nodes-crash-expected.txt
LayoutTests/fast/css/stylesheet-candidate-nodes-crash.xhtml
LayoutTests/fast/dom/xml-parser-error-message-crash-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/xml/XMLErrors.cpp

index d5291920d1bef95e7444e94a4c311d9e3ba44922..4775bd4cf58e2a9bec681eb394804866bf8c014c 100644 (file)
@@ -1,3 +1,16 @@
+2012-03-24  Jeffrey Pfau  <jpfau@apple.com>
+
+        XML error document creation should not fire mutation events
+        https://bugs.webkit.org/show_bug.cgi?id=80765
+
+        Reviewed by Adam Barth.
+
+        Fixed tests that relied on old behavior.
+
+        * fast/css/stylesheet-candidate-nodes-crash-expected.txt:
+        * fast/css/stylesheet-candidate-nodes-crash.xhtml:
+        * fast/dom/xml-parser-error-message-crash-expected.txt:
+
 2012-03-24  Florin Malita  <fmalita@google.com>
 
         ForeignObject content is zoomed two times
index 4346ce627913c51eeb19cb72f00ce362674758e4..7ef22e9a431ad0272713b71fdc8794016c8ef12f 100644 (file)
@@ -1,7 +1 @@
-This page contains the following errors:
-
-error on line 29 at column 9: Comment not terminated 
-error on line 32 at column 1: Comment not terminated
-Below is a rendering of the page up to the first error.
-
 PASS
index d0ecff463b9c2aa4bc98bbe7f9187d651f8665a7..6d20e917ffa435a06ef8ecb47b015290e37ceb0b 100644 (file)
@@ -7,20 +7,20 @@
                     layoutTestController.dumpAsText();\r
                     layoutTestController.waitUntilDone();\r
                 }\r
-                \r
+\r
                 function runTest()\r
                 {\r
                     document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'style')[0];\r
-                    if (document.body)\r
+                    if (document.body) {\r
                         document.body.innerHTML = "PASS";\r
-                    \r
-                    if (window.layoutTestController)\r
-                        layoutTestController.notifyDone();\r
+                        if (window.layoutTestController)\r
+                            layoutTestController.notifyDone();\r
+                    }\r
                 }\r
             </script>\r
             <svg:style>\r
                 <xht:caption>\r
-                    <xht:iframe onload="runTest();"></xht:iframe>             \r
+                    <xht:iframe onload="runTest();"></xht:iframe>\r
                     <style></style>\r
                 </xht:caption>\r
             </svg:style>\r
index 7ef22e9a431ad0272713b71fdc8794016c8ef12f..fedbc414e3ab836994e0f2c7756aa81e915267ee 100644 (file)
@@ -1 +1,6 @@
-PASS
+This page contains the following errors:
+
+error on line 14 at column 1: Extra content at the end of the document
+Below is a rendering of the page up to the first error.
+
+
index e45ca5ca135e7c79ea34d0bb4fb88ff83ee0e4ba..d4a5710fa1465891d0a37585cebb60e4e02ae57c 100644 (file)
@@ -1,3 +1,16 @@
+2012-03-24  Jeffrey Pfau  <jpfau@apple.com>
+
+        XML error document creation should not fire mutation events
+        https://bugs.webkit.org/show_bug.cgi?id=80765
+
+        Reviewed by Adam Barth.
+
+        Broke two tests that expected the old behavior, which have now been updated.
+
+        * xml/XMLErrors.cpp:
+        (WebCore::createXHTMLParserErrorHeader):
+        (WebCore::XMLErrors::insertErrorMessageBlock):
+
 2012-03-24  Florin Malita  <fmalita@google.com>
 
         ForeignObject content is zoomed two times
index 87fcf2704ef54ea503197019e967b37881f5272f..3d4113d141641b7293b847a5112a4c0b278c734c 100644 (file)
@@ -87,26 +87,31 @@ void XMLErrors::appendErrorMessage(const String& typeString, TextPosition positi
     m_errorMessages.append(message);
 }
 
-static inline RefPtr<Element> createXHTMLParserErrorHeader(Document* doc, const String& errorMessages)
+static inline PassRefPtr<Element> createXHTMLParserErrorHeader(Document* doc, const String& errorMessages)
 {
-    RefPtr<Element> reportElement = doc->createElement(QualifiedName(nullAtom, "parsererror", xhtmlNamespaceURI), false);
-    reportElement->setAttribute(styleAttr, "display: block; white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black");
+    RefPtr<Element> reportElement = doc->createElement(QualifiedName(nullAtom, "parsererror", xhtmlNamespaceURI), true);
 
-    ExceptionCode ec = 0;
-    RefPtr<Element> h3 = doc->createElement(h3Tag, false);
-    reportElement->appendChild(h3.get(), ec);
-    h3->appendChild(doc->createTextNode("This page contains the following errors:"), ec);
+    OwnPtr<AttributeVector> reportAttributes = AttributeVector::create();
+    reportAttributes->append(Attribute::create(styleAttr, "display: block; white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black"));
+    reportElement->parserSetAttributes(reportAttributes.release(), FragmentScriptingNotAllowed);
 
-    RefPtr<Element> fixed = doc->createElement(divTag, false);
-    reportElement->appendChild(fixed.get(), ec);
-    fixed->setAttribute(styleAttr, "font-family:monospace;font-size:12px");
-    fixed->appendChild(doc->createTextNode(errorMessages), ec);
+    RefPtr<Element> h3 = doc->createElement(h3Tag, true);
+    reportElement->parserAddChild(h3.get());
+    h3->parserAddChild(doc->createTextNode("This page contains the following errors:"));
 
-    h3 = doc->createElement(h3Tag, false);
-    reportElement->appendChild(h3.get(), ec);
-    h3->appendChild(doc->createTextNode("Below is a rendering of the page up to the first error."), ec);
+    RefPtr<Element> fixed = doc->createElement(divTag, true);
+    OwnPtr<AttributeVector> fixedAttributes = AttributeVector::create();
+    fixedAttributes->append(Attribute::create(styleAttr, "font-family:monospace;font-size:12px"));
+    fixed->parserSetAttributes(fixedAttributes.release(), FragmentScriptingNotAllowed);
+    reportElement->parserAddChild(fixed.get());
 
-    return reportElement;
+    fixed->parserAddChild(doc->createTextNode(errorMessages));
+
+    h3 = doc->createElement(h3Tag, true);
+    reportElement->parserAddChild(h3.get());
+    h3->parserAddChild(doc->createTextNode("Below is a rendering of the page up to the first error."));
+
+    return reportElement.release();
 }
 
 void XMLErrors::insertErrorMessageBlock()
@@ -116,36 +121,62 @@ void XMLErrors::insertErrorMessageBlock()
     // where the errors are located)
 
     // Create elements for display
-    ExceptionCode ec = 0;
     RefPtr<Element> documentElement = m_document->documentElement();
     if (!documentElement) {
-        RefPtr<Element> rootElement = m_document->createElement(htmlTag, false);
-        m_document->appendChild(rootElement, ec);
-        RefPtr<Element> body = m_document->createElement(bodyTag, false);
-        rootElement->appendChild(body, ec);
+        RefPtr<Element> rootElement = m_document->createElement(htmlTag, true);
+        RefPtr<Element> body = m_document->createElement(bodyTag, true);
+        rootElement->parserAddChild(body);
+        m_document->parserAddChild(rootElement);
+        if (m_document->attached() && !rootElement->attached())
+            rootElement->attach();
         documentElement = body.get();
     }
 #if ENABLE(SVG)
     else if (documentElement->namespaceURI() == SVGNames::svgNamespaceURI) {
-        RefPtr<Element> rootElement = m_document->createElement(htmlTag, false);
-        RefPtr<Element> body = m_document->createElement(bodyTag, false);
-        rootElement->appendChild(body, ec);
-        body->appendChild(documentElement, ec);
-        m_document->appendChild(rootElement.get(), ec);
+        RefPtr<Element> rootElement = m_document->createElement(htmlTag, true);
+        RefPtr<Element> body = m_document->createElement(bodyTag, true);
+        rootElement->parserAddChild(body);
+
+        documentElement->parentNode()->parserRemoveChild(documentElement.get());
+        if (documentElement->attached())
+            documentElement->detach();
+
+        body->parserAddChild(documentElement);
+        m_document->parserAddChild(rootElement.get());
+
+        if (m_document->attached()) {
+            // rootElement shouldn't be attached right now, but in some cases might be.
+            // See https://bugs.webkit.org/show_bug.cgi?id=81985
+            rootElement->reattach();
+        }
+
         documentElement = body.get();
     }
 #endif
+
     String errorMessages = m_errorMessages.toString();
     RefPtr<Element> reportElement = createXHTMLParserErrorHeader(m_document, errorMessages);
-    documentElement->insertBefore(reportElement, documentElement->firstChild(), ec);
+
 #if ENABLE(XSLT)
     if (m_document->transformSourceDocument()) {
-        RefPtr<Element> paragraph = m_document->createElement(pTag, false);
-        paragraph->setAttribute(styleAttr, "white-space: normal");
-        paragraph->appendChild(m_document->createTextNode("This document was created as the result of an XSL transformation. The line and column numbers given are from the transformed result."), ec);
-        reportElement->appendChild(paragraph.release(), ec);
+        OwnPtr<AttributeVector> attributes = AttributeVector::create();
+        attributes->append(Attribute::create(styleAttr, "white-space: normal"));
+        RefPtr<Element> paragraph = m_document->createElement(pTag, true);
+        paragraph->parserSetAttributes(attributes.release(), FragmentScriptingNotAllowed);
+        paragraph->parserAddChild(m_document->createTextNode("This document was created as the result of an XSL transformation. The line and column numbers given are from the transformed result."));
+        reportElement->parserAddChild(paragraph.release());
     }
 #endif
+
+    Node* firstChild = documentElement->firstChild();
+    if (firstChild)
+        documentElement->parserInsertBefore(reportElement, documentElement->firstChild());
+    else
+        documentElement->parserAddChild(reportElement);
+
+    if (documentElement->attached() && !reportElement->attached())
+        reportElement->attach();
+
     m_document->updateStyleIfNeeded();
 }