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

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

Issue 1845233003: SiteInstance unittest improvements (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@doghouse_now
Patch Set: Add missing #include for FRIEND_TEST Created 4 years, 8 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
« no previous file with comments | « content/browser/site_instance_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/compiler_specific.h" 8 #include "base/compiler_specific.h"
9 #include "base/memory/scoped_vector.h" 9 #include "base/memory/scoped_vector.h"
10 #include "base/strings/string16.h" 10 #include "base/strings/string16.h"
(...skipping 16 matching lines...) Expand all
27 #include "content/public/test/test_browser_context.h" 27 #include "content/public/test/test_browser_context.h"
28 #include "content/public/test/test_browser_thread.h" 28 #include "content/public/test/test_browser_thread.h"
29 #include "content/public/test/test_utils.h" 29 #include "content/public/test/test_utils.h"
30 #include "content/test/test_content_browser_client.h" 30 #include "content/test/test_content_browser_client.h"
31 #include "content/test/test_content_client.h" 31 #include "content/test/test_content_client.h"
32 #include "content/test/test_render_view_host.h" 32 #include "content/test/test_render_view_host.h"
33 #include "testing/gtest/include/gtest/gtest.h" 33 #include "testing/gtest/include/gtest/gtest.h"
34 #include "url/url_util.h" 34 #include "url/url_util.h"
35 35
36 namespace content { 36 namespace content {
37 namespace {
38 37
39 const char kPrivilegedScheme[] = "privileged"; 38 const char kPrivilegedScheme[] = "privileged";
40 39
41 class SiteInstanceTestBrowserClient : public TestContentBrowserClient { 40 class SiteInstanceTestBrowserClient : public TestContentBrowserClient {
42 public: 41 public:
43 SiteInstanceTestBrowserClient() 42 explicit SiteInstanceTestBrowserClient()
44 : privileged_process_id_(-1) { 43 : privileged_process_id_(-1),
44 site_instance_delete_count_(0),
45 browsing_instance_delete_count_(0) {
45 WebUIControllerFactory::RegisterFactory( 46 WebUIControllerFactory::RegisterFactory(
46 ContentWebUIControllerFactory::GetInstance()); 47 ContentWebUIControllerFactory::GetInstance());
47 } 48 }
48 49
49 ~SiteInstanceTestBrowserClient() override { 50 ~SiteInstanceTestBrowserClient() override {
50 WebUIControllerFactory::UnregisterFactoryForTesting( 51 WebUIControllerFactory::UnregisterFactoryForTesting(
51 ContentWebUIControllerFactory::GetInstance()); 52 ContentWebUIControllerFactory::GetInstance());
52 } 53 }
53 54
54 bool IsSuitableHost(RenderProcessHost* process_host, 55 bool IsSuitableHost(RenderProcessHost* process_host,
55 const GURL& site_url) override { 56 const GURL& site_url) override {
56 return (privileged_process_id_ == process_host->GetID()) == 57 return (privileged_process_id_ == process_host->GetID()) ==
57 site_url.SchemeIs(kPrivilegedScheme); 58 site_url.SchemeIs(kPrivilegedScheme);
58 } 59 }
59 60
60 void set_privileged_process_id(int process_id) { 61 void set_privileged_process_id(int process_id) {
61 privileged_process_id_ = process_id; 62 privileged_process_id_ = process_id;
62 } 63 }
63 64
65 void SiteInstanceDeleting(content::SiteInstance* site_instance) override {
66 site_instance_delete_count_++;
67 // Infer deletion of the browsing instance.
68 if (static_cast<SiteInstanceImpl*>(site_instance)
69 ->browsing_instance_->HasOneRef()) {
70 browsing_instance_delete_count_++;
71 }
72 }
73
74 int GetAndClearSiteInstanceDeleteCount() {
75 int result = site_instance_delete_count_;
76 site_instance_delete_count_ = 0;
77 return result;
78 }
79
80 int GetAndClearBrowsingInstanceDeleteCount() {
81 int result = browsing_instance_delete_count_;
82 browsing_instance_delete_count_ = 0;
83 return result;
84 }
85
64 private: 86 private:
65 int privileged_process_id_; 87 int privileged_process_id_;
88
89 int site_instance_delete_count_;
90 int browsing_instance_delete_count_;
66 }; 91 };
67 92
68 class SiteInstanceTest : public testing::Test { 93 class SiteInstanceTest : public testing::Test {
69 public: 94 public:
70 SiteInstanceTest() 95 SiteInstanceTest()
71 : ui_thread_(BrowserThread::UI, &message_loop_), 96 : ui_thread_(BrowserThread::UI, &message_loop_),
72 file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING, 97 file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING,
73 &message_loop_), 98 &message_loop_),
74 io_thread_(BrowserThread::IO, &message_loop_), 99 io_thread_(BrowserThread::IO, &message_loop_),
75 old_browser_client_(NULL) { 100 old_browser_client_(nullptr) {}
76 }
77 101
78 void SetUp() override { 102 void SetUp() override {
79 old_browser_client_ = SetBrowserClientForTesting(&browser_client_); 103 old_browser_client_ = SetBrowserClientForTesting(&browser_client_);
80 url::AddStandardScheme(kPrivilegedScheme, url::SCHEME_WITHOUT_PORT); 104 url::AddStandardScheme(kPrivilegedScheme, url::SCHEME_WITHOUT_PORT);
81 url::AddStandardScheme(kChromeUIScheme, url::SCHEME_WITHOUT_PORT); 105 url::AddStandardScheme(kChromeUIScheme, url::SCHEME_WITHOUT_PORT);
82 106
83 SiteInstanceImpl::set_render_process_host_factory(&rph_factory_); 107 SiteInstanceImpl::set_render_process_host_factory(&rph_factory_);
84 } 108 }
85 109
86 void TearDown() override { 110 void TearDown() override {
87 // Ensure that no RenderProcessHosts are left over after the tests. 111 // Ensure that no RenderProcessHosts are left over after the tests.
88 EXPECT_TRUE(RenderProcessHost::AllHostsIterator().IsAtEnd()); 112 EXPECT_TRUE(RenderProcessHost::AllHostsIterator().IsAtEnd());
89 113
90 SetBrowserClientForTesting(old_browser_client_); 114 SetBrowserClientForTesting(old_browser_client_);
91 SiteInstanceImpl::set_render_process_host_factory(NULL); 115 SiteInstanceImpl::set_render_process_host_factory(nullptr);
92 116
93 // http://crbug.com/143565 found SiteInstanceTest leaking an 117 // http://crbug.com/143565 found SiteInstanceTest leaking an
94 // AppCacheDatabase. This happens because some part of the test indirectly 118 // AppCacheDatabase. This happens because some part of the test indirectly
95 // calls StoragePartitionImplMap::PostCreateInitialization(), which posts 119 // calls StoragePartitionImplMap::PostCreateInitialization(), which posts
96 // a task to the IO thread to create the AppCacheDatabase. Since the 120 // a task to the IO thread to create the AppCacheDatabase. Since the
97 // message loop is not running, the AppCacheDatabase ends up getting 121 // message loop is not running, the AppCacheDatabase ends up getting
98 // created when DrainMessageLoops() gets called at the end of a test case. 122 // created when DrainMessageLoops() gets called at the end of a test case.
99 // Immediately after, the test case ends and the AppCacheDatabase gets 123 // Immediately after, the test case ends and the AppCacheDatabase gets
100 // scheduled for deletion. Here, call DrainMessageLoops() again so the 124 // scheduled for deletion. Here, call DrainMessageLoops() again so the
101 // AppCacheDatabase actually gets deleted. 125 // AppCacheDatabase actually gets deleted.
102 DrainMessageLoops(); 126 DrainMessageLoops();
103 } 127 }
104 128
105 void set_privileged_process_id(int process_id) { 129 void set_privileged_process_id(int process_id) {
106 browser_client_.set_privileged_process_id(process_id); 130 browser_client_.set_privileged_process_id(process_id);
107 } 131 }
108 132
109 void DrainMessageLoops() { 133 void DrainMessageLoops() {
110 // We don't just do this in TearDown() because we create TestBrowserContext 134 // We don't just do this in TearDown() because we create TestBrowserContext
111 // objects in each test, which will be destructed before 135 // objects in each test, which will be destructed before
112 // TearDown() is called. 136 // TearDown() is called.
113 base::MessageLoop::current()->RunUntilIdle(); 137 base::MessageLoop::current()->RunUntilIdle();
114 message_loop_.RunUntilIdle(); 138 message_loop_.RunUntilIdle();
115 } 139 }
116 140
141 SiteInstanceTestBrowserClient* browser_client() { return &browser_client_; }
142
117 private: 143 private:
118 base::MessageLoopForUI message_loop_; 144 base::MessageLoopForUI message_loop_;
119 TestBrowserThread ui_thread_; 145 TestBrowserThread ui_thread_;
120 TestBrowserThread file_user_blocking_thread_; 146 TestBrowserThread file_user_blocking_thread_;
121 TestBrowserThread io_thread_; 147 TestBrowserThread io_thread_;
122 148
123 SiteInstanceTestBrowserClient browser_client_; 149 SiteInstanceTestBrowserClient browser_client_;
124 ContentBrowserClient* old_browser_client_; 150 ContentBrowserClient* old_browser_client_;
125 MockRenderProcessHostFactory rph_factory_; 151 MockRenderProcessHostFactory rph_factory_;
126 }; 152 };
127 153
128 // Subclass of BrowsingInstance that updates a counter when deleted and
129 // returns TestSiteInstances from GetSiteInstanceForURL.
130 class TestBrowsingInstance : public BrowsingInstance {
131 public:
132 TestBrowsingInstance(BrowserContext* browser_context, int* delete_counter)
133 : BrowsingInstance(browser_context),
134 delete_counter_(delete_counter) {
135 }
136
137 // Make a few methods public for tests.
138 using BrowsingInstance::browser_context;
139 using BrowsingInstance::HasSiteInstance;
140 using BrowsingInstance::GetSiteInstanceForURL;
141 using BrowsingInstance::RegisterSiteInstance;
142 using BrowsingInstance::UnregisterSiteInstance;
143
144 private:
145 ~TestBrowsingInstance() override { (*delete_counter_)++; }
146
147 int* delete_counter_;
148 };
149
150 // Subclass of SiteInstanceImpl that updates a counter when deleted.
151 class TestSiteInstance : public SiteInstanceImpl {
152 public:
153 static TestSiteInstance* CreateTestSiteInstance(
154 BrowserContext* browser_context,
155 int* site_delete_counter,
156 int* browsing_delete_counter) {
157 TestBrowsingInstance* browsing_instance =
158 new TestBrowsingInstance(browser_context, browsing_delete_counter);
159 return new TestSiteInstance(browsing_instance, site_delete_counter);
160 }
161
162 private:
163 TestSiteInstance(BrowsingInstance* browsing_instance, int* delete_counter)
164 : SiteInstanceImpl(browsing_instance), delete_counter_(delete_counter) {}
165 ~TestSiteInstance() override { (*delete_counter_)++; }
166
167 int* delete_counter_;
168 };
169
170 } // namespace
171
172 // Test to ensure no memory leaks for SiteInstance objects. 154 // Test to ensure no memory leaks for SiteInstance objects.
173 TEST_F(SiteInstanceTest, SiteInstanceDestructor) { 155 TEST_F(SiteInstanceTest, SiteInstanceDestructor) {
174 // The existence of this object will cause WebContentsImpl to create our 156 // The existence of this object will cause WebContentsImpl to create our
175 // test one instead of the real one. 157 // test one instead of the real one.
176 RenderViewHostTestEnabler rvh_test_enabler; 158 RenderViewHostTestEnabler rvh_test_enabler;
177 int site_delete_counter = 0;
178 int browsing_delete_counter = 0;
179 const GURL url("test:foo"); 159 const GURL url("test:foo");
180 160
181 // Ensure that instances are deleted when their NavigationEntries are gone. 161 // Ensure that instances are deleted when their NavigationEntries are gone.
182 TestSiteInstance* instance = 162 scoped_refptr<SiteInstanceImpl> instance = SiteInstanceImpl::Create(nullptr);
183 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter, 163 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount());
184 &browsing_delete_counter);
185 EXPECT_EQ(0, site_delete_counter);
186 164
187 NavigationEntryImpl* e1 = new NavigationEntryImpl( 165 NavigationEntryImpl* e1 = new NavigationEntryImpl(
188 instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK, 166 instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK,
189 false); 167 false);
190 168
191 // Redundantly setting e1's SiteInstance shouldn't affect the ref count. 169 // Redundantly setting e1's SiteInstance shouldn't affect the ref count.
192 e1->set_site_instance(instance); 170 e1->set_site_instance(instance);
193 EXPECT_EQ(0, site_delete_counter); 171 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount());
172 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
194 173
195 // Add a second reference 174 // Add a second reference
196 NavigationEntryImpl* e2 = new NavigationEntryImpl( 175 NavigationEntryImpl* e2 = new NavigationEntryImpl(
197 instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK, 176 instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK,
198 false); 177 false);
199 178
179 instance = nullptr;
180 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount());
181 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
182
200 // Now delete both entries and be sure the SiteInstance goes away. 183 // Now delete both entries and be sure the SiteInstance goes away.
201 delete e1; 184 delete e1;
202 EXPECT_EQ(0, site_delete_counter); 185 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount());
203 EXPECT_EQ(0, browsing_delete_counter); 186 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
204 delete e2; 187 delete e2;
205 EXPECT_EQ(1, site_delete_counter);
206 // instance is now deleted 188 // instance is now deleted
207 EXPECT_EQ(1, browsing_delete_counter); 189 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount());
190 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
208 // browsing_instance is now deleted 191 // browsing_instance is now deleted
209 192
210 // Ensure that instances are deleted when their RenderViewHosts are gone. 193 // Ensure that instances are deleted when their RenderViewHosts are gone.
211 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); 194 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
212 instance =
213 TestSiteInstance::CreateTestSiteInstance(browser_context.get(),
214 &site_delete_counter,
215 &browsing_delete_counter);
216 { 195 {
217 scoped_ptr<WebContentsImpl> web_contents(static_cast<WebContentsImpl*>( 196 scoped_ptr<WebContentsImpl> web_contents(static_cast<WebContentsImpl*>(
218 WebContents::Create(WebContents::CreateParams( 197 WebContents::Create(WebContents::CreateParams(
219 browser_context.get(), instance)))); 198 browser_context.get(),
220 EXPECT_EQ(1, site_delete_counter); 199 SiteInstance::Create(browser_context.get())))));
221 EXPECT_EQ(1, browsing_delete_counter); 200 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount());
201 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
222 } 202 }
223 203
224 // Make sure that we flush any messages related to the above WebContentsImpl 204 // Make sure that we flush any messages related to the above WebContentsImpl
225 // destruction. 205 // destruction.
226 DrainMessageLoops(); 206 DrainMessageLoops();
227 207
228 EXPECT_EQ(2, site_delete_counter); 208 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount());
229 EXPECT_EQ(2, browsing_delete_counter); 209 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
230 // contents is now deleted, along with instance and browsing_instance 210 // contents is now deleted, along with instance and browsing_instance
231 } 211 }
232 212
233 // Test that NavigationEntries with SiteInstances can be cloned, but that their 213 // Test that NavigationEntries with SiteInstances can be cloned, but that their
234 // SiteInstances can be changed afterwards. Also tests that the ref counts are 214 // SiteInstances can be changed afterwards. Also tests that the ref counts are
235 // updated properly after the change. 215 // updated properly after the change.
236 TEST_F(SiteInstanceTest, CloneNavigationEntry) { 216 TEST_F(SiteInstanceTest, CloneNavigationEntry) {
237 int site_delete_counter1 = 0;
238 int site_delete_counter2 = 0;
239 int browsing_delete_counter = 0;
240 const GURL url("test:foo"); 217 const GURL url("test:foo");
241 218
242 SiteInstanceImpl* instance1 = 219 scoped_ptr<NavigationEntryImpl> e1 = make_scoped_ptr(new NavigationEntryImpl(
243 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter1, 220 SiteInstanceImpl::Create(nullptr), 0, url, Referrer(), base::string16(),
244 &browsing_delete_counter); 221 ui::PAGE_TRANSITION_LINK, false));
245 SiteInstanceImpl* instance2 =
246 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter2,
247 &browsing_delete_counter);
248 222
249 scoped_ptr<NavigationEntryImpl> e1 = make_scoped_ptr(new NavigationEntryImpl(
250 instance1, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK,
251 false));
252 // Clone the entry. 223 // Clone the entry.
253 scoped_ptr<NavigationEntryImpl> e2 = e1->Clone(); 224 scoped_ptr<NavigationEntryImpl> e2 = e1->Clone();
254 225
255 // Should be able to change the SiteInstance of the cloned entry. 226 // Should be able to change the SiteInstance of the cloned entry.
256 e2->set_site_instance(instance2); 227 e2->set_site_instance(SiteInstanceImpl::Create(nullptr));
257 228
258 // The first SiteInstance should go away after resetting e1, since e2 should 229 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount());
259 // no longer be referencing it. 230 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
231
232 // The first SiteInstance and BrowsingInstance should go away after resetting
233 // e1, since e2 should no longer be referencing it.
260 e1.reset(); 234 e1.reset();
261 EXPECT_EQ(1, site_delete_counter1); 235 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount());
262 EXPECT_EQ(0, site_delete_counter2); 236 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
263 237
264 // The second SiteInstance should go away after resetting e2. 238 // The second SiteInstance should go away after resetting e2.
265 e2.reset(); 239 e2.reset();
266 EXPECT_EQ(1, site_delete_counter1); 240 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount());
267 EXPECT_EQ(1, site_delete_counter2); 241 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
268
269 // Both BrowsingInstances are also now deleted.
270 EXPECT_EQ(2, browsing_delete_counter);
271 242
272 DrainMessageLoops(); 243 DrainMessageLoops();
273 } 244 }
274 245
275 // Test to ensure GetProcess returns and creates processes correctly. 246 // Test to ensure GetProcess returns and creates processes correctly.
276 TEST_F(SiteInstanceTest, GetProcess) { 247 TEST_F(SiteInstanceTest, GetProcess) {
277 // Ensure that GetProcess returns a process. 248 // Ensure that GetProcess returns a process.
278 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); 249 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
279 scoped_ptr<RenderProcessHost> host1; 250 scoped_ptr<RenderProcessHost> host1;
280 scoped_refptr<SiteInstanceImpl> instance( 251 scoped_refptr<SiteInstanceImpl> instance(
281 SiteInstanceImpl::Create(browser_context.get())); 252 SiteInstanceImpl::Create(browser_context.get()));
282 host1.reset(instance->GetProcess()); 253 host1.reset(instance->GetProcess());
283 EXPECT_TRUE(host1.get() != NULL); 254 EXPECT_TRUE(host1.get() != nullptr);
284 255
285 // Ensure that GetProcess creates a new process. 256 // Ensure that GetProcess creates a new process.
286 scoped_refptr<SiteInstanceImpl> instance2( 257 scoped_refptr<SiteInstanceImpl> instance2(
287 SiteInstanceImpl::Create(browser_context.get())); 258 SiteInstanceImpl::Create(browser_context.get()));
288 scoped_ptr<RenderProcessHost> host2(instance2->GetProcess()); 259 scoped_ptr<RenderProcessHost> host2(instance2->GetProcess());
289 EXPECT_TRUE(host2.get() != NULL); 260 EXPECT_TRUE(host2.get() != nullptr);
290 EXPECT_NE(host1.get(), host2.get()); 261 EXPECT_NE(host1.get(), host2.get());
291 262
292 DrainMessageLoops(); 263 DrainMessageLoops();
293 } 264 }
294 265
295 // Test to ensure SetSite and site() work properly. 266 // Test to ensure SetSite and site() work properly.
296 TEST_F(SiteInstanceTest, SetSite) { 267 TEST_F(SiteInstanceTest, SetSite) {
297 scoped_refptr<SiteInstanceImpl> instance(SiteInstanceImpl::Create(NULL)); 268 scoped_refptr<SiteInstanceImpl> instance(SiteInstanceImpl::Create(nullptr));
298 EXPECT_FALSE(instance->HasSite()); 269 EXPECT_FALSE(instance->HasSite());
299 EXPECT_TRUE(instance->GetSiteURL().is_empty()); 270 EXPECT_TRUE(instance->GetSiteURL().is_empty());
300 271
301 instance->SetSite(GURL("http://www.google.com/index.html")); 272 instance->SetSite(GURL("http://www.google.com/index.html"));
302 EXPECT_EQ(GURL("http://google.com"), instance->GetSiteURL()); 273 EXPECT_EQ(GURL("http://google.com"), instance->GetSiteURL());
303 274
304 EXPECT_TRUE(instance->HasSite()); 275 EXPECT_TRUE(instance->HasSite());
305 276
306 DrainMessageLoops(); 277 DrainMessageLoops();
307 } 278 }
308 279
309 // Test to ensure GetSiteForURL properly returns sites for URLs. 280 // Test to ensure GetSiteForURL properly returns sites for URLs.
310 TEST_F(SiteInstanceTest, GetSiteForURL) { 281 TEST_F(SiteInstanceTest, GetSiteForURL) {
311 // Pages are irrelevant. 282 // Pages are irrelevant.
312 GURL test_url = GURL("http://www.google.com/index.html"); 283 GURL test_url = GURL("http://www.google.com/index.html");
313 GURL site_url = SiteInstanceImpl::GetSiteForURL(NULL, test_url); 284 GURL site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
314 EXPECT_EQ(GURL("http://google.com"), site_url); 285 EXPECT_EQ(GURL("http://google.com"), site_url);
315 EXPECT_EQ("http", site_url.scheme()); 286 EXPECT_EQ("http", site_url.scheme());
316 EXPECT_EQ("google.com", site_url.host()); 287 EXPECT_EQ("google.com", site_url.host());
317 288
318 // Ports are irrlevant. 289 // Ports are irrlevant.
319 test_url = GURL("https://www.google.com:8080"); 290 test_url = GURL("https://www.google.com:8080");
320 site_url = SiteInstanceImpl::GetSiteForURL(NULL, test_url); 291 site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
321 EXPECT_EQ(GURL("https://google.com"), site_url); 292 EXPECT_EQ(GURL("https://google.com"), site_url);
322 293
323 // Hostnames without TLDs are ok. 294 // Hostnames without TLDs are ok.
324 test_url = GURL("http://foo/a.html"); 295 test_url = GURL("http://foo/a.html");
325 site_url = SiteInstanceImpl::GetSiteForURL(NULL, test_url); 296 site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
326 EXPECT_EQ(GURL("http://foo"), site_url); 297 EXPECT_EQ(GURL("http://foo"), site_url);
327 EXPECT_EQ("foo", site_url.host()); 298 EXPECT_EQ("foo", site_url.host());
328 299
329 // File URLs should include the scheme. 300 // File URLs should include the scheme.
330 test_url = GURL("file:///C:/Downloads/"); 301 test_url = GURL("file:///C:/Downloads/");
331 site_url = SiteInstanceImpl::GetSiteForURL(NULL, test_url); 302 site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
332 EXPECT_EQ(GURL("file:"), site_url); 303 EXPECT_EQ(GURL("file:"), site_url);
333 EXPECT_EQ("file", site_url.scheme()); 304 EXPECT_EQ("file", site_url.scheme());
334 EXPECT_FALSE(site_url.has_host()); 305 EXPECT_FALSE(site_url.has_host());
335 306
336 // Some file URLs have hosts in the path. 307 // Some file URLs have hosts in the path.
337 test_url = GURL("file://server/path"); 308 test_url = GURL("file://server/path");
338 site_url = SiteInstanceImpl::GetSiteForURL(NULL, test_url); 309 site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
339 EXPECT_EQ(GURL("file://server"), site_url); 310 EXPECT_EQ(GURL("file://server"), site_url);
340 EXPECT_EQ("server", site_url.host()); 311 EXPECT_EQ("server", site_url.host());
341 312
342 // Data URLs should include the scheme. 313 // Data URLs should include the scheme.
343 test_url = GURL("data:text/html,foo"); 314 test_url = GURL("data:text/html,foo");
344 site_url = SiteInstanceImpl::GetSiteForURL(NULL, test_url); 315 site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
345 EXPECT_EQ(GURL("data:"), site_url); 316 EXPECT_EQ(GURL("data:"), site_url);
346 EXPECT_EQ("data", site_url.scheme()); 317 EXPECT_EQ("data", site_url.scheme());
347 EXPECT_FALSE(site_url.has_host()); 318 EXPECT_FALSE(site_url.has_host());
348 319
349 // Javascript URLs should include the scheme. 320 // Javascript URLs should include the scheme.
350 test_url = GURL("javascript:foo();"); 321 test_url = GURL("javascript:foo();");
351 site_url = SiteInstanceImpl::GetSiteForURL(NULL, test_url); 322 site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
352 EXPECT_EQ(GURL("javascript:"), site_url); 323 EXPECT_EQ(GURL("javascript:"), site_url);
353 EXPECT_EQ("javascript", site_url.scheme()); 324 EXPECT_EQ("javascript", site_url.scheme());
354 EXPECT_FALSE(site_url.has_host()); 325 EXPECT_FALSE(site_url.has_host());
355 326
356 // Guest URLs are special and need to have the path in the site as well, 327 // Guest URLs are special and need to have the path in the site as well,
357 // since it affects the StoragePartition configuration. 328 // since it affects the StoragePartition configuration.
358 std::string guest_url(kGuestScheme); 329 std::string guest_url(kGuestScheme);
359 guest_url.append("://abc123/path"); 330 guest_url.append("://abc123/path");
360 test_url = GURL(guest_url); 331 test_url = GURL(guest_url);
361 site_url = SiteInstanceImpl::GetSiteForURL(NULL, test_url); 332 site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
362 EXPECT_EQ(test_url, site_url); 333 EXPECT_EQ(test_url, site_url);
363 334
364 DrainMessageLoops(); 335 DrainMessageLoops();
365 } 336 }
366 337
367 // Test of distinguishing URLs from different sites. Most of this logic is 338 // Test of distinguishing URLs from different sites. Most of this logic is
368 // tested in RegistryControlledDomainTest. This test focuses on URLs with 339 // tested in RegistryControlledDomainTest. This test focuses on URLs with
369 // different schemes or ports. 340 // different schemes or ports.
370 TEST_F(SiteInstanceTest, IsSameWebSite) { 341 TEST_F(SiteInstanceTest, IsSameWebSite) {
371 GURL url_foo = GURL("http://foo/a.html"); 342 GURL url_foo = GURL("http://foo/a.html");
372 GURL url_foo2 = GURL("http://foo/b.html"); 343 GURL url_foo2 = GURL("http://foo/b.html");
373 GURL url_foo_https = GURL("https://foo/a.html"); 344 GURL url_foo_https = GURL("https://foo/a.html");
374 GURL url_foo_port = GURL("http://foo:8080/a.html"); 345 GURL url_foo_port = GURL("http://foo:8080/a.html");
375 GURL url_javascript = GURL("javascript:alert(1);"); 346 GURL url_javascript = GURL("javascript:alert(1);");
376 GURL url_blank = GURL(url::kAboutBlankURL); 347 GURL url_blank = GURL(url::kAboutBlankURL);
377 348
378 // Same scheme and port -> same site. 349 // Same scheme and port -> same site.
379 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo, url_foo2)); 350 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, url_foo, url_foo2));
380 351
381 // Different scheme -> different site. 352 // Different scheme -> different site.
382 EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_foo, url_foo_https)); 353 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, url_foo, url_foo_https));
383 354
384 // Different port -> same site. 355 // Different port -> same site.
385 // (Changes to document.domain make renderer ignore the port.) 356 // (Changes to document.domain make renderer ignore the port.)
386 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo, url_foo_port)); 357 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, url_foo, url_foo_port));
387 358
388 // JavaScript links should be considered same site for anything. 359 // JavaScript links should be considered same site for anything.
389 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_javascript, url_foo)); 360 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, url_javascript, url_foo));
390 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_javascript, url_foo_https)); 361 EXPECT_TRUE(
391 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_javascript, url_foo_port)); 362 SiteInstance::IsSameWebSite(nullptr, url_javascript, url_foo_https));
363 EXPECT_TRUE(
364 SiteInstance::IsSameWebSite(nullptr, url_javascript, url_foo_port));
392 365
393 // Navigating to a blank page is considered the same site. 366 // Navigating to a blank page is considered the same site.
394 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo, url_blank)); 367 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, url_foo, url_blank));
395 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo_https, url_blank)); 368 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, url_foo_https, url_blank));
396 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo_port, url_blank)); 369 EXPECT_TRUE(SiteInstance::IsSameWebSite(nullptr, url_foo_port, url_blank));
397 370
398 // Navigating from a blank site is not considered to be the same site. 371 // Navigating from a blank site is not considered to be the same site.
399 EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_blank, url_foo)); 372 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, url_blank, url_foo));
400 EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_blank, url_foo_https)); 373 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, url_blank, url_foo_https));
401 EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_blank, url_foo_port)); 374 EXPECT_FALSE(SiteInstance::IsSameWebSite(nullptr, url_blank, url_foo_port));
402 375
403 DrainMessageLoops(); 376 DrainMessageLoops();
404 } 377 }
405 378
406 // Test to ensure that there is only one SiteInstance per site in a given 379 // Test to ensure that there is only one SiteInstance per site in a given
407 // BrowsingInstance, when process-per-site is not in use. 380 // BrowsingInstance, when process-per-site is not in use.
408 TEST_F(SiteInstanceTest, OneSiteInstancePerSite) { 381 TEST_F(SiteInstanceTest, OneSiteInstancePerSite) {
409 ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch( 382 ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch(
410 switches::kProcessPerSite)); 383 switches::kProcessPerSite));
411 int delete_counter = 0;
412 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); 384 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
413 TestBrowsingInstance* browsing_instance = 385 BrowsingInstance* browsing_instance =
414 new TestBrowsingInstance(browser_context.get(), &delete_counter); 386 new BrowsingInstance(browser_context.get());
415 387
416 const GURL url_a1("http://www.google.com/1.html"); 388 const GURL url_a1("http://www.google.com/1.html");
417 scoped_refptr<SiteInstanceImpl> site_instance_a1( 389 scoped_refptr<SiteInstanceImpl> site_instance_a1(
418 browsing_instance->GetSiteInstanceForURL(url_a1)); 390 browsing_instance->GetSiteInstanceForURL(url_a1));
419 EXPECT_TRUE(site_instance_a1.get() != NULL); 391 EXPECT_TRUE(site_instance_a1.get() != nullptr);
420 392
421 // A separate site should create a separate SiteInstance. 393 // A separate site should create a separate SiteInstance.
422 const GURL url_b1("http://www.yahoo.com/"); 394 const GURL url_b1("http://www.yahoo.com/");
423 scoped_refptr<SiteInstanceImpl> site_instance_b1( 395 scoped_refptr<SiteInstanceImpl> site_instance_b1(
424 396
425 browsing_instance->GetSiteInstanceForURL(url_b1)); 397 browsing_instance->GetSiteInstanceForURL(url_b1));
426 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get()); 398 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get());
427 EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get())); 399 EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get()));
428 400
429 // Getting the new SiteInstance from the BrowsingInstance and from another 401 // Getting the new SiteInstance from the BrowsingInstance and from another
430 // SiteInstance in the BrowsingInstance should give the same result. 402 // SiteInstance in the BrowsingInstance should give the same result.
431 EXPECT_EQ(site_instance_b1.get(), 403 EXPECT_EQ(site_instance_b1.get(),
432 site_instance_a1->GetRelatedSiteInstance(url_b1)); 404 site_instance_a1->GetRelatedSiteInstance(url_b1));
433 405
434 // A second visit to the original site should return the same SiteInstance. 406 // A second visit to the original site should return the same SiteInstance.
435 const GURL url_a2("http://www.google.com/2.html"); 407 const GURL url_a2("http://www.google.com/2.html");
436 EXPECT_EQ(site_instance_a1.get(), 408 EXPECT_EQ(site_instance_a1.get(),
437 browsing_instance->GetSiteInstanceForURL(url_a2)); 409 browsing_instance->GetSiteInstanceForURL(url_a2));
438 EXPECT_EQ(site_instance_a1.get(), 410 EXPECT_EQ(site_instance_a1.get(),
439 site_instance_a1->GetRelatedSiteInstance(url_a2)); 411 site_instance_a1->GetRelatedSiteInstance(url_a2));
440 412
441 // A visit to the original site in a new BrowsingInstance (same or different 413 // A visit to the original site in a new BrowsingInstance (same or different
442 // browser context) should return a different SiteInstance. 414 // browser context) should return a different SiteInstance.
443 TestBrowsingInstance* browsing_instance2 = 415 BrowsingInstance* browsing_instance2 =
444 new TestBrowsingInstance(browser_context.get(), &delete_counter); 416 new BrowsingInstance(browser_context.get());
445 // Ensure the new SiteInstance is ref counted so that it gets deleted. 417 // Ensure the new SiteInstance is ref counted so that it gets deleted.
446 scoped_refptr<SiteInstanceImpl> site_instance_a2_2( 418 scoped_refptr<SiteInstanceImpl> site_instance_a2_2(
447 browsing_instance2->GetSiteInstanceForURL(url_a2)); 419 browsing_instance2->GetSiteInstanceForURL(url_a2));
448 EXPECT_NE(site_instance_a1.get(), site_instance_a2_2.get()); 420 EXPECT_NE(site_instance_a1.get(), site_instance_a2_2.get());
449 EXPECT_FALSE( 421 EXPECT_FALSE(
450 site_instance_a1->IsRelatedSiteInstance(site_instance_a2_2.get())); 422 site_instance_a1->IsRelatedSiteInstance(site_instance_a2_2.get()));
451 423
452 // The two SiteInstances for http://google.com should not use the same process 424 // The two SiteInstances for http://google.com should not use the same process
453 // if process-per-site is not enabled. 425 // if process-per-site is not enabled.
454 scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess()); 426 scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess());
(...skipping 18 matching lines...) Expand all
473 // The processes will be unregistered when the RPH scoped_ptrs go away. 445 // The processes will be unregistered when the RPH scoped_ptrs go away.
474 446
475 DrainMessageLoops(); 447 DrainMessageLoops();
476 } 448 }
477 449
478 // Test to ensure that there is only one RenderProcessHost per site for an 450 // Test to ensure that there is only one RenderProcessHost per site for an
479 // entire BrowserContext, if process-per-site is in use. 451 // entire BrowserContext, if process-per-site is in use.
480 TEST_F(SiteInstanceTest, OneSiteInstancePerSiteInBrowserContext) { 452 TEST_F(SiteInstanceTest, OneSiteInstancePerSiteInBrowserContext) {
481 base::CommandLine::ForCurrentProcess()->AppendSwitch( 453 base::CommandLine::ForCurrentProcess()->AppendSwitch(
482 switches::kProcessPerSite); 454 switches::kProcessPerSite);
483 int delete_counter = 0;
484 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); 455 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
485 TestBrowsingInstance* browsing_instance = 456 scoped_refptr<BrowsingInstance> browsing_instance =
486 new TestBrowsingInstance(browser_context.get(), &delete_counter); 457 new BrowsingInstance(browser_context.get());
487 458
488 const GURL url_a1("http://www.google.com/1.html"); 459 const GURL url_a1("http://www.google.com/1.html");
489 scoped_refptr<SiteInstanceImpl> site_instance_a1( 460 scoped_refptr<SiteInstanceImpl> site_instance_a1(
490 browsing_instance->GetSiteInstanceForURL(url_a1)); 461 browsing_instance->GetSiteInstanceForURL(url_a1));
491 EXPECT_TRUE(site_instance_a1.get() != NULL); 462 EXPECT_TRUE(site_instance_a1.get() != nullptr);
492 scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess()); 463 scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess());
493 464
494 // A separate site should create a separate SiteInstance. 465 // A separate site should create a separate SiteInstance.
495 const GURL url_b1("http://www.yahoo.com/"); 466 const GURL url_b1("http://www.yahoo.com/");
496 scoped_refptr<SiteInstanceImpl> site_instance_b1( 467 scoped_refptr<SiteInstanceImpl> site_instance_b1(
497 browsing_instance->GetSiteInstanceForURL(url_b1)); 468 browsing_instance->GetSiteInstanceForURL(url_b1));
498 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get()); 469 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get());
499 EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get())); 470 EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get()));
500 471
501 // Getting the new SiteInstance from the BrowsingInstance and from another 472 // Getting the new SiteInstance from the BrowsingInstance and from another
502 // SiteInstance in the BrowsingInstance should give the same result. 473 // SiteInstance in the BrowsingInstance should give the same result.
503 EXPECT_EQ(site_instance_b1.get(), 474 EXPECT_EQ(site_instance_b1.get(),
504 site_instance_a1->GetRelatedSiteInstance(url_b1)); 475 site_instance_a1->GetRelatedSiteInstance(url_b1));
505 476
506 // A second visit to the original site should return the same SiteInstance. 477 // A second visit to the original site should return the same SiteInstance.
507 const GURL url_a2("http://www.google.com/2.html"); 478 const GURL url_a2("http://www.google.com/2.html");
508 EXPECT_EQ(site_instance_a1.get(), 479 EXPECT_EQ(site_instance_a1.get(),
509 browsing_instance->GetSiteInstanceForURL(url_a2)); 480 browsing_instance->GetSiteInstanceForURL(url_a2));
510 EXPECT_EQ(site_instance_a1.get(), 481 EXPECT_EQ(site_instance_a1.get(),
511 site_instance_a1->GetRelatedSiteInstance(url_a2)); 482 site_instance_a1->GetRelatedSiteInstance(url_a2));
512 483
513 // A visit to the original site in a new BrowsingInstance (same browser 484 // A visit to the original site in a new BrowsingInstance (same browser
514 // context) should return a different SiteInstance with the same process. 485 // context) should return a different SiteInstance with the same process.
515 TestBrowsingInstance* browsing_instance2 = 486 BrowsingInstance* browsing_instance2 =
516 new TestBrowsingInstance(browser_context.get(), &delete_counter); 487 new BrowsingInstance(browser_context.get());
517 scoped_refptr<SiteInstanceImpl> site_instance_a1_2( 488 scoped_refptr<SiteInstanceImpl> site_instance_a1_2(
518 browsing_instance2->GetSiteInstanceForURL(url_a1)); 489 browsing_instance2->GetSiteInstanceForURL(url_a1));
519 EXPECT_TRUE(site_instance_a1.get() != NULL); 490 EXPECT_TRUE(site_instance_a1.get() != nullptr);
520 EXPECT_NE(site_instance_a1.get(), site_instance_a1_2.get()); 491 EXPECT_NE(site_instance_a1.get(), site_instance_a1_2.get());
521 EXPECT_EQ(process_a1.get(), site_instance_a1_2->GetProcess()); 492 EXPECT_EQ(process_a1.get(), site_instance_a1_2->GetProcess());
522 493
523 // A visit to the original site in a new BrowsingInstance (different browser 494 // A visit to the original site in a new BrowsingInstance (different browser
524 // context) should return a different SiteInstance with a different process. 495 // context) should return a different SiteInstance with a different process.
525 scoped_ptr<TestBrowserContext> browser_context2(new TestBrowserContext()); 496 scoped_ptr<TestBrowserContext> browser_context2(new TestBrowserContext());
526 TestBrowsingInstance* browsing_instance3 = 497 BrowsingInstance* browsing_instance3 =
527 new TestBrowsingInstance(browser_context2.get(), &delete_counter); 498 new BrowsingInstance(browser_context2.get());
528 scoped_refptr<SiteInstanceImpl> site_instance_a2_3( 499 scoped_refptr<SiteInstanceImpl> site_instance_a2_3(
529 browsing_instance3->GetSiteInstanceForURL(url_a2)); 500 browsing_instance3->GetSiteInstanceForURL(url_a2));
530 EXPECT_TRUE(site_instance_a2_3.get() != NULL); 501 EXPECT_TRUE(site_instance_a2_3.get() != nullptr);
531 scoped_ptr<RenderProcessHost> process_a2_3(site_instance_a2_3->GetProcess()); 502 scoped_ptr<RenderProcessHost> process_a2_3(site_instance_a2_3->GetProcess());
532 EXPECT_NE(site_instance_a1.get(), site_instance_a2_3.get()); 503 EXPECT_NE(site_instance_a1.get(), site_instance_a2_3.get());
533 EXPECT_NE(process_a1.get(), process_a2_3.get()); 504 EXPECT_NE(process_a1.get(), process_a2_3.get());
534 505
535 // Should be able to see that we do have SiteInstances. 506 // Should be able to see that we do have SiteInstances.
536 EXPECT_TRUE(browsing_instance->HasSiteInstance( 507 EXPECT_TRUE(browsing_instance->HasSiteInstance(
537 GURL("http://mail.google.com"))); // visited before 508 GURL("http://mail.google.com"))); // visited before
538 EXPECT_TRUE(browsing_instance2->HasSiteInstance( 509 EXPECT_TRUE(browsing_instance2->HasSiteInstance(
539 GURL("http://mail.google.com"))); // visited before 510 GURL("http://mail.google.com"))); // visited before
540 EXPECT_TRUE(browsing_instance->HasSiteInstance( 511 EXPECT_TRUE(browsing_instance->HasSiteInstance(
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 instance->SetSite(GURL("http://evernote.com/")); 608 instance->SetSite(GURL("http://evernote.com/"));
638 EXPECT_TRUE(instance->HasSite()); 609 EXPECT_TRUE(instance->HasSite());
639 610
640 // Check prior to "assigning" a process to the instance, which is expected 611 // Check prior to "assigning" a process to the instance, which is expected
641 // to return false due to not being attached to any process yet. 612 // to return false due to not being attached to any process yet.
642 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://google.com"))); 613 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://google.com")));
643 614
644 // The call to GetProcess actually creates a new real process, which works 615 // The call to GetProcess actually creates a new real process, which works
645 // fine, but might be a cause for problems in different contexts. 616 // fine, but might be a cause for problems in different contexts.
646 host.reset(instance->GetProcess()); 617 host.reset(instance->GetProcess());
647 EXPECT_TRUE(host.get() != NULL); 618 EXPECT_TRUE(host.get() != nullptr);
648 EXPECT_TRUE(instance->HasProcess()); 619 EXPECT_TRUE(instance->HasProcess());
649 620
650 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://evernote.com"))); 621 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://evernote.com")));
651 EXPECT_FALSE(instance->HasWrongProcessForURL( 622 EXPECT_FALSE(instance->HasWrongProcessForURL(
652 GURL("javascript:alert(document.location.href);"))); 623 GURL("javascript:alert(document.location.href);")));
653 624
654 EXPECT_TRUE(instance->HasWrongProcessForURL(GURL("chrome://gpu"))); 625 EXPECT_TRUE(instance->HasWrongProcessForURL(GURL("chrome://gpu")));
655 626
656 // Test that WebUI SiteInstances reject normal web URLs. 627 // Test that WebUI SiteInstances reject normal web URLs.
657 const GURL webui_url("chrome://gpu"); 628 const GURL webui_url("chrome://gpu");
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
695 instance->SetSite(GURL("http://evernote.com/")); 666 instance->SetSite(GURL("http://evernote.com/"));
696 EXPECT_TRUE(instance->HasSite()); 667 EXPECT_TRUE(instance->HasSite());
697 668
698 // Check prior to "assigning" a process to the instance, which is expected 669 // Check prior to "assigning" a process to the instance, which is expected
699 // to return false due to not being attached to any process yet. 670 // to return false due to not being attached to any process yet.
700 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://google.com"))); 671 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://google.com")));
701 672
702 // The call to GetProcess actually creates a new real process, which works 673 // The call to GetProcess actually creates a new real process, which works
703 // fine, but might be a cause for problems in different contexts. 674 // fine, but might be a cause for problems in different contexts.
704 host.reset(instance->GetProcess()); 675 host.reset(instance->GetProcess());
705 EXPECT_TRUE(host.get() != NULL); 676 EXPECT_TRUE(host.get() != nullptr);
706 EXPECT_TRUE(instance->HasProcess()); 677 EXPECT_TRUE(instance->HasProcess());
707 678
708 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://evernote.com"))); 679 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://evernote.com")));
709 EXPECT_FALSE(instance->HasWrongProcessForURL( 680 EXPECT_FALSE(instance->HasWrongProcessForURL(
710 GURL("javascript:alert(document.location.href);"))); 681 GURL("javascript:alert(document.location.href);")));
711 682
712 EXPECT_TRUE(instance->HasWrongProcessForURL(GURL("chrome://gpu"))); 683 EXPECT_TRUE(instance->HasWrongProcessForURL(GURL("chrome://gpu")));
713 684
714 DrainMessageLoops(); 685 DrainMessageLoops();
715 } 686 }
(...skipping 11 matching lines...) Expand all
727 EXPECT_TRUE(instance->GetSiteURL().is_empty()); 698 EXPECT_TRUE(instance->GetSiteURL().is_empty());
728 699
729 // Simulate navigating to a WebUI URL in a process that does not have WebUI 700 // Simulate navigating to a WebUI URL in a process that does not have WebUI
730 // bindings. This already requires bypassing security checks. 701 // bindings. This already requires bypassing security checks.
731 const GURL webui_url("chrome://gpu"); 702 const GURL webui_url("chrome://gpu");
732 instance->SetSite(webui_url); 703 instance->SetSite(webui_url);
733 EXPECT_TRUE(instance->HasSite()); 704 EXPECT_TRUE(instance->HasSite());
734 705
735 // The call to GetProcess actually creates a new real process. 706 // The call to GetProcess actually creates a new real process.
736 host.reset(instance->GetProcess()); 707 host.reset(instance->GetProcess());
737 EXPECT_TRUE(host.get() != NULL); 708 EXPECT_TRUE(host.get() != nullptr);
738 EXPECT_TRUE(instance->HasProcess()); 709 EXPECT_TRUE(instance->HasProcess());
739 710
740 // Without bindings, this should look like the wrong process. 711 // Without bindings, this should look like the wrong process.
741 EXPECT_TRUE(instance->HasWrongProcessForURL(webui_url)); 712 EXPECT_TRUE(instance->HasWrongProcessForURL(webui_url));
742 713
743 // WebUI uses process-per-site, so another instance would normally use the 714 // WebUI uses process-per-site, so another instance would normally use the
744 // same process. Make sure it doesn't use the same process if the bindings 715 // same process. Make sure it doesn't use the same process if the bindings
745 // are missing. 716 // are missing.
746 scoped_refptr<SiteInstanceImpl> instance2( 717 scoped_refptr<SiteInstanceImpl> instance2(
747 SiteInstanceImpl::Create(browser_context.get())); 718 SiteInstanceImpl::Create(browser_context.get()));
748 instance2->SetSite(webui_url); 719 instance2->SetSite(webui_url);
749 host2.reset(instance2->GetProcess()); 720 host2.reset(instance2->GetProcess());
750 EXPECT_TRUE(host2.get() != NULL); 721 EXPECT_TRUE(host2.get() != nullptr);
751 EXPECT_TRUE(instance2->HasProcess()); 722 EXPECT_TRUE(instance2->HasProcess());
752 EXPECT_NE(host.get(), host2.get()); 723 EXPECT_NE(host.get(), host2.get());
753 724
754 DrainMessageLoops(); 725 DrainMessageLoops();
755 } 726 }
756 727
757 // Test that we do not register processes with empty sites for process-per-site 728 // Test that we do not register processes with empty sites for process-per-site
758 // mode. 729 // mode.
759 TEST_F(SiteInstanceTest, NoProcessPerSiteForEmptySite) { 730 TEST_F(SiteInstanceTest, NoProcessPerSiteForEmptySite) {
760 base::CommandLine::ForCurrentProcess()->AppendSwitch( 731 base::CommandLine::ForCurrentProcess()->AppendSwitch(
761 switches::kProcessPerSite); 732 switches::kProcessPerSite);
762 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); 733 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
763 scoped_ptr<RenderProcessHost> host; 734 scoped_ptr<RenderProcessHost> host;
764 scoped_refptr<SiteInstanceImpl> instance( 735 scoped_refptr<SiteInstanceImpl> instance(
765 SiteInstanceImpl::Create(browser_context.get())); 736 SiteInstanceImpl::Create(browser_context.get()));
766 737
767 instance->SetSite(GURL()); 738 instance->SetSite(GURL());
768 EXPECT_TRUE(instance->HasSite()); 739 EXPECT_TRUE(instance->HasSite());
769 EXPECT_TRUE(instance->GetSiteURL().is_empty()); 740 EXPECT_TRUE(instance->GetSiteURL().is_empty());
770 host.reset(instance->GetProcess()); 741 host.reset(instance->GetProcess());
771 742
772 EXPECT_FALSE(RenderProcessHostImpl::GetProcessHostForSite( 743 EXPECT_FALSE(RenderProcessHostImpl::GetProcessHostForSite(
773 browser_context.get(), GURL())); 744 browser_context.get(), GURL()));
774 745
775 DrainMessageLoops(); 746 DrainMessageLoops();
776 } 747 }
777 748
749 TEST_F(SiteInstanceTest, DefaultSubframeSiteInstance) {
750 if (AreAllSitesIsolatedForTesting())
751 return; // --top-document-isolation is not possible.
752
753 base::CommandLine::ForCurrentProcess()->AppendSwitch(
754 switches::kTopDocumentIsolation);
755
756 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
757 scoped_refptr<SiteInstanceImpl> main_instance =
758 SiteInstanceImpl::Create(browser_context.get());
759 scoped_refptr<SiteInstanceImpl> subframe_instance =
760 main_instance->GetDefaultSubframeSiteInstance();
761 int subframe_instance_id = subframe_instance->GetId();
762
763 EXPECT_NE(main_instance, subframe_instance);
764 EXPECT_EQ(subframe_instance, main_instance->GetDefaultSubframeSiteInstance());
765 EXPECT_FALSE(main_instance->is_default_subframe_site_instance());
766 EXPECT_TRUE(subframe_instance->is_default_subframe_site_instance());
767
768 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount());
769 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
770
771 // Free the subframe instance.
772 subframe_instance = nullptr;
773 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount());
774 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
775
776 // Calling GetDefaultSubframeSiteInstance again should return a new
777 // SiteInstance with a different ID from the original.
778 subframe_instance = main_instance->GetDefaultSubframeSiteInstance();
779 EXPECT_NE(subframe_instance->GetId(), subframe_instance_id);
780 EXPECT_FALSE(main_instance->is_default_subframe_site_instance());
781 EXPECT_TRUE(subframe_instance->is_default_subframe_site_instance());
782 EXPECT_EQ(subframe_instance->GetDefaultSubframeSiteInstance(),
783 subframe_instance);
784 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount());
785 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
786
787 // Free the main instance.
788 main_instance = nullptr;
789 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount());
790 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
791
792 // Free the subframe instance, which should free the browsing instance.
793 subframe_instance = nullptr;
794 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount());
795 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount());
796 }
797
778 } // namespace content 798 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/site_instance_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698