Index: Source/core/html/parser/HTMLDocumentParser.cpp |
diff --git a/Source/core/html/parser/HTMLDocumentParser.cpp b/Source/core/html/parser/HTMLDocumentParser.cpp |
index 2008ae5f0e144949d5a92c582b8e884ea3dff150..ff73092b2cbfbcead0f72a109aa85434652e03d4 100644 |
--- a/Source/core/html/parser/HTMLDocumentParser.cpp |
+++ b/Source/core/html/parser/HTMLDocumentParser.cpp |
@@ -38,6 +38,7 @@ |
#include "core/html/parser/HTMLTreeBuilder.h" |
#include "core/inspector/InspectorInstrumentation.h" |
#include "core/frame/Frame.h" |
+#include "platform/SharedBuffer.h" |
#include "platform/TraceEvent.h" |
#include "wtf/Functional.h" |
@@ -316,6 +317,11 @@ void HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser(PassOwnPtr<Pa |
pumpPendingSpeculations(); |
} |
+void HTMLDocumentParser::didReceiveEncodingDataFromBackgroundParser(const DocumentEncodingData& data) |
+{ |
+ document()->setEncodingData(data); |
+} |
+ |
void HTMLDocumentParser::validateSpeculations(PassOwnPtr<ParsedChunk> chunk) |
{ |
ASSERT(chunk); |
@@ -666,10 +672,11 @@ void HTMLDocumentParser::startBackgroundParser() |
config->xssAuditor = adoptPtr(new XSSAuditor); |
config->xssAuditor->init(document(), &m_xssAuditorDelegate); |
config->preloadScanner = adoptPtr(new TokenPreloadScanner(document()->url().copy(), document()->devicePixelRatio())); |
+ config->decoder = takeDecoder(); |
ASSERT(config->xssAuditor->isSafeToSendToAnotherThread()); |
ASSERT(config->preloadScanner->isSafeToSendToAnotherThread()); |
- HTMLParserThread::shared()->postTask(bind(&BackgroundHTMLParser::create, reference.release(), config.release())); |
+ HTMLParserThread::shared()->postTask(bind(&BackgroundHTMLParser::start, reference.release(), config.release())); |
} |
void HTMLDocumentParser::stopBackgroundParser() |
@@ -687,19 +694,9 @@ void HTMLDocumentParser::append(PassRefPtr<StringImpl> inputSource) |
if (isStopped()) |
return; |
- if (shouldUseThreading()) { |
- if (!m_haveBackgroundParser) |
- startBackgroundParser(); |
- |
- ASSERT(inputSource->hasOneRef()); |
- TRACE_EVENT1("net", "HTMLDocumentParser::append", "size", inputSource->length()); |
- // NOTE: Important that the String temporary is destroyed before we post the task |
- // otherwise the String could call deref() on a StringImpl now owned by the background parser. |
- // We would like to ASSERT(closure.arg3()->hasOneRef()) but sadly the args are private. |
- Closure closure = bind(&BackgroundHTMLParser::append, m_backgroundParser, String(inputSource)); |
- HTMLParserThread::shared()->postTask(closure); |
- return; |
- } |
+ // We should never reach this point if we're using a parser thread, |
+ // as appendBytes() will directly ship the data to the thread. |
+ ASSERT(!shouldUseThreading()); |
// pumpTokenizer can cause this parser to be detached from the Document, |
// but we need to ensure it isn't deleted yet. |
@@ -965,4 +962,44 @@ void HTMLDocumentParser::resumeScheduledTasks() |
m_parserScheduler->resume(); |
} |
+void HTMLDocumentParser::appendBytes(const char* data, size_t length) |
+{ |
+ if (!length || isDetached()) |
+ return; |
+ |
+ if (shouldUseThreading()) { |
+ if (!m_haveBackgroundParser) |
+ startBackgroundParser(); |
+ |
+ OwnPtr<Vector<char> > buffer = adoptPtr(new Vector<char>(length)); |
+ memcpy(buffer->data(), data, length); |
+ TRACE_EVENT1("net", "HTMLDocumentParser::appendBytes", "size", (unsigned)length); |
+ |
+ HTMLParserThread::shared()->postTask(bind(&BackgroundHTMLParser::appendBytes, m_backgroundParser, buffer.release())); |
+ return; |
+ } |
+ |
+ DecodedDataDocumentParser::appendBytes(data, length); |
+} |
+ |
+void HTMLDocumentParser::flush() |
+{ |
+ // If we've got no decoder, we never received any data. |
+ if (isDetached() || needsDecoder()) |
+ return; |
+ |
+ if (m_haveBackgroundParser) |
+ HTMLParserThread::shared()->postTask(bind(&BackgroundHTMLParser::flush, m_backgroundParser)); |
+ else |
+ DecodedDataDocumentParser::flush(); |
+} |
+ |
+void HTMLDocumentParser::setDecoder(PassOwnPtr<TextResourceDecoder> decoder) |
+{ |
+ DecodedDataDocumentParser::setDecoder(decoder); |
+ |
+ if (m_haveBackgroundParser) |
+ HTMLParserThread::shared()->postTask(bind(&BackgroundHTMLParser::setDecoder, m_backgroundParser, takeDecoder())); |
+} |
+ |
} |