| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2000 Peter Kelly (pmk@post.com) | 2 * Copyright (C) 2000 Peter Kelly (pmk@post.com) |
| 3 * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved. | 3 * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved. |
| 4 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) | 4 * Copyright (C) 2007 Samuel Weinig (sam@webkit.org) |
| 5 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 5 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
| 6 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 6 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 7 * | 7 * |
| 8 * This library is free software; you can redistribute it and/or | 8 * This library is free software; you can redistribute it and/or |
| 9 * modify it under the terms of the GNU Library General Public | 9 * modify it under the terms of the GNU Library General Public |
| 10 * License as published by the Free Software Foundation; either | 10 * License as published by the Free Software Foundation; either |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 class ContainerNode; | 43 class ContainerNode; |
| 44 class ScriptResource; | 44 class ScriptResource; |
| 45 class ResourceFetcher; | 45 class ResourceFetcher; |
| 46 class DocumentFragment; | 46 class DocumentFragment; |
| 47 class Document; | 47 class Document; |
| 48 class Element; | 48 class Element; |
| 49 class FrameView; | 49 class FrameView; |
| 50 class Text; | 50 class Text; |
| 51 | 51 |
| 52 class XMLParserContext : public RefCounted<XMLParserContext> { | 52 class XMLParserContext : public RefCounted<XMLParserContext> { |
| 53 public: |
| 54 static PassRefPtr<XMLParserContext> createMemoryParser(xmlSAXHandlerPtr, voi
d* userData, const CString& chunk); |
| 55 static PassRefPtr<XMLParserContext> createStringParser(xmlSAXHandlerPtr, voi
d* userData); |
| 56 ~XMLParserContext(); |
| 57 xmlParserCtxtPtr context() const { return m_context; } |
| 58 |
| 59 private: |
| 60 XMLParserContext(xmlParserCtxtPtr context) |
| 61 : m_context(context) |
| 62 { |
| 63 } |
| 64 |
| 65 xmlParserCtxtPtr m_context; |
| 66 }; |
| 67 |
| 68 class XMLDocumentParser FINAL : public ScriptableDocumentParser, public Resource
Client { |
| 69 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; |
| 70 public: |
| 71 static PassRefPtrWillBeRawPtr<XMLDocumentParser> create(Document& document,
FrameView* view) |
| 72 { |
| 73 return adoptRefWillBeNoop(new XMLDocumentParser(document, view)); |
| 74 } |
| 75 static PassRefPtrWillBeRawPtr<XMLDocumentParser> create(DocumentFragment* fr
agment, Element* element, ParserContentPolicy parserContentPolicy) |
| 76 { |
| 77 return adoptRefWillBeNoop(new XMLDocumentParser(fragment, element, parse
rContentPolicy)); |
| 78 } |
| 79 virtual ~XMLDocumentParser(); |
| 80 virtual void trace(Visitor*) OVERRIDE; |
| 81 |
| 82 // Exposed for callbacks: |
| 83 void handleError(XMLErrors::ErrorType, const char* message, TextPosition); |
| 84 |
| 85 void setIsXHTMLDocument(bool isXHTML) { m_isXHTMLDocument = isXHTML; } |
| 86 bool isXHTMLDocument() const { return m_isXHTMLDocument; } |
| 87 |
| 88 bool isCurrentlyParsing8BitChunk() { return m_isCurrentlyParsing8BitChunk; } |
| 89 |
| 90 static bool parseDocumentFragment(const String&, DocumentFragment*, Element*
parent = 0, ParserContentPolicy = AllowScriptingContent); |
| 91 |
| 92 // Used by the XMLHttpRequest to check if the responseXML was well formed. |
| 93 virtual bool wellFormed() const OVERRIDE { return !m_sawError; } |
| 94 |
| 95 virtual TextPosition textPosition() const OVERRIDE; |
| 96 |
| 97 static bool supportsXMLVersion(const String&); |
| 98 |
| 99 class PendingCallback { |
| 53 public: | 100 public: |
| 54 static PassRefPtr<XMLParserContext> createMemoryParser(xmlSAXHandlerPtr,
void* userData, const CString& chunk); | 101 virtual ~PendingCallback() { } |
| 55 static PassRefPtr<XMLParserContext> createStringParser(xmlSAXHandlerPtr,
void* userData); | 102 virtual void call(XMLDocumentParser*) = 0; |
| 56 ~XMLParserContext(); | |
| 57 xmlParserCtxtPtr context() const { return m_context; } | |
| 58 | |
| 59 private: | |
| 60 XMLParserContext(xmlParserCtxtPtr context) | |
| 61 : m_context(context) | |
| 62 { | |
| 63 } | |
| 64 xmlParserCtxtPtr m_context; | |
| 65 }; | 103 }; |
| 66 | 104 |
| 67 class XMLDocumentParser FINAL : public ScriptableDocumentParser, public Reso
urceClient { | 105 private: |
| 68 WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; | 106 explicit XMLDocumentParser(Document&, FrameView* = 0); |
| 69 public: | 107 XMLDocumentParser(DocumentFragment*, Element*, ParserContentPolicy); |
| 70 static PassRefPtrWillBeRawPtr<XMLDocumentParser> create(Document& docume
nt, FrameView* view) | |
| 71 { | |
| 72 return adoptRefWillBeNoop(new XMLDocumentParser(document, view)); | |
| 73 } | |
| 74 static PassRefPtrWillBeRawPtr<XMLDocumentParser> create(DocumentFragment
* fragment, Element* element, ParserContentPolicy parserContentPolicy) | |
| 75 { | |
| 76 return adoptRefWillBeNoop(new XMLDocumentParser(fragment, element, p
arserContentPolicy)); | |
| 77 } | |
| 78 | 108 |
| 79 virtual ~XMLDocumentParser(); | 109 // From DocumentParser |
| 80 virtual void trace(Visitor*) OVERRIDE; | 110 virtual void insert(const SegmentedString&) OVERRIDE; |
| 111 virtual void append(PassRefPtr<StringImpl>) OVERRIDE; |
| 112 virtual void finish() OVERRIDE; |
| 113 virtual bool isWaitingForScripts() const OVERRIDE; |
| 114 virtual void stopParsing() OVERRIDE; |
| 115 virtual void detach() OVERRIDE; |
| 116 virtual OrdinalNumber lineNumber() const OVERRIDE; |
| 117 OrdinalNumber columnNumber() const; |
| 81 | 118 |
| 82 // Exposed for callbacks: | 119 // from ResourceClient |
| 83 void handleError(XMLErrors::ErrorType, const char* message, TextPosition
); | 120 virtual void notifyFinished(Resource*) OVERRIDE; |
| 84 | 121 |
| 85 void setIsXHTMLDocument(bool isXHTML) { m_isXHTMLDocument = isXHTML; } | 122 void end(); |
| 86 bool isXHTMLDocument() const { return m_isXHTMLDocument; } | |
| 87 | 123 |
| 88 bool isCurrentlyParsing8BitChunk() { return m_isCurrentlyParsing8BitChun
k; } | 124 void pauseParsing(); |
| 125 void resumeParsing(); |
| 89 | 126 |
| 90 static bool parseDocumentFragment(const String&, DocumentFragment*, Elem
ent* parent = 0, ParserContentPolicy = AllowScriptingContent); | 127 bool appendFragmentSource(const String&); |
| 91 | 128 |
| 92 // Used by the XMLHttpRequest to check if the responseXML was well forme
d. | 129 public: |
| 93 virtual bool wellFormed() const OVERRIDE { return !m_sawError; } | 130 // Callbacks from parser SAX |
| 131 void error(XMLErrors::ErrorType, const char* message, va_list args) WTF_ATTR
IBUTE_PRINTF(3, 0); |
| 132 void startElementNs(const AtomicString& localName, const AtomicString& prefi
x, const AtomicString& uri, int namespaceCount, |
| 133 const xmlChar** namespaces, int attributeCount, int defaultedCount, cons
t xmlChar** libxmlAttributes); |
| 134 void endElementNs(); |
| 135 void characters(const xmlChar* chars, int length); |
| 136 void processingInstruction(const String& target, const String& data); |
| 137 void cdataBlock(const String&); |
| 138 void comment(const String&); |
| 139 void startDocument(const String& version, const String& encoding, int standa
lone); |
| 140 void internalSubset(const String& name, const String& externalID, const Stri
ng& systemID); |
| 141 void endDocument(); |
| 94 | 142 |
| 95 virtual TextPosition textPosition() const OVERRIDE; | 143 private: |
| 144 void initializeParserContext(const CString& chunk = CString()); |
| 96 | 145 |
| 97 static bool supportsXMLVersion(const String&); | 146 void pushCurrentNode(ContainerNode*); |
| 147 void popCurrentNode(); |
| 148 void clearCurrentNodeStack(); |
| 98 | 149 |
| 99 class PendingCallback { | 150 void insertErrorMessageBlock(); |
| 100 public: | |
| 101 virtual ~PendingCallback() { } | |
| 102 virtual void call(XMLDocumentParser*) = 0; | |
| 103 }; | |
| 104 | 151 |
| 105 private: | 152 void enterText(); |
| 106 explicit XMLDocumentParser(Document&, FrameView* = 0); | 153 void exitText(); |
| 107 XMLDocumentParser(DocumentFragment*, Element*, ParserContentPolicy); | |
| 108 | 154 |
| 109 // From DocumentParser | 155 void doWrite(const String&); |
| 110 virtual void insert(const SegmentedString&) OVERRIDE; | 156 void doEnd(); |
| 111 virtual void append(PassRefPtr<StringImpl>) OVERRIDE; | |
| 112 virtual void finish() OVERRIDE; | |
| 113 virtual bool isWaitingForScripts() const OVERRIDE; | |
| 114 virtual void stopParsing() OVERRIDE; | |
| 115 virtual void detach() OVERRIDE; | |
| 116 virtual OrdinalNumber lineNumber() const OVERRIDE; | |
| 117 OrdinalNumber columnNumber() const; | |
| 118 | 157 |
| 119 // from ResourceClient | 158 bool m_hasView; |
| 120 virtual void notifyFinished(Resource*) OVERRIDE; | |
| 121 | 159 |
| 122 void end(); | 160 SegmentedString m_originalSourceForTransform; |
| 123 | 161 |
| 124 void pauseParsing(); | 162 xmlParserCtxtPtr context() const { return m_context ? m_context->context() :
0; }; |
| 125 void resumeParsing(); | 163 RefPtr<XMLParserContext> m_context; |
| 164 Deque<OwnPtr<PendingCallback> > m_pendingCallbacks; |
| 165 Vector<xmlChar> m_bufferedText; |
| 126 | 166 |
| 127 bool appendFragmentSource(const String&); | 167 RawPtrWillBeMember<ContainerNode> m_currentNode; |
| 168 WillBeHeapVector<RawPtrWillBeMember<ContainerNode> > m_currentNodeStack; |
| 128 | 169 |
| 129 public: | 170 RefPtrWillBeMember<Text> m_leafTextNode; |
| 130 // callbacks from parser SAX | |
| 131 void error(XMLErrors::ErrorType, const char* message, va_list args) WTF_
ATTRIBUTE_PRINTF(3, 0); | |
| 132 void startElementNs(const AtomicString& localName, const AtomicString& p
refix, const AtomicString& uri, int nb_namespaces, | |
| 133 const xmlChar** namespaces, int nb_attributes, int n
b_defaulted, const xmlChar** libxmlAttributes); | |
| 134 void endElementNs(); | |
| 135 void characters(const xmlChar* chars, int length); | |
| 136 void processingInstruction(const String& target, const String& data); | |
| 137 void cdataBlock(const String&); | |
| 138 void comment(const String&); | |
| 139 void startDocument(const String& version, const String& encoding, int st
andalone); | |
| 140 void internalSubset(const String& name, const String& externalID, const
String& systemID); | |
| 141 void endDocument(); | |
| 142 | 171 |
| 143 private: | 172 bool m_isCurrentlyParsing8BitChunk; |
| 144 void initializeParserContext(const CString& chunk = CString()); | 173 bool m_sawError; |
| 174 bool m_sawCSS; |
| 175 bool m_sawXSLTransform; |
| 176 bool m_sawFirstElement; |
| 177 bool m_isXHTMLDocument; |
| 178 bool m_parserPaused; |
| 179 bool m_requestingScript; |
| 180 bool m_finishCalled; |
| 145 | 181 |
| 146 void pushCurrentNode(ContainerNode*); | 182 XMLErrors m_xmlErrors; |
| 147 void popCurrentNode(); | |
| 148 void clearCurrentNodeStack(); | |
| 149 | 183 |
| 150 void insertErrorMessageBlock(); | 184 ResourcePtr<ScriptResource> m_pendingScript; |
| 185 RefPtrWillBeMember<Element> m_scriptElement; |
| 186 TextPosition m_scriptStartPosition; |
| 151 | 187 |
| 152 void enterText(); | 188 bool m_parsingFragment; |
| 153 void exitText(); | 189 AtomicString m_defaultNamespaceURI; |
| 154 | 190 |
| 155 void doWrite(const String&); | 191 typedef HashMap<AtomicString, AtomicString> PrefixForNamespaceMap; |
| 156 void doEnd(); | 192 PrefixForNamespaceMap m_prefixToNamespaceMap; |
| 157 | 193 SegmentedString m_pendingSrc; |
| 158 bool m_hasView; | 194 }; |
| 159 | |
| 160 SegmentedString m_originalSourceForTransform; | |
| 161 | |
| 162 xmlParserCtxtPtr context() const { return m_context ? m_context->context
() : 0; }; | |
| 163 RefPtr<XMLParserContext> m_context; | |
| 164 Deque<OwnPtr<PendingCallback> > m_pendingCallbacks; | |
| 165 Vector<xmlChar> m_bufferedText; | |
| 166 | |
| 167 RawPtrWillBeMember<ContainerNode> m_currentNode; | |
| 168 WillBeHeapVector<RawPtrWillBeMember<ContainerNode> > m_currentNodeStack; | |
| 169 | |
| 170 RefPtrWillBeMember<Text> m_leafTextNode; | |
| 171 | |
| 172 bool m_isCurrentlyParsing8BitChunk; | |
| 173 bool m_sawError; | |
| 174 bool m_sawCSS; | |
| 175 bool m_sawXSLTransform; | |
| 176 bool m_sawFirstElement; | |
| 177 bool m_isXHTMLDocument; | |
| 178 bool m_parserPaused; | |
| 179 bool m_requestingScript; | |
| 180 bool m_finishCalled; | |
| 181 | |
| 182 XMLErrors m_xmlErrors; | |
| 183 | |
| 184 ResourcePtr<ScriptResource> m_pendingScript; | |
| 185 RefPtrWillBeMember<Element> m_scriptElement; | |
| 186 TextPosition m_scriptStartPosition; | |
| 187 | |
| 188 bool m_parsingFragment; | |
| 189 AtomicString m_defaultNamespaceURI; | |
| 190 | |
| 191 typedef HashMap<AtomicString, AtomicString> PrefixForNamespaceMap; | |
| 192 PrefixForNamespaceMap m_prefixToNamespaceMap; | |
| 193 SegmentedString m_pendingSrc; | |
| 194 }; | |
| 195 | 195 |
| 196 xmlDocPtr xmlDocPtrForString(ResourceFetcher*, const String& source, const Strin
g& url); | 196 xmlDocPtr xmlDocPtrForString(ResourceFetcher*, const String& source, const Strin
g& url); |
| 197 | |
| 198 HashMap<String, String> parseAttributes(const String&, bool& attrsOK); | 197 HashMap<String, String> parseAttributes(const String&, bool& attrsOK); |
| 199 | 198 |
| 200 } // namespace WebCore | 199 } // namespace WebCore |
| 201 | 200 |
| 202 #endif // XMLDocumentParser_h | 201 #endif // XMLDocumentParser_h |
| OLD | NEW |