Index: Source/core/html/parser/HTMLDocumentParser.cpp |
diff --git a/Source/core/html/parser/HTMLDocumentParser.cpp b/Source/core/html/parser/HTMLDocumentParser.cpp |
index 4a4ac5b759034e9f20e40e3337e8111b11d20b5c..f0dcfdf1bcb80f89bb44a99eb16bc10e398907e2 100644 |
--- a/Source/core/html/parser/HTMLDocumentParser.cpp |
+++ b/Source/core/html/parser/HTMLDocumentParser.cpp |
@@ -102,18 +102,18 @@ private: |
WeakPtr<BackgroundHTMLParser> m_backgroundParser; |
}; |
-HTMLDocumentParser::HTMLDocumentParser(HTMLDocument& document, bool reportErrors) |
+HTMLDocumentParser::HTMLDocumentParser(HTMLDocument& document, bool reportErrors, ParserSynchronizationPolicy syncPolicy) |
: ScriptableDocumentParser(document) |
, m_options(&document) |
- , m_token(nullptr) |
- , m_tokenizer(nullptr) |
+ , m_token(syncPolicy == ForceSynchronousParsing ? adoptPtr(new HTMLToken) : nullptr) |
+ , m_tokenizer(syncPolicy == ForceSynchronousParsing ? HTMLTokenizer::create(m_options) : nullptr) |
, m_scriptRunner(HTMLScriptRunner::create(&document, this)) |
, m_treeBuilder(HTMLTreeBuilder::create(this, &document, parserContentPolicy(), reportErrors, m_options)) |
, m_parserScheduler(HTMLParserScheduler::create(this)) |
, m_xssAuditorDelegate(&document) |
, m_weakFactory(this) |
, m_preloader(HTMLResourcePreloader::create(document)) |
- , m_isPinnedToMainThread(false) |
+ , m_shouldUseThreading(syncPolicy == AllowAsynchronousParsing) |
, m_endWasDelayed(false) |
, m_haveBackgroundParser(false) |
, m_tasksWereSuspended(false) |
@@ -133,14 +133,13 @@ HTMLDocumentParser::HTMLDocumentParser(DocumentFragment* fragment, Element* cont |
, m_treeBuilder(HTMLTreeBuilder::create(this, fragment, contextElement, this->parserContentPolicy(), m_options)) |
, m_xssAuditorDelegate(&fragment->document()) |
, m_weakFactory(this) |
- , m_isPinnedToMainThread(true) |
+ , m_shouldUseThreading(false) |
, m_endWasDelayed(false) |
, m_haveBackgroundParser(false) |
, m_tasksWereSuspended(false) |
, m_pumpSessionNestingLevel(0) |
, m_pumpSpeculationsSessionNestingLevel(0) |
{ |
- ASSERT(!shouldUseThreading()); |
bool reportErrors = false; // For now document fragment parsing never reports errors. |
m_tokenizer->setState(tokenizerStateForContextElement(contextElement, reportErrors, m_options)); |
m_xssAuditor.initForFragment(); |
@@ -175,18 +174,6 @@ void HTMLDocumentParser::trace(Visitor* visitor) |
HTMLScriptRunnerHost::trace(visitor); |
} |
-void HTMLDocumentParser::pinToMainThread() |
-{ |
- ASSERT(!m_haveBackgroundParser); |
- ASSERT(!m_isPinnedToMainThread); |
- m_isPinnedToMainThread = true; |
- if (!m_tokenizer) { |
- ASSERT(!m_token); |
- m_token = adoptPtr(new HTMLToken); |
- m_tokenizer = HTMLTokenizer::create(m_options); |
- } |
-} |
- |
void HTMLDocumentParser::detach() |
{ |
if (m_haveBackgroundParser) |
@@ -277,7 +264,7 @@ bool HTMLDocumentParser::isScheduledForResume() const |
// Used by HTMLParserScheduler |
void HTMLDocumentParser::resumeParsingAfterYield() |
{ |
- ASSERT(!m_isPinnedToMainThread); |
+ ASSERT(shouldUseThreading()); |
ASSERT(m_haveBackgroundParser); |
// pumpPendingSpeculations can cause this parser to be detached from the Document, |
@@ -792,12 +779,6 @@ void HTMLDocumentParser::append(PassRefPtr<StringImpl> inputSource) |
return; |
} |
- // A couple pinToMainThread() callers require synchronous parsing, but can't |
- // easily use the insert() method, so we hack append() for them to be synchronous. |
- // javascript: url handling is one such caller. |
- // FIXME: This is gross, and we should separate the concept of synchronous parsing |
- // from insert() so that only document.write() uses insert. |
- ASSERT(m_isPinnedToMainThread); |
pumpTokenizerIfPossible(); |
endIfDelayed(); |
@@ -1003,7 +984,7 @@ void HTMLDocumentParser::executeScriptsWaitingForResources() |
void HTMLDocumentParser::parseDocumentFragment(const String& source, DocumentFragment* fragment, Element* contextElement, ParserContentPolicy parserContentPolicy) |
{ |
RefPtrWillBeRawPtr<HTMLDocumentParser> parser = HTMLDocumentParser::create(fragment, contextElement, parserContentPolicy); |
- parser->insert(source); // Use insert() so that the parser will not yield. |
+ parser->append(source.impl()); |
parser->finish(); |
ASSERT(!parser->processingData()); // Make sure we're done. <rdar://problem/3963151> |
parser->detach(); // Allows ~DocumentParser to assert it was detached before destruction. |