Index: third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp b/third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp |
index d766a75057ce9ccea677efcd91801854f19d7242..262a72b858007671fcb9d7bcc1fa8cdcf476f9a7 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/BindingSecurity.cpp |
@@ -42,20 +42,36 @@ |
namespace blink { |
-static bool isOriginAccessibleFromDOMWindow(const SecurityOrigin* targetOrigin, const LocalDOMWindow* accessingWindow) |
-{ |
- return accessingWindow && accessingWindow->document()->getSecurityOrigin()->canAccessCheckSuborigins(targetOrigin); |
-} |
+namespace { |
-static bool canAccessFrame(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const SecurityOrigin* targetFrameOrigin, const DOMWindow* targetWindow, ExceptionState& exceptionState) |
+bool canAccessFrameInternal(const LocalDOMWindow* accessingWindow, const SecurityOrigin* targetFrameOrigin, const DOMWindow* targetWindow) |
{ |
- ASSERT_WITH_SECURITY_IMPLICATION(!(targetWindow && targetWindow->frame()) || targetWindow == targetWindow->frame()->domWindow()); |
+ SECURITY_CHECK(!(targetWindow && targetWindow->frame()) |
+ || targetWindow == targetWindow->frame()->domWindow()); |
// It's important to check that targetWindow is a LocalDOMWindow: it's |
// possible for a remote frame and local frame to have the same security |
// origin, depending on the model being used to allocate Frames between |
// processes. See https://crbug.com/601629. |
- if (targetWindow && targetWindow->isLocalDOMWindow() && isOriginAccessibleFromDOMWindow(targetFrameOrigin, accessingWindow)) |
+ if (!(accessingWindow && targetWindow && targetWindow->isLocalDOMWindow())) |
+ return false; |
+ |
+ const SecurityOrigin* accessingOrigin = |
+ accessingWindow->document()->getSecurityOrigin(); |
+ if (!accessingOrigin->canAccessCheckSuborigins(targetFrameOrigin)) |
+ return false; |
+ |
+ // Notify the loader's client if the initial document has been accessed. |
+ LocalFrame* targetFrame = toLocalDOMWindow(targetWindow)->frame(); |
+ if (targetFrame->loader().stateMachine()->isDisplayingInitialEmptyDocument()) |
+ targetFrame->loader().didAccessInitialDocument(); |
+ |
+ return true; |
+} |
+ |
+bool canAccessFrame(const LocalDOMWindow* accessingWindow, const SecurityOrigin* targetFrameOrigin, const DOMWindow* targetWindow, ExceptionState& exceptionState) |
+{ |
+ if (canAccessFrameInternal(accessingWindow, targetFrameOrigin, targetWindow)) |
return true; |
if (targetWindow) |
@@ -63,29 +79,25 @@ static bool canAccessFrame(v8::Isolate* isolate, const LocalDOMWindow* accessing |
return false; |
} |
-static bool canAccessFrame(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, SecurityOrigin* targetFrameOrigin, const DOMWindow* targetWindow, SecurityReportingOption reportingOption = ReportSecurityError) |
+bool canAccessFrame(const LocalDOMWindow* accessingWindow, SecurityOrigin* targetFrameOrigin, const DOMWindow* targetWindow, SecurityReportingOption reportingOption = ReportSecurityError) |
{ |
- ASSERT_WITH_SECURITY_IMPLICATION(!(targetWindow && targetWindow->frame()) || targetWindow == targetWindow->frame()->domWindow()); |
- |
- // It's important to check that targetWindow is a LocalDOMWindow: it's |
- // possible for a remote frame and local frame to have the same security |
- // origin, depending on the model being used to allocate Frames between |
- // processes. See https://crbug.com/601629. |
- if (targetWindow->isLocalDOMWindow() && isOriginAccessibleFromDOMWindow(targetFrameOrigin, accessingWindow)) |
+ if (canAccessFrameInternal(accessingWindow, targetFrameOrigin, targetWindow)) |
return true; |
- if (reportingOption == ReportSecurityError && targetWindow) |
+ if (accessingWindow && targetWindow && reportingOption == ReportSecurityError) |
accessingWindow->printErrorMessage(targetWindow->crossDomainAccessErrorMessage(accessingWindow)); |
return false; |
} |
+} // namespace |
+ |
bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const DOMWindow* target, ExceptionState& exceptionState) |
{ |
ASSERT(target); |
const Frame* frame = target->frame(); |
if (!frame || !frame->securityContext()) |
return false; |
- return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), target, exceptionState); |
+ return canAccessFrame(accessingWindow, frame->securityContext()->getSecurityOrigin(), target, exceptionState); |
} |
bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const DOMWindow* target, SecurityReportingOption reportingOption) |
@@ -94,7 +106,7 @@ bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWi |
const Frame* frame = target->frame(); |
if (!frame || !frame->securityContext()) |
return false; |
- return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), target, reportingOption); |
+ return canAccessFrame(accessingWindow, frame->securityContext()->getSecurityOrigin(), target, reportingOption); |
} |
bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const EventTarget* target, ExceptionState& exceptionState) |
@@ -110,7 +122,7 @@ bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWi |
const Frame* frame = window->frame(); |
if (!frame || !frame->securityContext()) |
return false; |
- return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), window, exceptionState); |
+ return canAccessFrame(accessingWindow, frame->securityContext()->getSecurityOrigin(), window, exceptionState); |
} |
bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Location* target, ExceptionState& exceptionState) |
@@ -119,7 +131,7 @@ bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWi |
const Frame* frame = target->frame(); |
if (!frame || !frame->securityContext()) |
return false; |
- return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), frame->domWindow(), exceptionState); |
+ return canAccessFrame(accessingWindow, frame->securityContext()->getSecurityOrigin(), frame->domWindow(), exceptionState); |
} |
bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Location* target, SecurityReportingOption reportingOption) |
@@ -128,7 +140,7 @@ bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWi |
const Frame* frame = target->frame(); |
if (!frame || !frame->securityContext()) |
return false; |
- return canAccessFrame(isolate, accessingWindow, frame->securityContext()->getSecurityOrigin(), frame->domWindow(), reportingOption); |
+ return canAccessFrame(accessingWindow, frame->securityContext()->getSecurityOrigin(), frame->domWindow(), reportingOption); |
} |
bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, v8::Local<v8::Context> context, const ExecutionContext* executionContext, const MainThreadWorkletGlobalScope* workletGlobalScope, SecurityReportingOption reportingOption) |
@@ -145,7 +157,7 @@ bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, v8::Local<v8::Co |
if (!workletGlobalScopeFrame || !workletGlobalScopeFrame->securityContext()) |
return false; |
- return domWindow && canAccessFrame(isolate, toLocalDOMWindow(domWindow), workletGlobalScopeFrame->securityContext()->getSecurityOrigin(), workletGlobalScopeFrame->domWindow(), reportingOption); |
+ return domWindow && canAccessFrame(toLocalDOMWindow(domWindow), workletGlobalScopeFrame->securityContext()->getSecurityOrigin(), workletGlobalScopeFrame->domWindow(), reportingOption); |
} |
bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, v8::Local<v8::Context> calling, v8::Local<v8::Context> target, SecurityReportingOption reportingOption) |
@@ -170,21 +182,21 @@ bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWi |
{ |
if (!target) |
return false; |
- return canAccessFrame(isolate, accessingWindow, target->document().getSecurityOrigin(), target->document().domWindow(), exceptionState); |
+ return canAccessFrame(accessingWindow, target->document().getSecurityOrigin(), target->document().domWindow(), exceptionState); |
} |
bool BindingSecurity::shouldAllowAccessTo(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Node* target, SecurityReportingOption reportingOption) |
{ |
if (!target) |
return false; |
- return canAccessFrame(isolate, accessingWindow, target->document().getSecurityOrigin(), target->document().domWindow(), reportingOption); |
+ return canAccessFrame(accessingWindow, target->document().getSecurityOrigin(), target->document().domWindow(), reportingOption); |
} |
bool BindingSecurity::shouldAllowAccessToFrame(v8::Isolate* isolate, const LocalDOMWindow* accessingWindow, const Frame* target, SecurityReportingOption reportingOption) |
{ |
if (!target || !target->securityContext()) |
return false; |
- return canAccessFrame(isolate, accessingWindow, target->securityContext()->getSecurityOrigin(), target->domWindow(), reportingOption); |
+ return canAccessFrame(accessingWindow, target->securityContext()->getSecurityOrigin(), target->domWindow(), reportingOption); |
} |
} // namespace blink |