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);