Commit 8e618096 authored by Hiroshige Hayashizaki's avatar Hiroshige Hayashizaki Committed by Commit Bot

Take IsolatedCopy() before registering isolated world's SecurityOrigin

XMLHttpRequest's responseXML's SecurityOrigin is aliased with
its ExecutionContext, i.e. either with Document or an isolated world,
in XMLHttpRequest::InitResponseDocument().

This CL is a preparation for making
SecurityContext::GetSecurityOrigin() and
XMLHttpRequest::GetSecurityOrigin() return const SecurityOrigin*
in [1], while preserving the aliasing behavior in XHR.

[1] https://chromium-review.googlesource.com/744586

This CL
- Introduces XMLHttpRequest::GetMutableSecurityOrigin(),
- Uses ExecutionContext::GetMutableSecurityOrigin() for
  aliasing with another Document and
- Uses the registered SecurityOrigin of an isolated world
  in DOMWrapperWorld for aliasing with the isolated world.

This CL Takes IsolatedCopy() before
DOMWrapperWorld::SetIsolatedWorldSecurityOrigin() in
WebLocalFrameImpl::SetIsolatedWorldSecurityOrigin(),
to make SecurityOrigin inside its argument (WebSecurityOrigin) const.
This IsolatedCopy() doesn't cause semantic changes, because
the callers of SetIsolatedWorldSecurityOrigin() never
pass an aliased WebSecurityOrigin.

Bug: 779730
Change-Id: I503c0623f15e37cba010a0c7f0b72e2b44f5af08
Reviewed-on: https://chromium-review.googlesource.com/752006
Commit-Queue: Hiroshige Hayashizaki <hiroshige@chromium.org>
Reviewed-by: default avatarTakeshi Yoshino <tyoshino@chromium.org>
Reviewed-by: default avatarMike West <mkwst@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarYutaka Hirano <yhirano@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Reviewed-by: default avatarKouhei Ueno <kouhei@chromium.org>
Cr-Commit-Position: refs/heads/master@{#521260}
parent e9694734
...@@ -663,8 +663,8 @@ void WebLocalFrameImpl::SetIsolatedWorldSecurityOrigin( ...@@ -663,8 +663,8 @@ void WebLocalFrameImpl::SetIsolatedWorldSecurityOrigin(
int world_id, int world_id,
const WebSecurityOrigin& security_origin) { const WebSecurityOrigin& security_origin) {
DCHECK(GetFrame()); DCHECK(GetFrame());
DOMWrapperWorld::SetIsolatedWorldSecurityOrigin(world_id, DOMWrapperWorld::SetIsolatedWorldSecurityOrigin(
security_origin.Get()); world_id, security_origin.Get()->IsolatedCopy());
} }
void WebLocalFrameImpl::SetIsolatedWorldContentSecurityPolicy( void WebLocalFrameImpl::SetIsolatedWorldContentSecurityPolicy(
......
...@@ -328,6 +328,12 @@ SecurityOrigin* XMLHttpRequest::GetSecurityOrigin() const { ...@@ -328,6 +328,12 @@ SecurityOrigin* XMLHttpRequest::GetSecurityOrigin() const {
: GetExecutionContext()->GetSecurityOrigin(); : GetExecutionContext()->GetSecurityOrigin();
} }
SecurityOrigin* XMLHttpRequest::GetMutableSecurityOrigin() {
return isolated_world_security_origin_
? isolated_world_security_origin_.get()
: GetExecutionContext()->GetMutableSecurityOrigin();
}
XMLHttpRequest::State XMLHttpRequest::readyState() const { XMLHttpRequest::State XMLHttpRequest::readyState() const {
return state_; return state_;
} }
...@@ -376,7 +382,7 @@ void XMLHttpRequest::InitResponseDocument() { ...@@ -376,7 +382,7 @@ void XMLHttpRequest::InitResponseDocument() {
response_document_ = XMLDocument::Create(init); response_document_ = XMLDocument::Create(init);
// FIXME: Set Last-Modified. // FIXME: Set Last-Modified.
response_document_->SetSecurityOrigin(GetSecurityOrigin()); response_document_->SetSecurityOrigin(GetMutableSecurityOrigin());
response_document_->SetContextFeatures(GetDocument()->GetContextFeatures()); response_document_->SetContextFeatures(GetDocument()->GetContextFeatures());
response_document_->SetMimeType(FinalResponseMIMETypeWithFallback()); response_document_->SetMimeType(FinalResponseMIMETypeWithFallback());
} }
......
...@@ -181,6 +181,7 @@ class XMLHttpRequest final : public XMLHttpRequestEventTarget, ...@@ -181,6 +181,7 @@ class XMLHttpRequest final : public XMLHttpRequestEventTarget,
// created in an isolated world. Otherwise, returns the SecurityOrigin of the // created in an isolated world. Otherwise, returns the SecurityOrigin of the
// execution context. // execution context.
SecurityOrigin* GetSecurityOrigin() const; SecurityOrigin* GetSecurityOrigin() const;
SecurityOrigin* GetMutableSecurityOrigin();
void DidSendData(unsigned long long bytes_sent, void DidSendData(unsigned long long bytes_sent,
unsigned long long total_bytes_to_be_sent) override; unsigned long long total_bytes_to_be_sent) override;
......
...@@ -370,6 +370,10 @@ class WebLocalFrame : public WebFrame { ...@@ -370,6 +370,10 @@ class WebLocalFrame : public WebFrame {
// Associates an isolated world (see above for description) with a security // Associates an isolated world (see above for description) with a security
// origin. XMLHttpRequest instances used in that world will be considered // origin. XMLHttpRequest instances used in that world will be considered
// to come from that origin, not the frame's. // to come from that origin, not the frame's.
//
// Currently the origin shouldn't be aliased, because IsolatedCopy() is
// taken before associating it to an isolated world and aliased relationship,
// if any, is broken. crbug.com/779730
virtual void SetIsolatedWorldSecurityOrigin(int world_id, virtual void SetIsolatedWorldSecurityOrigin(int world_id,
const WebSecurityOrigin&) = 0; const WebSecurityOrigin&) = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment