| 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 210a3c3c7cb5c9e7c2c9ab5e7c957a6a69c6cbc9..4fe2718a165d936809eb15f2f1f5f8a630f27a94 100644
|
| --- a/content/browser/child_process_security_policy_impl.cc
|
| +++ b/content/browser/child_process_security_policy_impl.cc
|
| @@ -17,6 +17,7 @@
|
| #include "base/strings/string_split.h"
|
| #include "base/strings/string_util.h"
|
| #include "build/build_config.h"
|
| +#include "content/browser/isolated_origin_util.h"
|
| #include "content/browser/site_instance_impl.h"
|
| #include "content/common/resource_request_body_impl.h"
|
| #include "content/common/site_isolation_policy.h"
|
| @@ -1092,12 +1093,12 @@ bool ChildProcessSecurityPolicyImpl::CanSendMidiSysExMessage(int child_id) {
|
|
|
| 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();
|
| + CHECK(IsolatedOriginUtil::IsValidIsolatedOrigin(origin));
|
|
|
| base::AutoLock lock(lock_);
|
| + CHECK(!isolated_origins_.count(origin))
|
| + << "Duplicate isolated origin: " << origin.Serialize();
|
| +
|
| isolated_origins_.insert(origin);
|
| }
|
|
|
| @@ -1114,8 +1115,38 @@ void ChildProcessSecurityPolicyImpl::AddIsolatedOriginsFromCommandLine(
|
|
|
| bool ChildProcessSecurityPolicyImpl::IsIsolatedOrigin(
|
| const url::Origin& origin) {
|
| + url::Origin unused_result;
|
| + return GetMatchingIsolatedOrigin(origin, &unused_result);
|
| +}
|
| +
|
| +bool ChildProcessSecurityPolicyImpl::GetMatchingIsolatedOrigin(
|
| + const url::Origin& origin,
|
| + url::Origin* result) {
|
| + *result = url::Origin();
|
| + base::AutoLock lock(lock_);
|
| +
|
| + // If multiple isolated origins are registered with a common domain suffix,
|
| + // return the most specific one. For example, if foo.isolated.com and
|
| + // isolated.com are both isolated origins, bar.foo.isolated.com should return
|
| + // foo.isolated.com.
|
| + bool found = false;
|
| + for (auto isolated_origin : isolated_origins_) {
|
| + if (IsolatedOriginUtil::DoesOriginMatchIsolatedOrigin(origin,
|
| + isolated_origin)) {
|
| + if (!found || result->host().length() < isolated_origin.host().length()) {
|
| + *result = isolated_origin;
|
| + found = true;
|
| + }
|
| + }
|
| + }
|
| +
|
| + return found;
|
| +}
|
| +
|
| +void ChildProcessSecurityPolicyImpl::RemoveIsolatedOriginForTesting(
|
| + const url::Origin& origin) {
|
| base::AutoLock lock(lock_);
|
| - return isolated_origins_.find(origin) != isolated_origins_.end();
|
| + isolated_origins_.erase(origin);
|
| }
|
|
|
| } // namespace content
|
|
|