| OLD | NEW |
| 1 // Copyright (c) 2011 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 "base/compiler_specific.h" | 5 #include "base/compiler_specific.h" |
| 6 #include "base/stl_util.h" | 6 #include "base/stl_util.h" |
| 7 #include "base/string16.h" | 7 #include "base/string16.h" |
| 8 #include "content/browser/browser_thread_impl.h" | 8 #include "content/browser/browser_thread_impl.h" |
| 9 #include "content/browser/browsing_instance.h" | 9 #include "content/browser/browsing_instance.h" |
| 10 #include "content/browser/child_process_security_policy.h" | 10 #include "content/browser/child_process_security_policy.h" |
| 11 #include "content/browser/mock_content_browser_client.h" | 11 #include "content/browser/mock_content_browser_client.h" |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 MessageLoopForUI message_loop_; | 104 MessageLoopForUI message_loop_; |
| 105 BrowserThreadImpl ui_thread_; | 105 BrowserThreadImpl ui_thread_; |
| 106 | 106 |
| 107 SiteInstanceTestBrowserClient browser_client_; | 107 SiteInstanceTestBrowserClient browser_client_; |
| 108 content::ContentBrowserClient* old_browser_client_; | 108 content::ContentBrowserClient* old_browser_client_; |
| 109 }; | 109 }; |
| 110 | 110 |
| 111 class TestBrowsingInstance : public BrowsingInstance { | 111 class TestBrowsingInstance : public BrowsingInstance { |
| 112 public: | 112 public: |
| 113 TestBrowsingInstance(content::BrowserContext* browser_context, | 113 TestBrowsingInstance(content::BrowserContext* browser_context, |
| 114 int* deleteCounter) | 114 int* delete_counter) |
| 115 : BrowsingInstance(browser_context), | 115 : BrowsingInstance(browser_context), |
| 116 use_process_per_site(false), | 116 use_process_per_site_(false), |
| 117 deleteCounter_(deleteCounter) { | 117 delete_counter_(delete_counter) { |
| 118 } | 118 } |
| 119 | 119 |
| 120 // Overrides BrowsingInstance::ShouldUseProcessPerSite so that we can test | 120 // Overrides BrowsingInstance::ShouldUseProcessPerSite so that we can test |
| 121 // both alternatives without using command-line switches. | 121 // both alternatives without using command-line switches. |
| 122 bool ShouldUseProcessPerSite(const GURL& url) { | 122 bool ShouldUseProcessPerSite(const GURL& url) { |
| 123 return use_process_per_site; | 123 return use_process_per_site_; |
| 124 } |
| 125 |
| 126 void set_use_process_per_site(bool use_process_per_site) { |
| 127 use_process_per_site_ = use_process_per_site; |
| 128 } |
| 129 |
| 130 private: |
| 131 virtual ~TestBrowsingInstance() { |
| 132 (*delete_counter_)++; |
| 124 } | 133 } |
| 125 | 134 |
| 126 // Set by individual tests. | 135 // Set by individual tests. |
| 127 bool use_process_per_site; | 136 bool use_process_per_site_; |
| 128 | 137 |
| 129 private: | 138 int* delete_counter_; |
| 130 ~TestBrowsingInstance() { | |
| 131 (*deleteCounter_)++; | |
| 132 } | |
| 133 | |
| 134 int* deleteCounter_; | |
| 135 }; | 139 }; |
| 136 | 140 |
| 137 class TestSiteInstance : public SiteInstance { | 141 class TestSiteInstance : public SiteInstance { |
| 138 public: | 142 public: |
| 139 static TestSiteInstance* CreateTestSiteInstance( | 143 static TestSiteInstance* CreateTestSiteInstance( |
| 140 content::BrowserContext* browser_context, | 144 content::BrowserContext* browser_context, |
| 141 int* siteDeleteCounter, | 145 int* site_delete_counter, |
| 142 int* browsingDeleteCounter) { | 146 int* browsing_delete_counter) { |
| 143 TestBrowsingInstance* browsing_instance = | 147 TestBrowsingInstance* browsing_instance = |
| 144 new TestBrowsingInstance(browser_context, browsingDeleteCounter); | 148 new TestBrowsingInstance(browser_context, browsing_delete_counter); |
| 145 return new TestSiteInstance(browsing_instance, siteDeleteCounter); | 149 return new TestSiteInstance(browsing_instance, site_delete_counter); |
| 146 } | 150 } |
| 147 | 151 |
| 148 private: | 152 private: |
| 149 TestSiteInstance(BrowsingInstance* browsing_instance, int* deleteCounter) | 153 TestSiteInstance(BrowsingInstance* browsing_instance, int* delete_counter) |
| 150 : SiteInstance(browsing_instance), deleteCounter_(deleteCounter) {} | 154 : SiteInstance(browsing_instance), delete_counter_(delete_counter) {} |
| 151 ~TestSiteInstance() { | 155 virtual ~TestSiteInstance() { |
| 152 (*deleteCounter_)++; | 156 (*delete_counter_)++; |
| 153 } | 157 } |
| 154 | 158 |
| 155 int* deleteCounter_; | 159 int* delete_counter_; |
| 156 }; | 160 }; |
| 157 | 161 |
| 158 } // namespace | 162 } // namespace |
| 159 | 163 |
| 160 // Test to ensure no memory leaks for SiteInstance objects. | 164 // Test to ensure no memory leaks for SiteInstance objects. |
| 161 TEST_F(SiteInstanceTest, SiteInstanceDestructor) { | 165 TEST_F(SiteInstanceTest, SiteInstanceDestructor) { |
| 162 // The existence of these factories will cause TabContents to create our test | 166 // The existence of these factories will cause TabContents to create our test |
| 163 // one instead of the real one. | 167 // one instead of the real one. |
| 164 MockRenderProcessHostFactory rph_factory; | 168 MockRenderProcessHostFactory rph_factory; |
| 165 TestRenderViewHostFactory rvh_factory(&rph_factory); | 169 TestRenderViewHostFactory rvh_factory(&rph_factory); |
| 166 int siteDeleteCounter = 0; | 170 int site_delete_counter = 0; |
| 167 int browsingDeleteCounter = 0; | 171 int browsing_delete_counter = 0; |
| 168 const GURL url("test:foo"); | 172 const GURL url("test:foo"); |
| 169 | 173 |
| 170 // Ensure that instances are deleted when their NavigationEntries are gone. | 174 // Ensure that instances are deleted when their NavigationEntries are gone. |
| 171 TestSiteInstance* instance = | 175 TestSiteInstance* instance = |
| 172 TestSiteInstance::CreateTestSiteInstance(NULL, &siteDeleteCounter, | 176 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter, |
| 173 &browsingDeleteCounter); | 177 &browsing_delete_counter); |
| 174 EXPECT_EQ(0, siteDeleteCounter); | 178 EXPECT_EQ(0, site_delete_counter); |
| 175 | 179 |
| 176 NavigationEntry* e1 = new NavigationEntry(instance, 0, url, | 180 NavigationEntry* e1 = new NavigationEntry(instance, 0, url, |
| 177 content::Referrer(), | 181 content::Referrer(), |
| 178 string16(), | 182 string16(), |
| 179 content::PAGE_TRANSITION_LINK, | 183 content::PAGE_TRANSITION_LINK, |
| 180 false); | 184 false); |
| 181 | 185 |
| 182 // Redundantly setting e1's SiteInstance shouldn't affect the ref count. | 186 // Redundantly setting e1's SiteInstance shouldn't affect the ref count. |
| 183 e1->set_site_instance(instance); | 187 e1->set_site_instance(instance); |
| 184 EXPECT_EQ(0, siteDeleteCounter); | 188 EXPECT_EQ(0, site_delete_counter); |
| 185 | 189 |
| 186 // Add a second reference | 190 // Add a second reference |
| 187 NavigationEntry* e2 = new NavigationEntry(instance, 0, url, | 191 NavigationEntry* e2 = new NavigationEntry(instance, 0, url, |
| 188 content::Referrer(), string16(), | 192 content::Referrer(), string16(), |
| 189 content::PAGE_TRANSITION_LINK, | 193 content::PAGE_TRANSITION_LINK, |
| 190 false); | 194 false); |
| 191 | 195 |
| 192 // Now delete both entries and be sure the SiteInstance goes away. | 196 // Now delete both entries and be sure the SiteInstance goes away. |
| 193 delete e1; | 197 delete e1; |
| 194 EXPECT_EQ(0, siteDeleteCounter); | 198 EXPECT_EQ(0, site_delete_counter); |
| 195 EXPECT_EQ(0, browsingDeleteCounter); | 199 EXPECT_EQ(0, browsing_delete_counter); |
| 196 delete e2; | 200 delete e2; |
| 197 EXPECT_EQ(1, siteDeleteCounter); | 201 EXPECT_EQ(1, site_delete_counter); |
| 198 // instance is now deleted | 202 // instance is now deleted |
| 199 EXPECT_EQ(1, browsingDeleteCounter); | 203 EXPECT_EQ(1, browsing_delete_counter); |
| 200 // browsing_instance is now deleted | 204 // browsing_instance is now deleted |
| 201 | 205 |
| 202 // Ensure that instances are deleted when their RenderViewHosts are gone. | 206 // Ensure that instances are deleted when their RenderViewHosts are gone. |
| 203 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); | 207 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); |
| 204 instance = | 208 instance = |
| 205 TestSiteInstance::CreateTestSiteInstance(browser_context.get(), | 209 TestSiteInstance::CreateTestSiteInstance(browser_context.get(), |
| 206 &siteDeleteCounter, | 210 &site_delete_counter, |
| 207 &browsingDeleteCounter); | 211 &browsing_delete_counter); |
| 208 { | 212 { |
| 209 TabContents contents(browser_context.get(), | 213 TabContents contents(browser_context.get(), |
| 210 instance, | 214 instance, |
| 211 MSG_ROUTING_NONE, | 215 MSG_ROUTING_NONE, |
| 212 NULL, | 216 NULL, |
| 213 NULL); | 217 NULL); |
| 214 EXPECT_EQ(1, siteDeleteCounter); | 218 EXPECT_EQ(1, site_delete_counter); |
| 215 EXPECT_EQ(1, browsingDeleteCounter); | 219 EXPECT_EQ(1, browsing_delete_counter); |
| 216 } | 220 } |
| 217 | 221 |
| 218 // Make sure that we flush any messages related to the above TabContents | 222 // Make sure that we flush any messages related to the above TabContents |
| 219 // destruction. | 223 // destruction. |
| 220 MessageLoop::current()->RunAllPending(); | 224 MessageLoop::current()->RunAllPending(); |
| 221 | 225 |
| 222 EXPECT_EQ(2, siteDeleteCounter); | 226 EXPECT_EQ(2, site_delete_counter); |
| 223 EXPECT_EQ(2, browsingDeleteCounter); | 227 EXPECT_EQ(2, browsing_delete_counter); |
| 224 // contents is now deleted, along with instance and browsing_instance | 228 // contents is now deleted, along with instance and browsing_instance |
| 225 } | 229 } |
| 226 | 230 |
| 227 // Test that NavigationEntries with SiteInstances can be cloned, but that their | 231 // Test that NavigationEntries with SiteInstances can be cloned, but that their |
| 228 // SiteInstances can be changed afterwards. Also tests that the ref counts are | 232 // SiteInstances can be changed afterwards. Also tests that the ref counts are |
| 229 // updated properly after the change. | 233 // updated properly after the change. |
| 230 TEST_F(SiteInstanceTest, CloneNavigationEntry) { | 234 TEST_F(SiteInstanceTest, CloneNavigationEntry) { |
| 231 int siteDeleteCounter1 = 0; | 235 int site_delete_counter1 = 0; |
| 232 int siteDeleteCounter2 = 0; | 236 int site_delete_counter2 = 0; |
| 233 int browsingDeleteCounter = 0; | 237 int browsing_delete_counter = 0; |
| 234 const GURL url("test:foo"); | 238 const GURL url("test:foo"); |
| 235 | 239 |
| 236 SiteInstance* instance1 = | 240 SiteInstance* instance1 = |
| 237 TestSiteInstance::CreateTestSiteInstance(NULL, &siteDeleteCounter1, | 241 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter1, |
| 238 &browsingDeleteCounter); | 242 &browsing_delete_counter); |
| 239 SiteInstance* instance2 = | 243 SiteInstance* instance2 = |
| 240 TestSiteInstance::CreateTestSiteInstance(NULL, &siteDeleteCounter2, | 244 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter2, |
| 241 &browsingDeleteCounter); | 245 &browsing_delete_counter); |
| 242 | 246 |
| 243 NavigationEntry* e1 = new NavigationEntry(instance1, 0, url, | 247 NavigationEntry* e1 = new NavigationEntry(instance1, 0, url, |
| 244 content::Referrer(), string16(), | 248 content::Referrer(), string16(), |
| 245 content::PAGE_TRANSITION_LINK, | 249 content::PAGE_TRANSITION_LINK, |
| 246 false); | 250 false); |
| 247 // Clone the entry | 251 // Clone the entry |
| 248 NavigationEntry* e2 = new NavigationEntry(*e1); | 252 NavigationEntry* e2 = new NavigationEntry(*e1); |
| 249 | 253 |
| 250 // Should be able to change the SiteInstance of the cloned entry. | 254 // Should be able to change the SiteInstance of the cloned entry. |
| 251 e2->set_site_instance(instance2); | 255 e2->set_site_instance(instance2); |
| 252 | 256 |
| 253 // The first SiteInstance should go away after deleting e1, since e2 should | 257 // The first SiteInstance should go away after deleting e1, since e2 should |
| 254 // no longer be referencing it. | 258 // no longer be referencing it. |
| 255 delete e1; | 259 delete e1; |
| 256 EXPECT_EQ(1, siteDeleteCounter1); | 260 EXPECT_EQ(1, site_delete_counter1); |
| 257 EXPECT_EQ(0, siteDeleteCounter2); | 261 EXPECT_EQ(0, site_delete_counter2); |
| 258 | 262 |
| 259 // The second SiteInstance should go away after deleting e2. | 263 // The second SiteInstance should go away after deleting e2. |
| 260 delete e2; | 264 delete e2; |
| 261 EXPECT_EQ(1, siteDeleteCounter1); | 265 EXPECT_EQ(1, site_delete_counter1); |
| 262 EXPECT_EQ(1, siteDeleteCounter2); | 266 EXPECT_EQ(1, site_delete_counter2); |
| 263 | 267 |
| 264 // Both BrowsingInstances are also now deleted | 268 // Both BrowsingInstances are also now deleted |
| 265 EXPECT_EQ(2, browsingDeleteCounter); | 269 EXPECT_EQ(2, browsing_delete_counter); |
| 266 } | 270 } |
| 267 | 271 |
| 268 // Test to ensure GetProcess returns and creates processes correctly. | 272 // Test to ensure GetProcess returns and creates processes correctly. |
| 269 TEST_F(SiteInstanceTest, GetProcess) { | 273 TEST_F(SiteInstanceTest, GetProcess) { |
| 270 // Ensure that GetProcess returns a process. | 274 // Ensure that GetProcess returns a process. |
| 271 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); | 275 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); |
| 272 scoped_ptr<content::RenderProcessHost> host1; | 276 scoped_ptr<content::RenderProcessHost> host1; |
| 273 scoped_refptr<SiteInstance> instance( | 277 scoped_refptr<SiteInstance> instance( |
| 274 SiteInstance::CreateSiteInstance(browser_context.get())); | 278 SiteInstance::CreateSiteInstance(browser_context.get())); |
| 275 host1.reset(instance->GetProcess()); | 279 host1.reset(instance->GetProcess()); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 // The URLs specified by the ContentBrowserClient should also be treated as | 358 // The URLs specified by the ContentBrowserClient should also be treated as |
| 355 // same site. | 359 // same site. |
| 356 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_crash, url_foo)); | 360 EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_crash, url_foo)); |
| 357 EXPECT_TRUE( | 361 EXPECT_TRUE( |
| 358 SiteInstance::IsSameWebSite(NULL, url_browser_specified, url_foo)); | 362 SiteInstance::IsSameWebSite(NULL, url_browser_specified, url_foo)); |
| 359 } | 363 } |
| 360 | 364 |
| 361 // Test to ensure that there is only one SiteInstance per site in a given | 365 // Test to ensure that there is only one SiteInstance per site in a given |
| 362 // BrowsingInstance, when process-per-site is not in use. | 366 // BrowsingInstance, when process-per-site is not in use. |
| 363 TEST_F(SiteInstanceTest, OneSiteInstancePerSite) { | 367 TEST_F(SiteInstanceTest, OneSiteInstancePerSite) { |
| 364 int deleteCounter = 0; | 368 int delete_counter = 0; |
| 365 TestBrowsingInstance* browsing_instance = | 369 TestBrowsingInstance* browsing_instance = |
| 366 new TestBrowsingInstance(NULL, &deleteCounter); | 370 new TestBrowsingInstance(NULL, &delete_counter); |
| 367 browsing_instance->use_process_per_site = false; | 371 browsing_instance->set_use_process_per_site(false); |
| 368 | 372 |
| 369 const GURL url_a1("http://www.google.com/1.html"); | 373 const GURL url_a1("http://www.google.com/1.html"); |
| 370 scoped_refptr<SiteInstance> site_instance_a1( | 374 scoped_refptr<SiteInstance> site_instance_a1( |
| 371 browsing_instance->GetSiteInstanceForURL(url_a1)); | 375 browsing_instance->GetSiteInstanceForURL(url_a1)); |
| 372 EXPECT_TRUE(site_instance_a1.get() != NULL); | 376 EXPECT_TRUE(site_instance_a1.get() != NULL); |
| 373 | 377 |
| 374 // A separate site should create a separate SiteInstance. | 378 // A separate site should create a separate SiteInstance. |
| 375 const GURL url_b1("http://www.yahoo.com/"); | 379 const GURL url_b1("http://www.yahoo.com/"); |
| 376 scoped_refptr<SiteInstance> site_instance_b1( | 380 scoped_refptr<SiteInstance> site_instance_b1( |
| 377 browsing_instance->GetSiteInstanceForURL(url_b1)); | 381 browsing_instance->GetSiteInstanceForURL(url_b1)); |
| 378 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get()); | 382 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get()); |
| 379 | 383 |
| 380 // Getting the new SiteInstance from the BrowsingInstance and from another | 384 // Getting the new SiteInstance from the BrowsingInstance and from another |
| 381 // SiteInstance in the BrowsingInstance should give the same result. | 385 // SiteInstance in the BrowsingInstance should give the same result. |
| 382 EXPECT_EQ(site_instance_b1.get(), | 386 EXPECT_EQ(site_instance_b1.get(), |
| 383 site_instance_a1->GetRelatedSiteInstance(url_b1)); | 387 site_instance_a1->GetRelatedSiteInstance(url_b1)); |
| 384 | 388 |
| 385 // A second visit to the original site should return the same SiteInstance. | 389 // A second visit to the original site should return the same SiteInstance. |
| 386 const GURL url_a2("http://www.google.com/2.html"); | 390 const GURL url_a2("http://www.google.com/2.html"); |
| 387 EXPECT_EQ(site_instance_a1.get(), | 391 EXPECT_EQ(site_instance_a1.get(), |
| 388 browsing_instance->GetSiteInstanceForURL(url_a2)); | 392 browsing_instance->GetSiteInstanceForURL(url_a2)); |
| 389 EXPECT_EQ(site_instance_a1.get(), | 393 EXPECT_EQ(site_instance_a1.get(), |
| 390 site_instance_a1->GetRelatedSiteInstance(url_a2)); | 394 site_instance_a1->GetRelatedSiteInstance(url_a2)); |
| 391 | 395 |
| 392 // A visit to the original site in a new BrowsingInstance (same or different | 396 // A visit to the original site in a new BrowsingInstance (same or different |
| 393 // browser context) should return a different SiteInstance. | 397 // browser context) should return a different SiteInstance. |
| 394 TestBrowsingInstance* browsing_instance2 = | 398 TestBrowsingInstance* browsing_instance2 = |
| 395 new TestBrowsingInstance(NULL, &deleteCounter); | 399 new TestBrowsingInstance(NULL, &delete_counter); |
| 396 browsing_instance2->use_process_per_site = false; | 400 browsing_instance2->set_use_process_per_site(false); |
| 397 // Ensure the new SiteInstance is ref counted so that it gets deleted. | 401 // Ensure the new SiteInstance is ref counted so that it gets deleted. |
| 398 scoped_refptr<SiteInstance> site_instance_a2_2( | 402 scoped_refptr<SiteInstance> site_instance_a2_2( |
| 399 browsing_instance2->GetSiteInstanceForURL(url_a2)); | 403 browsing_instance2->GetSiteInstanceForURL(url_a2)); |
| 400 EXPECT_NE(site_instance_a1.get(), site_instance_a2_2.get()); | 404 EXPECT_NE(site_instance_a1.get(), site_instance_a2_2.get()); |
| 401 | 405 |
| 402 // Should be able to see that we do have SiteInstances. | 406 // Should be able to see that we do have SiteInstances. |
| 403 EXPECT_TRUE(browsing_instance->HasSiteInstance( | 407 EXPECT_TRUE(browsing_instance->HasSiteInstance( |
| 404 GURL("http://mail.google.com"))); | 408 GURL("http://mail.google.com"))); |
| 405 EXPECT_TRUE(browsing_instance2->HasSiteInstance( | 409 EXPECT_TRUE(browsing_instance2->HasSiteInstance( |
| 406 GURL("http://mail.google.com"))); | 410 GURL("http://mail.google.com"))); |
| 407 EXPECT_TRUE(browsing_instance->HasSiteInstance( | 411 EXPECT_TRUE(browsing_instance->HasSiteInstance( |
| 408 GURL("http://mail.yahoo.com"))); | 412 GURL("http://mail.yahoo.com"))); |
| 409 | 413 |
| 410 // Should be able to see that we don't have SiteInstances. | 414 // Should be able to see that we don't have SiteInstances. |
| 411 EXPECT_FALSE(browsing_instance->HasSiteInstance( | 415 EXPECT_FALSE(browsing_instance->HasSiteInstance( |
| 412 GURL("https://www.google.com"))); | 416 GURL("https://www.google.com"))); |
| 413 EXPECT_FALSE(browsing_instance2->HasSiteInstance( | 417 EXPECT_FALSE(browsing_instance2->HasSiteInstance( |
| 414 GURL("http://www.yahoo.com"))); | 418 GURL("http://www.yahoo.com"))); |
| 415 | 419 |
| 416 // browsing_instances will be deleted when their SiteInstances are deleted | 420 // browsing_instances will be deleted when their SiteInstances are deleted |
| 417 } | 421 } |
| 418 | 422 |
| 419 // Test to ensure that there is only one SiteInstance per site for an entire | 423 // Test to ensure that there is only one SiteInstance per site for an entire |
| 420 // BrowserContext, if process-per-site is in use. | 424 // BrowserContext, if process-per-site is in use. |
| 421 TEST_F(SiteInstanceTest, OneSiteInstancePerSiteInBrowserContext) { | 425 TEST_F(SiteInstanceTest, OneSiteInstancePerSiteInBrowserContext) { |
| 422 int deleteCounter = 0; | 426 int delete_counter = 0; |
| 423 TestBrowsingInstance* browsing_instance = | 427 TestBrowsingInstance* browsing_instance = |
| 424 new TestBrowsingInstance(NULL, &deleteCounter); | 428 new TestBrowsingInstance(NULL, &delete_counter); |
| 425 browsing_instance->use_process_per_site = true; | 429 browsing_instance->set_use_process_per_site(true); |
| 426 | 430 |
| 427 const GURL url_a1("http://www.google.com/1.html"); | 431 const GURL url_a1("http://www.google.com/1.html"); |
| 428 scoped_refptr<SiteInstance> site_instance_a1( | 432 scoped_refptr<SiteInstance> site_instance_a1( |
| 429 browsing_instance->GetSiteInstanceForURL(url_a1)); | 433 browsing_instance->GetSiteInstanceForURL(url_a1)); |
| 430 EXPECT_TRUE(site_instance_a1.get() != NULL); | 434 EXPECT_TRUE(site_instance_a1.get() != NULL); |
| 431 | 435 |
| 432 // A separate site should create a separate SiteInstance. | 436 // A separate site should create a separate SiteInstance. |
| 433 const GURL url_b1("http://www.yahoo.com/"); | 437 const GURL url_b1("http://www.yahoo.com/"); |
| 434 scoped_refptr<SiteInstance> site_instance_b1( | 438 scoped_refptr<SiteInstance> site_instance_b1( |
| 435 browsing_instance->GetSiteInstanceForURL(url_b1)); | 439 browsing_instance->GetSiteInstanceForURL(url_b1)); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 446 browsing_instance->GetSiteInstanceForURL(url_a2)); | 450 browsing_instance->GetSiteInstanceForURL(url_a2)); |
| 447 EXPECT_EQ(site_instance_a1.get(), | 451 EXPECT_EQ(site_instance_a1.get(), |
| 448 site_instance_a1->GetRelatedSiteInstance(url_a2)); | 452 site_instance_a1->GetRelatedSiteInstance(url_a2)); |
| 449 | 453 |
| 450 // A visit to the original site in a new BrowsingInstance (same browser | 454 // A visit to the original site in a new BrowsingInstance (same browser |
| 451 // context) should also return the same SiteInstance. | 455 // context) should also return the same SiteInstance. |
| 452 // This BrowsingInstance doesn't get its own SiteInstance within the test, so | 456 // This BrowsingInstance doesn't get its own SiteInstance within the test, so |
| 453 // it won't be deleted by its children. Thus, we'll keep a ref count to it | 457 // it won't be deleted by its children. Thus, we'll keep a ref count to it |
| 454 // to make sure it gets deleted. | 458 // to make sure it gets deleted. |
| 455 scoped_refptr<TestBrowsingInstance> browsing_instance2( | 459 scoped_refptr<TestBrowsingInstance> browsing_instance2( |
| 456 new TestBrowsingInstance(NULL, &deleteCounter)); | 460 new TestBrowsingInstance(NULL, &delete_counter)); |
| 457 browsing_instance2->use_process_per_site = true; | 461 browsing_instance2->set_use_process_per_site(true); |
| 458 EXPECT_EQ(site_instance_a1.get(), | 462 EXPECT_EQ(site_instance_a1.get(), |
| 459 browsing_instance2->GetSiteInstanceForURL(url_a2)); | 463 browsing_instance2->GetSiteInstanceForURL(url_a2)); |
| 460 | 464 |
| 461 // A visit to the original site in a new BrowsingInstance (different browser | 465 // A visit to the original site in a new BrowsingInstance (different browser |
| 462 // context) should return a different SiteInstance. | 466 // context) should return a different SiteInstance. |
| 463 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); | 467 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); |
| 464 TestBrowsingInstance* browsing_instance3 = | 468 TestBrowsingInstance* browsing_instance3 = |
| 465 new TestBrowsingInstance(browser_context.get(), &deleteCounter); | 469 new TestBrowsingInstance(browser_context.get(), &delete_counter); |
| 466 browsing_instance3->use_process_per_site = true; | 470 browsing_instance3->set_use_process_per_site(true); |
| 467 // Ensure the new SiteInstance is ref counted so that it gets deleted. | 471 // Ensure the new SiteInstance is ref counted so that it gets deleted. |
| 468 scoped_refptr<SiteInstance> site_instance_a2_3( | 472 scoped_refptr<SiteInstance> site_instance_a2_3( |
| 469 browsing_instance3->GetSiteInstanceForURL(url_a2)); | 473 browsing_instance3->GetSiteInstanceForURL(url_a2)); |
| 470 EXPECT_NE(site_instance_a1.get(), site_instance_a2_3.get()); | 474 EXPECT_NE(site_instance_a1.get(), site_instance_a2_3.get()); |
| 471 | 475 |
| 472 // Should be able to see that we do have SiteInstances. | 476 // Should be able to see that we do have SiteInstances. |
| 473 EXPECT_TRUE(browsing_instance->HasSiteInstance( | 477 EXPECT_TRUE(browsing_instance->HasSiteInstance( |
| 474 GURL("http://mail.google.com"))); // visited before | 478 GURL("http://mail.google.com"))); // visited before |
| 475 EXPECT_TRUE(browsing_instance2->HasSiteInstance( | 479 EXPECT_TRUE(browsing_instance2->HasSiteInstance( |
| 476 GURL("http://mail.google.com"))); // visited before | 480 GURL("http://mail.google.com"))); // visited before |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 scoped_ptr<content::RenderProcessHost> extension_host( | 524 scoped_ptr<content::RenderProcessHost> extension_host( |
| 521 extension1_instance->GetProcess()); | 525 extension1_instance->GetProcess()); |
| 522 EXPECT_EQ(extension1_instance->GetProcess(), | 526 EXPECT_EQ(extension1_instance->GetProcess(), |
| 523 extension2_instance->GetProcess()); | 527 extension2_instance->GetProcess()); |
| 524 | 528 |
| 525 // Create some WebUI instances and make sure they share a process. | 529 // Create some WebUI instances and make sure they share a process. |
| 526 scoped_refptr<SiteInstance> webui1_instance(CreateSiteInstance(&rph_factory, | 530 scoped_refptr<SiteInstance> webui1_instance(CreateSiteInstance(&rph_factory, |
| 527 GURL(chrome::kChromeUIScheme + std::string("://newtab")))); | 531 GURL(chrome::kChromeUIScheme + std::string("://newtab")))); |
| 528 policy->GrantWebUIBindings(webui1_instance->GetProcess()->GetID()); | 532 policy->GrantWebUIBindings(webui1_instance->GetProcess()->GetID()); |
| 529 | 533 |
| 530 scoped_refptr<SiteInstance> webui2_instance( CreateSiteInstance(&rph_factory, | 534 scoped_refptr<SiteInstance> webui2_instance(CreateSiteInstance(&rph_factory, |
| 531 GURL(chrome::kChromeUIScheme + std::string("://history")))); | 535 GURL(chrome::kChromeUIScheme + std::string("://history")))); |
| 532 | 536 |
| 533 scoped_ptr<content::RenderProcessHost> dom_host( | 537 scoped_ptr<content::RenderProcessHost> dom_host( |
| 534 webui1_instance->GetProcess()); | 538 webui1_instance->GetProcess()); |
| 535 EXPECT_EQ(webui1_instance->GetProcess(), webui2_instance->GetProcess()); | 539 EXPECT_EQ(webui1_instance->GetProcess(), webui2_instance->GetProcess()); |
| 536 | 540 |
| 537 // Make sure none of differing privilege processes are mixed. | 541 // Make sure none of differing privilege processes are mixed. |
| 538 EXPECT_NE(extension1_instance->GetProcess(), webui1_instance->GetProcess()); | 542 EXPECT_NE(extension1_instance->GetProcess(), webui1_instance->GetProcess()); |
| 539 | 543 |
| 540 for (size_t i = 0; i < content::kMaxRendererProcessCount; ++i) { | 544 for (size_t i = 0; i < content::kMaxRendererProcessCount; ++i) { |
| 541 EXPECT_NE(extension1_instance->GetProcess(), hosts[i]); | 545 EXPECT_NE(extension1_instance->GetProcess(), hosts[i]); |
| 542 EXPECT_NE(webui1_instance->GetProcess(), hosts[i]); | 546 EXPECT_NE(webui1_instance->GetProcess(), hosts[i]); |
| 543 } | 547 } |
| 544 | 548 |
| 545 STLDeleteContainerPointers(hosts.begin(), hosts.end()); | 549 STLDeleteContainerPointers(hosts.begin(), hosts.end()); |
| 546 } | 550 } |
| 551 |
| 552 // Test to ensure that HasWrongProcessForURL behaves properly for different |
| 553 // types of URLs. |
| 554 TEST_F(SiteInstanceTest, HasWrongProcessForURL) { |
| 555 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); |
| 556 scoped_ptr<content::RenderProcessHost> host; |
| 557 scoped_refptr<SiteInstance> instance( |
| 558 SiteInstance::CreateSiteInstance(browser_context.get())); |
| 559 |
| 560 EXPECT_FALSE(instance->has_site()); |
| 561 EXPECT_TRUE(instance->site().is_empty()); |
| 562 |
| 563 instance->SetSite(GURL("http://evernote.com/")); |
| 564 EXPECT_TRUE(instance->has_site()); |
| 565 |
| 566 // Check prior to "assigning" a process to the instance, which is expected |
| 567 // to return false due to not being attached to any process yet. |
| 568 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://google.com"))); |
| 569 |
| 570 // The call to GetProcess actually creates a new real process, which works |
| 571 // fine, but might be a cause for problems in different contexts. |
| 572 host.reset(instance->GetProcess()); |
| 573 EXPECT_TRUE(host.get() != NULL); |
| 574 EXPECT_TRUE(instance->HasProcess()); |
| 575 |
| 576 EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://evernote.com"))); |
| 577 EXPECT_FALSE(instance->HasWrongProcessForURL( |
| 578 GURL("javascript:alert(document.location.href);"))); |
| 579 |
| 580 EXPECT_TRUE(instance->HasWrongProcessForURL(GURL("chrome://settings"))); |
| 581 } |
| OLD | NEW |