| Index: Source/core/dom/ScriptLoader.cpp
|
| diff --git a/Source/core/dom/ScriptLoader.cpp b/Source/core/dom/ScriptLoader.cpp
|
| index e5b9a3be4bbb4bf97415f6e9dd11fad32571616d..e82455733ba303d29199c7dce749545897a59e9a 100644
|
| --- a/Source/core/dom/ScriptLoader.cpp
|
| +++ b/Source/core/dom/ScriptLoader.cpp
|
| @@ -262,8 +262,8 @@ bool ScriptLoader::fetchScript(const String& sourceUrl)
|
| request.setCrossOriginAccessControl(elementDocument->securityOrigin(), crossOriginMode);
|
| request.setCharset(scriptCharset());
|
|
|
| - bool isValidScriptNonce = elementDocument->contentSecurityPolicy()->allowScriptNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr));
|
| - if (isValidScriptNonce)
|
| + bool scriptPassesCSP = elementDocument->contentSecurityPolicy()->allowScriptWithNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr));
|
| + if (scriptPassesCSP)
|
| request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy);
|
|
|
| m_resource = elementDocument->fetcher()->fetchScript(request);
|
| @@ -303,9 +303,12 @@ void ScriptLoader::executeScript(const ScriptSourceCode& sourceCode)
|
|
|
| LocalFrame* frame = contextDocument->frame();
|
|
|
| - bool shouldBypassMainWorldContentSecurityPolicy = (frame && frame->script().shouldBypassMainWorldContentSecurityPolicy()) || elementDocument->contentSecurityPolicy()->allowScriptNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr)) || elementDocument->contentSecurityPolicy()->allowScriptHash(sourceCode.source());
|
| + const ContentSecurityPolicy* csp = elementDocument->contentSecurityPolicy();
|
| + bool shouldBypassMainWorldCSP = (frame && frame->script().shouldBypassMainWorldCSP())
|
| + || csp->allowScriptWithNonce(m_element->fastGetAttribute(HTMLNames::nonceAttr))
|
| + || csp->allowScriptWithHash(sourceCode.source());
|
|
|
| - if (!m_isExternalScript && (!shouldBypassMainWorldContentSecurityPolicy && !elementDocument->contentSecurityPolicy()->allowInlineScript(elementDocument->url(), m_startLineNumber)))
|
| + if (!m_isExternalScript && (!shouldBypassMainWorldCSP && !csp->allowInlineScript(elementDocument->url(), m_startLineNumber)))
|
| return;
|
|
|
| if (m_isExternalScript) {
|
| @@ -316,28 +319,31 @@ void ScriptLoader::executeScript(const ScriptSourceCode& sourceCode)
|
| }
|
| }
|
|
|
| - if (frame) {
|
| - const bool isImportedScript = contextDocument != elementDocument;
|
| - // http://www.whatwg.org/specs/web-apps/current-work/#execute-the-script-block step 2.3
|
| - // with additional support for HTML imports.
|
| - IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(m_isExternalScript || isImportedScript ? contextDocument.get() : 0);
|
| + // FIXME: Can this be moved earlier in the function?
|
| + // Why are we ever attempting to execute scripts without a frame?
|
| + if (!frame)
|
| + return;
|
| +
|
| + const bool isImportedScript = contextDocument != elementDocument;
|
| + // http://www.whatwg.org/specs/web-apps/current-work/#execute-the-script-block step 2.3
|
| + // with additional support for HTML imports.
|
| + IgnoreDestructiveWriteCountIncrementer ignoreDestructiveWriteCountIncrementer(m_isExternalScript || isImportedScript ? contextDocument.get() : 0);
|
|
|
| - if (isHTMLScriptLoader(m_element))
|
| - contextDocument->pushCurrentScript(toHTMLScriptElement(m_element));
|
| + if (isHTMLScriptLoader(m_element))
|
| + contextDocument->pushCurrentScript(toHTMLScriptElement(m_element));
|
|
|
| - AccessControlStatus corsCheck = NotSharableCrossOrigin;
|
| - if (!m_isExternalScript || (sourceCode.resource() && sourceCode.resource()->passesAccessControlCheck(m_element->document().securityOrigin())))
|
| - corsCheck = SharableCrossOrigin;
|
| + AccessControlStatus corsCheck = NotSharableCrossOrigin;
|
| + if (!m_isExternalScript || (sourceCode.resource() && sourceCode.resource()->passesAccessControlCheck(m_element->document().securityOrigin())))
|
| + corsCheck = SharableCrossOrigin;
|
|
|
| - // 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.
|
| - frame->script().executeScriptInMainWorld(sourceCode, corsCheck);
|
| + // 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.
|
| + frame->script().executeScriptInMainWorld(sourceCode, corsCheck);
|
|
|
| - if (isHTMLScriptLoader(m_element)) {
|
| - ASSERT(contextDocument->currentScript() == m_element);
|
| - contextDocument->popCurrentScript();
|
| - }
|
| + if (isHTMLScriptLoader(m_element)) {
|
| + ASSERT(contextDocument->currentScript() == m_element);
|
| + contextDocument->popCurrentScript();
|
| }
|
| }
|
|
|
|
|