| Index: third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
|
| diff --git a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
|
| index 5e9a939b06e3bb280540b4a91c2a5da21a7a94aa..86a6de795f9fbe57a540ea225dbbf16344474856 100644
|
| --- a/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
|
| +++ b/third_party/WebKit/Source/core/frame/csp/ContentSecurityPolicy.cpp
|
| @@ -477,6 +477,30 @@ bool isAllowedByAllWithContextAndContent(
|
| return isAllowed;
|
| }
|
|
|
| +template <
|
| + bool (CSPDirectiveList::*allowed)(const String&,
|
| + const String&,
|
| + ParserDisposition,
|
| + const WTF::OrdinalNumber&,
|
| + ContentSecurityPolicy::ReportingStatus,
|
| + const String& content) const>
|
| +bool isAllowedByAllWithContextAndContentAndParser(
|
| + const CSPDirectiveListVector& policies,
|
| + const String& contextURL,
|
| + const String& nonce,
|
| + ParserDisposition parserDisposition,
|
| + const WTF::OrdinalNumber& contextLine,
|
| + ContentSecurityPolicy::ReportingStatus reportingStatus,
|
| + const String& content) {
|
| + bool isAllowed = true;
|
| + for (const auto& policy : policies) {
|
| + isAllowed &=
|
| + (policy.get()->*allowed)(contextURL, nonce, parserDisposition,
|
| + contextLine, reportingStatus, content);
|
| + }
|
| + return isAllowed;
|
| +}
|
| +
|
| template <bool (CSPDirectiveList::*allowed)(const CSPHashValue&,
|
| ContentSecurityPolicy::InlineType)
|
| const>
|
| @@ -529,6 +553,30 @@ bool isAllowedByAllWithURLWithNonce(
|
| return isAllowed;
|
| }
|
|
|
| +template <bool (CSPDirectiveList::*allowFromURLWithNonceAndParser)(
|
| + const KURL&,
|
| + const String& nonce,
|
| + ParserDisposition parserDisposition,
|
| + RedirectStatus,
|
| + ContentSecurityPolicy::ReportingStatus) const>
|
| +bool isAllowedByAllWithURLNonceAndParser(
|
| + const CSPDirectiveListVector& policies,
|
| + const KURL& url,
|
| + const String& nonce,
|
| + ParserDisposition parserDisposition,
|
| + RedirectStatus redirectStatus,
|
| + ContentSecurityPolicy::ReportingStatus reportingStatus) {
|
| + if (SchemeRegistry::schemeShouldBypassContentSecurityPolicy(url.protocol()))
|
| + return true;
|
| +
|
| + bool isAllowed = true;
|
| + for (const auto& policy : policies) {
|
| + isAllowed &= (policy.get()->*allowFromURLWithNonceAndParser)(
|
| + url, nonce, parserDisposition, redirectStatus, reportingStatus);
|
| + }
|
| + return isAllowed;
|
| +}
|
| +
|
| template <bool (CSPDirectiveList::*allowed)(
|
| LocalFrame*,
|
| const KURL&,
|
| @@ -615,13 +663,14 @@ bool ContentSecurityPolicy::allowInlineEventHandler(
|
| bool ContentSecurityPolicy::allowInlineScript(
|
| const String& contextURL,
|
| const String& nonce,
|
| + ParserDisposition parserDisposition,
|
| const WTF::OrdinalNumber& contextLine,
|
| const String& scriptContent,
|
| ContentSecurityPolicy::ReportingStatus reportingStatus) const {
|
| - return isAllowedByAllWithContextAndContent<
|
| + return isAllowedByAllWithContextAndContentAndParser<
|
| &CSPDirectiveList::allowInlineScript>(m_policies, contextURL, nonce,
|
| - contextLine, reportingStatus,
|
| - scriptContent);
|
| + parserDisposition, contextLine,
|
| + reportingStatus, scriptContent);
|
| }
|
|
|
| bool ContentSecurityPolicy::allowInlineStyle(
|
| @@ -647,14 +696,6 @@ bool ContentSecurityPolicy::allowEval(
|
| exceptionStatus);
|
| }
|
|
|
| -bool ContentSecurityPolicy::allowDynamic() const {
|
| - for (const auto& policy : m_policies) {
|
| - if (!policy->allowDynamic())
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| String ContentSecurityPolicy::evalDisabledErrorMessage() const {
|
| for (const auto& policy : m_policies) {
|
| if (!policy->allowEval(0, SuppressReport))
|
| @@ -705,11 +746,13 @@ bool ContentSecurityPolicy::allowPluginTypeForDocument(
|
| bool ContentSecurityPolicy::allowScriptFromSource(
|
| const KURL& url,
|
| const String& nonce,
|
| + ParserDisposition parserDisposition,
|
| RedirectStatus redirectStatus,
|
| ContentSecurityPolicy::ReportingStatus reportingStatus) const {
|
| - return isAllowedByAllWithURLWithNonce<
|
| + return isAllowedByAllWithURLNonceAndParser<
|
| &CSPDirectiveList::allowScriptFromSource>(
|
| - m_policies, url, nonce, redirectStatus, reportingStatus);
|
| + m_policies, url, nonce, parserDisposition, redirectStatus,
|
| + reportingStatus);
|
| }
|
|
|
| bool ContentSecurityPolicy::allowScriptWithHash(const String& source,
|
| @@ -742,6 +785,7 @@ bool ContentSecurityPolicy::allowRequest(
|
| const KURL& url,
|
| const String& nonce,
|
| const IntegrityMetadataSet& integrityMetadata,
|
| + ParserDisposition parserDisposition,
|
| RedirectStatus redirectStatus,
|
| ReportingStatus reportingStatus) const {
|
| if (integrityMetadata.isEmpty() &&
|
| @@ -775,9 +819,11 @@ bool ContentSecurityPolicy::allowRequest(
|
| return allowChildFrameFromSource(url, redirectStatus, reportingStatus);
|
| case WebURLRequest::RequestContextImport:
|
| case WebURLRequest::RequestContextScript:
|
| - return allowScriptFromSource(url, nonce, redirectStatus, reportingStatus);
|
| + return allowScriptFromSource(url, nonce, parserDisposition,
|
| + redirectStatus, reportingStatus);
|
| case WebURLRequest::RequestContextXSLT:
|
| - return allowScriptFromSource(url, nonce, redirectStatus, reportingStatus);
|
| + return allowScriptFromSource(url, nonce, parserDisposition,
|
| + redirectStatus, reportingStatus);
|
| case WebURLRequest::RequestContextManifest:
|
| return allowManifestFromSource(url, redirectStatus, reportingStatus);
|
| case WebURLRequest::RequestContextServiceWorker:
|
| @@ -900,11 +946,13 @@ bool ContentSecurityPolicy::allowWorkerContextFromSource(
|
| UseCounter::count(*document, UseCounter::WorkerSubjectToCSP);
|
| if (isAllowedByAllWithURL<&CSPDirectiveList::allowChildContextFromSource>(
|
| m_policies, url, redirectStatus, SuppressReport) &&
|
| - !isAllowedByAllWithURLWithNonce<
|
| + !isAllowedByAllWithURLNonceAndParser<
|
| &CSPDirectiveList::allowScriptFromSource>(
|
| - m_policies, url, AtomicString(), redirectStatus, SuppressReport))
|
| + m_policies, url, AtomicString(), NotParserInserted, redirectStatus,
|
| + SuppressReport)) {
|
| UseCounter::count(*document,
|
| UseCounter::WorkerAllowedByChildBlockedByScript);
|
| + }
|
| }
|
|
|
| return isAllowedByAllWithURL<&CSPDirectiveList::allowChildContextFromSource>(
|
|
|