Commit 9fc36825 authored by kouhei@chromium.org's avatar kouhei@chromium.org

Force synchronized parser for substitute main resource load marked forceSynchronousLoad.

Before this CL, synchronized parsing for forceSynchronousLoad
substituteData was not enforced. The flag was simply ignored in parsing
code path.

This bug has not surfaced because all substituteData which required
synchronized loading were used against about:blank URL, and
HTMLDocumentParserOptions had a special casing that about:blank urls
required synchronous parsing.

This CL explicitly enforces synchronous parse for forceSynchronousLoad
substituteData, so that flag is actually used.
This is also a step toward removing special casing against about:black
URL in HTMLDocumentParser.

BUG=421289

Review URL: https://codereview.chromium.org/646913002

git-svn-id: svn://svn.chromium.org/blink/trunk@183570 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent b29e848a
...@@ -521,6 +521,10 @@ void DocumentLoader::ensureWriter(const AtomicString& mimeType, const KURL& over ...@@ -521,6 +521,10 @@ void DocumentLoader::ensureWriter(const AtomicString& mimeType, const KURL& over
m_writer = createWriterFor(0, init, mimeType, encoding, false); m_writer = createWriterFor(0, init, mimeType, encoding, false);
m_writer->setDocumentWasLoadedAsPartOfNavigation(); m_writer->setDocumentWasLoadedAsPartOfNavigation();
if (m_substituteData.isValid() && m_substituteData.forceSynchronousLoad())
m_writer->forceSynchronousParse();
// This should be set before receivedFirstData(). // This should be set before receivedFirstData().
if (!overridingURL.isEmpty()) if (!overridingURL.isEmpty())
m_frame->document()->setBaseURLOverride(overridingURL); m_frame->document()->setBaseURLOverride(overridingURL);
......
...@@ -56,6 +56,7 @@ DocumentWriter::DocumentWriter(Document* document, const AtomicString& mimeType, ...@@ -56,6 +56,7 @@ DocumentWriter::DocumentWriter(Document* document, const AtomicString& mimeType,
// original parser, even if the document acquires a new parser (e.g., via // original parser, even if the document acquires a new parser (e.g., via
// document.open). // document.open).
, m_parser(m_document->implicitOpen()) , m_parser(m_document->implicitOpen())
, m_forcedSynchronousParse(false)
{ {
if (m_document->frame()) { if (m_document->frame()) {
if (FrameView* view = m_document->frame()->view()) if (FrameView* view = m_document->frame()->view())
...@@ -73,6 +74,15 @@ void DocumentWriter::trace(Visitor* visitor) ...@@ -73,6 +74,15 @@ void DocumentWriter::trace(Visitor* visitor)
visitor->trace(m_parser); visitor->trace(m_parser);
} }
void DocumentWriter::forceSynchronousParse()
{
ASSERT(!m_forcedSynchronousParse);
ASSERT(m_parser);
m_parser->pinToMainThread();
m_forcedSynchronousParse = true;
}
void DocumentWriter::appendReplacingData(const String& source) void DocumentWriter::appendReplacingData(const String& source)
{ {
m_document->setCompatibilityMode(Document::NoQuirksMode); m_document->setCompatibilityMode(Document::NoQuirksMode);
...@@ -80,7 +90,8 @@ void DocumentWriter::appendReplacingData(const String& source) ...@@ -80,7 +90,8 @@ void DocumentWriter::appendReplacingData(const String& source)
// FIXME: This should call DocumentParser::appendBytes instead of append // FIXME: This should call DocumentParser::appendBytes instead of append
// to support RawDataDocumentParsers. // to support RawDataDocumentParsers.
if (DocumentParser* parser = m_document->parser()) { if (DocumentParser* parser = m_document->parser()) {
parser->pinToMainThread(); if (!m_forcedSynchronousParse)
forceSynchronousParse();
// Because we're pinned to the main thread we don't need to worry about // Because we're pinned to the main thread we don't need to worry about
// passing ownership of the source string. // passing ownership of the source string.
parser->append(source.impl()); parser->append(source.impl());
......
...@@ -49,6 +49,7 @@ public: ...@@ -49,6 +49,7 @@ public:
void end(); void end();
void forceSynchronousParse();
void addData(const char* bytes, size_t length); void addData(const char* bytes, size_t length);
const AtomicString& mimeType() const { return m_decoderBuilder.mimeType(); } const AtomicString& mimeType() const { return m_decoderBuilder.mimeType(); }
...@@ -68,6 +69,7 @@ private: ...@@ -68,6 +69,7 @@ private:
TextResourceDecoderBuilder m_decoderBuilder; TextResourceDecoderBuilder m_decoderBuilder;
RefPtrWillBeMember<DocumentParser> m_parser; RefPtrWillBeMember<DocumentParser> m_parser;
bool m_forcedSynchronousParse;
}; };
} // namespace blink } // namespace blink
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment