LayoutTests:
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Oct 2005 06:10:11 +0000 (06:10 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 26 Oct 2005 06:10:11 +0000 (06:10 +0000)
        * dom/xhtml/level1/core/hc_documentgetdoctype-expected.txt: Expect success.

WebCore:

        Reviewed by Eric.

        - fixed http://bugzilla.opendarwin.org/show_bug.cgi?id=5315
          need to set document type based on contents of <!DOCTYPE>
          (fixes one layout test)

        * khtml/html/html_documentimpl.cpp: (DOM::HTMLDocumentImpl::determineParseMode):
        Use the new setDocType function instead of modifying m_doctype directly.

        * khtml/xml/dom_docimpl.h: Changed to use SharedPtr more.
        (DOM::DocumentImpl::realDocType): Add get() since we're using SharedPtr.
        (DOM::DocumentImpl::setDocType): Added.
        * khtml/xml/dom_docimpl.cpp:
        (DOMImplementationImpl::createDocument): Use setDocType instead of using
        realDocType()->copyFrom to set up the document type in the new document.
        (DocumentImpl::DocumentImpl): Don't create an empty document type during constructor.
        (DocumentImpl::~DocumentImpl): Remove explicit deref since we're using SharedPtr.
        (DocumentImpl::doctype): Add get() since we're using SharedPtr.
        (DocumentTypeImpl::DocumentTypeImpl): Streamlined implementation since we're using SharedPtr.

        * khtml/xml/xml_tokenizer.cpp:
        (khtml::XMLTokenizer::internalSubset): Added. Calls setDocType.
        (khtml::internalSubsetHandler): Added. Calls xmlSAX2InternalSubset after calling our function.
        (khtml::XMLTokenizer::finish): Changed to pass our internalSubsetHandler function pointer.

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

LayoutTests/ChangeLog
LayoutTests/dom/xhtml/level1/core/hc_documentgetdoctype-expected.txt
WebCore/ChangeLog-2005-12-19
WebCore/khtml/html/html_documentimpl.cpp
WebCore/khtml/xml/dom_docimpl.cpp
WebCore/khtml/xml/dom_docimpl.h
WebCore/khtml/xml/xml_tokenizer.cpp

index 49ef5ca463e83a20ee8a53de7d669ac54204fe2e..269a2efa150f02baf295aac3782bbc1775153e11 100644 (file)
@@ -1,3 +1,7 @@
+2005-10-25  Darin Adler  <darin@apple.com>
+
+        * dom/xhtml/level1/core/hc_documentgetdoctype-expected.txt: Expect success.
+
 2005-10-25  Maciej Stachowiak  <mjs@apple.com>
 
         Update isSameNode results back, now that the fix is landed.
index aa47f013241b9fa015b746a81832aad87a755b3c..6ec641da5aa84f592ed25b602c27803fc5449bc4 100644 (file)
@@ -1,3 +1,2 @@
 Test   http://www.w3.org/2001/DOM-Test-Suite/level1/core/hc_documentgetdoctype
-Status failure
-Message        nodeName: assertEquals failed, actual null, expected html.
+Status Success
index 322d5893beedca2ad5bcfbaa991d6a08e39f48ae..22ffb99da91dd80859a4c8d3d848cde187631ddc 100644 (file)
@@ -1,3 +1,30 @@
+2005-10-25  Darin Adler  <darin@apple.com>
+
+        Reviewed by Eric.
+
+        - fixed http://bugzilla.opendarwin.org/show_bug.cgi?id=5315
+          need to set document type based on contents of <!DOCTYPE>
+          (fixes one layout test)
+
+        * khtml/html/html_documentimpl.cpp: (DOM::HTMLDocumentImpl::determineParseMode):
+        Use the new setDocType function instead of modifying m_doctype directly.
+
+        * khtml/xml/dom_docimpl.h: Changed to use SharedPtr more.
+        (DOM::DocumentImpl::realDocType): Add get() since we're using SharedPtr.
+        (DOM::DocumentImpl::setDocType): Added.
+        * khtml/xml/dom_docimpl.cpp:
+        (DOMImplementationImpl::createDocument): Use setDocType instead of using
+        realDocType()->copyFrom to set up the document type in the new document.
+        (DocumentImpl::DocumentImpl): Don't create an empty document type during constructor.
+        (DocumentImpl::~DocumentImpl): Remove explicit deref since we're using SharedPtr.
+        (DocumentImpl::doctype): Add get() since we're using SharedPtr.
+        (DocumentTypeImpl::DocumentTypeImpl): Streamlined implementation since we're using SharedPtr.
+
+        * khtml/xml/xml_tokenizer.cpp:
+        (khtml::XMLTokenizer::internalSubset): Added. Calls setDocType.
+        (khtml::internalSubsetHandler): Added. Calls xmlSAX2InternalSubset after calling our function.
+        (khtml::XMLTokenizer::finish): Changed to pass our internalSubsetHandler function pointer.
+
 2005-10-25  David Hyatt  <hyatt@apple.com>
 
        This patch makes a number of refinements to buttons to make
index 6dac68376469c2a6f4b509fad17ef0ff02dcd725..99faf6a6307523187942c67209601dc93f79196f 100644 (file)
@@ -495,11 +495,8 @@ void HTMLDocumentImpl::determineParseMode( const QString &str )
     QString systemID, publicID;
     int resultFlags = 0;
     if (parseDocTypeDeclaration(str, &resultFlags, publicID, systemID)) {
-        if (resultFlags & PARSEMODE_HAVE_DOCTYPE) {
-            m_doctype->setName("HTML");
-            m_doctype->setPublicId(publicID);
-            m_doctype->setSystemId(systemID);
-        }
+        if (resultFlags & PARSEMODE_HAVE_DOCTYPE)
+            setDocType(new DocumentTypeImpl(docPtr(), "HTML", publicID, systemID));
         if (!(resultFlags & PARSEMODE_HAVE_DOCTYPE)) {
             // No doctype found at all.  Default to quirks mode and Html4.
             pMode = Compat;
index edffc3989ee06aa80a2fa70c69473ed1ebaa202b..e2db1a5e6fd97f6bc3623457f29b7cad6dc8b2ea 100644 (file)
@@ -305,7 +305,7 @@ DocumentImpl *DOMImplementationImpl::createDocument( const DOMString &namespaceU
 
     // now get the interesting parts of the doctype
     if (doctype)
-        doc->realDocType()->copyFrom(*doctype);
+        doc->setDocType(new DocumentTypeImpl(doc->docPtr(), *doctype));
 
     return doc;
 }
@@ -415,14 +415,6 @@ DocumentImpl::DocumentImpl(DOMImplementationImpl *_implementation, KHTMLView *v)
     m_elemSheet = 0;
     m_tokenizer = 0;
 
-    // ### this should be created during parsing a <!DOCTYPE>
-    // not during construction. Not sure who added that and why (Dirk)
-    m_doctype = new DocumentTypeImpl(_implementation, document,
-                                     DOMString() /* qualifiedName */,
-                                     DOMString() /* publicId */,
-                                     DOMString() /* systemId */);
-    m_doctype->ref();
-
     m_implementation = _implementation;
     if (m_implementation)
         m_implementation->ref();
@@ -492,8 +484,6 @@ DocumentImpl::~DocumentImpl()
     delete m_styleSelector;
     delete m_docLoader;
     if (m_elemSheet )  m_elemSheet->deref();
-    if (m_doctype)
-        m_doctype->deref();
     if (m_implementation)
         m_implementation->deref();
     delete m_paintDeviceMetrics;
@@ -571,7 +561,7 @@ void DocumentImpl::resetActiveLinkColor()
 
 DocumentTypeImpl *DocumentImpl::doctype() const
 {
-    return m_doctype;
+    return m_docType.get();
 }
 
 DOMImplementationImpl *DocumentImpl::impl() const
@@ -3310,49 +3300,29 @@ NodeImpl *DocumentFragmentImpl::cloneNode ( bool deep )
 
 // ----------------------------------------------------------------------------
 
-DocumentTypeImpl::DocumentTypeImpl(DOMImplementationImpl *implementation, DocumentPtr *doc,
-                                   const DOMString &qualifiedName, const DOMString &publicId,
-                                   const DOMString &systemId)
-    : NodeImpl(doc), m_implementation(implementation),
-      m_qualifiedName(qualifiedName), m_publicId(publicId), m_systemId(systemId)
+DocumentTypeImpl::DocumentTypeImpl(DOMImplementationImpl *i, DocumentPtr *doc, const DOMString &n, const DOMString &p, const DOMString &s)
+    : NodeImpl(doc), m_implementation(i), m_name(n), m_publicId(p), m_systemId(s)
 {
-    if (m_implementation)
-        m_implementation->ref();
-
-    m_entities = 0;
-    m_notations = 0;
-
-    // if doc is 0, it is not attached to a document and / or
-    // therefore does not provide entities or notations. (DOM Level 3)
 }
 
-DocumentTypeImpl::~DocumentTypeImpl()
+DocumentTypeImpl::DocumentTypeImpl(DocumentPtr *doc, const DOMString &n, const DOMString &p, const DOMString &s)
+    : NodeImpl(doc), m_name(n), m_publicId(p), m_systemId(s)
 {
-    if (m_implementation)
-        m_implementation->deref();
-    if (m_entities)
-        m_entities->deref();
-    if (m_notations)
-        m_notations->deref();
 }
 
-void DocumentTypeImpl::copyFrom(const DocumentTypeImpl& other)
+DocumentTypeImpl::DocumentTypeImpl(DocumentPtr *doc, const DocumentTypeImpl &t)
+    : NodeImpl(doc), m_implementation(t.m_implementation)
+    , m_name(t.m_name), m_publicId(t.m_publicId), m_systemId(t.m_systemId), m_subset(t.m_subset)
 {
-    m_qualifiedName = other.m_qualifiedName;
-    m_publicId = other.m_publicId;
-    m_systemId = other.m_systemId;
-    m_subset = other.m_subset;
 }
 
 DOMString DocumentTypeImpl::toString() const
 {
-    DOMString result;
-    if (m_qualifiedName.isEmpty()) {
+    if (m_name.isEmpty())
         return "";
-    } else {
-        result = "<!DOCTYPE ";
-        result += m_qualifiedName;
-    }
+
+    DOMString result = "<!DOCTYPE ";
+    result += m_name;
     if (!m_publicId.isEmpty()) {
        result += " PUBLIC \"";
        result += m_publicId;
@@ -3383,16 +3353,9 @@ unsigned short DocumentTypeImpl::nodeType() const
     return Node::DOCUMENT_TYPE_NODE;
 }
 
-// DOM Section 1.1.1
-bool DocumentTypeImpl::childTypeAllowed( unsigned short /*type*/ )
+NodeImpl *DocumentTypeImpl::cloneNode(bool /*deep*/)
 {
-    return false;
-}
-
-NodeImpl *DocumentTypeImpl::cloneNode ( bool /*deep*/ )
-{
-    // Spec says cloning Document nodes is "implementation dependent"
-    // so we do not support it...
+    // The DOM Level 2 specification says cloning DocumentType nodes is "implementation dependent" so for now we do not support it.
     return 0;
 }
 
index 2e5b824de95f0e1e8c269ddaaa98008b59a993d2..35e80673cd438cf4f4468fa87f3c6b6c4c330b1d 100644 (file)
@@ -175,7 +175,7 @@ public:
     // DOM methods & attributes for Document
 
     virtual DocumentTypeImpl *doctype() const; // returns 0 for HTML documents
-    DocumentTypeImpl *realDocType() const { return m_doctype; }
+    DocumentTypeImpl *realDocType() const { return m_docType.get(); }
 
     DOMImplementationImpl *impl() const;
     virtual ElementImpl *documentElement() const;
@@ -584,6 +584,8 @@ public:
     void incDOMTreeVersion() { ++m_domtree_version; }
     unsigned int domTreeVersion() const { return m_domtree_version; }
 
+    void setDocType(DocumentTypeImpl *docType) { m_docType = docType; }
+
 signals:
     void finishedParsing();
 
@@ -598,7 +600,7 @@ protected:
     QString m_baseURL;
     QString m_baseTarget;
 
-    DocumentTypeImpl *m_doctype;
+    SharedPtr<DocumentTypeImpl> m_docType;
     DOMImplementationImpl *m_implementation;
 
     StyleSheetImpl *m_sheet;
@@ -794,51 +796,42 @@ public:
     virtual DOMString toString() const;
 };
 
-
 class DocumentTypeImpl : public NodeImpl
 {
 public:
-    DocumentTypeImpl(DOMImplementationImpl *_implementation, DocumentPtr *doc,
-                     const DOMString &qualifiedName, const DOMString &publicId,
-                     const DOMString &systemId);
-    ~DocumentTypeImpl();
+    DocumentTypeImpl(DOMImplementationImpl *, DocumentPtr *, const DOMString &name, const DOMString &publicId, const DOMString &systemId);
+    DocumentTypeImpl(DocumentPtr *, const DOMString &name, const DOMString &publicId, const DOMString &systemId);
+    DocumentTypeImpl(DocumentPtr *, const DocumentTypeImpl &);
 
     // DOM methods & attributes for DocumentType
-    NamedNodeMapImpl *entities() const { return m_entities; }
-    NamedNodeMapImpl *notations() const { return m_notations; }
+    NamedNodeMapImpl *entities() const { return m_entities.get(); }
+    NamedNodeMapImpl *notations() const { return m_notations.get(); }
 
-    DOMString name() const { return m_qualifiedName; }
+    DOMString name() const { return m_name; }
     DOMString publicId() const { return m_publicId; }
     DOMString systemId() const { return m_systemId; }
     DOMString internalSubset() const { return m_subset; }
 
-    // DOM methods overridden from  parent classes
+    // DOM methods overridden from parent classes
     virtual DOMString nodeName() const;
     virtual unsigned short nodeType() const;
-    virtual bool childTypeAllowed( unsigned short type );
-    virtual NodeImpl *cloneNode ( bool deep );
+    virtual NodeImpl *cloneNode(bool deep);
 
     // Other methods (not part of DOM)
-    void setName(const DOMString& n) { m_qualifiedName = n; }
-    void setPublicId(const DOMString& publicId) { m_publicId = publicId; }
-    void setSystemId(const DOMString& systemId) { m_systemId = systemId; }
-    DOMImplementationImpl *impl() const { return m_implementation; }
-    void copyFrom(const DocumentTypeImpl&);
-
+    DOMImplementationImpl *impl() const { return m_implementation.get(); }
     virtual DOMString toString() const;
 
-protected:
-    DOMImplementationImpl *m_implementation;
-    NamedNodeMapImpl* m_entities;
-    NamedNodeMapImpl* m_notations;
+private:
+    SharedPtr<DOMImplementationImpl> m_implementation;
+    SharedPtr<NamedNodeMapImpl> m_entities;
+    SharedPtr<NamedNodeMapImpl> m_notations;
 
-    DOMString m_qualifiedName;
+    DOMString m_name;
     DOMString m_publicId;
     DOMString m_systemId;
     DOMString m_subset;
 };
 
-
 } //namespace
 
 #endif
index 39c83bdddfa6fe222847946e4630b5ae9d99ac83..dc9058bba98b7781fb7274dad077c3505014ce20 100644 (file)
 
 #include <qptrstack.h>
 
-using namespace DOM::HTMLNames;
-
-using DOM::AttributeImpl;
-using DOM::NamedAttrMapImpl;
-using DOM::DocumentFragmentImpl;
-using DOM::DocumentImpl;
-using DOM::DocumentPtr;
-using DOM::DOMString;
-using DOM::DOMStringImpl;
-using DOM::ElementImpl;
-using DOM::HTMLScriptElementImpl;
-using DOM::HTMLTableSectionElementImpl;
-using DOM::Node;
-using DOM::NodeImpl;
-using DOM::nullAtom;
-using DOM::ProcessingInstructionImpl;
-using DOM::QualifiedName;
-using DOM::TextImpl;
-using DOM::AtomicString;
+using namespace DOM;
+using namespace HTMLNames;
 
 namespace khtml {
 
@@ -113,6 +96,7 @@ public:
     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);
 
 private:
     void end();
@@ -134,7 +118,7 @@ private:
     QString m_xmlCode;
 
     xmlParserCtxtPtr m_context;
-    DOM::NodeImpl *m_currentNode;
+    NodeImpl *m_currentNode;
 
     bool m_sawError;
     bool m_sawXSLTransform;
@@ -386,7 +370,7 @@ void XMLTokenizer::startElementNs(const xmlChar *xmlLocalName, const xmlChar *xm
 
 void XMLTokenizer::endElementNs()
 {
-    if (m_parserStopped) 
+    if (m_parserStopped)
         return;
 
     if (m_currentNode->nodeType() == Node::TEXT_NODE)
@@ -401,7 +385,7 @@ void XMLTokenizer::endElementNs()
 
 void XMLTokenizer::characters(const xmlChar *s, int len)
 {
-    if (m_parserStopped) 
+    if (m_parserStopped)
         return;
     
     if (m_currentNode->nodeType() == Node::TEXT_NODE ||
@@ -539,7 +523,7 @@ void XMLTokenizer::cdataBlock(const xmlChar *s, int len)
 
 void XMLTokenizer::comment(const xmlChar *s)
 {
-    if (m_parserStopped) 
+    if (m_parserStopped)
         return;
     
     if (m_currentNode->nodeType() == Node::TEXT_NODE)
@@ -548,6 +532,19 @@ void XMLTokenizer::comment(const xmlChar *s)
     m_currentNode->addChild(m_doc->document()->createComment(toQString(s)));
 }
 
+void XMLTokenizer::internalSubset(const xmlChar *name, const xmlChar *externalID, const xmlChar *systemID)
+{
+    if (m_parserStopped)
+        return;
+
+    DocumentPtr *docPtr = m_doc;
+    DocumentImpl *doc = docPtr->document();
+    if (!doc)
+        return;
+
+    doc->setDocType(new DocumentTypeImpl(docPtr, toQString(name), toQString(externalID), toQString(systemID)));
+}
+
 inline XMLTokenizer *getTokenizer(void *closure)
 {
     xmlParserCtxtPtr ctxt = static_cast<xmlParserCtxtPtr>(closure);
@@ -615,15 +612,21 @@ static xmlEntityPtr getEntityHandler(void *closure, const xmlChar *name)
     if(ent)
         return ent;
 
-    // Workaround a libxml SAX2 bug whereby charactersHandler is called twice
+    // Work around a libxml SAX2 bug that causes charactersHandler to be called twice.
     bool inAttr = ctxt->instate == XML_PARSER_ATTRIBUTE_VALUE;
     ent = xmlGetDocEntity(ctxt->myDoc, name);
-    if(ent)
+    if (ent)
         ctxt->replaceEntities = inAttr || (ent->etype != XML_INTERNAL_GENERAL_ENTITY);
     
     return ent;
 }
 
+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);
+}
+
 void XMLTokenizer::finish()
 {
     xmlSAXHandler sax;
@@ -639,7 +642,7 @@ void XMLTokenizer::finish()
     sax.endElementNs = endElementNsHandler;
     sax.getEntity = getEntityHandler;
     sax.startDocument = xmlSAX2StartDocument;
-    sax.internalSubset = xmlSAX2InternalSubset;
+    sax.internalSubset = internalSubsetHandler;
     sax.entityDecl = xmlSAX2EntityDecl;
     sax.initialized = XML_SAX2_MAGIC;