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: