Index: third_party/WebKit/Source/core/dom/Document.cpp |
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp |
index f0573887629fc669ea47dfd44cdb3d1389c40f38..4dd6e6b710bbd5e33052e0869f6280e68611bfe6 100644 |
--- a/third_party/WebKit/Source/core/dom/Document.cpp |
+++ b/third_party/WebKit/Source/core/dom/Document.cpp |
@@ -5656,12 +5656,45 @@ v8::Local<v8::Object> Document::associateWithWrapper(v8::Isolate* isolate, const |
bool Document::isSecureContext(String& errorMessage, const SecureContextCheck privilegeContextCheck) const |
{ |
+ // There may be exceptions for the secure context check defined for certain |
+ // origins. The exceptions are applied only to the origin themselves and to |
+ // sandboxed URLs from those origins, but *not* to any children. |
+ // |
+ // For example: |
+ // <iframe src="http://host"> |
+ // <iframe src="scheme-has-exception://host"></iframe> |
+ // <iframe sandbox src="scheme-has-exception://host"></iframe> |
+ // </iframe> |
+ // both inner iframes pass this check, assuming that the scheme |
+ // "scheme-has-exception:" is granted an exception. |
+ // |
+ // However, |
+ // <iframe src="http://host"> |
+ // <iframe sandbox src="http://host"></iframe> |
+ // </iframe> |
+ // would fail the check (that is, sandbox does not grant an exception itself). |
+ // |
+ // Additionally, with |
+ // <iframe src="scheme-has-exception://host"> |
+ // <iframe src="http://host"></iframe> |
+ // <iframe sandbox src="http://host"></iframe> |
+ // </iframe> |
+ // both inner iframes would fail the check, even though the outermost iframe |
+ // passes. |
+ // |
+ // In all cases, a frame must be potentially trustworthy in addition to |
+ // having an exception listed in order for the exception to be granted. |
if (SecurityContext::isSandboxed(SandboxOrigin)) { |
- if (!SecurityOrigin::create(url())->isPotentiallyTrustworthy(errorMessage)) |
+ RefPtr<SecurityOrigin> origin = SecurityOrigin::create(url()); |
+ if (!origin->isPotentiallyTrustworthy(errorMessage)) |
return false; |
+ if (SchemeRegistry::schemeShouldBypassSecureContextCheck(origin->protocol())) |
+ return true; |
} else { |
if (!securityOrigin()->isPotentiallyTrustworthy(errorMessage)) |
return false; |
+ if (SchemeRegistry::schemeShouldBypassSecureContextCheck(securityOrigin()->protocol())) |
+ return true; |
} |
if (privilegeContextCheck == StandardSecureContextCheck) { |