| Index: content/browser/site_instance_impl_unittest.cc
|
| diff --git a/content/browser/site_instance_impl_unittest.cc b/content/browser/site_instance_impl_unittest.cc
|
| index 39246c9be642c82ea95c42d0daf7916b391cc30d..2d1b28d99923d0532654d65f126caf0eb3bf5149 100644
|
| --- a/content/browser/site_instance_impl_unittest.cc
|
| +++ b/content/browser/site_instance_impl_unittest.cc
|
| @@ -19,6 +19,7 @@
|
| #include "content/browser/browsing_instance.h"
|
| #include "content/browser/child_process_security_policy_impl.h"
|
| #include "content/browser/frame_host/navigation_entry_impl.h"
|
| +#include "content/browser/isolated_origin_util.h"
|
| #include "content/browser/renderer_host/render_process_host_impl.h"
|
| #include "content/browser/renderer_host/render_view_host_impl.h"
|
| #include "content/browser/web_contents/web_contents_impl.h"
|
| @@ -905,8 +906,6 @@ TEST_F(SiteInstanceTest, IsolatedOrigins) {
|
| policy->IsIsolatedOrigin(url::Origin(GURL("https://isolated.foo.com"))));
|
| EXPECT_FALSE(policy->IsIsolatedOrigin(
|
| url::Origin(GURL("http://isolated.foo.com:12345"))));
|
| - EXPECT_FALSE(policy->IsIsolatedOrigin(
|
| - url::Origin(GURL("http://bar.isolated.foo.com"))));
|
|
|
| policy->AddIsolatedOrigin(url::Origin(isolated_bar_url));
|
| EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_bar_url)));
|
| @@ -949,6 +948,197 @@ TEST_F(SiteInstanceTest, IsolatedOrigins) {
|
| nullptr, isolated_blob_foo_url));
|
| EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
|
| nullptr, isolated_filesystem_foo_url));
|
| +
|
| + // Cleanup.
|
| + policy->RemoveIsolatedOriginForTesting(url::Origin(isolated_foo_url));
|
| + policy->RemoveIsolatedOriginForTesting(url::Origin(isolated_bar_url));
|
| +}
|
| +
|
| +// Check that only valid isolated origins are allowed to be registered.
|
| +TEST_F(SiteInstanceTest, IsValidIsolatedOrigin) {
|
| + // Unique origins are invalid, as are invalid URLs that resolve to
|
| + // unique origins.
|
| + EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(url::Origin()));
|
| + EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("invalid.url"))));
|
| +
|
| + // IP addresses are ok.
|
| + EXPECT_TRUE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("http://127.0.0.1"))));
|
| +
|
| + // Hosts without a valid registry-controlled domain are disallowed. This
|
| + // includes hosts that are themselves a registry-controlled domain.
|
| + EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("http://.com/"))));
|
| + EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("http://.com./"))));
|
| + EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("http://foo/"))));
|
| + EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("http://co.uk/"))));
|
| + EXPECT_TRUE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("http://foo.bar.baz/"))));
|
| +
|
| + // Scheme must be HTTP or HTTPS.
|
| + EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL(kChromeUIScheme + std::string("://gpu")))));
|
| + EXPECT_TRUE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("http://a.com"))));
|
| + EXPECT_TRUE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("https://b.co.uk"))));
|
| +
|
| + // Trailing dot is disallowed.
|
| + EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
|
| + url::Origin(GURL("http://a.com."))));
|
| +}
|
| +
|
| +TEST_F(SiteInstanceTest, SubdomainOnIsolatedSite) {
|
| + GURL isolated_url("http://isolated.com");
|
| + GURL foo_isolated_url("http://foo.isolated.com");
|
| +
|
| + auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
|
| + policy->AddIsolatedOrigin(url::Origin(isolated_url));
|
| +
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_url)));
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(foo_isolated_url)));
|
| + EXPECT_FALSE(
|
| + policy->IsIsolatedOrigin(url::Origin(GURL("http://unisolated.com"))));
|
| + EXPECT_FALSE(
|
| + policy->IsIsolatedOrigin(url::Origin(GURL("http://isolated.foo.com"))));
|
| + // Wrong scheme.
|
| + EXPECT_FALSE(
|
| + policy->IsIsolatedOrigin(url::Origin(GURL("https://foo.isolated.com"))));
|
| +
|
| + // Appending a trailing dot to a URL should not bypass process isolation.
|
| + EXPECT_TRUE(
|
| + policy->IsIsolatedOrigin(url::Origin(GURL("http://isolated.com."))));
|
| + EXPECT_TRUE(
|
| + policy->IsIsolatedOrigin(url::Origin(GURL("http://foo.isolated.com."))));
|
| +
|
| + // A new SiteInstance created for a subdomain on an isolated origin
|
| + // should use the isolated origin's host and not its own host as the site
|
| + // URL.
|
| + EXPECT_EQ(isolated_url,
|
| + SiteInstance::GetSiteForURL(nullptr, foo_isolated_url));
|
| +
|
| + EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
|
| + nullptr, foo_isolated_url));
|
| +
|
| + EXPECT_TRUE(
|
| + SiteInstance::IsSameWebSite(nullptr, isolated_url, foo_isolated_url));
|
| + EXPECT_TRUE(
|
| + SiteInstance::IsSameWebSite(nullptr, foo_isolated_url, isolated_url));
|
| +
|
| + // Don't try to match subdomains on IP addresses.
|
| + GURL isolated_ip("http://127.0.0.1");
|
| + policy->AddIsolatedOrigin(url::Origin(isolated_ip));
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_ip)));
|
| + EXPECT_FALSE(
|
| + policy->IsIsolatedOrigin(url::Origin(GURL("http://42.127.0.0.1"))));
|
| +
|
| + // Cleanup.
|
| + policy->RemoveIsolatedOriginForTesting(url::Origin(isolated_url));
|
| +}
|
| +
|
| +TEST_F(SiteInstanceTest, SubdomainOnIsolatedOrigin) {
|
| + GURL foo_url("http://foo.com");
|
| + GURL isolated_foo_url("http://isolated.foo.com");
|
| + GURL bar_isolated_foo_url("http://bar.isolated.foo.com");
|
| + GURL baz_isolated_foo_url("http://baz.isolated.foo.com");
|
| +
|
| + auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
|
| + policy->AddIsolatedOrigin(url::Origin(isolated_foo_url));
|
| +
|
| + EXPECT_FALSE(policy->IsIsolatedOrigin(url::Origin(foo_url)));
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_foo_url)));
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(bar_isolated_foo_url)));
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(baz_isolated_foo_url)));
|
| +
|
| + EXPECT_EQ(foo_url, SiteInstance::GetSiteForURL(nullptr, foo_url));
|
| + EXPECT_EQ(isolated_foo_url,
|
| + SiteInstance::GetSiteForURL(nullptr, isolated_foo_url));
|
| + EXPECT_EQ(isolated_foo_url,
|
| + SiteInstance::GetSiteForURL(nullptr, bar_isolated_foo_url));
|
| + EXPECT_EQ(isolated_foo_url,
|
| + SiteInstance::GetSiteForURL(nullptr, baz_isolated_foo_url));
|
| +
|
| + if (!AreAllSitesIsolatedForTesting()) {
|
| + EXPECT_FALSE(
|
| + SiteInstanceImpl::DoesSiteRequireDedicatedProcess(nullptr, foo_url));
|
| + }
|
| + EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
|
| + nullptr, isolated_foo_url));
|
| + EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
|
| + nullptr, bar_isolated_foo_url));
|
| + EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
|
| + nullptr, baz_isolated_foo_url));
|
| +
|
| + EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, foo_url, isolated_foo_url));
|
| + EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, isolated_foo_url, foo_url));
|
| + EXPECT_FALSE(
|
| + SiteInstance::IsSameWebSite(nullptr, foo_url, bar_isolated_foo_url));
|
| + EXPECT_FALSE(
|
| + SiteInstance::IsSameWebSite(nullptr, bar_isolated_foo_url, foo_url));
|
| + EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, bar_isolated_foo_url,
|
| + isolated_foo_url));
|
| + EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, isolated_foo_url,
|
| + bar_isolated_foo_url));
|
| + EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, bar_isolated_foo_url,
|
| + baz_isolated_foo_url));
|
| + EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, baz_isolated_foo_url,
|
| + bar_isolated_foo_url));
|
| +
|
| + // Cleanup.
|
| + policy->RemoveIsolatedOriginForTesting(url::Origin(isolated_foo_url));
|
| +}
|
| +
|
| +TEST_F(SiteInstanceTest, MultipleIsolatedOriginsWithCommonSite) {
|
| + GURL foo_url("http://foo.com");
|
| + GURL bar_foo_url("http://bar.foo.com");
|
| + GURL baz_bar_foo_url("http://baz.bar.foo.com");
|
| + GURL qux_baz_bar_foo_url("http://qux.baz.bar.foo.com");
|
| +
|
| + auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
|
| + policy->AddIsolatedOrigin(url::Origin(foo_url));
|
| + policy->AddIsolatedOrigin(url::Origin(baz_bar_foo_url));
|
| +
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(foo_url)));
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(bar_foo_url)));
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(baz_bar_foo_url)));
|
| + EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(qux_baz_bar_foo_url)));
|
| +
|
| + EXPECT_EQ(foo_url, SiteInstance::GetSiteForURL(nullptr, foo_url));
|
| + EXPECT_EQ(foo_url, SiteInstance::GetSiteForURL(nullptr, bar_foo_url));
|
| + EXPECT_EQ(baz_bar_foo_url,
|
| + SiteInstance::GetSiteForURL(nullptr, baz_bar_foo_url));
|
| + EXPECT_EQ(baz_bar_foo_url,
|
| + SiteInstance::GetSiteForURL(nullptr, qux_baz_bar_foo_url));
|
| +
|
| + EXPECT_TRUE(
|
| + SiteInstanceImpl::DoesSiteRequireDedicatedProcess(nullptr, foo_url));
|
| + EXPECT_TRUE(
|
| + SiteInstanceImpl::DoesSiteRequireDedicatedProcess(nullptr, bar_foo_url));
|
| + EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
|
| + nullptr, baz_bar_foo_url));
|
| + EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
|
| + nullptr, qux_baz_bar_foo_url));
|
| +
|
| + EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, foo_url, bar_foo_url));
|
| + EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, foo_url, baz_bar_foo_url));
|
| + EXPECT_FALSE(
|
| + SiteInstance::IsSameWebSite(nullptr, foo_url, qux_baz_bar_foo_url));
|
| +
|
| + EXPECT_FALSE(
|
| + SiteInstance::IsSameWebSite(nullptr, bar_foo_url, baz_bar_foo_url));
|
| + EXPECT_FALSE(
|
| + SiteInstance::IsSameWebSite(nullptr, bar_foo_url, qux_baz_bar_foo_url));
|
| +
|
| + EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, baz_bar_foo_url,
|
| + qux_baz_bar_foo_url));
|
| +
|
| + // Cleanup.
|
| + policy->RemoveIsolatedOriginForTesting(url::Origin(foo_url));
|
| + policy->RemoveIsolatedOriginForTesting(url::Origin(baz_bar_foo_url));
|
| }
|
|
|
| } // namespace content
|
|
|