Reviewed by Sam Weinig.
authorap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 Nov 2006 18:59:12 +0000 (18:59 +0000)
committerap <ap@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 Nov 2006 18:59:12 +0000 (18:59 +0000)
        http://bugs.webkit.org/show_bug.cgi?id=11633
        Implement XMLDocument properties xmlEncoding, xmlVersion, xmlStandalone

WebCore:
        * dom/Document.cpp:
        (WebCore::Document::Document):
        (WebCore::Document::setXMLVersion):
        (WebCore::Document::setXMLStandalone):
        * dom/Document.h:
        (WebCore::Document::xmlEncoding):
        (WebCore::Document::xmlVersion):
        (WebCore::Document::xmlStandalone):
        (WebCore::Document::setXMLEncoding):
        * dom/Document.idl:
        * dom/XMLTokenizer.cpp:
        (WebCore::XMLTokenizer::startDocument):
        (WebCore::startDocumentHandler):
        (WebCore::XMLTokenizer::initializeParserContext):
        Added support for these properties, getting them from an libxml2 context.

        * html/HTMLDocument.cpp:
        (WebCore::HTMLDocument::HTMLDocument):
        HTMLDocument is the only kind of document that doesn't have xmlVersion default to "1.0".

        * bindings/scripts/CodeGeneratorJS.pm:
        * bindings/scripts/CodeGeneratorObjC.pm:
        Added WK_ucfirst to properly uppercase xmlVersion and xmlStandalone.

LayoutTests:
        * dom/xhtml/level3/core/documentgetxmlencoding01-expected.txt:
        * dom/xhtml/level3/core/documentgetxmlencoding03-expected.txt
        * dom/xhtml/level3/core/documentgetxmlstandalone04-expected.txt:
        * dom/xhtml/level3/core/documentgetxmlversion01-expected.txt:
        * dom/xhtml/level3/core/documentgetxmlversion02-expected.txt:
        * dom/xhtml/level3/core/documentgetxmlversion03-expected.txt:
        These now pass.

        * dom/xhtml/level3/core/documentgetxmlencoding03.xhtml: Re-added a correct test.

        * fast/dom/Window/window-properties-expected.txt: Added these new properties.

        * http/tests/xmlhttprequest/xml-encoding-expected.txt: Added.
        * http/tests/xmlhttprequest/xml-encoding.html: Added.
        * http/tests/xmlhttprequest/resources/xml-encoding.xml: Added.
        * http/tests/xmlhttprequest/resources/post-echo-as-utf-8.cgi: Added.
        Test how xmlEncoding interacts with XMLHttpRequest.

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

21 files changed:
LayoutTests/ChangeLog
LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding01-expected.txt
LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding03-expected.txt
LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding03.xhtml [new file with mode: 0644]
LayoutTests/dom/xhtml/level3/core/documentgetxmlstandalone04-expected.txt
LayoutTests/dom/xhtml/level3/core/documentgetxmlversion01-expected.txt
LayoutTests/dom/xhtml/level3/core/documentgetxmlversion02-expected.txt
LayoutTests/dom/xhtml/level3/core/documentgetxmlversion03-expected.txt
LayoutTests/fast/dom/Window/window-properties-expected.txt
LayoutTests/http/tests/xmlhttprequest/resources/post-echo-as-utf-8.cgi [new file with mode: 0755]
LayoutTests/http/tests/xmlhttprequest/resources/xml-encoding.xml [new file with mode: 0644]
LayoutTests/http/tests/xmlhttprequest/xml-encoding-expected.txt [new file with mode: 0644]
LayoutTests/http/tests/xmlhttprequest/xml-encoding.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/bindings/scripts/CodeGeneratorJS.pm
WebCore/bindings/scripts/CodeGeneratorObjC.pm
WebCore/dom/Document.cpp
WebCore/dom/Document.h
WebCore/dom/Document.idl
WebCore/dom/XMLTokenizer.cpp
WebCore/html/HTMLDocument.cpp

index 326aa05..cb5ff24 100644 (file)
@@ -1,3 +1,28 @@
+2006-11-20  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Sam Weinig.
+
+        http://bugs.webkit.org/show_bug.cgi?id=11633
+        Implement XMLDocument properties xmlEncoding, xmlVersion, xmlStandalone
+
+        * dom/xhtml/level3/core/documentgetxmlencoding01-expected.txt:
+        * dom/xhtml/level3/core/documentgetxmlencoding03-expected.txt
+        * dom/xhtml/level3/core/documentgetxmlstandalone04-expected.txt:
+        * dom/xhtml/level3/core/documentgetxmlversion01-expected.txt:
+        * dom/xhtml/level3/core/documentgetxmlversion02-expected.txt:
+        * dom/xhtml/level3/core/documentgetxmlversion03-expected.txt:
+        These now pass.
+
+        * dom/xhtml/level3/core/documentgetxmlencoding03.xhtml: Re-added a correct test.
+
+        * fast/dom/Window/window-properties-expected.txt: Added these new properties.
+
+        * http/tests/xmlhttprequest/xml-encoding-expected.txt: Added.
+        * http/tests/xmlhttprequest/xml-encoding.html: Added.
+        * http/tests/xmlhttprequest/resources/xml-encoding.xml: Added.
+        * http/tests/xmlhttprequest/resources/post-echo-as-utf-8.cgi: Added.
+        Test how xmlEncoding interacts with XMLHttpRequest.
+
 2006-11-19  Alexey Proskuryakov  <ap@webkit.org>
 
         Removed parts of an incorrectly committed test, to be re-added later.
index f043e06..26c3dab 100644 (file)
@@ -1,4 +1,3 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetxmlencoding01
-Status failure
-Message        documentgetxmlencoding01: assertEquals failed, actual null, expected uTf-8.
+Status Success
 
index fc730ec..36ab725 100644 (file)
@@ -1,8 +1,3 @@
-layer at (0,0) size 800x600
-  RenderView at (0,0) size 800x600
-layer at (0,0) size 800x50
-  RenderBlock {html} at (0,0) size 800x50
-    RenderBody {body} at (8,16) size 784x18
-      RenderBlock {p} at (0,0) size 784x18
-        RenderText {#text} at (0,0) size 20x18
-          text run at (0,0) width 20: "bar"
+Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetxmlencoding03
+Status Success
+
diff --git a/LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding03.xhtml b/LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding03.xhtml
new file mode 100644 (file)
index 0000000..3156eb4
Binary files /dev/null and b/LayoutTests/dom/xhtml/level3/core/documentgetxmlencoding03.xhtml differ
index 191494e..7dc08aa 100644 (file)
@@ -1,4 +1,3 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetxmlstandalone04
-Status failure
-Message        documentgetxmlstandalone04: assertTrue failed
+Status Success
 
index 2a81632..e19e19b 100644 (file)
@@ -1,3 +1,2 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetxmlversion01
-Status failure
-Message        documentgetxmlversion01: assertEquals failed, actual null, expected 1.0.
+Status Success
index 0041a28..9dddd6a 100644 (file)
@@ -1,4 +1,3 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetxmlversion02
-Status error
-Message        TypeError: Undefined value
+Status Success
 
index 4f461b9..d21fa74 100644 (file)
@@ -1,4 +1,3 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level3/core/documentgetxmlversion03
-Status error
-Message        TypeError: Undefined value
+Status Success
 
index 781948d..1f4ce3a 100644 (file)
@@ -1563,6 +1563,9 @@ window.document.vlinkColor [string]
 window.document.width [number]
 window.document.write [function]
 window.document.writeln [function]
+window.document.xmlEncoding [null]
+window.document.xmlStandalone [boolean]
+window.document.xmlVersion [null]
 window.event [undefined]
 window.eventSender [object RuntimeObject]
 window.flushLog [function]
diff --git a/LayoutTests/http/tests/xmlhttprequest/resources/post-echo-as-utf-8.cgi b/LayoutTests/http/tests/xmlhttprequest/resources/post-echo-as-utf-8.cgi
new file mode 100755 (executable)
index 0000000..0aac324
--- /dev/null
@@ -0,0 +1,13 @@
+#!/usr/bin/perl -w
+#use CGI ();
+
+print "Content-type: text/plain;charset=utf-8\n\n";
+
+if ($ENV{'REQUEST_METHOD'} eq "POST") {
+    read(STDIN, $request, $ENV{'CONTENT_LENGTH'})
+                || die "Could not get query\n";
+#    print CGI::escape($request);
+     print $request;
+} else {
+    print "Wrong method: " . $ENV{'REQUEST_METHOD'} . "\n";
+} 
diff --git a/LayoutTests/http/tests/xmlhttprequest/resources/xml-encoding.xml b/LayoutTests/http/tests/xmlhttprequest/resources/xml-encoding.xml
new file mode 100644 (file)
index 0000000..f2f007f
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
+<doc>Ïðîâåðêà</doc>
diff --git a/LayoutTests/http/tests/xmlhttprequest/xml-encoding-expected.txt b/LayoutTests/http/tests/xmlhttprequest/xml-encoding-expected.txt
new file mode 100644 (file)
index 0000000..d7a7462
--- /dev/null
@@ -0,0 +1,9 @@
+Test XMLHttpRequest and document.xmlEncoding interaction.
+
+The request body should contain the word "Проверка".
+
+responseXML.xmlEncoding: windows-1251
+responseXML.xmlVersion: 1.0
+responseXML.xmlStandalone: true
+Request body: <doc>Проверка</doc>
+
diff --git a/LayoutTests/http/tests/xmlhttprequest/xml-encoding.html b/LayoutTests/http/tests/xmlhttprequest/xml-encoding.html
new file mode 100644 (file)
index 0000000..05ce741
--- /dev/null
@@ -0,0 +1,38 @@
+<html>
+<head>
+<title>Test XMLHttpRequest and document.xmlEncoding interaction.</title>
+<meta http-equiv="content-type" content="text/html;charset=utf-8">
+<body>
+<p>Test XMLHttpRequest and document.xmlEncoding interaction.</p>
+<p>The request body should contain the word "Проверка".</p>
+<script>
+
+    if (window.layoutTestController)
+        layoutTestController.dumpAsText();
+
+    var console_messages = document.createElement("ul");
+    document.body.appendChild(console_messages);
+    
+    function log(message)
+    {
+        var item = document.createElement("li");
+        item.appendChild(document.createTextNode(message));
+        console_messages.appendChild(item);
+    }
+    
+    req = new XMLHttpRequest();
+    req.open('GET', 'resources/xml-encoding.xml', false);
+    req.send(null);
+
+    var responseXML = req.responseXML;
+    log("responseXML.xmlEncoding: " + responseXML.xmlEncoding);
+    log("responseXML.xmlVersion: " + responseXML.xmlVersion);
+    log("responseXML.xmlStandalone: " + responseXML.xmlStandalone);
+
+    req.open('POST', 'resources/post-echo-as-utf-8.cgi', false);
+    req.send(responseXML);
+    log("Request body: " + req.responseText);
+
+</script>
+</body>
+</html>
index 6cdb546..5ab1e57 100644 (file)
@@ -1,3 +1,34 @@
+2006-11-20  Alexey Proskuryakov  <ap@webkit.org>
+
+        Reviewed by Sam Weinig.
+
+        http://bugs.webkit.org/show_bug.cgi?id=11633
+        Implement XMLDocument properties xmlEncoding, xmlVersion, xmlStandalone
+
+        * dom/Document.cpp:
+        (WebCore::Document::Document):
+        (WebCore::Document::setXMLVersion):
+        (WebCore::Document::setXMLStandalone):
+        * dom/Document.h:
+        (WebCore::Document::xmlEncoding):
+        (WebCore::Document::xmlVersion):
+        (WebCore::Document::xmlStandalone):
+        (WebCore::Document::setXMLEncoding):
+        * dom/Document.idl:
+        * dom/XMLTokenizer.cpp:
+        (WebCore::XMLTokenizer::startDocument):
+        (WebCore::startDocumentHandler):
+        (WebCore::XMLTokenizer::initializeParserContext):
+        Added support for these properties, getting them from an libxml2 context.
+
+        * html/HTMLDocument.cpp:
+        (WebCore::HTMLDocument::HTMLDocument):
+        HTMLDocument is the only kind of document that doesn't have xmlVersion default to "1.0".
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        * bindings/scripts/CodeGeneratorObjC.pm:
+        Added WK_ucfirst to properly uppercase xmlVersion and xmlStandalone.
+
 2006-11-20  Nikolas Zimmermann  <zimmermann@kde.org>
 
         Reviewed by Rob.
index 25fb0ba..ae3adeb 100644 (file)
@@ -4,6 +4,7 @@
 # Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org>
 # Copyright (C) 2006 Anders Carlsson <andersca@mac.com>
 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+# Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org>
 # Copyright (C) 2006 Apple Computer, Inc.
 #
 # This file is part of the KDE project
@@ -85,6 +86,16 @@ sub leftShift($$) {
     return (($value << $distance) & 0xFFFFFFFF);
 }
 
+# Uppercase the first letter, while respecting WebKit style guidelines. 
+# E.g., xmlEncoding becomes XMLEncoding, but xmlllang becomes Xmllang.
+sub WK_ucfirst
+{
+    my $param = shift;
+    my $ret = ucfirst($param);
+    $ret =~ s/Xml/XML/ if $ret =~ /^Xml[^a-z]/;
+    return $ret;
+}
+
 # Params: 'domClass' struct
 sub GenerateInterface
 {
@@ -334,7 +345,7 @@ sub GenerateHeader
 
             my $value = $attribute->signature->type =~ /Constructor$/
                       ? $attribute->signature->name . "ConstructorAttrNum"
-                      : ucfirst($attribute->signature->name) . "AttrNum";
+                      : WK_ucfirst($attribute->signature->name) . "AttrNum";
             $value .= ", " if (($i < $numAttributes - 1));
             $value .= ", " if (($i eq $numAttributes - 1) and ($numFunctions ne 0));
             push(@headerContent, $value);
@@ -353,7 +364,7 @@ sub GenerateHeader
 
             $numCustomFunctions++ if $function->signature->extendedAttributes->{"Custom"};
 
-            my $value = ucfirst($function->signature->name) . "FuncNum";
+            my $value = WK_ucfirst($function->signature->name) . "FuncNum";
             $value .= ", " if ($i < $numFunctions - 1);
             push(@headerContent, $value);
         }
@@ -368,7 +379,7 @@ sub GenerateHeader
             if ($attribute->signature->extendedAttributes->{"Custom"}) {
                 push(@headerContent, "    KJS::JSValue* " . $attribute->signature->name . "(KJS::ExecState*) const;\n");
                 if ($attribute->type !~ /^readonly/) {
-                    push(@headerContent, "    void set" . ucfirst($attribute->signature->name) . "(KJS::ExecState*, KJS::JSValue*);\n");
+                    push(@headerContent, "    void set" . WK_ucfirst($attribute->signature->name) . "(KJS::ExecState*, KJS::JSValue*);\n");
                 }
             }
         }
@@ -507,7 +518,7 @@ sub GenerateImplementation
 
             my $value = $className . "::" . ($attribute->signature->type =~ /Constructor$/
                                        ? $attribute->signature->name . "ConstructorAttrNum"
-                                       : ucfirst($attribute->signature->name) . "AttrNum");
+                                       : WK_ucfirst($attribute->signature->name) . "AttrNum");
             push(@hashValues, $value);
 
             my $special = "DontDelete";
@@ -587,7 +598,7 @@ sub GenerateImplementation
         my $name = $function->signature->name;
         push(@hashKeys, $name);
 
-        my $value = $className . "::" . ucfirst($name) . "FuncNum";
+        my $value = $className . "::" . WK_ucfirst($name) . "FuncNum";
         push(@hashValues, $value);
 
         my $special = "DontDelete|Function";
@@ -746,7 +757,7 @@ sub GenerateImplementation
             my $name = $attribute->signature->name;
 
             if ($attribute->signature->extendedAttributes->{"Custom"}) {
-                push(@implContent, "    case " . ucfirst($name) . "AttrNum:\n");
+                push(@implContent, "    case " . WK_ucfirst($name) . "AttrNum:\n");
                 push(@implContent, "        return $name(exec);\n");
             } elsif ($attribute->signature->type =~ /Constructor$/) {
                 my $constructorType = $codeGenerator->StripModule($attribute->signature->type);
@@ -755,10 +766,10 @@ sub GenerateImplementation
                 push(@implContent, "    case " . $name . "ConstructorAttrNum:\n");
                 push(@implContent, "        return JS" . $constructorType . "::getConstructor(exec);\n");
             } elsif (!@{$attribute->getterExceptions}) {
-                push(@implContent, "    case " . ucfirst($name) . "AttrNum:\n");
+                push(@implContent, "    case " . WK_ucfirst($name) . "AttrNum:\n");
                 push(@implContent, "        return " . NativeToJSValue($attribute->signature, "imp->$name()") . ";\n");
             } else {
-                push(@implContent, "    case " . ucfirst($name) . "AttrNum: {\n");
+                push(@implContent, "    case " . WK_ucfirst($name) . "AttrNum: {\n");
                 push(@implContent, "        ExceptionCode ec = 0;\n");
                 push(@implContent, "        KJS::JSValue* result = " . NativeToJSValue($attribute->signature, "imp->$name(ec)") . ";\n");
                 push(@implContent, "        setDOMException(exec, ec);\n");
@@ -795,8 +806,8 @@ sub GenerateImplementation
                     my $name = $attribute->signature->name;
 
                     if ($attribute->signature->extendedAttributes->{"Custom"}) {
-                        push(@implContent, "    case " . ucfirst($name) . "AttrNum: {\n");
-                        push(@implContent, "        set" . ucfirst($name) . "(exec, value);\n");
+                        push(@implContent, "    case " . WK_ucfirst($name) . "AttrNum: {\n");
+                        push(@implContent, "        set" . WK_ucfirst($name) . "(exec, value);\n");
                     } elsif ($attribute->signature->type =~ /Constructor$/) {
                         my $constructorType = $attribute->signature->type;
                         $constructorType =~ s/Constructor$//;
@@ -809,9 +820,9 @@ sub GenerateImplementation
                         push(@implContent, "        if (isSafeScript(exec))\n");
                         push(@implContent, "            JSObject::put(exec, \"$name\", value);\n");
                     } else {
-                        push(@implContent, "    case " . ucfirst($name) ."AttrNum: {\n");
+                        push(@implContent, "    case " . WK_ucfirst($name) ."AttrNum: {\n");
                         push(@implContent, "        ExceptionCode ec = 0;\n") if @{$attribute->setterExceptions};
-                        push(@implContent, "        imp->set" . ucfirst($name) . "(" . JSValueToNative($attribute->signature, "value"));
+                        push(@implContent, "        imp->set" . WK_ucfirst($name) . "(" . JSValueToNative($attribute->signature, "value"));
                         push(@implContent, ", ec") if @{$attribute->setterExceptions};
                         push(@implContent, ");\n");
                         push(@implContent, "        setDOMException(exec, ec);\n") if @{$attribute->setterExceptions};
@@ -846,7 +857,7 @@ sub GenerateImplementation
 
         push(@implContent, "    switch (id) {\n");
         foreach my $function (@{$dataNode->functions}) {
-            push(@implContent, "    case ${className}::" . ucfirst($function->signature->name) . "FuncNum: {\n");
+            push(@implContent, "    case ${className}::" . WK_ucfirst($function->signature->name) . "FuncNum: {\n");
 
             if ($function->signature->extendedAttributes->{"Custom"}) {
                 push(@implContent, "        return static_cast<${className}*>(thisObj)->" . $function->signature->name . "(exec, args);\n    }\n");
index 5a61ca4..5b34dac 100644 (file)
@@ -2,6 +2,7 @@
 # Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org>
 # Copyright (C) 2006 Anders Carlsson <andersca@mac.com> 
 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
+# Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org>
 # Copyright (C) 2006 Apple Computer, Inc.
 #
 # This library is free software; you can redistribute it and/or
@@ -152,6 +153,16 @@ sub finish
     my $object = shift;
 }
 
+# Uppercase the first letter, while respecting WebKit style guidelines. 
+# E.g., xmlEncoding becomes XMLEncoding, but xmlllang becomes Xmllang.
+sub WK_ucfirst
+{
+    my $param = shift;
+    my $ret = ucfirst($param);
+    $ret =~ s/Xml/XML/ if $ret =~ /^Xml[^a-z]/;
+    return $ret;
+}
+
 sub ReadPublicInterfaces
 {
     my $class = shift;
@@ -672,7 +683,7 @@ sub GenerateHeader
 
                 # - SETTER
                 if (!$attributeIsReadonly) {
-                    my $setter = "- (void)set" . ucfirst($attributeName) . ":(" . $attributeType . ")new" . ucfirst($attributeName) . ";\n";
+                    my $setter = "- (void)set" . WK_ucfirst($attributeName) . ":(" . $attributeType . ")new" . WK_ucfirst($attributeName) . ";\n";
                     push(@headerAttributes, $setter) if $public;
                     push(@privateHeaderAttributes, $setter) unless $public;
                 }
@@ -998,9 +1009,9 @@ sub GenerateImplementation
                 # Exception handling
                 my $hasSetterException = @{$attribute->setterExceptions};
 
-                $attributeName = "set" . ucfirst($attributeName);
-                my $setterName = "set" . ucfirst($attributeInterfaceName);
-                my $argName = "new" . ucfirst($attributeInterfaceName);
+                $attributeName = "set" . WK_ucfirst($attributeName);
+                my $setterName = "set" . WK_ucfirst($attributeInterfaceName);
+                my $argName = "new" . WK_ucfirst($attributeInterfaceName);
                 my $arg = GetObjCTypeGetter($argName, $idlType);
 
                 if ($attribute->signature->extendedAttributes->{"ConvertFromString"}) {
@@ -1052,7 +1063,7 @@ sub GenerateImplementation
                 my $paramType = GetObjCType($param->type);
 
                 # make a new parameter name if the original conflicts with a property name
-                $paramName = "in" . ucfirst($paramName) if $attributeNames{$paramName};
+                $paramName = "in" . WK_ucfirst($paramName) if $attributeNames{$paramName};
 
                 AddIncludesForType($param->type);
 
index 9ab4b13..cef6f88 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
+ *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
  *
  * This library is free software; you can redistribute it and/or
@@ -219,12 +220,14 @@ Document::Document(DOMImplementation* impl, FrameView *v)
     , m_title("")
     , m_titleSetExplicitly(false)
     , m_imageLoadEventTimer(this, &Document::imageLoadEventTimerFired)
-#ifdef XBL_SUPPORT
-    , m_bindingManager(new XBLBindingManager(this))
-#endif
 #ifdef XSLT_SUPPORT
     , m_transformSource(0)
 #endif
+    , m_xmlVersion("1.0")
+    , m_xmlStandalone(false)
+#ifdef XBL_SUPPORT
+    , m_bindingManager(new XBLBindingManager(this))
+#endif
     , m_savedRenderer(0)
     , m_passwordFields(0)
     , m_secureForms(0)
@@ -676,6 +679,27 @@ void Document::setCharset(const String& charset)
     decoder()->setEncoding(charset, TextResourceDecoder::UserChosenEncoding);
 }
 
+void Document::setXMLVersion(const String& version, ExceptionCode& ec)
+{
+    // FIXME: also raise NOT_SUPPORTED_ERR if the version is set to a value that is not supported by this Document.
+    if (!implementation()->hasFeature("XML", String())) {
+        ec = NOT_SUPPORTED_ERR;
+        return;
+    }
+   
+    m_xmlVersion = version;
+}
+
+void Document::setXMLStandalone(bool standalone, ExceptionCode& ec)
+{
+    if (!implementation()->hasFeature("XML", String())) {
+        ec = NOT_SUPPORTED_ERR;
+        return;
+    }
+
+    m_xmlStandalone = standalone;
+}
+
 Element* Document::elementFromPoint(int x, int y) const
 {
     if (!renderer())
index ef04b4b..51537a0 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
  *           (C) 2001 Dirk Mueller (mueller@kde.org)
+ *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
  * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
  *
  * This library is free software; you can redistribute it and/or
@@ -179,6 +180,14 @@ public:
 
     void setCharset(const String&);
 
+    String xmlEncoding() const { return m_xmlEncoding; }
+    String xmlVersion() const { return m_xmlVersion; }
+    bool xmlStandalone() const { return m_xmlStandalone; }
+
+    void setXMLEncoding(const String& encoding) { m_xmlEncoding = encoding; } // read-only property, only to be set from XMLTokenizer
+    void setXMLVersion(const String&, ExceptionCode&);
+    void setXMLStandalone(bool, ExceptionCode&);
+
     PassRefPtr<Node> adoptNode(PassRefPtr<Node> source, ExceptionCode&);
     
     PassRefPtr<NameNodeList> getElementsByName(const String& elementName);
@@ -715,6 +724,10 @@ protected:
 
     int m_docID; // A unique document identifier used for things like document-specific mapped attributes.
 
+    String m_xmlEncoding;
+    String m_xmlVersion;
+    bool m_xmlStandalone;
+
 public:
     bool inPageCache();
     void setInPageCache(bool flag);
index d4a6f38..feba2b0 100644 (file)
@@ -63,6 +63,12 @@ module core {
 
         readonly attribute [ConvertNullStringTo=Null] DOMString inputEncoding;
 
+        readonly attribute [ConvertNullStringTo=Null] DOMString xmlEncoding;
+                 attribute [ConvertNullStringTo=Null] DOMString xmlVersion
+                    setter raises (DOMException);
+                 attribute boolean xmlStandalone
+                    setter raises (DOMException);
+
         Node               adoptNode(in Node source)
             raises (DOMException);
 
index 38a380a..f276aef 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2000 Peter Kelly (pmk@post.com)
  * Copyright (C) 2005, 2006 Apple Computer, Inc.
- * Copyright (C) 2006 Alexey Proskuryakov
+ * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -75,14 +75,14 @@ class PendingCallbacks;
 
 class XMLTokenizer : public Tokenizer, public CachedResourceClient {
 public:
-    XMLTokenizer(Document *, FrameView * = 0);
-    XMLTokenizer(DocumentFragment *, Element *);
+    XMLTokenizer(Document*, FrameView* = 0);
+    XMLTokenizer(DocumentFragment*, Element*);
     ~XMLTokenizer();
 
     enum ErrorType { warning, nonFatal, fatal };
 
     // from Tokenizer
-    virtual bool write(const SegmentedString &str, bool);
+    virtual bool write(const SegmentedStringstr, bool);
     virtual void finish();
     virtual bool isWaitingForScripts() const;
     virtual void stopParsing();
@@ -96,17 +96,18 @@ public:
     bool isXHTMLDocument() const { return m_isXHTMLDocument; }
 
     // from CachedResourceClient
-    virtual void notifyFinished(CachedResource *finishedObj);
+    virtual void notifyFinished(CachedResourcefinishedObj);
 
     // callbacks from parser SAX
-    void error(ErrorType, const char *message, va_list args);
-    void startElementNs(const xmlChar *xmlLocalName, const xmlChar *xmlPrefix, const xmlChar *xmlURI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **libxmlAttributes);
+    void error(ErrorType, const charmessage, va_list args);
+    void startElementNs(const xmlChar* xmlLocalName, const xmlChar* xmlPrefix, const xmlChar* xmlURI, int nb_namespaces, const xmlChar** namespaces, int nb_attributes, int nb_defaulted, const xmlChar** libxmlAttributes);
     void endElementNs();
-    void characters(const xmlChar *s, int len);
-    void processingInstruction(const xmlChar *target, const xmlChar *data);
-    void cdataBlock(const xmlChar *s, int len);
-    void comment(const xmlChar *s);
-    void internalSubset(const xmlChar *name, const xmlChar *externalID, const xmlChar *systemID);
+    void characters(const xmlChar* s, int len);
+    void processingInstruction(const xmlChar* target, const xmlChar* data);
+    void cdataBlock(const xmlChar* s, int len);
+    void comment(const xmlChar* s);
+    void startDocument(const xmlChar* version, const xmlChar* encoding, int standalone);
+    void internalSubset(const xmlChar* name, const xmlChar* externalID, const xmlChar* systemID);
 
     void handleError(ErrorType type, const char* m, int lineNumber, int columnNumber);
     
@@ -122,13 +123,13 @@ private:
     bool enterText();
     void exitText();
 
-    Document *m_doc;
-    FrameView *m_view;
+    Documentm_doc;
+    FrameViewm_view;
     
     String m_originalSourceForTransform;
 
     xmlParserCtxtPtr m_context;
-    Node *m_currentNode;
+    Nodem_currentNode;
     bool m_currentNodeIsReferenced;
 
     bool m_sawError;
@@ -145,7 +146,7 @@ private:
     int m_lastErrorColumn;
     String m_errorMessages;
 
-    CachedScript *m_pendingScript;
+    CachedScriptm_pendingScript;
     RefPtr<Element> m_scriptElement;
     int m_scriptStartLine;
     
@@ -164,7 +165,7 @@ public:
         m_callbacks.setAutoDelete(true);
     }
     
-    void appendStartElementNSCallback(const xmlChar *xmlLocalName, const xmlChar *xmlPrefix, const xmlChar *xmlURI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes)
+    void appendStartElementNSCallback(const xmlChar* xmlLocalName, const xmlChar* xmlPrefix, const xmlChar* xmlURI, int nb_namespaces, const xmlChar** namespaces, int nb_attributes, int nb_defaulted, const xmlChar** attributes)
     {
         PendingStartElementNSCallback* callback = new PendingStartElementNSCallback;
         
@@ -172,12 +173,12 @@ public:
         callback->xmlPrefix = xmlStrdup(xmlPrefix);
         callback->xmlURI = xmlStrdup(xmlURI);
         callback->nb_namespaces = nb_namespaces;
-        callback->namespaces = reinterpret_cast<xmlChar**>(xmlMalloc(sizeof (xmlChar*) * nb_namespaces * 2));
+        callback->namespaces = reinterpret_cast<xmlChar**>(xmlMalloc(sizeof(xmlChar*) * nb_namespaces * 2));
         for (int i = 0; i < nb_namespaces * 2 ; i++)
             callback->namespaces[i] = xmlStrdup(namespaces[i]);
         callback->nb_attributes = nb_attributes;
         callback->nb_defaulted = nb_defaulted;
-        callback->attributes =  reinterpret_cast<xmlChar**>(xmlMalloc(sizeof (xmlChar*) * nb_attributes * 5));
+        callback->attributes =  reinterpret_cast<xmlChar**>(xmlMalloc(sizeof(xmlChar*) * nb_attributes * 5));
         for (int i = 0; i < nb_attributes; i++) {
             // Each attribute has 5 elements in the array:
             // name, prefix, uri, value and an end pointer.
@@ -201,7 +202,7 @@ public:
         m_callbacks.append(callback);
     }
     
-    void appendCharactersCallback(const xmlChar *s, int len)
+    void appendCharactersCallback(const xmlChars, int len)
     {
         PendingCharactersCallback* callback = new PendingCharactersCallback;
         
@@ -211,7 +212,7 @@ public:
         m_callbacks.append(callback);        
     }
     
-    void appendProcessingInstructionCallback(const xmlChar *target, const xmlChar *data)
+    void appendProcessingInstructionCallback(const xmlChar* target, const xmlChar* data)
     {
         PendingProcessingInstructionCallback* callback = new PendingProcessingInstructionCallback;
         
@@ -221,7 +222,7 @@ public:
         m_callbacks.append(callback);
     }
     
-    void appendCDATABlockCallback(const xmlChar *s, int len)
+    void appendCDATABlockCallback(const xmlChars, int len)
     {
         PendingCDATABlockCallback* callback = new PendingCDATABlockCallback;
         
@@ -231,7 +232,7 @@ public:
         m_callbacks.append(callback);        
     }
 
-    void appendCommentCallback(const xmlChar *s)
+    void appendCommentCallback(const xmlChars)
     {
         PendingCommentCallback* callback = new PendingCommentCallback;
         
@@ -240,7 +241,7 @@ public:
         m_callbacks.append(callback);        
     }
 
-    void appendInternalSubsetCallback(const xmlChar *name, const xmlChar *externalID, const xmlChar *systemID)
+    void appendInternalSubsetCallback(const xmlChar* name, const xmlChar* externalID, const xmlChar* systemID)
     {
         PendingInternalSubsetCallback* callback = new PendingInternalSubsetCallback;
         
@@ -265,7 +266,7 @@ public:
 
     void callAndRemoveFirstCallback(XMLTokenizer* tokenizer)
     {
-        PendingCallback *cb = m_callbacks.getFirst();
+        PendingCallbackcb = m_callbacks.getFirst();
             
         cb->call(tokenizer);
         m_callbacks.removeFirst();
@@ -426,13 +427,13 @@ static int matchFunc(const char* uri)
     return 1; // Match everything.
 }
 
-static DocLoader *globalDocLoader = 0;
+static DocLoaderglobalDocLoader = 0;
 
 class OffsetBuffer {
 public:
     OffsetBuffer(const Vector<char>& b) : m_buffer(b), m_currentOffset(0) { }
     
-    int readOutBytes(char *outputBuffer, unsigned askedToRead) {
+    int readOutBytes(charoutputBuffer, unsigned askedToRead) {
         unsigned bytesLeft = m_buffer.size() - m_currentOffset;
         unsigned lenToCopy = min(askedToRead, bytesLeft);
         if (lenToCopy) {
@@ -473,7 +474,7 @@ static int readFunc(void* context, char* buffer, int len)
     if (context == &globalDescriptor)
         return 0;
         
-    OffsetBuffer *data = static_cast<OffsetBuffer *>(context);
+    OffsetBuffer* data = static_cast<OffsetBuffer*>(context);
     return data->readOutBytes(buffer, len);
 }
 
@@ -483,10 +484,10 @@ static int writeFunc(void* context, const char* buffer, int len)
     return 0;
 }
 
-static int closeFunc(void * context)
+static int closeFunc(void* context)
 {
     if (context != &globalDescriptor) {
-        OffsetBuffer *data = static_cast<OffsetBuffer *>(context);
+        OffsetBuffer* data = static_cast<OffsetBuffer*>(context);
         delete data;
     }
     return 0;
@@ -497,7 +498,7 @@ static void errorFunc(void*, const char*, ...)
     // FIXME: It would be nice to display error messages somewhere.
 }
 
-void setLoaderForLibXMLCallbacks(DocLoader *docLoader)
+void setLoaderForLibXMLCallbacks(DocLoaderdocLoader)
 {
     globalDocLoader = docLoader;
 }
@@ -523,7 +524,7 @@ static xmlParserCtxtPtr createStringParser(xmlSAXHandlerPtr handlers, void* user
 
 // --------------------------------
 
-XMLTokenizer::XMLTokenizer(Document *_doc, FrameView *_view)
+XMLTokenizer::XMLTokenizer(Document* _doc, FrameView* _view)
     : m_doc(_doc)
     , m_view(_view)
     , m_context(0)
@@ -546,7 +547,7 @@ XMLTokenizer::XMLTokenizer(Document *_doc, FrameView *_view)
 {
 }
 
-XMLTokenizer::XMLTokenizer(DocumentFragment *fragment, Element *parentElement)
+XMLTokenizer::XMLTokenizer(DocumentFragment* fragment, Element* parentElement)
     : m_doc(fragment->document())
     , m_view(0)
     , m_context(0)
@@ -577,19 +578,19 @@ XMLTokenizer::XMLTokenizer(DocumentFragment *fragment, Element *parentElement)
     while (parentElement) {
         elemStack.append(parentElement);
         
-        Node *n = parentElement->parentNode();
+        Noden = parentElement->parentNode();
         if (!n || !n->isElementNode())
             break;
-        parentElement = static_cast<Element *>(n);
+        parentElement = static_cast<Element*>(n);
     }
     
     if (elemStack.isEmpty())
         return;
     
-    for (Element *element = elemStack.last(); !elemStack.isEmpty(); elemStack.removeLast()) {
-        if (NamedAttrMap *attrs = element->attributes()) {
+    for (Elementelement = elemStack.last(); !elemStack.isEmpty(); elemStack.removeLast()) {
+        if (NamedAttrMapattrs = element->attributes()) {
             for (unsigned i = 0; i < attrs->length(); i++) {
-                Attribute *attr = attrs->attributeItem(i);
+                Attributeattr = attrs->attributeItem(i);
                 if (attr->localName() == "xmlns")
                     m_defaultNamespaceURI = attr->value();
                 else if (attr->prefix() == "xmlns")
@@ -666,14 +667,14 @@ inline String toString(const xmlChar* str)
 }
 
 struct _xmlSAX2Namespace {
-    const xmlChar *prefix;
-    const xmlChar *uri;
+    const xmlCharprefix;
+    const xmlCharuri;
 };
 typedef struct _xmlSAX2Namespace xmlSAX2Namespace;
 
-static inline void handleElementNamespaces(Element *newElement, const xmlChar **libxmlNamespaces, int nb_namespaces, ExceptionCode& ec)
+static inline void handleElementNamespaces(Element* newElement, const xmlChar** libxmlNamespaces, int nb_namespaces, ExceptionCode& ec)
 {
-    xmlSAX2Namespace *namespaces = reinterpret_cast<xmlSAX2Namespace *>(libxmlNamespaces);
+    xmlSAX2Namespace* namespaces = reinterpret_cast<xmlSAX2Namespace*>(libxmlNamespaces);
     for(int i = 0; i < nb_namespaces; i++) {
         String namespaceQName = "xmlns";
         String namespaceURI = toString(namespaces[i].uri);
@@ -686,17 +687,17 @@ static inline void handleElementNamespaces(Element *newElement, const xmlChar **
 }
 
 struct _xmlSAX2Attributes {
-    const xmlChar *localname;
-    const xmlChar *prefix;
-    const xmlChar *uri;
-    const xmlChar *value;
-    const xmlChar *end;
+    const xmlCharlocalname;
+    const xmlCharprefix;
+    const xmlCharuri;
+    const xmlCharvalue;
+    const xmlCharend;
 };
 typedef struct _xmlSAX2Attributes xmlSAX2Attributes;
 
-static inline void handleElementAttributes(Element *newElement, const xmlChar **libxmlAttributes, int nb_attributes, ExceptionCode& ec)
+static inline void handleElementAttributes(Element* newElement, const xmlChar** libxmlAttributes, int nb_attributes, ExceptionCode& ec)
 {
-    xmlSAX2Attributes *attributes = reinterpret_cast<xmlSAX2Attributes *>(libxmlAttributes);
+    xmlSAX2Attributes* attributes = reinterpret_cast<xmlSAX2Attributes*>(libxmlAttributes);
     for(int i = 0; i < nb_attributes; i++) {
         String attrLocalName = toString(attributes[i].localname);
         int valueLength = (int) (attributes[i].end - attributes[i].value);
@@ -711,7 +712,7 @@ static inline void handleElementAttributes(Element *newElement, const xmlChar **
     }
 }
 
-void XMLTokenizer::startElementNs(const xmlChar *xmlLocalName, const xmlChar *xmlPrefix, const xmlChar *xmlURI, int nb_namespaces, const xmlChar **libxmlNamespaces, int nb_attributes, int nb_defaulted, const xmlChar **libxmlAttributes)
+void XMLTokenizer::startElementNs(const xmlChar* xmlLocalName, const xmlChar* xmlPrefix, const xmlChar* xmlURI, int nb_namespaces, const xmlChar** libxmlNamespaces, int nb_attributes, int nb_defaulted, const xmlChar** libxmlAttributes)
 {
     if (m_parserStopped)
         return;
@@ -768,7 +769,7 @@ void XMLTokenizer::startElementNs(const xmlChar *xmlLocalName, const xmlChar *xm
     }
 
     if (newElement->hasTagName(scriptTag))
-        static_cast<HTMLScriptElement *>(newElement.get())->setCreatedByParser(true);
+        static_cast<HTMLScriptElement*>(newElement.get())->setCreatedByParser(true);
     
     if (newElement->hasTagName(HTMLNames::scriptTag)
 #ifdef SVG_SUPPORT
@@ -799,7 +800,7 @@ void XMLTokenizer::endElementNs()
     
     exitText();
 
-    Node *n = m_currentNode;
+    Noden = m_currentNode;
     while (n->implicitNode())
         n = n->parentNode();
     RefPtr<Node> parent = n->parentNode();
@@ -842,7 +843,7 @@ void XMLTokenizer::endElementNs()
 
         } else {
             String scriptCode = "";
-            for (Node *child = scriptElement->firstChild(); child; child = child->nextSibling()) {
+            for (Nodechild = scriptElement->firstChild(); child; child = child->nextSibling()) {
                 if (child->isTextNode() || child->nodeType() == Node::CDATA_SECTION_NODE)
                     scriptCode += static_cast<CharacterData*>(child)->data();
             }
@@ -855,7 +856,7 @@ void XMLTokenizer::endElementNs()
     setCurrentNode(parent.get());
 }
 
-void XMLTokenizer::characters(const xmlChar *s, int len)
+void XMLTokenizer::characters(const xmlChars, int len)
 {
     if (m_parserStopped)
         return;
@@ -921,7 +922,7 @@ void XMLTokenizer::handleError(ErrorType type, const char* m, int lineNumber, in
         stopParsing();    
 }
 
-void XMLTokenizer::error(ErrorType type, const char *message, va_list args)
+void XMLTokenizer::error(ErrorType type, const charmessage, va_list args)
 {
     if (m_parserStopped)
         return;
@@ -930,7 +931,7 @@ void XMLTokenizer::error(ErrorType type, const char *message, va_list args)
     char m[1024];
     vsnprintf(m, sizeof(m) - 1, message, args);
 #else
-    char *m;
+    charm;
     vasprintf(&m, message, args);
 #endif
     
@@ -944,7 +945,7 @@ void XMLTokenizer::error(ErrorType type, const char *message, va_list args)
 #endif
 }
 
-void XMLTokenizer::processingInstruction(const xmlChar *target, const xmlChar *data)
+void XMLTokenizer::processingInstruction(const xmlChar* target, const xmlChar* data)
 {
     if (m_parserStopped)
         return;
@@ -982,7 +983,7 @@ void XMLTokenizer::processingInstruction(const xmlChar *target, const xmlChar *d
     }
 }
 
-void XMLTokenizer::cdataBlock(const xmlChar *s, int len)
+void XMLTokenizer::cdataBlock(const xmlChars, int len)
 {
     if (m_parserStopped)
         return;
@@ -1001,7 +1002,7 @@ void XMLTokenizer::cdataBlock(const xmlChar *s, int len)
         newNode->attach();
 }
 
-void XMLTokenizer::comment(const xmlChar *s)
+void XMLTokenizer::comment(const xmlChars)
 {
     if (m_parserStopped)
         return;
@@ -1019,7 +1020,18 @@ void XMLTokenizer::comment(const xmlChar *s)
         newNode->attach();
 }
 
-void XMLTokenizer::internalSubset(const xmlChar *name, const xmlChar *externalID, const xmlChar *systemID)
+void XMLTokenizer::startDocument(const xmlChar* version, const xmlChar* encoding, int standalone)
+{
+    ExceptionCode ec = 0;
+    
+    if (version)
+        m_doc->setXMLVersion(toString(version), ec);
+    m_doc->setXMLStandalone(standalone == 1, ec); // possible values are 0, 1, and -1
+    if (encoding)
+        m_doc->setXMLEncoding(toString(encoding));
+}
+
+void XMLTokenizer::internalSubset(const xmlChar* name, const xmlChar* externalID, const xmlChar* systemID)
 {
     if (m_parserStopped)
         return;
@@ -1029,27 +1041,27 @@ void XMLTokenizer::internalSubset(const xmlChar *name, const xmlChar *externalID
         return;
     }
     
-    Document *doc = m_doc;
+    Documentdoc = m_doc;
     if (!doc)
         return;
 
     doc->setDocType(new DocumentType(doc, toString(name), toString(externalID), toString(systemID)));
 }
 
-inline XMLTokenizer *getTokenizer(void *closure)
+inline XMLTokenizer* getTokenizer(void* closure)
 {
     xmlParserCtxtPtr ctxt = static_cast<xmlParserCtxtPtr>(closure);
-    return static_cast<XMLTokenizer *>(ctxt->_private);
+    return static_cast<XMLTokenizer*>(ctxt->_private);
 }
 
 // This is a hack around http://bugzilla.gnome.org/show_bug.cgi?id=159219
 // Otherwise libxml seems to call all the SAX callbacks twice for any replaced entity.
-static inline bool hackAroundLibXMLEntityBug(void *closure)
+static inline bool hackAroundLibXMLEntityBug(voidclosure)
 {
     return static_cast<xmlParserCtxtPtr>(closure)->node;
 }
 
-static void startElementNsHandler(void *closure, const xmlChar *localname, const xmlChar *prefix, const xmlChar *uri, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **libxmlAttributes)
+static void startElementNsHandler(void* closure, const xmlChar* localname, const xmlChar* prefix, const xmlChar* uri, int nb_namespaces, const xmlChar** namespaces, int nb_attributes, int nb_defaulted, const xmlChar** libxmlAttributes)
 {
     if (hackAroundLibXMLEntityBug(closure))
         return;
@@ -1057,7 +1069,7 @@ static void startElementNsHandler(void *closure, const xmlChar *localname, const
     getTokenizer(closure)->startElementNs(localname, prefix, uri, nb_namespaces, namespaces, nb_attributes, nb_defaulted, libxmlAttributes);
 }
 
-static void endElementNsHandler(void *closure, const xmlChar *localname, const xmlChar *prefix, const xmlChar *uri)
+static void endElementNsHandler(void* closure, const xmlChar* localname, const xmlChar* prefix, const xmlChar* uri)
 {
     if (hackAroundLibXMLEntityBug(closure))
         return;
@@ -1065,7 +1077,7 @@ static void endElementNsHandler(void *closure, const xmlChar *localname, const x
     getTokenizer(closure)->endElementNs();
 }
 
-static void charactersHandler(void *closure, const xmlChar *s, int len)
+static void charactersHandler(void* closure, const xmlChar* s, int len)
 {
     if (hackAroundLibXMLEntityBug(closure))
         return;
@@ -1073,7 +1085,7 @@ static void charactersHandler(void *closure, const xmlChar *s, int len)
     getTokenizer(closure)->characters(s, len);
 }
 
-static void processingInstructionHandler(void *closure, const xmlChar *target, const xmlChar *data)
+static void processingInstructionHandler(void* closure, const xmlChar* target, const xmlChar* data)
 {
     if (hackAroundLibXMLEntityBug(closure))
         return;
@@ -1081,7 +1093,7 @@ static void processingInstructionHandler(void *closure, const xmlChar *target, c
     getTokenizer(closure)->processingInstruction(target, data);
 }
 
-static void cdataBlockHandler(void *closure, const xmlChar *s, int len)
+static void cdataBlockHandler(void* closure, const xmlChar* s, int len)
 {
     if (hackAroundLibXMLEntityBug(closure))
         return;
@@ -1089,7 +1101,7 @@ static void cdataBlockHandler(void *closure, const xmlChar *s, int len)
     getTokenizer(closure)->cdataBlock(s, len);
 }
 
-static void commentHandler(void *closure, const xmlChar *comment)
+static void commentHandler(void* closure, const xmlChar* comment)
 {
     if (hackAroundLibXMLEntityBug(closure))
         return;
@@ -1097,7 +1109,7 @@ static void commentHandler(void *closure, const xmlChar *comment)
     getTokenizer(closure)->comment(comment);
 }
 
-static void warningHandler(void *closure, const char *message, ...)
+static void warningHandler(void* closure, const char* message, ...)
 {
     va_list args;
     va_start(args, message);
@@ -1105,7 +1117,7 @@ static void warningHandler(void *closure, const char *message, ...)
     va_end(args);
 }
 
-static void fatalErrorHandler(void *closure, const char *message, ...)
+static void fatalErrorHandler(void* closure, const char* message, ...)
 {
     va_list args;
     va_start(args, message);
@@ -1113,7 +1125,7 @@ static void fatalErrorHandler(void *closure, const char *message, ...)
     va_end(args);
 }
 
-static void normalErrorHandler(void *closure, const char *message, ...)
+static void normalErrorHandler(void* closure, const char* message, ...)
 {
     va_list args;
     va_start(args, message);
@@ -1146,7 +1158,7 @@ static xmlEntityPtr getXHTMLEntity(const xmlChar* name)
     return &sharedXHTMLEntity;
 }
 
-static xmlEntityPtr getEntityHandler(void *closure, const xmlChar *name)
+static xmlEntityPtr getEntityHandler(void* closure, const xmlChar* name)
 {
     xmlParserCtxtPtr ctxt = static_cast<xmlParserCtxtPtr>(closure);
     xmlEntityPtr ent = xmlGetPredefinedEntity(name);
@@ -1160,13 +1172,20 @@ static xmlEntityPtr getEntityHandler(void *closure, const xmlChar *name)
     return ent;
 }
 
-static void internalSubsetHandler(void *closure, const xmlChar *name, const xmlChar *externalID, const xmlChar *systemID)
+static void startDocumentHandler(void* closure)
+{
+    xmlParserCtxt* ctxt = static_cast<xmlParserCtxt*>(closure);
+    getTokenizer(closure)->startDocument(ctxt->version, ctxt->encoding, ctxt->standalone);
+    xmlSAX2StartDocument(closure);
+}
+
+static void internalSubsetHandler(void* closure, const xmlChar* name, const xmlChar* externalID, const xmlChar* systemID)
 {
     getTokenizer(closure)->internalSubset(name, externalID, systemID);
     xmlSAX2InternalSubset(closure, name, externalID, systemID);
 }
 
-static void externalSubsetHandler(void *closure, const xmlChar *name, const xmlChar *externalId, const xmlChar *systemId)
+static void externalSubsetHandler(void* closure, const xmlChar* name, const xmlChar* externalId, const xmlChar* systemId)
 {
     String extId = toString(externalId);
     if ((extId == "-//W3C//DTD XHTML 1.0 Transitional//EN")
@@ -1180,7 +1199,7 @@ static void externalSubsetHandler(void *closure, const xmlChar *name, const xmlC
         getTokenizer(closure)->setIsXHTMLDocument(true); // controls if we replace entities or not.
 }
 
-static void ignorableWhitespaceHandler(void *ctx, const xmlChar *ch, int len)
+static void ignorableWhitespaceHandler(void* ctx, const xmlChar* ch, int len)
 {
     // nothing to do, but we need this to work around a crasher
     // http://bugzilla.gnome.org/show_bug.cgi?id=172255
@@ -1201,7 +1220,7 @@ void XMLTokenizer::initializeParserContext()
     sax.startElementNs = startElementNsHandler;
     sax.endElementNs = endElementNsHandler;
     sax.getEntity = getEntityHandler;
-    sax.startDocument = xmlSAX2StartDocument;
+    sax.startDocument = startDocumentHandler;
     sax.internalSubset = internalSubsetHandler;
     sax.externalSubset = externalSubsetHandler;
     sax.ignorableWhitespace = ignorableWhitespaceHandler;
@@ -1287,7 +1306,7 @@ void XMLTokenizer::insertErrorMessageBlock()
 
     // Create elements for display
     ExceptionCode ec = 0;
-    Document *doc = m_doc;
+    Documentdoc = m_doc;
     Node* documentElement = doc->documentElement();
     if (!documentElement) {
         RefPtr<Node> rootElement = doc->createElementNS(xhtmlNamespaceURI, "html", ec);
@@ -1323,7 +1342,7 @@ void XMLTokenizer::insertErrorMessageBlock()
     doc->updateRendering();
 }
 
-void XMLTokenizer::notifyFinished(CachedResource *finishedObj)
+void XMLTokenizer::notifyFinished(CachedResourcefinishedObj)
 {
     ASSERT(m_pendingScript == finishedObj);
     ASSERT(m_pendingScript->accessCount() > 0);
@@ -1356,7 +1375,7 @@ bool XMLTokenizer::isWaitingForScripts() const
 }
 
 #ifdef XSLT_SUPPORT
-void* xmlDocPtrForString(DocLoader* docLoader, const String& source, const DeprecatedString &url)
+void* xmlDocPtrForString(DocLoader* docLoader, const String& source, const DeprecatedStringurl)
 {
     if (source.isEmpty())
         return 0;
@@ -1386,7 +1405,7 @@ void* xmlDocPtrForString(DocLoader* docLoader, const String& source, const Depre
 }
 #endif
 
-Tokenizer *newXMLTokenizer(Document *d, FrameView *v)
+Tokenizer* newXMLTokenizer(Document* d, FrameView* v)
 {
     return new XMLTokenizer(d, v);
 }
@@ -1441,45 +1460,45 @@ void XMLTokenizer::resumeParsing()
         end();
 }
 
-static void balancedStartElementNsHandler(void *closure, const xmlChar *localname, const xmlChar *prefix, const xmlChar *uri, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **libxmlAttributes)
+static void balancedStartElementNsHandler(void* closure, const xmlChar* localname, const xmlChar* prefix, const xmlChar* uri, int nb_namespaces, const xmlChar** namespaces, int nb_attributes, int nb_defaulted, const xmlChar** libxmlAttributes)
 {
-   static_cast<XMLTokenizer *>(closure)->startElementNs(localname, prefix, uri, nb_namespaces, namespaces, nb_attributes, nb_defaulted, libxmlAttributes);
+   static_cast<XMLTokenizer*>(closure)->startElementNs(localname, prefix, uri, nb_namespaces, namespaces, nb_attributes, nb_defaulted, libxmlAttributes);
 }
 
-static void balancedEndElementNsHandler(void *closure, const xmlChar *localname, const xmlChar *prefix, const xmlChar *uri)
+static void balancedEndElementNsHandler(void* closure, const xmlChar* localname, const xmlChar* prefix, const xmlChar* uri)
 {
-    static_cast<XMLTokenizer *>(closure)->endElementNs();
+    static_cast<XMLTokenizer*>(closure)->endElementNs();
 }
 
-static void balancedCharactersHandler(void *closure, const xmlChar *s, int len)
+static void balancedCharactersHandler(void* closure, const xmlChar* s, int len)
 {
-    static_cast<XMLTokenizer *>(closure)->characters(s, len);
+    static_cast<XMLTokenizer*>(closure)->characters(s, len);
 }
 
-static void balancedProcessingInstructionHandler(void *closure, const xmlChar *target, const xmlChar *data)
+static void balancedProcessingInstructionHandler(void* closure, const xmlChar* target, const xmlChar* data)
 {
-    static_cast<XMLTokenizer *>(closure)->processingInstruction(target, data);
+    static_cast<XMLTokenizer*>(closure)->processingInstruction(target, data);
 }
 
-static void balancedCdataBlockHandler(void *closure, const xmlChar *s, int len)
+static void balancedCdataBlockHandler(void* closure, const xmlChar* s, int len)
 {
-    static_cast<XMLTokenizer *>(closure)->cdataBlock(s, len);
+    static_cast<XMLTokenizer*>(closure)->cdataBlock(s, len);
 }
 
-static void balancedCommentHandler(void *closure, const xmlChar *comment)
+static void balancedCommentHandler(void* closure, const xmlChar* comment)
 {
-    static_cast<XMLTokenizer *>(closure)->comment(comment);
+    static_cast<XMLTokenizer*>(closure)->comment(comment);
 }
 
-static void balancedWarningHandler(void *closure, const char *message, ...)
+static void balancedWarningHandler(void* closure, const char* message, ...)
 {
     va_list args;
     va_start(args, message);
-    static_cast<XMLTokenizer *>(closure)->error(XMLTokenizer::warning, message, args);
+    static_cast<XMLTokenizer*>(closure)->error(XMLTokenizer::warning, message, args);
     va_end(args);
 }
 
-bool parseXMLDocumentFragment(const String &string, DocumentFragment *fragment, Element *parent)
+bool parseXMLDocumentFragment(const String& string, DocumentFragment* fragment, Element* parent)
 {
     XMLTokenizer tokenizer(fragment, parent);
     
@@ -1508,17 +1527,17 @@ struct AttributeParseState {
 };
 
 
-static void attributesStartElementNsHandler(void *closure, const xmlChar *xmlLocalName, const xmlChar *xmlPrefix, const xmlChar *xmlURI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **libxmlAttributes)
+static void attributesStartElementNsHandler(void* closure, const xmlChar* xmlLocalName, const xmlChar* xmlPrefix, const xmlChar* xmlURI, int nb_namespaces, const xmlChar** namespaces, int nb_attributes, int nb_defaulted, const xmlChar** libxmlAttributes)
 {
-    if (strcmp(reinterpret_cast<const char *>(xmlLocalName), "attrs") != 0)
+    if (strcmp(reinterpret_cast<const char*>(xmlLocalName), "attrs") != 0)
         return;
     
     xmlParserCtxtPtr ctxt = static_cast<xmlParserCtxtPtr>(closure);
-    AttributeParseState *state = static_cast<AttributeParseState *>(ctxt->_private);
+    AttributeParseState* state = static_cast<AttributeParseState*>(ctxt->_private);
     
     state->gotAttributes = true;
     
-    xmlSAX2Attributes *attributes = reinterpret_cast<xmlSAX2Attributes *>(libxmlAttributes);
+    xmlSAX2Attributes* attributes = reinterpret_cast<xmlSAX2Attributes*>(libxmlAttributes);
     for(int i = 0; i < nb_attributes; i++) {
         String attrLocalName = toString(attributes[i].localname);
         int valueLength = (int) (attributes[i].end - attributes[i].value);
index 8d1109e..eebd429 100644 (file)
@@ -78,6 +78,7 @@ using namespace HTMLNames;
 HTMLDocument::HTMLDocument(DOMImplementation *_implementation, FrameView *v)
   : Document(_implementation, v)
 {
+    m_xmlVersion = String();
     bodyElement = 0;
     htmlElement = 0;
 }