Reviewed by Maciej.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 Nov 2006 19:56:38 +0000 (19:56 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 Nov 2006 19:56:38 +0000 (19:56 +0000)
        http://bugs.webkit.org/show_bug.cgi?id=10736
        XMLHttpRequest.responseXML should be null on error

WebCore:
        * dom/XMLTokenizer.cpp:
        (WebCore::XMLTokenizer::wellFormed):
        * dom/XMLTokenizer.h:
        (WebCore::Tokenizer::wellFormed):
        * dom/Document.cpp:
        (WebCore::Document::Document):
        (WebCore::Document::implicitClose):
        * dom/Document.h:
        (WebCore::Document::wellFormed):
        Tell whether XMLTokenizer saw an error. Always true (success) for HTML.

        * xml/xmlhttprequest.cpp:
        (WebCore::XMLHttpRequest::getResponseXML): Set the document to null if it's not well-formed.

LayoutTests:
        * http/tests/xmlhttprequest/zero-length-response-expected.txt:
        * http/tests/xmlhttprequest/zero-length-response-sync-expected.txt:
        Updated the results for the new behavior.

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

LayoutTests/ChangeLog
LayoutTests/http/tests/xmlhttprequest/zero-length-response-expected.txt
LayoutTests/http/tests/xmlhttprequest/zero-length-response-sync-expected.txt
WebCore/ChangeLog
WebCore/dom/Document.cpp
WebCore/dom/Document.h
WebCore/dom/XMLTokenizer.cpp
WebCore/dom/XMLTokenizer.h
WebCore/xml/xmlhttprequest.cpp

index cb5ff2441f75308e575ad01384de0d144cb68459..2ca25e211ba67854548eac6d2a20f620c2188c62 100644 (file)
@@ -1,3 +1,14 @@
+2006-11-20  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Maciej.
+
+        http://bugs.webkit.org/show_bug.cgi?id=10736
+        XMLHttpRequest.responseXML should be null on error
+
+        * http/tests/xmlhttprequest/zero-length-response-expected.txt:
+        * http/tests/xmlhttprequest/zero-length-response-sync-expected.txt:
+        Updated the results for the new behavior.
+
 2006-11-20  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Sam Weinig.
index b9ba6784693bb78d0a5df09ae58138f7e916a920..9133798fd335b34d48414c1363191c318d96d8f6 100644 (file)
@@ -31,6 +31,6 @@ onreadystatechange: Loaded
   Status: 200
   StatusText: "OK"
   ResponseText: ""
-  ResponseXML: [object Document]
-  ResponseXML serialized: "<html><body><parsererror style="white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black"><h3>This page contains the following errors:</h3><div style="font-family:monospace;font-size:12px">error on line 1 at column 1: Extra content at the end of the document </div><h3>Below is a rendering of the page up to the first error.</h3></parsererror></body></html>"
+  ResponseXML: null
+  ResponseXML serialized: n/a
 
index bfc61b892604dfe2e4d3e100dcc633afe3d9af32..c1c86cdab9decb239a4d6e75a28a4fc3765ff626 100644 (file)
@@ -9,6 +9,6 @@ after send(): Loaded
   Status: 200
   StatusText: "OK"
   ResponseText: ""
-  ResponseXML: [object Document]
-  ResponseXML serialized: "<html><body><parsererror style="white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black"><h3>This page contains the following errors:</h3><div style="font-family:monospace;font-size:12px">error on line 1 at column 1: Extra content at the end of the document </div><h3>Below is a rendering of the page up to the first error.</h3></parsererror></body></html>"
+  ResponseXML: null
+  ResponseXML serialized: n/a
 
index 5ab1e573e771ece4ed802fda254585ee5f9a0eec..6106cacd28caff73fa7e1342df4888eb0a796363 100644 (file)
@@ -1,3 +1,24 @@
+2006-11-20  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Maciej.
+
+        http://bugs.webkit.org/show_bug.cgi?id=10736
+        XMLHttpRequest.responseXML should be null on error
+
+        * dom/XMLTokenizer.cpp:
+        (WebCore::XMLTokenizer::wellFormed):
+        * dom/XMLTokenizer.h:
+        (WebCore::Tokenizer::wellFormed):
+        * dom/Document.cpp:
+        (WebCore::Document::Document):
+        (WebCore::Document::implicitClose):
+        * dom/Document.h:
+        (WebCore::Document::wellFormed):
+        Tell whether XMLTokenizer saw an error. Always true (success) for HTML.
+
+        * xml/xmlhttprequest.cpp:
+        (WebCore::XMLHttpRequest::getResponseXML): Set the document to null if it's not well-formed.
+
 2006-11-20  Alexey Proskuryakov  <ap@webkit.org>
 
         Reviewed by Sam Weinig.
index cef6f88806b55bbefd8a8dd911129323c776f30b..8fd612a42a2245bac4b48b535a183cec5425c9fd 100644 (file)
@@ -260,6 +260,7 @@ Document::Document(DOMImplementation* impl, FrameView *v)
     m_bParsing = false;
     m_docChanged = false;
     m_tokenizer = 0;
+    m_wellFormed = false;
 
     pMode = Strict;
     hMode = XHtml;
@@ -1231,6 +1232,8 @@ void Document::implicitClose()
 
     m_processingLoadEvent = true;
 
+    m_wellFormed = m_tokenizer && m_tokenizer->wellFormed();
+
     // We have to clear the tokenizer, in case someone document.write()s from the
     // onLoad event handler, as in Radar 3206524.
     delete m_tokenizer;
index 51537a043da666df7741eb4a3148011a64a05359..d178d5fc111e166a5c095d358882864fe07c17e6 100644 (file)
@@ -325,6 +325,8 @@ public:
     void finishParsing();
     void clear();
 
+    bool wellFormed() const { return m_wellFormed; }
+
     DeprecatedString URL() const { return m_url.isEmpty() ? "about:blank" : m_url; }
     void setURL(const DeprecatedString& url);
 
@@ -612,6 +614,7 @@ protected:
 
     DocLoader* m_docLoader;
     Tokenizer* m_tokenizer;
+    bool m_wellFormed;
     DeprecatedString m_url;
     DeprecatedString m_baseURL;
     String m_baseTarget;
index f276aefbd15eb446fd249a4b25eff00702776080..5ccab7bf1ad2e5c78d699e8571bd91799a78599a 100644 (file)
@@ -110,7 +110,9 @@ public:
     void internalSubset(const xmlChar* name, const xmlChar* externalID, const xmlChar* systemID);
 
     void handleError(ErrorType type, const char* m, int lineNumber, int columnNumber);
-    
+
+    virtual bool wellFormed() const { return !m_sawError; }
+
 private:
     void initializeParserContext();
     void setCurrentNode(Node*);
index 0d77b06d07cc5784f85c8c0b3e49dea562a7f0c3..c5fdf882540df95cdba77f8d1be2b484ec04e26b 100644 (file)
@@ -63,6 +63,8 @@ public:
     bool inViewSourceMode() const { return m_inViewSourceMode; }
     void setInViewSourceMode(bool mode) { m_inViewSourceMode = mode; }
 
+    virtual bool wellFormed() const { return true; }
+
 protected:
     // The tokenizer has buffers, so parsing may continue even after
     // it stops receiving data. We use m_parserStopped to stop the tokenizer
index 5bf664859f9cbcc8e89623a4b9981f51f0d1edaa..b7c2f5e5175d698af6af331e6d8376f3dd3b9bb0 100644 (file)
@@ -160,6 +160,9 @@ Document* XMLHttpRequest::getResponseXML() const
             m_responseXML->write(m_responseText);
             m_responseXML->finishParsing();
             m_responseXML->close();
+            
+            if (!m_responseXML->wellFormed())
+                m_responseXML = 0;
         }
         m_createdDocument = true;
     }