Index: third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp |
diff --git a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp |
index bcb25c1adc6296fbb7d605889c8c4aabe919adab..b37b62b4f38fd842fa7de7c2ed56bb36797ad209 100644 |
--- a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp |
+++ b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp |
@@ -10,6 +10,7 @@ |
#include "core/dom/SpaceSplitString.h" |
#include "core/frame/LocalFrame.h" |
#include "core/frame/UseCounter.h" |
+#include "core/html/HTMLScriptElement.h" |
#include "core/inspector/ConsoleMessage.h" |
#include "platform/Crypto.h" |
#include "platform/RuntimeEnabledFeatures.h" |
@@ -125,7 +126,8 @@ void CSPDirectiveList::reportViolationWithLocation( |
const String& consoleMessage, |
const KURL& blockedURL, |
const String& contextURL, |
- const WTF::OrdinalNumber& contextLine) const { |
+ const WTF::OrdinalNumber& contextLine, |
+ Element* element) const { |
String message = |
isReportOnly() ? "[Report Only] " + consoleMessage : consoleMessage; |
m_policy->logToConsole(ConsoleMessage::create( |
@@ -134,7 +136,7 @@ void CSPDirectiveList::reportViolationWithLocation( |
m_policy->reportViolation( |
directiveText, effectiveDirective, message, blockedURL, m_reportEndpoints, |
m_header, m_headerType, ContentSecurityPolicy::InlineViolation, nullptr, |
- RedirectStatus::NoRedirect, contextLine.oneBasedInt()); |
+ RedirectStatus::NoRedirect, contextLine.oneBasedInt(), element); |
} |
void CSPDirectiveList::reportViolationWithState( |
@@ -379,6 +381,7 @@ bool CSPDirectiveList::checkMediaTypeAndReportViolation( |
bool CSPDirectiveList::checkInlineAndReportViolation( |
SourceListDirective* directive, |
const String& consoleMessage, |
+ Element* element, |
const String& contextURL, |
const WTF::OrdinalNumber& contextLine, |
bool isScript, |
@@ -408,7 +411,7 @@ bool CSPDirectiveList::checkInlineAndReportViolation( |
directive->text(), isScript ? ContentSecurityPolicy::ScriptSrc |
: ContentSecurityPolicy::StyleSrc, |
consoleMessage + "\"" + directive->text() + "\"." + suffix + "\n", KURL(), |
- contextURL, contextLine); |
+ contextURL, contextLine, element); |
if (!isReportOnly()) { |
if (isScript) |
@@ -492,6 +495,7 @@ bool CSPDirectiveList::checkAncestorsAndReportViolation( |
} |
bool CSPDirectiveList::allowJavaScriptURLs( |
+ Element* element, |
const String& contextURL, |
const WTF::OrdinalNumber& contextLine, |
ContentSecurityPolicy::ReportingStatus reportingStatus) const { |
@@ -500,12 +504,13 @@ bool CSPDirectiveList::allowJavaScriptURLs( |
operativeDirective(m_scriptSrc.get()), |
"Refused to execute JavaScript URL because it violates the following " |
"Content Security Policy directive: ", |
- contextURL, contextLine, true, "sha256-..."); |
+ element, contextURL, contextLine, true, "sha256-..."); |
} |
return checkInline(operativeDirective(m_scriptSrc.get())); |
} |
bool CSPDirectiveList::allowInlineEventHandlers( |
+ Element* element, |
const String& contextURL, |
const WTF::OrdinalNumber& contextLine, |
ContentSecurityPolicy::ReportingStatus reportingStatus) const { |
@@ -514,32 +519,37 @@ bool CSPDirectiveList::allowInlineEventHandlers( |
operativeDirective(m_scriptSrc.get()), |
"Refused to execute inline event handler because it violates the " |
"following Content Security Policy directive: ", |
- contextURL, contextLine, true, "sha256-..."); |
+ element, contextURL, contextLine, true, "sha256-..."); |
} |
return checkInline(operativeDirective(m_scriptSrc.get())); |
} |
bool CSPDirectiveList::allowInlineScript( |
+ Element* element, |
const String& contextURL, |
const String& nonce, |
- ParserDisposition parserDisposition, |
const WTF::OrdinalNumber& contextLine, |
ContentSecurityPolicy::ReportingStatus reportingStatus, |
const String& content) const { |
if (isMatchingNoncePresent(operativeDirective(m_scriptSrc.get()), nonce)) |
return true; |
- if (parserDisposition == NotParserInserted && allowDynamic()) |
+ if (element && isHTMLScriptElement(element) && |
+ !toHTMLScriptElement(element)->loader()->isParserInserted() && |
+ allowDynamic()) { |
return true; |
- if (reportingStatus == ContentSecurityPolicy::SendReport) |
+ } |
+ if (reportingStatus == ContentSecurityPolicy::SendReport) { |
return checkInlineAndReportViolation( |
operativeDirective(m_scriptSrc.get()), |
"Refused to execute inline script because it violates the following " |
"Content Security Policy directive: ", |
- contextURL, contextLine, true, getSha256String(content)); |
+ element, contextURL, contextLine, true, getSha256String(content)); |
+ } |
return checkInline(operativeDirective(m_scriptSrc.get())); |
} |
bool CSPDirectiveList::allowInlineStyle( |
+ Element* element, |
const String& contextURL, |
const String& nonce, |
const WTF::OrdinalNumber& contextLine, |
@@ -547,12 +557,13 @@ bool CSPDirectiveList::allowInlineStyle( |
const String& content) const { |
if (isMatchingNoncePresent(operativeDirective(m_styleSrc.get()), nonce)) |
return true; |
- if (reportingStatus == ContentSecurityPolicy::SendReport) |
+ if (reportingStatus == ContentSecurityPolicy::SendReport) { |
return checkInlineAndReportViolation( |
operativeDirective(m_styleSrc.get()), |
"Refused to apply inline style because it violates the following " |
"Content Security Policy directive: ", |
- contextURL, contextLine, false, getSha256String(content)); |
+ element, contextURL, contextLine, false, getSha256String(content)); |
+ } |
return checkInline(operativeDirective(m_styleSrc.get())); |
} |