OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/browser/site_instance.h" | 5 #include "chrome/browser/site_instance.h" |
6 | 6 |
7 #include "net/base/registry_controlled_domain.h" | 7 #include "net/base/registry_controlled_domain.h" |
8 | 8 |
9 SiteInstance::~SiteInstance() { | 9 SiteInstance::~SiteInstance() { |
10 // Now that no one is referencing us, we can safely remove ourselves from | 10 // Now that no one is referencing us, we can safely remove ourselves from |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 /*static*/ | 78 /*static*/ |
79 GURL SiteInstance::GetSiteForURL(const GURL& url) { | 79 GURL SiteInstance::GetSiteForURL(const GURL& url) { |
80 // URLs with no host should have an empty site. | 80 // URLs with no host should have an empty site. |
81 GURL site; | 81 GURL site; |
82 | 82 |
83 // TODO(creis): For many protocols, we should just treat the scheme as the | 83 // TODO(creis): For many protocols, we should just treat the scheme as the |
84 // site, since there is no host. e.g., file:, about:, chrome-resource: | 84 // site, since there is no host. e.g., file:, about:, chrome-resource: |
85 | 85 |
86 // If the url has a host, then determine the site. | 86 // If the url has a host, then determine the site. |
87 if (url.has_host()) { | 87 if (url.has_host()) { |
88 // Only keep the scheme, registered domain, and port as given by GetOrigin. | 88 // Only keep the scheme and registered domain as given by GetOrigin. This |
| 89 // may also include a port, which we need to drop. |
89 site = url.GetOrigin(); | 90 site = url.GetOrigin(); |
90 | 91 |
| 92 // Remove port, if any. |
| 93 if (site.has_port()) { |
| 94 GURL::Replacements rep; |
| 95 rep.ClearPort(); |
| 96 site = site.ReplaceComponents(rep); |
| 97 } |
| 98 |
91 // If this URL has a registered domain, we only want to remember that part. | 99 // If this URL has a registered domain, we only want to remember that part. |
92 std::string domain = | 100 std::string domain = |
93 net::RegistryControlledDomainService::GetDomainAndRegistry(url); | 101 net::RegistryControlledDomainService::GetDomainAndRegistry(url); |
94 if (!domain.empty()) { | 102 if (!domain.empty()) { |
95 GURL::Replacements rep; | 103 GURL::Replacements rep; |
96 rep.SetHostStr(domain); | 104 rep.SetHostStr(domain); |
97 site = site.ReplaceComponents(rep); | 105 site = site.ReplaceComponents(rep); |
98 } | 106 } |
99 } | 107 } |
100 return site; | 108 return site; |
101 } | 109 } |
102 | 110 |
103 /*static*/ | 111 /*static*/ |
104 bool SiteInstance::IsSameWebSite(const GURL& url1, const GURL& url2) { | 112 bool SiteInstance::IsSameWebSite(const GURL& url1, const GURL& url2) { |
105 // We infer web site boundaries based on the registered domain name of the | 113 // We infer web site boundaries based on the registered domain name of the |
106 // top-level page, as well as the scheme and the port. | 114 // top-level page and the scheme. We do not pay attention to the port if |
| 115 // one is present, because pages served from different ports can still |
| 116 // access each other if they change their document.domain variable. |
107 | 117 |
108 // We must treat javascript: URLs as part of the same site, regardless of | 118 // We must treat javascript: URLs as part of the same site, regardless of |
109 // the site. | 119 // the site. |
110 if (url1.SchemeIs("javascript") || url2.SchemeIs("javascript")) | 120 if (url1.SchemeIs("javascript") || url2.SchemeIs("javascript")) |
111 return true; | 121 return true; |
112 | 122 |
113 // We treat about:crash, about:hang, and about:shorthang as the same site as | 123 // We treat about:crash, about:hang, and about:shorthang as the same site as |
114 // any URL, since they are used as demos for crashing/hanging a process. | 124 // any URL, since they are used as demos for crashing/hanging a process. |
115 GURL about_crash = GURL("about:crash"); | 125 GURL about_crash = GURL("about:crash"); |
116 GURL about_hang = GURL("about:hang"); | 126 GURL about_hang = GURL("about:hang"); |
117 GURL about_shorthang = GURL("about:shorthang"); | 127 GURL about_shorthang = GURL("about:shorthang"); |
118 if (url1 == about_crash || url2 == about_crash || | 128 if (url1 == about_crash || url2 == about_crash || |
119 url1 == about_hang || url2 == about_hang || | 129 url1 == about_hang || url2 == about_hang || |
120 url1 == about_shorthang || url2 == about_shorthang) | 130 url1 == about_shorthang || url2 == about_shorthang) |
121 return true; | 131 return true; |
122 | 132 |
123 // If either URL is invalid, they aren't part of the same site. | 133 // If either URL is invalid, they aren't part of the same site. |
124 if (!url1.is_valid() || !url2.is_valid()) { | 134 if (!url1.is_valid() || !url2.is_valid()) { |
125 return false; | 135 return false; |
126 } | 136 } |
127 | 137 |
128 // If the scheme or port differ, they aren't part of the same site. | 138 // If the schemes differ, they aren't part of the same site. |
129 if (url1.scheme() != url2.scheme() || url1.port() != url2.port()) { | 139 if (url1.scheme() != url2.scheme()) { |
130 return false; | 140 return false; |
131 } | 141 } |
132 | 142 |
133 return net::RegistryControlledDomainService::SameDomainOrHost(url1, url2); | 143 return net::RegistryControlledDomainService::SameDomainOrHost(url1, url2); |
134 } | 144 } |
135 | 145 |
OLD | NEW |