| Index: third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp | 
| diff --git a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp | 
| index 05c63f6a5e263a17e414899171190371b90a2073..8b2229b67f1ba46051bb5e094c97ecfb7c0b6320 100644 | 
| --- a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp | 
| +++ b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp | 
| @@ -34,6 +34,7 @@ | 
| #include "core/dom/ScriptLoader.h" | 
| #include "core/dom/TaskRunnerHelper.h" | 
| #include "core/events/Event.h" | 
| +#include "core/fetch/MemoryCache.h" | 
| #include "core/fetch/ScriptResource.h" | 
| #include "core/frame/LocalFrame.h" | 
| #include "core/html/parser/HTMLInputStream.h" | 
| @@ -249,6 +250,43 @@ void HTMLScriptRunner::stopWatchingResourceForLoad(Resource* resource) | 
| } | 
| } | 
|  | 
| +void fetchBlockedDocWriteScript(Element* script, bool isParserInserted, const TextPosition& scriptStartPosition) | 
| +{ | 
| +    DCHECK(script); | 
| + | 
| +    ScriptLoader* scriptLoader = ScriptLoader::create(script, isParserInserted, false, false); | 
| +    DCHECK(scriptLoader); | 
| +    scriptLoader->setFetchDocWrittenScriptDeferIdle(); | 
| +    scriptLoader->prepareScript(scriptStartPosition); | 
| +} | 
| + | 
| +void HTMLScriptRunner::possiblyFetchBlockedDocWriteScript(Resource* resource) | 
| +{ | 
| +    // If the script was blocked as part of document.write intervention, | 
| +    // then send an asynchronous GET request with an interventions header. | 
| +    Element* element = nullptr; | 
| +    TextPosition startingPosition; | 
| +    bool isParserInserted = false; | 
| + | 
| +    if (!resource->errorOccurred() || !m_parserBlockingScript || !(m_parserBlockingScript->resource() == resource)) | 
| +        return; | 
| + | 
| +    // Due to dependency violation, not able to check the exact error to be | 
| +    // ERR_CACHE_MISS but other errors are rare with | 
| +    // WebCachePolicy::ReturnCacheDataDontLoad. | 
| +    element = m_parserBlockingScript->element(); | 
| + | 
| +    ScriptLoader* scriptLoader = nullptr; | 
| +    if (element && (scriptLoader = toScriptLoaderIfPossible(element)) && scriptLoader->disallowedFetchForDocWrittenScript()) { | 
| +        startingPosition = m_parserBlockingScript->startingPosition(); | 
| +        isParserInserted = scriptLoader->isParserInserted(); | 
| +        // remove this resource entry from memory cache as the new request | 
| +        // should not join onto this existing entry. | 
| +        memoryCache()->remove(resource); | 
| +        fetchBlockedDocWriteScript(element, isParserInserted, startingPosition); | 
| +    } | 
| +} | 
| + | 
| void HTMLScriptRunner::notifyFinished(Resource* cachedResource) | 
| { | 
| // Handle cancellations of parser-blocking script loads without | 
| @@ -261,6 +299,11 @@ void HTMLScriptRunner::notifyFinished(Resource* cachedResource) | 
| stopWatchingResourceForLoad(cachedResource); | 
| return; | 
| } | 
| + | 
| +    // If the script was blocked as part of document.write intervention, | 
| +    // then send an asynchronous GET request with an interventions header. | 
| +    possiblyFetchBlockedDocWriteScript(cachedResource); | 
| + | 
| m_host->notifyScriptLoaded(cachedResource); | 
| } | 
|  | 
|  |