Changeset 145464 in webkit
- Timestamp:
- Mar 11, 2013 7:09:50 PM (11 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r145451 r145464 1 2013-03-11 Adam Barth <abarth@webkit.org> 2 3 Make BackgroundHTMLParser work with doc.writes that enter or leave foreign content 4 https://bugs.webkit.org/show_bug.cgi?id=109764 5 6 Reviewed by Eric Seidel. 7 8 * fast/parser/document-write-svg-cdata-expected.txt: Added. 9 * fast/parser/document-write-svg-cdata.html: Added. 10 1 11 2013-03-11 Yuki Sekiguchi <yuki.sekiguchi@access-company.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r145462 r145464 1 2013-03-11 Adam Barth <abarth@webkit.org> 2 3 Make BackgroundHTMLParser work with doc.writes that enter or leave foreign content 4 https://bugs.webkit.org/show_bug.cgi?id=109764 5 6 Reviewed by Eric Seidel. 7 8 Previously, we were not reseting the state of the 9 HTMLTreeBuilderSimulator when we failed speculative parsing. This had a 10 number of observable consequences, including not parsing CDATA sections 11 correctly when document.write caused us to enter foreign content. 12 13 Test: fast/parser/document-write-svg-cdata.html 14 15 * html/parser/BackgroundHTMLParser.cpp: 16 (WebCore::BackgroundHTMLParser::BackgroundHTMLParser): 17 (WebCore::BackgroundHTMLParser::resumeFrom): 18 (WebCore::BackgroundHTMLParser::pumpTokenizer): 19 (WebCore::BackgroundHTMLParser::sendTokensToMainThread): 20 * html/parser/BackgroundHTMLParser.h: 21 (Checkpoint): 22 (BackgroundHTMLParser): 23 * html/parser/HTMLDocumentParser.cpp: 24 (WebCore::HTMLDocumentParser::validateSpeculations): 25 (WebCore::HTMLDocumentParser::didFailSpeculation): 26 * html/parser/HTMLDocumentParser.h: 27 (ParsedChunk): 28 * html/parser/HTMLElementStack.h: 29 (WebCore::HTMLElementStack::ElementRecord::namespaceURI): 30 * html/parser/HTMLTreeBuilder.h: 31 (WebCore::HTMLTreeBuilder::options): 32 (WebCore::HTMLTreeBuilder::openElements): 33 (HTMLTreeBuilder): 34 * html/parser/HTMLTreeBuilderSimulator.cpp: 35 (WebCore::HTMLTreeBuilderSimulator::stateFor): 36 (WebCore): 37 * html/parser/HTMLTreeBuilderSimulator.h: 38 (WebCore): 39 (WebCore::HTMLTreeBuilderSimulator::state): 40 (WebCore::HTMLTreeBuilderSimulator::setState): 41 (HTMLTreeBuilderSimulator): 42 1 43 2013-03-11 Abhishek Arya <inferno@chromium.org> 2 44 -
trunk/Source/WebCore/html/parser/BackgroundHTMLParser.cpp
r145398 r145464 66 66 BackgroundHTMLParser::BackgroundHTMLParser(PassRefPtr<WeakReference<BackgroundHTMLParser> > reference, PassOwnPtr<Configuration> config) 67 67 : m_weakFactory(reference, this) 68 , m_treeBuilderSimulator(config->options)69 68 , m_token(adoptPtr(new HTMLToken)) 70 69 , m_tokenizer(HTMLTokenizer::create(config->options)) 70 , m_treeBuilderSimulator(config->options) 71 71 , m_options(config->options) 72 72 , m_parser(config->parser) … … 89 89 m_token = checkpoint->token.release(); 90 90 m_tokenizer = checkpoint->tokenizer.release(); 91 m_treeBuilderSimulator.setState(checkpoint->treeBuilderState); 91 92 m_input.rewindTo(checkpoint->inputCheckpoint, checkpoint->unparsedInput); 92 93 m_preloadScanner->rewindTo(checkpoint->preloadScannerCheckpoint); … … 175 176 chunk->xssInfos.swap(m_pendingXSSInfos); 176 177 chunk->tokenizerState = m_tokenizer->state(); 178 chunk->treeBuilderState = m_treeBuilderSimulator.state(); 177 179 chunk->inputCheckpoint = m_input.createCheckpoint(); 178 180 chunk->preloadScannerCheckpoint = m_preloadScanner->createCheckpoint(); -
trunk/Source/WebCore/html/parser/BackgroundHTMLParser.h
r145398 r145464 68 68 OwnPtr<HTMLToken> token; 69 69 OwnPtr<HTMLTokenizer> tokenizer; 70 HTMLTreeBuilderSimulator::State treeBuilderState; 70 71 HTMLInputCheckpoint inputCheckpoint; 71 72 TokenPreloadScannerCheckpoint preloadScannerCheckpoint; … … 91 92 BackgroundHTMLInputStream m_input; 92 93 HTMLSourceTracker m_sourceTracker; 93 HTMLTreeBuilderSimulator m_treeBuilderSimulator;94 94 OwnPtr<HTMLToken> m_token; 95 95 OwnPtr<HTMLTokenizer> m_tokenizer; 96 HTMLTreeBuilderSimulator m_treeBuilderSimulator; 96 97 HTMLParserOptions m_options; 97 98 WeakPtr<HTMLDocumentParser> m_parser; -
trunk/Source/WebCore/html/parser/HTMLDocumentParser.cpp
r145292 r145464 355 355 if (m_currentChunk->tokenizerState == HTMLTokenizer::DataState 356 356 && tokenizer->state() == HTMLTokenizer::DataState 357 && m_input.current().isEmpty()) { 357 && m_input.current().isEmpty() 358 && m_currentChunk->treeBuilderState == HTMLTreeBuilderSimulator::stateFor(m_treeBuilder.get())) { 358 359 ASSERT(token->isUninitialized()); 359 360 return; … … 372 373 checkpoint->token = token; 373 374 checkpoint->tokenizer = tokenizer; 375 checkpoint->treeBuilderState = HTMLTreeBuilderSimulator::stateFor(m_treeBuilder.get()); 374 376 checkpoint->inputCheckpoint = m_currentChunk->inputCheckpoint; 375 377 checkpoint->preloadScannerCheckpoint = m_currentChunk->preloadScannerCheckpoint; -
trunk/Source/WebCore/html/parser/HTMLDocumentParser.h
r144801 r145464 38 38 #include "HTMLToken.h" 39 39 #include "HTMLTokenizer.h" 40 #include "HTMLTreeBuilderSimulator.h" 40 41 #include "ScriptableDocumentParser.h" 41 42 #include "SegmentedString.h" … … 92 93 XSSInfoStream xssInfos; 93 94 HTMLTokenizer::State tokenizerState; 95 HTMLTreeBuilderSimulator::State treeBuilderState; 94 96 HTMLInputCheckpoint inputCheckpoint; 95 97 TokenPreloadScannerCheckpoint preloadScannerCheckpoint; -
trunk/Source/WebCore/html/parser/HTMLElementStack.h
r136467 r145464 58 58 Element* element() const { return m_item->element(); } 59 59 ContainerNode* node() const { return m_item->node(); } 60 const AtomicString& namespaceURI() const { return m_item->namespaceURI(); } 60 61 PassRefPtr<HTMLStackItem> stackItem() const { return m_item; } 61 62 void replaceElement(PassRefPtr<HTMLStackItem>); -
trunk/Source/WebCore/html/parser/HTMLTreeBuilder.h
r142635 r145464 68 68 } 69 69 ~HTMLTreeBuilder(); 70 71 const HTMLElementStack* openElements() const { return m_tree.openElements(); } 70 72 71 73 bool isParsingFragment() const { return !!m_fragmentContext.fragment(); } -
trunk/Source/WebCore/html/parser/HTMLTreeBuilderSimulator.cpp
r145398 r145464 34 34 #include "HTMLParserIdioms.h" 35 35 #include "HTMLTokenizer.h" 36 #include "HTMLTreeBuilder.h" 36 37 #include "MathMLNames.h" 37 38 #include "SVGNames.h" … … 118 119 } 119 120 121 HTMLTreeBuilderSimulator::State HTMLTreeBuilderSimulator::stateFor(HTMLTreeBuilder* treeBuilder) 122 { 123 ASSERT(isMainThread()); 124 State namespaceStack; 125 for (HTMLElementStack::ElementRecord* record = treeBuilder->openElements()->topRecord(); record; record = record->next()) { 126 Namespace currentNamespace = HTML; 127 if (record->namespaceURI() == SVGNames::svgNamespaceURI) 128 currentNamespace = SVG; 129 else if (record->namespaceURI() == MathMLNames::mathmlNamespaceURI) 130 currentNamespace = MathML; 131 132 if (namespaceStack.isEmpty() || namespaceStack.last() != currentNamespace) 133 namespaceStack.append(currentNamespace); 134 } 135 namespaceStack.reverse(); 136 return namespaceStack; 137 } 138 120 139 bool HTMLTreeBuilderSimulator::simulate(const CompactHTMLToken& token, HTMLTokenizer* tokenizer) 121 140 { -
trunk/Source/WebCore/html/parser/HTMLTreeBuilderSimulator.h
r145398 r145464 30 30 31 31 #include "HTMLParserOptions.h" 32 #include <wtf/PassOwnPtr.h> 32 33 #include <wtf/Vector.h> 33 34 … … 36 37 class CompactHTMLToken; 37 38 class HTMLTokenizer; 39 class HTMLTreeBuilder; 38 40 39 41 class HTMLTreeBuilderSimulator { 40 42 WTF_MAKE_FAST_ALLOCATED; 41 public:42 explicit HTMLTreeBuilderSimulator(const HTMLParserOptions&);43 bool simulate(const CompactHTMLToken&, HTMLTokenizer*);44 45 43 private: 46 44 enum Namespace { … … 50 48 }; 51 49 50 public: 51 typedef Vector<Namespace, 1> State; 52 53 explicit HTMLTreeBuilderSimulator(const HTMLParserOptions&); 54 55 static State stateFor(HTMLTreeBuilder*); 56 57 const State& state() const { return m_namespaceStack; } 58 void setState(const State& state) { m_namespaceStack = state; } 59 60 bool simulate(const CompactHTMLToken&, HTMLTokenizer*); 61 62 private: 63 explicit HTMLTreeBuilderSimulator(HTMLTreeBuilder*); 64 52 65 bool inForeignContent() const { return m_namespaceStack.last() != HTML; } 53 66 54 67 HTMLParserOptions m_options; 55 Vector<Namespace, 1>m_namespaceStack;68 State m_namespaceStack; 56 69 }; 57 70
Note: See TracChangeset
for help on using the changeset viewer.