| Index: content/browser/child_process_security_policy_impl.cc
|
| diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
|
| index 28ce45ad809ad34567726a34478ff43627bf5f67..16f4f0efbec14f250bef83b54426b4bb3f05adec 100644
|
| --- a/content/browser/child_process_security_policy_impl.cc
|
| +++ b/content/browser/child_process_security_policy_impl.cc
|
| @@ -14,6 +14,7 @@
|
| #include "base/macros.h"
|
| #include "base/memory/ptr_util.h"
|
| #include "base/metrics/histogram_macros.h"
|
| +#include "base/strings/string_split.h"
|
| #include "base/strings/string_util.h"
|
| #include "build/build_config.h"
|
| #include "content/browser/site_instance_impl.h"
|
| @@ -252,14 +253,10 @@ class ChildProcessSecurityPolicyImpl::SecurityState {
|
| return false;
|
| }
|
|
|
| - bool CanAccessDataForOrigin(const GURL& gurl) {
|
| + bool CanAccessDataForOrigin(const GURL& site_url) {
|
| if (origin_lock_.is_empty())
|
| return true;
|
| - // TODO(creis): We must pass the valid browser_context to convert hosted
|
| - // apps URLs. Currently, hosted apps cannot set cookies in this mode.
|
| - // See http://crbug.com/160576.
|
| - GURL site_gurl = SiteInstanceImpl::GetSiteForURL(NULL, gurl);
|
| - return origin_lock_ == site_gurl;
|
| + return origin_lock_ == site_url;
|
| }
|
|
|
| void LockToOrigin(const GURL& gurl) {
|
| @@ -921,7 +918,16 @@ bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForFile(
|
| }
|
|
|
| bool ChildProcessSecurityPolicyImpl::CanAccessDataForOrigin(int child_id,
|
| - const GURL& gurl) {
|
| + const GURL& url) {
|
| + // It's important to call GetSiteForURL before acquiring |lock_|, since
|
| + // GetSiteForURL consults IsIsolatedOrigin, which needs to grab the same
|
| + // lock.
|
| + //
|
| + // TODO(creis): We must pass the valid browser_context to convert hosted apps
|
| + // URLs. Currently, hosted apps cannot set cookies in this mode. See
|
| + // http://crbug.com/160576.
|
| + GURL site_url = SiteInstanceImpl::GetSiteForURL(NULL, url);
|
| +
|
| base::AutoLock lock(lock_);
|
| SecurityStateMap::iterator state = security_state_.find(child_id);
|
| if (state == security_state_.end()) {
|
| @@ -929,7 +935,7 @@ bool ChildProcessSecurityPolicyImpl::CanAccessDataForOrigin(int child_id,
|
| // workaround for https://crbug.com/600441
|
| return true;
|
| }
|
| - return state->second->CanAccessDataForOrigin(gurl);
|
| + return state->second->CanAccessDataForOrigin(site_url);
|
| }
|
|
|
| bool ChildProcessSecurityPolicyImpl::HasSpecificPermissionForOrigin(
|
| @@ -993,4 +999,32 @@ bool ChildProcessSecurityPolicyImpl::CanSendMidiSysExMessage(int child_id) {
|
| return state->second->can_send_midi_sysex();
|
| }
|
|
|
| +void ChildProcessSecurityPolicyImpl::AddIsolatedOrigin(
|
| + const url::Origin& origin) {
|
| + CHECK(!origin.unique())
|
| + << "Cannot register a unique origin as an isolated origin.";
|
| + CHECK(!IsIsolatedOrigin(origin))
|
| + << "Duplicate isolated origin: " << origin.Serialize();
|
| +
|
| + base::AutoLock lock(lock_);
|
| + isolated_origins_.insert(origin);
|
| +}
|
| +
|
| +void ChildProcessSecurityPolicyImpl::AddIsolatedOriginsFromCommandLine(
|
| + const std::string& origin_list) {
|
| + for (const base::StringPiece& origin_piece :
|
| + base::SplitStringPiece(origin_list, ",", base::TRIM_WHITESPACE,
|
| + base::SPLIT_WANT_NONEMPTY)) {
|
| + url::Origin origin((GURL(origin_piece)));
|
| + if (!origin.unique())
|
| + AddIsolatedOrigin(origin);
|
| + }
|
| +}
|
| +
|
| +bool ChildProcessSecurityPolicyImpl::IsIsolatedOrigin(
|
| + const url::Origin& origin) {
|
| + base::AutoLock lock(lock_);
|
| + return isolated_origins_.find(origin) != isolated_origins_.end();
|
| +}
|
| +
|
| } // namespace content
|
|
|