Index: third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
index 51cc3de3567c61ce4b52e03b47cd7801bd537838..59f9f6a2fca321a9cb3b4b55a560c1e298fce140 100644 |
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
@@ -60,6 +60,7 @@ namespace blink { |
ScriptLoader::ScriptLoader(Element* element, bool parserInserted, bool alreadyStarted) |
: m_element(element) |
, m_resource(0) |
+ , m_originWorld(nullptr) |
, m_startLineNumber(WTF::OrdinalNumber::beforeFirst()) |
, m_parserInserted(parserInserted) |
, m_isExternalScript(false) |
@@ -248,6 +249,11 @@ bool ScriptLoader::prepareScript(const TextPosition& scriptStartPosition, Legacy |
return false; |
} |
+ // Store the origin to apply when the script is done loading, as the script could be loaded in the main world. |
+ if (v8::Isolate::GetCurrent()->InContext()) { |
+ m_originWorld = PassRefPtr<DOMWrapperWorld>(DOMWrapperWorld::current(v8::Isolate::GetCurrent()).originWorld()); |
+ } |
+ |
if (client->hasSourceAttribute() && client->deferAttributeValue() && m_parserInserted && !client->asyncAttributeValue()) { |
m_willExecuteWhenDocumentFinishedParsing = true; |
m_willBeParserExecuted = true; |
@@ -421,6 +427,9 @@ bool ScriptLoader::executeScript(const ScriptSourceCode& sourceCode, double* com |
if (isHTMLScriptLoader(m_element)) |
contextDocument->pushCurrentScript(toHTMLScriptElement(m_element)); |
+ // Ensure the origin world gets propagated to the script and is reset afterwards. |
+ DOMWrapperWorld::OriginWorldScope worldScope(m_originWorld); |
+ |
// Create a script from the script element node, using the script |
// block's source and the script block's type. |
// Note: This is where the script is compiled and actually executed. |