Title: [93133] trunk/Source/WebCore
Revision
93133
Author
[email protected]
Date
2011-08-16 11:36:57 -0700 (Tue, 16 Aug 2011)

Log Message

New XML parser: Add document fragment parser
https://bugs.webkit.org/show_bug.cgi?id=66317

Reviewed by Adam Barth.

* dom/DocumentFragment.cpp:
(WebCore::DocumentFragment::parseXML):
* xml/parser/NewXMLDocumentParser.cpp:
(WebCore::NewXMLDocumentParser::NewXMLDocumentParser):
(WebCore::NewXMLDocumentParser::parseDocumentFragment):
* xml/parser/NewXMLDocumentParser.h:
(WebCore::NewXMLDocumentParser::create):
* xml/parser/XMLTokenizer.h:
* xml/parser/XMLTreeBuilder.cpp:
(WebCore::XMLTreeBuilder::XMLTreeBuilder):
(WebCore::XMLTreeBuilder::pushCurrentNode):
* xml/parser/XMLTreeBuilder.h:
(WebCore::XMLTreeBuilder::create):
(WebCore::XMLTreeBuilder::NodeStackItem::node):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (93132 => 93133)


--- trunk/Source/WebCore/ChangeLog	2011-08-16 18:36:18 UTC (rev 93132)
+++ trunk/Source/WebCore/ChangeLog	2011-08-16 18:36:57 UTC (rev 93133)
@@ -1,5 +1,27 @@
 2011-08-16  Jeffrey Pfau  <[email protected]>
 
+        New XML parser: Add document fragment parser
+        https://bugs.webkit.org/show_bug.cgi?id=66317
+
+        Reviewed by Adam Barth.
+
+        * dom/DocumentFragment.cpp:
+        (WebCore::DocumentFragment::parseXML):
+        * xml/parser/NewXMLDocumentParser.cpp:
+        (WebCore::NewXMLDocumentParser::NewXMLDocumentParser):
+        (WebCore::NewXMLDocumentParser::parseDocumentFragment):
+        * xml/parser/NewXMLDocumentParser.h:
+        (WebCore::NewXMLDocumentParser::create):
+        * xml/parser/XMLTokenizer.h:
+        * xml/parser/XMLTreeBuilder.cpp:
+        (WebCore::XMLTreeBuilder::XMLTreeBuilder):
+        (WebCore::XMLTreeBuilder::pushCurrentNode):
+        * xml/parser/XMLTreeBuilder.h:
+        (WebCore::XMLTreeBuilder::create):
+        (WebCore::XMLTreeBuilder::NodeStackItem::node):
+
+2011-08-16  Jeffrey Pfau  <[email protected]>
+
         New XML parser: Replace assertions regarding character data in the prolog with proper checks
         https://bugs.webkit.org/show_bug.cgi?id=66269
 

Modified: trunk/Source/WebCore/dom/DocumentFragment.cpp (93132 => 93133)


--- trunk/Source/WebCore/dom/DocumentFragment.cpp	2011-08-16 18:36:18 UTC (rev 93132)
+++ trunk/Source/WebCore/dom/DocumentFragment.cpp	2011-08-16 18:36:57 UTC (rev 93133)
@@ -25,6 +25,7 @@
 
 #include "Document.h"
 #include "HTMLDocumentParser.h"
+#include "NewXMLDocumentParser.h"
 #include "Page.h"
 #include "Settings.h"
 #include "XMLDocumentParser.h"
@@ -82,7 +83,11 @@
 
 bool DocumentFragment::parseXML(const String& source, Element* contextElement, FragmentScriptingPermission scriptingPermission)
 {
+#if ENABLE(NEW_XML)
+    return NewXMLDocumentParser::parseDocumentFragment(source, this, contextElement, scriptingPermission);
+#else
     return XMLDocumentParser::parseDocumentFragment(source, this, contextElement, scriptingPermission);
+#endif
 }
 
 }

Modified: trunk/Source/WebCore/xml/parser/NewXMLDocumentParser.cpp (93132 => 93133)


--- trunk/Source/WebCore/xml/parser/NewXMLDocumentParser.cpp	2011-08-16 18:36:18 UTC (rev 93132)
+++ trunk/Source/WebCore/xml/parser/NewXMLDocumentParser.cpp	2011-08-16 18:36:57 UTC (rev 93133)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "NewXMLDocumentParser.h"
 
+#include "DocumentFragment.h"
 #include "SegmentedString.h"
 #include "XMLTreeBuilder.h"
 
@@ -39,6 +40,29 @@
 {
 }
 
+NewXMLDocumentParser::NewXMLDocumentParser(DocumentFragment* fragment, Element* parent, FragmentScriptingPermission)
+    : ScriptableDocumentParser(fragment->document())
+    , m_tokenizer(XMLTokenizer::create())
+    , m_finishWasCalled(false)
+    , m_treeBuilder(XMLTreeBuilder::create(this, fragment, parent))
+{
+}
+
+bool NewXMLDocumentParser::parseDocumentFragment(const String& chunk, DocumentFragment* fragment, Element* contextElement, FragmentScriptingPermission scriptingPermission)
+{
+    if (!chunk.length())
+        return true;
+
+    RefPtr<NewXMLDocumentParser> parser = NewXMLDocumentParser::create(fragment, contextElement, scriptingPermission);
+    parser->append(SegmentedString(chunk));
+    // Do not call finish(). Current finish() implementation touches the main Document/loader
+    // and can cause crashes in the fragment case.
+    parser->detach(); // Allows ~DocumentParser to assert it was detached before destruction.
+
+    // FIXME: return false if not well-formed
+    return true;
+}
+
 NewXMLDocumentParser::~NewXMLDocumentParser()
 {
 }

Modified: trunk/Source/WebCore/xml/parser/NewXMLDocumentParser.h (93132 => 93133)


--- trunk/Source/WebCore/xml/parser/NewXMLDocumentParser.h	2011-08-16 18:36:18 UTC (rev 93132)
+++ trunk/Source/WebCore/xml/parser/NewXMLDocumentParser.h	2011-08-16 18:36:57 UTC (rev 93133)
@@ -47,6 +47,13 @@
         return adoptRef(new NewXMLDocumentParser(document));
     }
 
+    static PassRefPtr<NewXMLDocumentParser> create(DocumentFragment* fragment, Element* parent, FragmentScriptingPermission scriptingPermission)
+    {
+        return adoptRef(new NewXMLDocumentParser(fragment, parent, scriptingPermission));
+    }
+
+    static bool parseDocumentFragment(const String&, DocumentFragment*, Element* parent = 0, FragmentScriptingPermission = FragmentScriptingAllowed);
+
     virtual TextPosition0 textPosition() const;
     virtual int lineNumber() const;
 
@@ -64,6 +71,7 @@
 
 private:
     NewXMLDocumentParser(Document*);
+    NewXMLDocumentParser(DocumentFragment*, Element* parent, FragmentScriptingPermission);
     virtual ~NewXMLDocumentParser();
 
     OwnPtr<XMLTokenizer> m_tokenizer;

Modified: trunk/Source/WebCore/xml/parser/XMLTokenizer.h (93132 => 93133)


--- trunk/Source/WebCore/xml/parser/XMLTokenizer.h	2011-08-16 18:36:18 UTC (rev 93132)
+++ trunk/Source/WebCore/xml/parser/XMLTokenizer.h	2011-08-16 18:36:57 UTC (rev 93133)
@@ -97,7 +97,7 @@
     };
 };
 
-class XMLTokenizer : MarkupTokenizerBase<XMLToken, XMLTokenizerState> {
+class XMLTokenizer : public MarkupTokenizerBase<XMLToken, XMLTokenizerState> {
     WTF_MAKE_NONCOPYABLE(XMLTokenizer);
     WTF_MAKE_FAST_ALLOCATED;
 public:

Modified: trunk/Source/WebCore/xml/parser/XMLTreeBuilder.cpp (93132 => 93133)


--- trunk/Source/WebCore/xml/parser/XMLTreeBuilder.cpp	2011-08-16 18:36:18 UTC (rev 93132)
+++ trunk/Source/WebCore/xml/parser/XMLTreeBuilder.cpp	2011-08-16 18:36:57 UTC (rev 93133)
@@ -29,6 +29,7 @@
 #include "CDATASection.h"
 #include "Comment.h"
 #include "Document.h"
+#include "DocumentFragment.h"
 #include "DocumentType.h"
 #include "Frame.h"
 #include "HTMLEntitySearch.h"
@@ -47,6 +48,49 @@
     m_currentNodeStack.append(NodeStackItem(document));
 }
 
+XMLTreeBuilder::XMLTreeBuilder(NewXMLDocumentParser* parser, DocumentFragment* fragment, Element* parent)
+    : m_document(fragment->document())
+    , m_parser(parser)
+    , m_isXHTML(false)
+{
+    NodeStackItem stackItem(fragment);
+
+    // Figure out namespaces
+    Vector<Element*> nodeStack;
+    while (parent) {
+        nodeStack.append(parent);
+
+        ContainerNode* node = parent->parentNode();
+        if (!node || !node->isElementNode())
+            break;
+        parent = static_cast<Element*>(node);
+    }
+
+    if (nodeStack.isEmpty()) {
+        m_currentNodeStack.append(stackItem);
+        return;
+    }
+
+    for (Element* element; !nodeStack.isEmpty(); nodeStack.removeLast()) {
+        element = nodeStack.last();
+        if (NamedNodeMap* attrs = element->attributes()) {
+            for (size_t i = 0; i < attrs->length(); ++i) {
+                Attribute* attr = attrs->attributeItem(i);
+                if (attr->localName() == xmlnsAtom)
+                    stackItem.setNamespaceURI(attr->value());
+                else if (attr->prefix() == xmlnsAtom)
+                    stackItem.setNamespaceURI(attr->localName(), attr->value());
+            }
+        }
+    }
+
+    // If the parent element is not in document tree, there may be no xmlns attribute; just default to the parent's namespace.
+    if (stackItem.namespaceURI().isNull() && !parent->inDocument())
+        stackItem.setNamespaceURI(parent->namespaceURI());
+
+    m_currentNodeStack.append(stackItem);
+}
+
 void XMLTreeBuilder::processToken(const AtomicXMLToken& token)
 {
     switch (token.type()) {
@@ -87,6 +131,7 @@
 
 void XMLTreeBuilder::pushCurrentNode(const NodeStackItem& stackItem)
 {
+    ASSERT(stackItem.node());
     m_currentNodeStack.append(stackItem);
     // FIXME: is there a maximum DOM depth?
 }

Modified: trunk/Source/WebCore/xml/parser/XMLTreeBuilder.h (93132 => 93133)


--- trunk/Source/WebCore/xml/parser/XMLTreeBuilder.h	2011-08-16 18:36:18 UTC (rev 93132)
+++ trunk/Source/WebCore/xml/parser/XMLTreeBuilder.h	2011-08-16 18:36:57 UTC (rev 93133)
@@ -47,10 +47,16 @@
         return adoptPtr(new XMLTreeBuilder(parser, document));
     }
 
+    static PassOwnPtr<XMLTreeBuilder> create(NewXMLDocumentParser* parser, DocumentFragment* document, Element* parent)
+    {
+        return adoptPtr(new XMLTreeBuilder(parser, document, parent));
+    }
+
     void processToken(const AtomicXMLToken&);
 
 private:
     XMLTreeBuilder(NewXMLDocumentParser*, Document*);
+    XMLTreeBuilder(NewXMLDocumentParser*, DocumentFragment*, Element* parent);
 
     class NodeStackItem {
     public:
@@ -64,6 +70,7 @@
         AtomicString namespaceForPrefix(AtomicString prefix, AtomicString fallback);
 
         PassRefPtr<ContainerNode> node() { return m_node; }
+        const ContainerNode* node() const { return m_node.get(); }
         void setNode(PassRefPtr<ContainerNode> node) { m_node = node; }
 
     private:
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to