WebCore:

2008-06-15  Darin Adler  <darin@apple.com>

        Reviewed and tweaked by Sam Weinig.

        Fix for <rdar://problem/5908591>
        https://bugs.webkit.org/show_bug.cgi?id=18743

        Makes DOMImplementation per-document.

        Test: http/tests/security/cross-frame-access-DOMImplementation.html

        * bindings/objc/DOMImplementationFront.cpp:
        (WebCore::DOMImplementationFront::getInterface):
        * bindings/objc/DOMImplementationFront.h:
        * dom/DOMImplementation.cpp:
        (WebCore::DOMImplementation::hasFeature):
        (WebCore::DOMImplementation::createDocumentType):
        (WebCore::DOMImplementation::getInterface):
        (WebCore::DOMImplementation::createDocument):
        (WebCore::DOMImplementation::createHTMLDocument):
        * dom/DOMImplementation.h:
        (WebCore::DOMImplementation::create):
        * dom/Document.cpp:
        (WebCore::Document::Document):
        (WebCore::Document::implementation):
        * dom/Document.h:
        (WebCore::Document::create):
        (WebCore::Document::createXHTML):
        * dom/DocumentType.cpp:
        * dom/DocumentType.h:
        (WebCore::DocumentType::create):
        (WebCore::DocumentType::entities):
        (WebCore::DocumentType::notations):
        (WebCore::DocumentType::name):
        (WebCore::DocumentType::publicId):
        (WebCore::DocumentType::systemId):
        (WebCore::DocumentType::internalSubset):
        * dom/Node.cpp:
        (WebCore::Node::isSupported):
        * dom/XMLTokenizer.cpp:
        (WebCore::XMLTokenizer::internalSubset):
        * html/HTMLDocument.cpp:
        (WebCore::HTMLDocument::HTMLDocument):
        * html/HTMLDocument.h:
        (WebCore::HTMLDocument::create):
        (WebCore::HTMLDocument::isHTMLDocument):
        * html/HTMLParser.cpp:
        (WebCore::HTMLParser::parseDoctypeToken):
        * html/HTMLViewSourceDocument.cpp:
        (WebCore::HTMLViewSourceDocument::HTMLViewSourceDocument):
        (WebCore::HTMLViewSourceDocument::createTokenizer):
        * html/HTMLViewSourceDocument.h:
        (WebCore::HTMLViewSourceDocument::create):
        * loader/CachedFont.cpp:
        (WebCore::CachedFont::ensureSVGFontData):
        * loader/FTPDirectoryDocument.cpp:
        (WebCore::FTPDirectoryDocument::FTPDirectoryDocument):
        * loader/FTPDirectoryDocument.h:
        (WebCore::FTPDirectoryDocument::create):
        * loader/FrameLoader.cpp:
        (WebCore::FrameLoader::begin):
        * loader/ImageDocument.cpp:
        (WebCore::ImageDocument::ImageDocument):
        * loader/ImageDocument.h:
        (WebCore::ImageDocument::create):
        (WebCore::ImageDocument::isImageDocument):
        * loader/PluginDocument.cpp:
        (WebCore::PluginDocument::PluginDocument):
        * loader/PluginDocument.h:
        (WebCore::PluginDocument::create):
        (WebCore::PluginDocument::isPluginDocument):
        * loader/TextDocument.cpp:
        (WebCore::TextTokenizer::checkBuffer):
        (WebCore::TextDocument::TextDocument):
        (WebCore::createTextTokenizer):
        * loader/TextDocument.h:
        (WebCore::TextDocument::create):
        * svg/SVGDocument.cpp:
        (WebCore::SVGDocument::SVGDocument):
        * svg/SVGDocument.h:
        (WebCore::SVGDocument::create):
        * svg/SVGElement.cpp:
        (WebCore::SVGElement::isSupported):
        * svg/SVGTests.cpp:
        (WebCore::SVGTests::isValid):
        * xml/DOMParser.cpp:
        (WebCore::DOMParser::parseFromString):

LayoutTests:

2008-06-15  Darin Adler  <darin@apple.com>

        Reviewed and tweaked by Sam Weinig.

        Test for <rdar://problem/5908591>
        https://bugs.webkit.org/show_bug.cgi?id=18743

        * http/tests/security/cross-frame-access-DOMImplementation-expected.txt: Added.
        * http/tests/security/cross-frame-access-DOMImplementation.html: Added.
        * http/tests/security/resources/cross-frame-iframe-for-DOMImplementation-test.html: Added.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@34574 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/html/HTMLDocument.cpp b/WebCore/html/HTMLDocument.cpp
index e96a3c7..0174397 100644
--- a/WebCore/html/HTMLDocument.cpp
+++ b/WebCore/html/HTMLDocument.cpp
@@ -80,8 +80,8 @@
 
 using namespace HTMLNames;
 
-HTMLDocument::HTMLDocument(DOMImplementation* implementation, Frame* frame)
-    : Document(implementation, frame)
+HTMLDocument::HTMLDocument(Frame* frame)
+    : Document(frame, false)
 {
     clearXMLVersion();
     setParseMode(Compat);
diff --git a/WebCore/html/HTMLDocument.h b/WebCore/html/HTMLDocument.h
index a68e595..de84c70 100644
--- a/WebCore/html/HTMLDocument.h
+++ b/WebCore/html/HTMLDocument.h
@@ -33,11 +33,12 @@
 
 class HTMLDocument : public Document, public CachedResourceClient {
 public:
-    HTMLDocument(DOMImplementation*, Frame*);
+    static PassRefPtr<HTMLDocument> create(Frame* frame)
+    {
+        return new HTMLDocument(frame);
+    }
     virtual ~HTMLDocument();
 
-    virtual bool isHTMLDocument() const { return true; }
-
     int width();
     int height();
 
@@ -68,8 +69,6 @@
     void captureEvents();
     void releaseEvents();
 
-    virtual Tokenizer* createTokenizer();
-
     virtual bool childAllowed(Node*);
 
     virtual PassRefPtr<Element> createElement(const AtomicString& tagName, ExceptionCode&);
@@ -84,10 +83,14 @@
 
     typedef HashMap<AtomicStringImpl*, int> NameCountMap;
 
-private:
-    virtual void determineParseMode();
+protected:
+    HTMLDocument(Frame*);
 
 private:
+    virtual bool isHTMLDocument() const { return true; }
+    virtual Tokenizer* createTokenizer();
+    virtual void determineParseMode();
+
     NameCountMap m_namedItemCounts;
     NameCountMap m_extraNamedItemCounts;
 };
diff --git a/WebCore/html/HTMLParser.cpp b/WebCore/html/HTMLParser.cpp
index ba60334..15a5ce1 100644
--- a/WebCore/html/HTMLParser.cpp
+++ b/WebCore/html/HTMLParser.cpp
@@ -282,7 +282,7 @@
         return;
         
     // Make a new doctype node and set it as our doctype.
-    document->addChild(new DocumentType(document, String::adopt(t->m_name), String::adopt(t->m_publicID), String::adopt(t->m_systemID)));
+    document->addChild(DocumentType::create(document, String::adopt(t->m_name), String::adopt(t->m_publicID), String::adopt(t->m_systemID)));
 }
 
 static bool isTableSection(Node* n)
diff --git a/WebCore/html/HTMLViewSourceDocument.cpp b/WebCore/html/HTMLViewSourceDocument.cpp
index 0e63e5a..2a68149 100644
--- a/WebCore/html/HTMLViewSourceDocument.cpp
+++ b/WebCore/html/HTMLViewSourceDocument.cpp
@@ -43,19 +43,16 @@
 
 using namespace HTMLNames;
 
-HTMLViewSourceDocument::HTMLViewSourceDocument(DOMImplementation* implementation, Frame* frame, const String& mimeType)
-    : HTMLDocument(implementation, frame)
+HTMLViewSourceDocument::HTMLViewSourceDocument(Frame* frame, const String& mimeType)
+    : HTMLDocument(frame)
     , m_type(mimeType)
-    , m_current(0)
-    , m_tbody(0)
-    , m_td(0)
 {
 }
 
 Tokenizer* HTMLViewSourceDocument::createTokenizer()
 {
     if (implementation()->isTextMIMEType(m_type))
-        return new TextTokenizer(this);
+        return createTextTokenizer(this);
     return new HTMLTokenizer(this);
 }
 
diff --git a/WebCore/html/HTMLViewSourceDocument.h b/WebCore/html/HTMLViewSourceDocument.h
index 6cf5746..3f11bc0 100644
--- a/WebCore/html/HTMLViewSourceDocument.h
+++ b/WebCore/html/HTMLViewSourceDocument.h
@@ -34,7 +34,10 @@
 
 class HTMLViewSourceDocument : public HTMLDocument {
 public:
-    HTMLViewSourceDocument(DOMImplementation*, Frame*, const String& mimeType);
+    static PassRefPtr<HTMLViewSourceDocument> create(Frame* frame, const String& mimeType)
+    {
+        return new HTMLViewSourceDocument(frame, mimeType);
+    }
     
     virtual Tokenizer* createTokenizer();
     
@@ -43,6 +46,8 @@
     void addViewSourceDoctypeToken(DoctypeToken*);
 
 private:
+    HTMLViewSourceDocument(Frame*, const String& mimeType);
+
     void createContainingTable();
     PassRefPtr<Element> addSpanWithClassName(const String&);
     void addLine(const String& className);