Fixes in the XML tokenizer when using QXmlStream.
authorhausmann <hausmann@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Oct 2007 11:09:08 +0000 (11:09 +0000)
committerhausmann <hausmann@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 31 Oct 2007 11:09:08 +0000 (11:09 +0000)
Use new functionality of QXmlStream in Qt 4.4 to simplify
the code (but keep the old code for now to still support Qt 4.3).

Add proper support for namespace handling when parsing into
a document fragment.

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

LayoutTests/ChangeLog
LayoutTests/platform/qt/Skipped
LayoutTests/platform/qt/dom/xhtml/level3/core/canonicalform10-expected.txt [deleted file]
LayoutTests/platform/qt/dom/xhtml/level3/core/canonicalform11-expected.txt [deleted file]
WebCore/ChangeLog
WebCore/dom/XMLTokenizer.cpp
WebCore/dom/XMLTokenizer.h

index 0aeecb45cec2f7a458f6cb3549210d4796919577..379e13525f3c6c6f720823b633c91940aa7df7f6 100644 (file)
@@ -1,3 +1,19 @@
+2007-10-31  Lars Knoll  <lars@trolltech.com>
+
+        Reviewed by Simon.
+
+        Fixes in the XML tokenizer when using QXmlStream.
+        
+        Use new functionality of QXmlStream in Qt 4.4 to simplify
+        the code (but keep the old code for now to still support Qt 4.3).
+        
+        Add proper support for namespace handling when parsing into
+        a document fragment.
+
+        * platform/qt/Skipped:
+        * platform/qt/dom/xhtml/level3/core/canonicalform10-expected.txt: Removed.
+        * platform/qt/dom/xhtml/level3/core/canonicalform11-expected.txt: Removed.
+
 2007-10-31  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Darin.
index 479698548fb07fb0a42f2c2adacc2ad454218e3a..69f2c130a9532f4ba75b7c58c5b7b291d6d9db70 100644 (file)
@@ -7,9 +7,6 @@ editing/selection/5354455-1.html
 editing/selection/5354455-2.html
 editing/selection/caret-and-focus-ring.html
 
-# ------- crashes 
-editing/execCommand/copy-without-selection.html
-
 # ------- failing editing tests
 editing/pasteboard/
 
@@ -74,13 +71,6 @@ editing/undo/undo-misspellings.html
 editing/undo/undo-typing-001.html
 editing/unsupported-content
 
-
-# ------- tests that fail against Qt 4.3 due to bugs and missing features in QXmlStream
-fast/dom/set-innerHTML.xhtml
-fast/encoding/css-charset-default.xhtml
-fast/encoding/default-xhtml-encoding.xhtml
-fast/encoding/meta-in-xhtml.xhtml
-
 # ------- failures due to missing XSLT support
 fast/dom/Window/get-set-properties.html
 fast/dom/Window/window-properties.html
diff --git a/LayoutTests/platform/qt/dom/xhtml/level3/core/canonicalform10-expected.txt b/LayoutTests/platform/qt/dom/xhtml/level3/core/canonicalform10-expected.txt
deleted file mode 100644 (file)
index 5c28b66..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 800x126
-  RenderBlock {html} at (0,0) size 800x126
-    RenderBody {body} at (8,16) size 784x94
-      RenderBlock (anonymous) at (0,0) size 784x0
-        RenderInline {parsererror} at (0,0) size 0x0 [bgcolor=#FFDDDD] [border: (2px solid #CC7777)]
-      RenderBlock (anonymous) at (0,0) size 784x94
-        RenderBlock {h3} at (0,0) size 784x23
-          RenderText {#text} at (0,0) size 301x22
-            text run at (0,0) width 301: "This page contains the following errors:"
-        RenderBlock {div} at (0,39) size 784x16
-          RenderText {#text} at (0,0) size 315x15
-            text run at (0,0) width 315: "error on line 1 at column 58: Invalid DOCTYPE"
-        RenderBlock {h3} at (0,71) size 784x23
-          RenderText {#text} at (0,0) size 393x22
-            text run at (0,0) width 393: "Below is a rendering of the page up to the first error."
-      RenderBlock (anonymous) at (0,110) size 784x0
-        RenderInline {parsererror} at (0,0) size 0x0 [bgcolor=#FFDDDD] [border: (2px solid #CC7777)]
diff --git a/LayoutTests/platform/qt/dom/xhtml/level3/core/canonicalform11-expected.txt b/LayoutTests/platform/qt/dom/xhtml/level3/core/canonicalform11-expected.txt
deleted file mode 100644 (file)
index 5c28b66..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 800x126
-  RenderBlock {html} at (0,0) size 800x126
-    RenderBody {body} at (8,16) size 784x94
-      RenderBlock (anonymous) at (0,0) size 784x0
-        RenderInline {parsererror} at (0,0) size 0x0 [bgcolor=#FFDDDD] [border: (2px solid #CC7777)]
-      RenderBlock (anonymous) at (0,0) size 784x94
-        RenderBlock {h3} at (0,0) size 784x23
-          RenderText {#text} at (0,0) size 301x22
-            text run at (0,0) width 301: "This page contains the following errors:"
-        RenderBlock {div} at (0,39) size 784x16
-          RenderText {#text} at (0,0) size 315x15
-            text run at (0,0) width 315: "error on line 1 at column 58: Invalid DOCTYPE"
-        RenderBlock {h3} at (0,71) size 784x23
-          RenderText {#text} at (0,0) size 393x22
-            text run at (0,0) width 393: "Below is a rendering of the page up to the first error."
-      RenderBlock (anonymous) at (0,110) size 784x0
-        RenderInline {parsererror} at (0,0) size 0x0 [bgcolor=#FFDDDD] [border: (2px solid #CC7777)]
index 4dce2eb2ec589f5563ec09c3add35ff35ee00166..cd15422a0b9fee315699a8e3f1ff8383c3c0b2b1 100644 (file)
@@ -1,3 +1,22 @@
+2007-10-31  Lars Knoll  <lars@trolltech.com>
+
+        Reviewed by Simon.
+
+        Fixes in the XML tokenizer when using QXmlStream.
+        
+        Use new functionality of QXmlStream in Qt 4.4 to simplify
+        the code (but keep the old code for now to still support Qt 4.3).
+        
+        Add proper support for namespace handling when parsing into
+        a document fragment.
+
+        * dom/XMLTokenizer.cpp:
+        (WebCore::XMLTokenizer::XMLTokenizer):
+        (WebCore::XMLTokenizer::write):
+        (WebCore::XMLTokenizer::startElementNs):
+        (WebCore::):
+        * dom/XMLTokenizer.h:
+
 2007-10-31  Lars Knoll  <lars@trolltech.com>
 
         Reviewed by Simon.
index 8d8f53376f8ab362637ab250296fdc883f3f1cdf..1171c6963167971c4f02d03da6b772b3bc50120f 100644 (file)
@@ -482,7 +482,9 @@ XMLTokenizer::XMLTokenizer(Document* _doc, FrameView* _view)
 XMLTokenizer::XMLTokenizer(DocumentFragment* fragment, Element* parentElement)
     : m_doc(fragment->document())
     , m_view(0)
-#ifndef USE_QXMLSTREAM
+#ifdef USE_QXMLSTREAM
+    , m_wroteText(false)
+#else
     , m_context(0)
 #endif
     , m_currentNode(fragment)
@@ -523,6 +525,7 @@ XMLTokenizer::XMLTokenizer(DocumentFragment* fragment, Element* parentElement)
     if (elemStack.isEmpty())
         return;
     
+#ifndef USE_QXMLSTREAM
     for (Element* element = elemStack.last(); !elemStack.isEmpty(); elemStack.removeLast()) {
         if (NamedAttrMap* attrs = element->attributes()) {
             for (unsigned i = 0; i < attrs->length(); i++) {
@@ -534,6 +537,23 @@ XMLTokenizer::XMLTokenizer(DocumentFragment* fragment, Element* parentElement)
             }
         }
     }
+#else
+    QXmlStreamNamespaceDeclarations namespaces;
+    for (Element* element = elemStack.last(); !elemStack.isEmpty(); elemStack.removeLast()) {
+        if (NamedAttrMap* attrs = element->attributes()) {
+            for (unsigned i = 0; i < attrs->length(); i++) {
+                Attribute* attr = attrs->attributeItem(i);
+                if (attr->localName() == "xmlns")
+                    m_defaultNamespaceURI = attr->value();
+                else if (attr->prefix() == "xmlns")
+                    namespaces.append(QXmlStreamNamespaceDeclaration(attr->localName(), attr->value()));
+            }
+        }
+    }
+#if QT_VERSION >= 0x040400
+    m_stream.addExtraNamespaceDeclarations(namespaces);
+#endif
+#endif
 }
 
 XMLTokenizer::~XMLTokenizer()
@@ -591,6 +611,7 @@ bool XMLTokenizer::write(const SegmentedString& s, bool /*appendData*/)
     m_wroteText = true;
     QString data(parseString);
     if (!data.isEmpty()) {
+#if QT_VERSION < 0x040400
         if (!m_sawFirstElement) {
             int idx = data.indexOf(QLatin1String("<?xml"));
             if (idx != -1) {
@@ -610,6 +631,7 @@ bool XMLTokenizer::write(const SegmentedString& s, bool /*appendData*/)
                 }
             }
         }
+#endif
         m_stream.addData(data);
         parse();
     }
@@ -696,7 +718,7 @@ void XMLTokenizer::startElementNs(const xmlChar* xmlLocalName, const xmlChar* xm
     String localName = toString(xmlLocalName);
     String uri = toString(xmlURI);
     String prefix = toString(xmlPrefix);
-    
+
     if (m_parsingFragment && uri.isNull()) {
         if (!prefix.isNull())
             uri = m_prefixToNamespaceMap.get(prefix);
@@ -1524,9 +1546,11 @@ bool parseXMLDocumentFragment(const String& string, DocumentFragment* fragment,
     int result = xmlParseBalancedChunkMemory(0, &sax, &tokenizer, 0, (const xmlChar*)string.utf8().data(), 0);
     return result == 0;
 #else
+    tokenizer.write(String("<qxmlstreamdummyelement>"), false);
     tokenizer.write(string, false);
+    tokenizer.write(String("</qxmlstreamdummyelement>"), false);
     tokenizer.finish();
-    return tokenizer.hasError();
+    return !tokenizer.hasError();
 #endif
 }
 
@@ -1725,12 +1749,27 @@ void XMLTokenizer::startDocument()
     initializeParserContext();
     ExceptionCode ec = 0;
 
-    if (!m_parsingFragment)
+    if (!m_parsingFragment) {
         m_doc->setXMLStandalone(m_stream.isStandaloneDocument(), ec);
+
+#if QT_VERSION >= 0x040400
+        QStringRef version = m_stream.documentVersion();
+        if (!version.isEmpty())
+            m_doc->setXMLVersion(version, ec);
+        QStringRef encoding = m_stream.documentEncoding();
+        if (!encoding.isEmpty())
+            m_doc->setXMLEncoding(encoding);
+#endif
+    }
 }
 
 void XMLTokenizer::parseStartElement()
 {
+    if (!m_sawFirstElement && m_parsingFragment) {
+        // skip dummy element for fragments
+        m_sawFirstElement = true;
+        return;
+    }
     m_sawFirstElement = true;
 
     exitText();
@@ -1740,10 +1779,8 @@ void XMLTokenizer::parseStartElement()
     String prefix    = prefixFromQName(m_stream.qualifiedName().toString());
 
     if (m_parsingFragment && uri.isNull()) {
-        if (!prefix.isNull())
-            uri = m_prefixToNamespaceMap.get(prefix);
-        else
-            uri = m_defaultNamespaceURI;
+        Q_ASSERT (prefix.isNull());
+        uri = m_defaultNamespaceURI;
     }
 
     ExceptionCode ec = 0;
@@ -1791,6 +1828,11 @@ void XMLTokenizer::parseEndElement()
     exitText();
 
     Node* n = m_currentNode;
+
+    // skip end of dummy element
+//     if (m_parsingFragment & n->nodeType() == Node::DOCUMENT_FRAGMENT_NODE)
+//         return;
+    
     RefPtr<Node> parent = n->parentNode();
     n->finishedParsing();
 
@@ -1905,6 +1947,7 @@ bool XMLTokenizer::hasError() const
     return m_stream.hasError();
 }
 
+#if QT_VERSION < 0x040400
 static QString parseId(const QString &dtd, int *pos, bool *ok)
 {
     *ok = true;
@@ -1923,9 +1966,15 @@ static QString parseId(const QString &dtd, int *pos, bool *ok)
     *pos = end + 1;
     return dtd.mid(start, end - start);
 }
+#endif
 
 void XMLTokenizer::parseDtd()
 {
+#if QT_VERSION >= 0x040400
+    QStringRef name = m_stream.dtdName();
+    QStringRef publicId = m_stream.dtdPublicId();
+    QStringRef systemId = m_stream.dtdSystemId();
+#else
     QString dtd = m_stream.text().toString();
 
     int start = dtd.indexOf("<!DOCTYPE ") + 10;
@@ -1974,10 +2023,9 @@ void XMLTokenizer::parseDtd()
         handleError(fatal, "Invalid DOCTYPE", lineNumber(), columnNumber());
         return;
     }
-    
-    //qDebug() << dtd << name << publicId << systemId;
-    const QXmlStreamNotationDeclarations& decls = m_stream.notationDeclarations();
+#endif    
 
+    //qDebug() << dtd << name << publicId << systemId;
     if ((publicId == "-//W3C//DTD XHTML 1.0 Transitional//EN")
         || (publicId == "-//W3C//DTD XHTML 1.1//EN")
         || (publicId == "-//W3C//DTD XHTML 1.0 Strict//EN")
index a595d519fba5feb8ce51912c4ef43e1feec8d793..55c67fb7a836632a2aaa1b38f34252e86b8747e4 100644 (file)
@@ -160,8 +160,8 @@ namespace WebCore {
         String m_defaultNamespaceURI;
 
         typedef HashMap<String, String> PrefixForNamespaceMap;
-        PrefixForNamespaceMap m_prefixToNamespaceMap;
 #ifndef USE_QXMLSTREAM
+        PrefixForNamespaceMap m_prefixToNamespaceMap;
         OwnPtr<PendingCallbacks> m_pendingCallbacks;
 #endif
         SegmentedString m_pendingSrc;