Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 { | |
|
Charlie Reis
2016/04/01 21:50:41
Cool! Nice use of this method, which we didn't ha
ncarter (slow)
2016/04/04 21:47:33
Done.
| |
| 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 int GetAndClearBrowsingInstanceDeleteCount() { | |
| 80 int result = browsing_instance_delete_count_; | |
| 81 browsing_instance_delete_count_ = 0; | |
| 82 return result; | |
| 83 } | |
| 84 | |
| 64 private: | 85 private: |
| 65 int privileged_process_id_; | 86 int privileged_process_id_; |
| 87 | |
| 88 int site_instance_delete_count_; | |
| 89 int browsing_instance_delete_count_; | |
| 66 }; | 90 }; |
| 67 | 91 |
| 92 namespace { | |
| 93 | |
| 68 class SiteInstanceTest : public testing::Test { | 94 class SiteInstanceTest : public testing::Test { |
| 69 public: | 95 public: |
| 70 SiteInstanceTest() | 96 SiteInstanceTest() |
| 71 : ui_thread_(BrowserThread::UI, &message_loop_), | 97 : ui_thread_(BrowserThread::UI, &message_loop_), |
| 72 file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING, | 98 file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING, |
| 73 &message_loop_), | 99 &message_loop_), |
| 74 io_thread_(BrowserThread::IO, &message_loop_), | 100 io_thread_(BrowserThread::IO, &message_loop_), |
| 75 old_browser_client_(NULL) { | 101 old_browser_client_(NULL) { |
| 76 } | 102 } |
| 77 | 103 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 107 } | 133 } |
| 108 | 134 |
| 109 void DrainMessageLoops() { | 135 void DrainMessageLoops() { |
| 110 // We don't just do this in TearDown() because we create TestBrowserContext | 136 // We don't just do this in TearDown() because we create TestBrowserContext |
| 111 // objects in each test, which will be destructed before | 137 // objects in each test, which will be destructed before |
| 112 // TearDown() is called. | 138 // TearDown() is called. |
| 113 base::MessageLoop::current()->RunUntilIdle(); | 139 base::MessageLoop::current()->RunUntilIdle(); |
| 114 message_loop_.RunUntilIdle(); | 140 message_loop_.RunUntilIdle(); |
| 115 } | 141 } |
| 116 | 142 |
| 143 SiteInstanceTestBrowserClient* browser_client() { return &browser_client_; } | |
| 144 | |
| 117 private: | 145 private: |
| 118 base::MessageLoopForUI message_loop_; | 146 base::MessageLoopForUI message_loop_; |
| 119 TestBrowserThread ui_thread_; | 147 TestBrowserThread ui_thread_; |
| 120 TestBrowserThread file_user_blocking_thread_; | 148 TestBrowserThread file_user_blocking_thread_; |
| 121 TestBrowserThread io_thread_; | 149 TestBrowserThread io_thread_; |
| 122 | 150 |
| 123 SiteInstanceTestBrowserClient browser_client_; | 151 SiteInstanceTestBrowserClient browser_client_; |
| 124 ContentBrowserClient* old_browser_client_; | 152 ContentBrowserClient* old_browser_client_; |
| 125 MockRenderProcessHostFactory rph_factory_; | 153 MockRenderProcessHostFactory rph_factory_; |
| 126 }; | 154 }; |
| 127 | 155 |
| 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 | 156 } // namespace |
| 171 | 157 |
| 172 // Test to ensure no memory leaks for SiteInstance objects. | 158 // Test to ensure no memory leaks for SiteInstance objects. |
| 173 TEST_F(SiteInstanceTest, SiteInstanceDestructor) { | 159 TEST_F(SiteInstanceTest, SiteInstanceDestructor) { |
| 174 // The existence of this object will cause WebContentsImpl to create our | 160 // The existence of this object will cause WebContentsImpl to create our |
| 175 // test one instead of the real one. | 161 // test one instead of the real one. |
| 176 RenderViewHostTestEnabler rvh_test_enabler; | 162 RenderViewHostTestEnabler rvh_test_enabler; |
| 177 int site_delete_counter = 0; | |
| 178 int browsing_delete_counter = 0; | |
| 179 const GURL url("test:foo"); | 163 const GURL url("test:foo"); |
| 180 | 164 |
| 181 // Ensure that instances are deleted when their NavigationEntries are gone. | 165 // Ensure that instances are deleted when their NavigationEntries are gone. |
| 182 TestSiteInstance* instance = | 166 scoped_refptr<SiteInstanceImpl> instance = SiteInstanceImpl::Create(NULL); |
|
Charlie Reis
2016/04/01 21:50:41
nit: nullptr while we're at it? (Same below.)
ncarter (slow)
2016/04/04 21:47:33
NULL->nullptr replaced globally in the file.
| |
| 183 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter, | 167 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 184 &browsing_delete_counter); | |
| 185 EXPECT_EQ(0, site_delete_counter); | |
| 186 | 168 |
| 187 NavigationEntryImpl* e1 = new NavigationEntryImpl( | 169 NavigationEntryImpl* e1 = new NavigationEntryImpl( |
| 188 instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK, | 170 instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK, |
| 189 false); | 171 false); |
| 190 | 172 |
| 191 // Redundantly setting e1's SiteInstance shouldn't affect the ref count. | 173 // Redundantly setting e1's SiteInstance shouldn't affect the ref count. |
| 192 e1->set_site_instance(instance); | 174 e1->set_site_instance(instance); |
| 193 EXPECT_EQ(0, site_delete_counter); | 175 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 176 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 194 | 177 |
| 195 // Add a second reference | 178 // Add a second reference |
| 196 NavigationEntryImpl* e2 = new NavigationEntryImpl( | 179 NavigationEntryImpl* e2 = new NavigationEntryImpl( |
| 197 instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK, | 180 instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK, |
| 198 false); | 181 false); |
| 199 | 182 |
| 183 instance = nullptr; | |
| 184 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount()); | |
| 185 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 186 | |
| 200 // Now delete both entries and be sure the SiteInstance goes away. | 187 // Now delete both entries and be sure the SiteInstance goes away. |
| 201 delete e1; | 188 delete e1; |
| 202 EXPECT_EQ(0, site_delete_counter); | 189 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 203 EXPECT_EQ(0, browsing_delete_counter); | 190 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); |
| 204 delete e2; | 191 delete e2; |
| 205 EXPECT_EQ(1, site_delete_counter); | |
| 206 // instance is now deleted | 192 // instance is now deleted |
| 207 EXPECT_EQ(1, browsing_delete_counter); | 193 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 194 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 208 // browsing_instance is now deleted | 195 // browsing_instance is now deleted |
| 209 | 196 |
| 210 // Ensure that instances are deleted when their RenderViewHosts are gone. | 197 // Ensure that instances are deleted when their RenderViewHosts are gone. |
| 211 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); | 198 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); |
| 212 instance = | |
| 213 TestSiteInstance::CreateTestSiteInstance(browser_context.get(), | |
| 214 &site_delete_counter, | |
| 215 &browsing_delete_counter); | |
| 216 { | 199 { |
| 217 scoped_ptr<WebContentsImpl> web_contents(static_cast<WebContentsImpl*>( | 200 scoped_ptr<WebContentsImpl> web_contents(static_cast<WebContentsImpl*>( |
| 218 WebContents::Create(WebContents::CreateParams( | 201 WebContents::Create(WebContents::CreateParams( |
| 219 browser_context.get(), instance)))); | 202 browser_context.get(), |
| 220 EXPECT_EQ(1, site_delete_counter); | 203 SiteInstance::Create(browser_context.get()))))); |
| 221 EXPECT_EQ(1, browsing_delete_counter); | 204 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 205 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 222 } | 206 } |
| 223 | 207 |
| 224 // Make sure that we flush any messages related to the above WebContentsImpl | 208 // Make sure that we flush any messages related to the above WebContentsImpl |
| 225 // destruction. | 209 // destruction. |
| 226 DrainMessageLoops(); | 210 DrainMessageLoops(); |
| 227 | 211 |
| 228 EXPECT_EQ(2, site_delete_counter); | 212 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 229 EXPECT_EQ(2, browsing_delete_counter); | 213 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); |
| 230 // contents is now deleted, along with instance and browsing_instance | 214 // contents is now deleted, along with instance and browsing_instance |
| 231 } | 215 } |
| 232 | 216 |
| 233 // Test that NavigationEntries with SiteInstances can be cloned, but that their | 217 // Test that NavigationEntries with SiteInstances can be cloned, but that their |
| 234 // SiteInstances can be changed afterwards. Also tests that the ref counts are | 218 // SiteInstances can be changed afterwards. Also tests that the ref counts are |
| 235 // updated properly after the change. | 219 // updated properly after the change. |
| 236 TEST_F(SiteInstanceTest, CloneNavigationEntry) { | 220 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"); | 221 const GURL url("test:foo"); |
| 241 | 222 |
| 242 SiteInstanceImpl* instance1 = | 223 scoped_ptr<NavigationEntryImpl> e1 = make_scoped_ptr(new NavigationEntryImpl( |
| 243 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter1, | 224 SiteInstanceImpl::Create(NULL), 0, url, Referrer(), base::string16(), |
| 244 &browsing_delete_counter); | 225 ui::PAGE_TRANSITION_LINK, false)); |
| 245 SiteInstanceImpl* instance2 = | |
| 246 TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter2, | |
| 247 &browsing_delete_counter); | |
| 248 | 226 |
| 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. | 227 // Clone the entry. |
| 253 scoped_ptr<NavigationEntryImpl> e2 = e1->Clone(); | 228 scoped_ptr<NavigationEntryImpl> e2 = e1->Clone(); |
| 254 | 229 |
| 255 // Should be able to change the SiteInstance of the cloned entry. | 230 // Should be able to change the SiteInstance of the cloned entry. |
| 256 e2->set_site_instance(instance2); | 231 e2->set_site_instance(SiteInstanceImpl::Create(NULL)); |
| 257 | 232 |
| 258 // The first SiteInstance should go away after resetting e1, since e2 should | 233 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 259 // no longer be referencing it. | 234 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); |
| 235 | |
| 236 // The first SiteInstance and BrowsingInstance should go away after resetting | |
| 237 // e1, since e2 should no longer be referencing it. | |
| 260 e1.reset(); | 238 e1.reset(); |
| 261 EXPECT_EQ(1, site_delete_counter1); | 239 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 262 EXPECT_EQ(0, site_delete_counter2); | 240 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); |
| 263 | 241 |
| 264 // The second SiteInstance should go away after resetting e2. | 242 // The second SiteInstance should go away after resetting e2. |
| 265 e2.reset(); | 243 e2.reset(); |
| 266 EXPECT_EQ(1, site_delete_counter1); | 244 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount()); |
| 267 EXPECT_EQ(1, site_delete_counter2); | 245 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); |
| 268 | |
| 269 // Both BrowsingInstances are also now deleted. | |
| 270 EXPECT_EQ(2, browsing_delete_counter); | |
| 271 | 246 |
| 272 DrainMessageLoops(); | 247 DrainMessageLoops(); |
| 273 } | 248 } |
| 274 | 249 |
| 275 // Test to ensure GetProcess returns and creates processes correctly. | 250 // Test to ensure GetProcess returns and creates processes correctly. |
| 276 TEST_F(SiteInstanceTest, GetProcess) { | 251 TEST_F(SiteInstanceTest, GetProcess) { |
| 277 // Ensure that GetProcess returns a process. | 252 // Ensure that GetProcess returns a process. |
| 278 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); | 253 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); |
| 279 scoped_ptr<RenderProcessHost> host1; | 254 scoped_ptr<RenderProcessHost> host1; |
| 280 scoped_refptr<SiteInstanceImpl> instance( | 255 scoped_refptr<SiteInstanceImpl> instance( |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 401 EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_blank, url_foo_port)); | 376 EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_blank, url_foo_port)); |
| 402 | 377 |
| 403 DrainMessageLoops(); | 378 DrainMessageLoops(); |
| 404 } | 379 } |
| 405 | 380 |
| 406 // Test to ensure that there is only one SiteInstance per site in a given | 381 // Test to ensure that there is only one SiteInstance per site in a given |
| 407 // BrowsingInstance, when process-per-site is not in use. | 382 // BrowsingInstance, when process-per-site is not in use. |
| 408 TEST_F(SiteInstanceTest, OneSiteInstancePerSite) { | 383 TEST_F(SiteInstanceTest, OneSiteInstancePerSite) { |
| 409 ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch( | 384 ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 410 switches::kProcessPerSite)); | 385 switches::kProcessPerSite)); |
| 411 int delete_counter = 0; | |
| 412 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); | 386 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); |
| 413 TestBrowsingInstance* browsing_instance = | 387 BrowsingInstance* browsing_instance = |
| 414 new TestBrowsingInstance(browser_context.get(), &delete_counter); | 388 new BrowsingInstance(browser_context.get()); |
| 415 | 389 |
| 416 const GURL url_a1("http://www.google.com/1.html"); | 390 const GURL url_a1("http://www.google.com/1.html"); |
| 417 scoped_refptr<SiteInstanceImpl> site_instance_a1( | 391 scoped_refptr<SiteInstanceImpl> site_instance_a1( |
| 418 browsing_instance->GetSiteInstanceForURL(url_a1)); | 392 browsing_instance->GetSiteInstanceForURL(url_a1)); |
| 419 EXPECT_TRUE(site_instance_a1.get() != NULL); | 393 EXPECT_TRUE(site_instance_a1.get() != NULL); |
| 420 | 394 |
| 421 // A separate site should create a separate SiteInstance. | 395 // A separate site should create a separate SiteInstance. |
| 422 const GURL url_b1("http://www.yahoo.com/"); | 396 const GURL url_b1("http://www.yahoo.com/"); |
| 423 scoped_refptr<SiteInstanceImpl> site_instance_b1( | 397 scoped_refptr<SiteInstanceImpl> site_instance_b1( |
| 424 | 398 |
| 425 browsing_instance->GetSiteInstanceForURL(url_b1)); | 399 browsing_instance->GetSiteInstanceForURL(url_b1)); |
| 426 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get()); | 400 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get()); |
| 427 EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get())); | 401 EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get())); |
| 428 | 402 |
| 429 // Getting the new SiteInstance from the BrowsingInstance and from another | 403 // Getting the new SiteInstance from the BrowsingInstance and from another |
| 430 // SiteInstance in the BrowsingInstance should give the same result. | 404 // SiteInstance in the BrowsingInstance should give the same result. |
| 431 EXPECT_EQ(site_instance_b1.get(), | 405 EXPECT_EQ(site_instance_b1.get(), |
| 432 site_instance_a1->GetRelatedSiteInstance(url_b1)); | 406 site_instance_a1->GetRelatedSiteInstance(url_b1)); |
| 433 | 407 |
| 434 // A second visit to the original site should return the same SiteInstance. | 408 // A second visit to the original site should return the same SiteInstance. |
| 435 const GURL url_a2("http://www.google.com/2.html"); | 409 const GURL url_a2("http://www.google.com/2.html"); |
| 436 EXPECT_EQ(site_instance_a1.get(), | 410 EXPECT_EQ(site_instance_a1.get(), |
| 437 browsing_instance->GetSiteInstanceForURL(url_a2)); | 411 browsing_instance->GetSiteInstanceForURL(url_a2)); |
| 438 EXPECT_EQ(site_instance_a1.get(), | 412 EXPECT_EQ(site_instance_a1.get(), |
| 439 site_instance_a1->GetRelatedSiteInstance(url_a2)); | 413 site_instance_a1->GetRelatedSiteInstance(url_a2)); |
| 440 | 414 |
| 441 // A visit to the original site in a new BrowsingInstance (same or different | 415 // A visit to the original site in a new BrowsingInstance (same or different |
| 442 // browser context) should return a different SiteInstance. | 416 // browser context) should return a different SiteInstance. |
| 443 TestBrowsingInstance* browsing_instance2 = | 417 BrowsingInstance* browsing_instance2 = |
| 444 new TestBrowsingInstance(browser_context.get(), &delete_counter); | 418 new BrowsingInstance(browser_context.get()); |
| 445 // Ensure the new SiteInstance is ref counted so that it gets deleted. | 419 // Ensure the new SiteInstance is ref counted so that it gets deleted. |
| 446 scoped_refptr<SiteInstanceImpl> site_instance_a2_2( | 420 scoped_refptr<SiteInstanceImpl> site_instance_a2_2( |
| 447 browsing_instance2->GetSiteInstanceForURL(url_a2)); | 421 browsing_instance2->GetSiteInstanceForURL(url_a2)); |
| 448 EXPECT_NE(site_instance_a1.get(), site_instance_a2_2.get()); | 422 EXPECT_NE(site_instance_a1.get(), site_instance_a2_2.get()); |
| 449 EXPECT_FALSE( | 423 EXPECT_FALSE( |
| 450 site_instance_a1->IsRelatedSiteInstance(site_instance_a2_2.get())); | 424 site_instance_a1->IsRelatedSiteInstance(site_instance_a2_2.get())); |
| 451 | 425 |
| 452 // The two SiteInstances for http://google.com should not use the same process | 426 // The two SiteInstances for http://google.com should not use the same process |
| 453 // if process-per-site is not enabled. | 427 // if process-per-site is not enabled. |
| 454 scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess()); | 428 scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess()); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 473 // The processes will be unregistered when the RPH scoped_ptrs go away. | 447 // The processes will be unregistered when the RPH scoped_ptrs go away. |
| 474 | 448 |
| 475 DrainMessageLoops(); | 449 DrainMessageLoops(); |
| 476 } | 450 } |
| 477 | 451 |
| 478 // Test to ensure that there is only one RenderProcessHost per site for an | 452 // Test to ensure that there is only one RenderProcessHost per site for an |
| 479 // entire BrowserContext, if process-per-site is in use. | 453 // entire BrowserContext, if process-per-site is in use. |
| 480 TEST_F(SiteInstanceTest, OneSiteInstancePerSiteInBrowserContext) { | 454 TEST_F(SiteInstanceTest, OneSiteInstancePerSiteInBrowserContext) { |
| 481 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 455 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 482 switches::kProcessPerSite); | 456 switches::kProcessPerSite); |
| 483 int delete_counter = 0; | |
| 484 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); | 457 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); |
| 485 TestBrowsingInstance* browsing_instance = | 458 scoped_refptr<BrowsingInstance> browsing_instance = |
| 486 new TestBrowsingInstance(browser_context.get(), &delete_counter); | 459 new BrowsingInstance(browser_context.get()); |
| 487 | 460 |
| 488 const GURL url_a1("http://www.google.com/1.html"); | 461 const GURL url_a1("http://www.google.com/1.html"); |
| 489 scoped_refptr<SiteInstanceImpl> site_instance_a1( | 462 scoped_refptr<SiteInstanceImpl> site_instance_a1( |
| 490 browsing_instance->GetSiteInstanceForURL(url_a1)); | 463 browsing_instance->GetSiteInstanceForURL(url_a1)); |
| 491 EXPECT_TRUE(site_instance_a1.get() != NULL); | 464 EXPECT_TRUE(site_instance_a1.get() != NULL); |
| 492 scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess()); | 465 scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess()); |
| 493 | 466 |
| 494 // A separate site should create a separate SiteInstance. | 467 // A separate site should create a separate SiteInstance. |
| 495 const GURL url_b1("http://www.yahoo.com/"); | 468 const GURL url_b1("http://www.yahoo.com/"); |
| 496 scoped_refptr<SiteInstanceImpl> site_instance_b1( | 469 scoped_refptr<SiteInstanceImpl> site_instance_b1( |
| 497 browsing_instance->GetSiteInstanceForURL(url_b1)); | 470 browsing_instance->GetSiteInstanceForURL(url_b1)); |
| 498 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get()); | 471 EXPECT_NE(site_instance_a1.get(), site_instance_b1.get()); |
| 499 EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get())); | 472 EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get())); |
| 500 | 473 |
| 501 // Getting the new SiteInstance from the BrowsingInstance and from another | 474 // Getting the new SiteInstance from the BrowsingInstance and from another |
| 502 // SiteInstance in the BrowsingInstance should give the same result. | 475 // SiteInstance in the BrowsingInstance should give the same result. |
| 503 EXPECT_EQ(site_instance_b1.get(), | 476 EXPECT_EQ(site_instance_b1.get(), |
| 504 site_instance_a1->GetRelatedSiteInstance(url_b1)); | 477 site_instance_a1->GetRelatedSiteInstance(url_b1)); |
| 505 | 478 |
| 506 // A second visit to the original site should return the same SiteInstance. | 479 // A second visit to the original site should return the same SiteInstance. |
| 507 const GURL url_a2("http://www.google.com/2.html"); | 480 const GURL url_a2("http://www.google.com/2.html"); |
| 508 EXPECT_EQ(site_instance_a1.get(), | 481 EXPECT_EQ(site_instance_a1.get(), |
| 509 browsing_instance->GetSiteInstanceForURL(url_a2)); | 482 browsing_instance->GetSiteInstanceForURL(url_a2)); |
| 510 EXPECT_EQ(site_instance_a1.get(), | 483 EXPECT_EQ(site_instance_a1.get(), |
| 511 site_instance_a1->GetRelatedSiteInstance(url_a2)); | 484 site_instance_a1->GetRelatedSiteInstance(url_a2)); |
| 512 | 485 |
| 513 // A visit to the original site in a new BrowsingInstance (same browser | 486 // A visit to the original site in a new BrowsingInstance (same browser |
| 514 // context) should return a different SiteInstance with the same process. | 487 // context) should return a different SiteInstance with the same process. |
| 515 TestBrowsingInstance* browsing_instance2 = | 488 BrowsingInstance* browsing_instance2 = |
| 516 new TestBrowsingInstance(browser_context.get(), &delete_counter); | 489 new BrowsingInstance(browser_context.get()); |
| 517 scoped_refptr<SiteInstanceImpl> site_instance_a1_2( | 490 scoped_refptr<SiteInstanceImpl> site_instance_a1_2( |
| 518 browsing_instance2->GetSiteInstanceForURL(url_a1)); | 491 browsing_instance2->GetSiteInstanceForURL(url_a1)); |
| 519 EXPECT_TRUE(site_instance_a1.get() != NULL); | 492 EXPECT_TRUE(site_instance_a1.get() != NULL); |
| 520 EXPECT_NE(site_instance_a1.get(), site_instance_a1_2.get()); | 493 EXPECT_NE(site_instance_a1.get(), site_instance_a1_2.get()); |
| 521 EXPECT_EQ(process_a1.get(), site_instance_a1_2->GetProcess()); | 494 EXPECT_EQ(process_a1.get(), site_instance_a1_2->GetProcess()); |
| 522 | 495 |
| 523 // A visit to the original site in a new BrowsingInstance (different browser | 496 // A visit to the original site in a new BrowsingInstance (different browser |
| 524 // context) should return a different SiteInstance with a different process. | 497 // context) should return a different SiteInstance with a different process. |
| 525 scoped_ptr<TestBrowserContext> browser_context2(new TestBrowserContext()); | 498 scoped_ptr<TestBrowserContext> browser_context2(new TestBrowserContext()); |
| 526 TestBrowsingInstance* browsing_instance3 = | 499 BrowsingInstance* browsing_instance3 = |
| 527 new TestBrowsingInstance(browser_context2.get(), &delete_counter); | 500 new BrowsingInstance(browser_context2.get()); |
| 528 scoped_refptr<SiteInstanceImpl> site_instance_a2_3( | 501 scoped_refptr<SiteInstanceImpl> site_instance_a2_3( |
| 529 browsing_instance3->GetSiteInstanceForURL(url_a2)); | 502 browsing_instance3->GetSiteInstanceForURL(url_a2)); |
| 530 EXPECT_TRUE(site_instance_a2_3.get() != NULL); | 503 EXPECT_TRUE(site_instance_a2_3.get() != NULL); |
| 531 scoped_ptr<RenderProcessHost> process_a2_3(site_instance_a2_3->GetProcess()); | 504 scoped_ptr<RenderProcessHost> process_a2_3(site_instance_a2_3->GetProcess()); |
| 532 EXPECT_NE(site_instance_a1.get(), site_instance_a2_3.get()); | 505 EXPECT_NE(site_instance_a1.get(), site_instance_a2_3.get()); |
| 533 EXPECT_NE(process_a1.get(), process_a2_3.get()); | 506 EXPECT_NE(process_a1.get(), process_a2_3.get()); |
| 534 | 507 |
| 535 // Should be able to see that we do have SiteInstances. | 508 // Should be able to see that we do have SiteInstances. |
| 536 EXPECT_TRUE(browsing_instance->HasSiteInstance( | 509 EXPECT_TRUE(browsing_instance->HasSiteInstance( |
| 537 GURL("http://mail.google.com"))); // visited before | 510 GURL("http://mail.google.com"))); // visited before |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 768 EXPECT_TRUE(instance->HasSite()); | 741 EXPECT_TRUE(instance->HasSite()); |
| 769 EXPECT_TRUE(instance->GetSiteURL().is_empty()); | 742 EXPECT_TRUE(instance->GetSiteURL().is_empty()); |
| 770 host.reset(instance->GetProcess()); | 743 host.reset(instance->GetProcess()); |
| 771 | 744 |
| 772 EXPECT_FALSE(RenderProcessHostImpl::GetProcessHostForSite( | 745 EXPECT_FALSE(RenderProcessHostImpl::GetProcessHostForSite( |
| 773 browser_context.get(), GURL())); | 746 browser_context.get(), GURL())); |
| 774 | 747 |
| 775 DrainMessageLoops(); | 748 DrainMessageLoops(); |
| 776 } | 749 } |
| 777 | 750 |
| 751 TEST_F(SiteInstanceTest, DefaultSubframeSiteInstance) { | |
| 752 base::CommandLine::ForCurrentProcess()->AppendSwitch( | |
| 753 switches::kTopDocumentIsolation); | |
|
Charlie Reis
2016/04/01 21:50:41
Does this need to return early for --site-per-proc
ncarter (slow)
2016/04/04 21:47:33
Good catch. Done.
| |
| 754 | |
| 755 scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext()); | |
| 756 scoped_refptr<SiteInstanceImpl> main_instance = | |
| 757 SiteInstanceImpl::Create(browser_context.get()); | |
| 758 scoped_refptr<SiteInstanceImpl> subframe_instance = | |
| 759 main_instance->GetDefaultSubframeSiteInstance(); | |
| 760 int subframe_instance_id = subframe_instance->GetId(); | |
| 761 | |
| 762 EXPECT_NE(main_instance, subframe_instance); | |
| 763 EXPECT_EQ(subframe_instance, main_instance->GetDefaultSubframeSiteInstance()); | |
| 764 EXPECT_FALSE(main_instance->is_default_subframe_site_instance()); | |
| 765 EXPECT_TRUE(subframe_instance->is_default_subframe_site_instance()); | |
| 766 | |
| 767 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount()); | |
| 768 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 769 | |
| 770 // Free the subframe instance. | |
| 771 subframe_instance = nullptr; | |
| 772 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount()); | |
| 773 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 774 | |
| 775 // Calling GetDefaultSubframeSiteInstance again should return a new | |
| 776 // SiteInstance with a different ID from the original. | |
| 777 subframe_instance = main_instance->GetDefaultSubframeSiteInstance(); | |
| 778 EXPECT_NE(subframe_instance->GetId(), subframe_instance_id); | |
| 779 EXPECT_FALSE(main_instance->is_default_subframe_site_instance()); | |
| 780 EXPECT_TRUE(subframe_instance->is_default_subframe_site_instance()); | |
| 781 EXPECT_EQ(subframe_instance->GetDefaultSubframeSiteInstance(), | |
| 782 subframe_instance); | |
| 783 EXPECT_EQ(0, browser_client()->GetAndClearSiteInstanceDeleteCount()); | |
| 784 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 785 | |
| 786 // Free the main instance. | |
| 787 main_instance = nullptr; | |
| 788 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount()); | |
| 789 EXPECT_EQ(0, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 790 | |
| 791 // Free the subframe instance, which should free the browsing instance. | |
| 792 subframe_instance = nullptr; | |
| 793 EXPECT_EQ(1, browser_client()->GetAndClearSiteInstanceDeleteCount()); | |
| 794 EXPECT_EQ(1, browser_client()->GetAndClearBrowsingInstanceDeleteCount()); | |
| 795 } | |
| 796 | |
| 778 } // namespace content | 797 } // namespace content |
| OLD | NEW |