Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: content/browser/site_instance_impl_unittest.cc

Issue 2891443002: Keep subdomains of an isolated origin in the isolated origin's SiteInstance. (Closed)
Patch Set: Addressing Nick's comments Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/site_instance_impl.h" 5 #include "content/browser/site_instance_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/run_loop.h" 15 #include "base/run_loop.h"
16 #include "base/strings/string16.h" 16 #include "base/strings/string16.h"
17 #include "base/test/scoped_feature_list.h" 17 #include "base/test/scoped_feature_list.h"
18 #include "content/browser/browser_thread_impl.h" 18 #include "content/browser/browser_thread_impl.h"
19 #include "content/browser/browsing_instance.h" 19 #include "content/browser/browsing_instance.h"
20 #include "content/browser/child_process_security_policy_impl.h" 20 #include "content/browser/child_process_security_policy_impl.h"
21 #include "content/browser/frame_host/navigation_entry_impl.h" 21 #include "content/browser/frame_host/navigation_entry_impl.h"
22 #include "content/browser/isolated_origin_util.h"
22 #include "content/browser/renderer_host/render_process_host_impl.h" 23 #include "content/browser/renderer_host/render_process_host_impl.h"
23 #include "content/browser/renderer_host/render_view_host_impl.h" 24 #include "content/browser/renderer_host/render_view_host_impl.h"
24 #include "content/browser/web_contents/web_contents_impl.h" 25 #include "content/browser/web_contents/web_contents_impl.h"
25 #include "content/browser/webui/content_web_ui_controller_factory.h" 26 #include "content/browser/webui/content_web_ui_controller_factory.h"
26 #include "content/browser/webui/web_ui_controller_factory_registry.h" 27 #include "content/browser/webui/web_ui_controller_factory_registry.h"
27 #include "content/public/common/content_client.h" 28 #include "content/public/common/content_client.h"
28 #include "content/public/common/content_constants.h" 29 #include "content/public/common/content_constants.h"
29 #include "content/public/common/content_features.h" 30 #include "content/public/common/content_features.h"
30 #include "content/public/common/content_switches.h" 31 #include "content/public/common/content_switches.h"
31 #include "content/public/common/url_constants.h" 32 #include "content/public/common/url_constants.h"
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 policy->AddIsolatedOrigin(url::Origin(isolated_foo_url)); 899 policy->AddIsolatedOrigin(url::Origin(isolated_foo_url));
899 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_foo_url))); 900 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_foo_url)));
900 EXPECT_FALSE(policy->IsIsolatedOrigin(url::Origin(foo_url))); 901 EXPECT_FALSE(policy->IsIsolatedOrigin(url::Origin(foo_url)));
901 EXPECT_FALSE(policy->IsIsolatedOrigin(url::Origin(GURL("http://foo.com")))); 902 EXPECT_FALSE(policy->IsIsolatedOrigin(url::Origin(GURL("http://foo.com"))));
902 EXPECT_FALSE( 903 EXPECT_FALSE(
903 policy->IsIsolatedOrigin(url::Origin(GURL("http://www.bar.com")))); 904 policy->IsIsolatedOrigin(url::Origin(GURL("http://www.bar.com"))));
904 EXPECT_FALSE( 905 EXPECT_FALSE(
905 policy->IsIsolatedOrigin(url::Origin(GURL("https://isolated.foo.com")))); 906 policy->IsIsolatedOrigin(url::Origin(GURL("https://isolated.foo.com"))));
906 EXPECT_FALSE(policy->IsIsolatedOrigin( 907 EXPECT_FALSE(policy->IsIsolatedOrigin(
907 url::Origin(GURL("http://isolated.foo.com:12345")))); 908 url::Origin(GURL("http://isolated.foo.com:12345"))));
908 EXPECT_FALSE(policy->IsIsolatedOrigin(
909 url::Origin(GURL("http://bar.isolated.foo.com"))));
910 909
911 policy->AddIsolatedOrigin(url::Origin(isolated_bar_url)); 910 policy->AddIsolatedOrigin(url::Origin(isolated_bar_url));
912 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_bar_url))); 911 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_bar_url)));
913 912
914 // IsSameWebSite should compare origins rather than sites if either URL is an 913 // IsSameWebSite should compare origins rather than sites if either URL is an
915 // isolated origin. 914 // isolated origin.
916 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, foo_url, isolated_foo_url)); 915 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, foo_url, isolated_foo_url));
917 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, isolated_foo_url, foo_url)); 916 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, isolated_foo_url, foo_url));
918 EXPECT_FALSE( 917 EXPECT_FALSE(
919 SiteInstance::IsSameWebSite(nullptr, isolated_foo_url, isolated_bar_url)); 918 SiteInstance::IsSameWebSite(nullptr, isolated_foo_url, isolated_bar_url));
(...skipping 22 matching lines...) Expand all
942 941
943 // Isolated origins always require a dedicated process. 942 // Isolated origins always require a dedicated process.
944 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess( 943 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
945 nullptr, isolated_foo_url)); 944 nullptr, isolated_foo_url));
946 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess( 945 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
947 nullptr, isolated_bar_url)); 946 nullptr, isolated_bar_url));
948 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess( 947 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
949 nullptr, isolated_blob_foo_url)); 948 nullptr, isolated_blob_foo_url));
950 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess( 949 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
951 nullptr, isolated_filesystem_foo_url)); 950 nullptr, isolated_filesystem_foo_url));
951
952 // Cleanup.
953 policy->RemoveIsolatedOriginForTesting(url::Origin(isolated_foo_url));
954 policy->RemoveIsolatedOriginForTesting(url::Origin(isolated_bar_url));
955 }
956
957 // Check that only valid isolated origins are allowed to be registered.
958 TEST_F(SiteInstanceTest, IsValidIsolatedOrigin) {
959 // Unique origins are invalid, as are invalid URLs that resolve to
960 // unique origins.
961 EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(url::Origin()));
962 EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
963 url::Origin(GURL("invalid.url"))));
964
965 // IP addresses are ok.
966 EXPECT_TRUE(IsolatedOriginUtil::IsValidIsolatedOrigin(
967 url::Origin(GURL("http://127.0.0.1"))));
968
969 // Hosts without a valid registry-controlled domain are disallowed. This
970 // includes hosts that are themselves a registry-controlled domain.
971 EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
972 url::Origin(GURL("http://.com/"))));
973 EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
974 url::Origin(GURL("http://.com./"))));
975 EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
976 url::Origin(GURL("http://foo/"))));
977 EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
978 url::Origin(GURL("http://co.uk/"))));
979 EXPECT_TRUE(IsolatedOriginUtil::IsValidIsolatedOrigin(
980 url::Origin(GURL("http://foo.bar.baz/"))));
981
982 // Scheme must be HTTP or HTTPS.
983 EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
984 url::Origin(GURL(kChromeUIScheme + std::string("://gpu")))));
985 EXPECT_TRUE(IsolatedOriginUtil::IsValidIsolatedOrigin(
986 url::Origin(GURL("http://a.com"))));
987 EXPECT_TRUE(IsolatedOriginUtil::IsValidIsolatedOrigin(
988 url::Origin(GURL("https://b.co.uk"))));
989
990 // Trailing dot is disallowed.
991 EXPECT_FALSE(IsolatedOriginUtil::IsValidIsolatedOrigin(
992 url::Origin(GURL("http://a.com."))));
993 }
994
995 TEST_F(SiteInstanceTest, SubdomainOnIsolatedSite) {
996 GURL isolated_url("http://isolated.com");
997 GURL foo_isolated_url("http://foo.isolated.com");
998
999 auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
1000 policy->AddIsolatedOrigin(url::Origin(isolated_url));
1001
1002 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_url)));
1003 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(foo_isolated_url)));
1004 EXPECT_FALSE(
1005 policy->IsIsolatedOrigin(url::Origin(GURL("http://unisolated.com"))));
1006 EXPECT_FALSE(
1007 policy->IsIsolatedOrigin(url::Origin(GURL("http://isolated.foo.com"))));
1008 // Wrong scheme.
1009 EXPECT_FALSE(
1010 policy->IsIsolatedOrigin(url::Origin(GURL("https://foo.isolated.com"))));
1011
1012 // Appending a trailing dot to a URL should not bypass process isolation.
1013 EXPECT_TRUE(
1014 policy->IsIsolatedOrigin(url::Origin(GURL("http://isolated.com."))));
1015 EXPECT_TRUE(
1016 policy->IsIsolatedOrigin(url::Origin(GURL("http://foo.isolated.com."))));
1017
1018 // A new SiteInstance created for a subdomain on an isolated origin
1019 // should use the isolated origin's host and not its own host as the site
1020 // URL.
1021 EXPECT_EQ(isolated_url,
1022 SiteInstance::GetSiteForURL(nullptr, foo_isolated_url));
1023
1024 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
1025 nullptr, foo_isolated_url));
1026
1027 EXPECT_TRUE(
1028 SiteInstance::IsSameWebSite(nullptr, isolated_url, foo_isolated_url));
1029 EXPECT_TRUE(
1030 SiteInstance::IsSameWebSite(nullptr, foo_isolated_url, isolated_url));
1031
1032 // Don't try to match subdomains on IP addresses.
1033 GURL isolated_ip("http://127.0.0.1");
1034 policy->AddIsolatedOrigin(url::Origin(isolated_ip));
1035 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_ip)));
1036 EXPECT_FALSE(
1037 policy->IsIsolatedOrigin(url::Origin(GURL("http://42.127.0.0.1"))));
1038
1039 // Cleanup.
1040 policy->RemoveIsolatedOriginForTesting(url::Origin(isolated_url));
1041 }
1042
1043 TEST_F(SiteInstanceTest, SubdomainOnIsolatedOrigin) {
1044 GURL foo_url("http://foo.com");
1045 GURL isolated_foo_url("http://isolated.foo.com");
1046 GURL bar_isolated_foo_url("http://bar.isolated.foo.com");
1047 GURL baz_isolated_foo_url("http://baz.isolated.foo.com");
1048
1049 auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
1050 policy->AddIsolatedOrigin(url::Origin(isolated_foo_url));
1051
1052 EXPECT_FALSE(policy->IsIsolatedOrigin(url::Origin(foo_url)));
1053 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(isolated_foo_url)));
1054 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(bar_isolated_foo_url)));
1055 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(baz_isolated_foo_url)));
1056
1057 EXPECT_EQ(foo_url, SiteInstance::GetSiteForURL(nullptr, foo_url));
1058 EXPECT_EQ(isolated_foo_url,
1059 SiteInstance::GetSiteForURL(nullptr, isolated_foo_url));
1060 EXPECT_EQ(isolated_foo_url,
1061 SiteInstance::GetSiteForURL(nullptr, bar_isolated_foo_url));
1062 EXPECT_EQ(isolated_foo_url,
1063 SiteInstance::GetSiteForURL(nullptr, baz_isolated_foo_url));
1064
1065 if (!AreAllSitesIsolatedForTesting()) {
1066 EXPECT_FALSE(
1067 SiteInstanceImpl::DoesSiteRequireDedicatedProcess(nullptr, foo_url));
1068 }
1069 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
1070 nullptr, isolated_foo_url));
1071 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
1072 nullptr, bar_isolated_foo_url));
1073 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
1074 nullptr, baz_isolated_foo_url));
1075
1076 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, foo_url, isolated_foo_url));
1077 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, isolated_foo_url, foo_url));
1078 EXPECT_FALSE(
1079 SiteInstance::IsSameWebSite(nullptr, foo_url, bar_isolated_foo_url));
1080 EXPECT_FALSE(
1081 SiteInstance::IsSameWebSite(nullptr, bar_isolated_foo_url, foo_url));
1082 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, bar_isolated_foo_url,
1083 isolated_foo_url));
1084 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, isolated_foo_url,
1085 bar_isolated_foo_url));
1086 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, bar_isolated_foo_url,
1087 baz_isolated_foo_url));
1088 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, baz_isolated_foo_url,
1089 bar_isolated_foo_url));
1090
1091 // Cleanup.
1092 policy->RemoveIsolatedOriginForTesting(url::Origin(isolated_foo_url));
1093 }
1094
1095 TEST_F(SiteInstanceTest, MultipleIsolatedOriginsWithCommonSite) {
1096 GURL foo_url("http://foo.com");
1097 GURL bar_foo_url("http://bar.foo.com");
1098 GURL baz_bar_foo_url("http://baz.bar.foo.com");
1099 GURL qux_baz_bar_foo_url("http://qux.baz.bar.foo.com");
1100
1101 auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
1102 policy->AddIsolatedOrigin(url::Origin(foo_url));
1103 policy->AddIsolatedOrigin(url::Origin(baz_bar_foo_url));
1104
1105 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(foo_url)));
1106 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(bar_foo_url)));
1107 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(baz_bar_foo_url)));
1108 EXPECT_TRUE(policy->IsIsolatedOrigin(url::Origin(qux_baz_bar_foo_url)));
1109
1110 EXPECT_EQ(foo_url, SiteInstance::GetSiteForURL(nullptr, foo_url));
1111 EXPECT_EQ(foo_url, SiteInstance::GetSiteForURL(nullptr, bar_foo_url));
1112 EXPECT_EQ(baz_bar_foo_url,
1113 SiteInstance::GetSiteForURL(nullptr, baz_bar_foo_url));
1114 EXPECT_EQ(baz_bar_foo_url,
1115 SiteInstance::GetSiteForURL(nullptr, qux_baz_bar_foo_url));
1116
1117 EXPECT_TRUE(
1118 SiteInstanceImpl::DoesSiteRequireDedicatedProcess(nullptr, foo_url));
1119 EXPECT_TRUE(
1120 SiteInstanceImpl::DoesSiteRequireDedicatedProcess(nullptr, bar_foo_url));
1121 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
1122 nullptr, baz_bar_foo_url));
1123 EXPECT_TRUE(SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
1124 nullptr, qux_baz_bar_foo_url));
1125
1126 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, foo_url, bar_foo_url));
1127 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, foo_url, baz_bar_foo_url));
1128 EXPECT_FALSE(
1129 SiteInstance::IsSameWebSite(nullptr, foo_url, qux_baz_bar_foo_url));
1130
1131 EXPECT_FALSE(
1132 SiteInstance::IsSameWebSite(nullptr, bar_foo_url, baz_bar_foo_url));
1133 EXPECT_FALSE(
1134 SiteInstance::IsSameWebSite(nullptr, bar_foo_url, qux_baz_bar_foo_url));
1135
1136 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, baz_bar_foo_url,
1137 qux_baz_bar_foo_url));
1138
1139 // Cleanup.
1140 policy->RemoveIsolatedOriginForTesting(url::Origin(foo_url));
1141 policy->RemoveIsolatedOriginForTesting(url::Origin(baz_bar_foo_url));
952 } 1142 }
953 1143
954 } // namespace content 1144 } // namespace content
OLDNEW
« content/browser/site_instance_impl.cc ('K') | « content/browser/site_instance_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698