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 9d232e97209af2b0bad868196100c62db1373da9..4bdfefc6cc7a7147cdca93bbf6659dc25093bb0f 100644 |
--- a/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp |
+++ b/third_party/WebKit/Source/core/frame/csp/CSPDirectiveList.cpp |
@@ -430,11 +430,17 @@ bool CSPDirectiveList::checkSourceAndReportViolation( |
if (checkSource(directive, url, redirectStatus) && !checkDynamic(directive)) |
return true; |
+ // We should never have a violation against `child-src` or `default-src` |
+ // directly; the effective directive should always be one of the explicit |
+ // fetch directives. |
+ DCHECK_NE(ContentSecurityPolicy::ChildSrc, effectiveDirective); |
+ DCHECK_NE(ContentSecurityPolicy::DefaultSrc, effectiveDirective); |
+ |
String prefix; |
if (ContentSecurityPolicy::BaseURI == effectiveDirective) |
prefix = "Refused to set the document's base URI to '"; |
- else if (ContentSecurityPolicy::ChildSrc == effectiveDirective) |
- prefix = "Refused to create a child context containing '"; |
+ else if (ContentSecurityPolicy::WorkerSrc == effectiveDirective) |
+ prefix = "Refused to create a worker from '"; |
else if (ContentSecurityPolicy::ConnectSrc == effectiveDirective) |
prefix = "Refused to connect to '"; |
else if (ContentSecurityPolicy::FontSrc == effectiveDirective) |
@@ -626,15 +632,14 @@ bool CSPDirectiveList::allowObjectFromSource( |
redirectStatus); |
} |
-bool CSPDirectiveList::allowChildFrameFromSource( |
+bool CSPDirectiveList::allowFrameFromSource( |
const KURL& url, |
ResourceRequest::RedirectStatus redirectStatus, |
ContentSecurityPolicy::ReportingStatus reportingStatus) const { |
if (url.protocolIsAbout()) |
return true; |
- // 'frame-src' is the only directive which overrides something other than the |
- // default sources. It overrides 'child-src', which overrides the default |
+ // 'frame-src' overrides 'child-src', which overrides the default |
// sources. So, we do this nested set of calls to 'operativeDirective()' to |
// grab 'frame-src' if it exists, 'child-src' if it doesn't, and 'defaut-src' |
// if neither are available. |
@@ -745,16 +750,22 @@ bool CSPDirectiveList::allowBaseURI( |
: checkSource(m_baseURI.get(), url, redirectStatus); |
} |
-bool CSPDirectiveList::allowChildContextFromSource( |
+bool CSPDirectiveList::allowWorkerFromSource( |
const KURL& url, |
ResourceRequest::RedirectStatus redirectStatus, |
ContentSecurityPolicy::ReportingStatus reportingStatus) const { |
+ // 'worker-src' overrides 'child-src', which overrides the default |
+ // sources. So, we do this nested set of calls to 'operativeDirective()' to |
+ // grab 'worker-src' if it exists, 'child-src' if it doesn't, and 'defaut-src' |
+ // if neither are available. |
+ SourceListDirective* whichDirective = operativeDirective( |
+ m_workerSrc.get(), operativeDirective(m_childSrc.get())); |
+ |
return reportingStatus == ContentSecurityPolicy::SendReport |
- ? checkSourceAndReportViolation( |
- operativeDirective(m_childSrc.get()), url, |
- ContentSecurityPolicy::ChildSrc, redirectStatus) |
- : checkSource(operativeDirective(m_childSrc.get()), url, |
- redirectStatus); |
+ ? checkSourceAndReportViolation(whichDirective, url, |
+ ContentSecurityPolicy::WorkerSrc, |
+ redirectStatus) |
+ : checkSource(whichDirective, url, redirectStatus); |
} |
bool CSPDirectiveList::allowAncestors( |
@@ -1106,6 +1117,8 @@ void CSPDirectiveList::addDirective(const String& name, const String& value) { |
setCSPDirective<SourceListDirective>(name, value, m_baseURI); |
} else if (equalIgnoringCase(name, ContentSecurityPolicy::ChildSrc)) { |
setCSPDirective<SourceListDirective>(name, value, m_childSrc); |
+ } else if (equalIgnoringCase(name, ContentSecurityPolicy::WorkerSrc)) { |
+ setCSPDirective<SourceListDirective>(name, value, m_workerSrc); |
} else if (equalIgnoringCase(name, ContentSecurityPolicy::FormAction)) { |
setCSPDirective<SourceListDirective>(name, value, m_formAction); |
} else if (equalIgnoringCase(name, ContentSecurityPolicy::PluginTypes)) { |
@@ -1146,6 +1159,7 @@ DEFINE_TRACE(CSPDirectiveList) { |
visitor->trace(m_objectSrc); |
visitor->trace(m_scriptSrc); |
visitor->trace(m_styleSrc); |
+ visitor->trace(m_workerSrc); |
} |
} // namespace blink |