Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Unified Diff: third_party/WebKit/Source/core/dom/Document.cpp

Issue 1723753002: Make Document::isSecureContext() work for OOPIFs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix WebRemoteFrameImpl assert Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 81263fb20b605db13a5843c513e00835b5d3c863..7dbc83a946e06d2d63430a6431953f5a9e065691 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -3386,35 +3386,19 @@ bool Document::isSecureContextImpl(String* errorMessage, const SecureContextChec
//
// 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)) {
- RefPtr<SecurityOrigin> origin = SecurityOrigin::create(url());
- if (!isOriginPotentiallyTrustworthy(origin.get(), errorMessage))
- return false;
- if (SchemeRegistry::schemeShouldBypassSecureContextCheck(origin->protocol()))
- return true;
- } else {
- if (!isOriginPotentiallyTrustworthy(securityOrigin(), errorMessage))
- return false;
- if (SchemeRegistry::schemeShouldBypassSecureContextCheck(securityOrigin()->protocol()))
- return true;
- }
+ if (!isOriginPotentiallyTrustworthy(securityOrigin(), errorMessage))
+ return false;
+ if (SchemeRegistry::schemeShouldBypassSecureContextCheck(securityOrigin()->protocol()))
+ return true;
if (privilegeContextCheck == StandardSecureContextCheck) {
- Document* context = parentDocument();
- while (context) {
- // Skip to the next ancestor if it's a srcdoc.
- if (!context->isSrcdocDocument()) {
- if (context->securityContext().isSandboxed(SandboxOrigin)) {
- // For a sandboxed origin, use the document's URL.
- RefPtr<SecurityOrigin> origin = SecurityOrigin::create(context->url());
- if (!isOriginPotentiallyTrustworthy(origin.get(), errorMessage))
- return false;
- } else {
- if (!isOriginPotentiallyTrustworthy(context->securityOrigin(), errorMessage))
- return false;
- }
- }
- context = context->parentDocument();
+ if (!m_frame)
+ return true;
+ Frame* parent = m_frame->tree().parent();
+ while (parent) {
+ if (!isOriginPotentiallyTrustworthy(parent->securityContext()->securityOrigin(), errorMessage))
+ return false;
+ parent = parent->tree().parent();
}
}
return true;
@@ -4942,10 +4926,14 @@ void Document::initSecurityContext(const DocumentInit& initializer)
if (isSandboxed(SandboxOrigin)) {
m_cookieURL = m_url;
setSecurityOrigin(SecurityOrigin::createUnique());
- // If we're supposed to inherit our security origin from our owner,
- // but we're also sandboxed, the only thing we inherit is the ability
- // to load local resources. This lets about:blank iframes in file://
- // URL documents load images and other resources from the file system.
+ // If we're supposed to inherit our security origin from our
+ // owner, but we're also sandboxed, the only things we inherit are
+ // the origin's potential trustworthiness and the ability to
+ // load local resources. The latter lets about:blank iframes in
+ // file:// URL documents load images and other resources from
+ // the file system.
+ if (initializer.owner() && initializer.owner()->securityOrigin()->isPotentiallyTrustworthy())
+ setUniqueOriginIsPotentiallyTrustworthy();
if (initializer.owner() && initializer.owner()->securityOrigin()->canLoadLocalResources())
securityOrigin()->grantLoadLocalResources();
} else if (initializer.owner()) {
@@ -5001,8 +4989,8 @@ void Document::initSecurityContext(const DocumentInit& initializer)
setBaseURLOverride(initializer.parentBaseURL());
}
- if (securityOrigin()->hasSuborigin())
alexmos 2016/03/09 18:45:06 Weird that there were two identical enforceSuborig
estark 2016/03/10 00:53:44 Huh, I actually didn't notice that I deleted this;
- enforceSuborigin(securityOrigin()->suboriginName());
+ if (securityOrigin()->isUnique() && SecurityOrigin::create(m_url)->isPotentiallyTrustworthy())
+ setUniqueOriginIsPotentiallyTrustworthy();
}
void Document::initContentSecurityPolicy(PassRefPtrWillBeRawPtr<ContentSecurityPolicy> csp)
@@ -5063,6 +5051,14 @@ bool Document::allowExecutingScripts(Node* node)
return true;
}
+void Document::enforceSandboxFlags(SandboxFlags mask)
+{
+ RefPtr<SecurityOrigin> standInOrigin = securityOrigin();
+ applySandboxFlags(mask);
+ if (standInOrigin && !standInOrigin->isUnique() && securityOrigin()->isUnique() && standInOrigin->isPotentiallyTrustworthy())
+ setUniqueOriginIsPotentiallyTrustworthy();
+}
+
void Document::updateSecurityOrigin(PassRefPtr<SecurityOrigin> origin)
{
setSecurityOrigin(origin);
@@ -5922,6 +5918,13 @@ PassOwnPtrWillBeRawPtr<OriginTrialContext> Document::createOriginTrialContext()
return adoptPtrWillBeNoop(new DocumentOriginTrialContext(this));
}
+void Document::setUniqueOriginIsPotentiallyTrustworthy()
+{
+ securityOrigin()->setUniqueOriginIsPotentiallyTrustworthy(true);
+ if (frame())
+ frame()->loader().client()->didSetUniqueOriginPotentiallyTrustworthy();
+}
+
DEFINE_TRACE(Document)
{
#if ENABLE(OILPAN)

Powered by Google App Engine
This is Rietveld 408576698