15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
7a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/scoped_vector.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browser_thread_impl.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/browsing_instance.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/child_process_security_policy_impl.h"
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_process_host_impl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/site_instance_impl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/webui/web_ui_controller_factory_registry.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_client.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/url_utils.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_render_process_host.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_context.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/test_content_browser_client.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/test/test_content_client.h"
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/test/test_render_view_host.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/url_util.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kPrivilegedScheme[] = "privileged";
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SiteInstanceTestWebUIControllerFactory : public WebUIControllerFactory {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebUIController* CreateWebUIControllerForURL(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebUI* web_ui, const GURL& url) const OVERRIDE {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebUI::TypeID GetWebUIType(BrowserContext* browser_context,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url) const OVERRIDE {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebUI::kNoWebUI;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool UseWebUIForURL(BrowserContext* browser_context,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const GURL& url) const OVERRIDE {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return HasWebUIScheme(url);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool UseWebUIBindingsForURL(BrowserContext* browser_context,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const GURL& url) const OVERRIDE {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return HasWebUIScheme(url);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SiteInstanceTestBrowserClient : public TestContentBrowserClient {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstanceTestBrowserClient()
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : privileged_process_id_(-1) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebUIControllerFactory::RegisterFactory(&factory_);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~SiteInstanceTestBrowserClient() {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebUIControllerFactory::UnregisterFactoryForTesting(&factory_);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsSuitableHost(RenderProcessHost* process_host,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const GURL& site_url) OVERRIDE {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (privileged_process_id_ == process_host->GetID()) ==
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        site_url.SchemeIs(kPrivilegedScheme);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_privileged_process_id(int process_id) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    privileged_process_id_ = process_id;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstanceTestWebUIControllerFactory factory_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int privileged_process_id_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SiteInstanceTest : public testing::Test {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstanceTest()
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(BrowserThread::UI, &message_loop_),
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   &message_loop_),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        io_thread_(BrowserThread::IO, &message_loop_),
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        old_browser_client_(NULL) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    old_browser_client_ = SetBrowserClientForTesting(&browser_client_);
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    url::AddStandardScheme(kPrivilegedScheme);
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    url::AddStandardScheme(kChromeUIScheme);
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SiteInstanceImpl::set_render_process_host_factory(&rph_factory_);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that no RenderProcessHosts are left over after the tests.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(RenderProcessHost::AllHostsIterator().IsAtEnd());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetBrowserClientForTesting(old_browser_client_);
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    SiteInstanceImpl::set_render_process_host_factory(NULL);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // http://crbug.com/143565 found SiteInstanceTest leaking an
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // AppCacheDatabase. This happens because some part of the test indirectly
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // calls StoragePartitionImplMap::PostCreateInitialization(), which posts
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a task to the IO thread to create the AppCacheDatabase. Since the
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // message loop is not running, the AppCacheDatabase ends up getting
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // created when DrainMessageLoops() gets called at the end of a test case.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Immediately after, the test case ends and the AppCacheDatabase gets
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // scheduled for deletion. Here, call DrainMessageLoops() again so the
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // AppCacheDatabase actually gets deleted.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DrainMessageLoops();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_privileged_process_id(int process_id) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_client_.set_privileged_process_id(process_id);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DrainMessageLoops() {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We don't just do this in TearDown() because we create TestBrowserContext
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // objects in each test, which will be destructed before
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TearDown() is called.
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_.RunUntilIdle();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowserThread ui_thread_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowserThread file_user_blocking_thread_;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowserThread io_thread_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstanceTestBrowserClient browser_client_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentBrowserClient* old_browser_client_;
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  MockRenderProcessHostFactory rph_factory_;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass of BrowsingInstance that updates a counter when deleted and
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns TestSiteInstances from GetSiteInstanceForURL.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestBrowsingInstance : public BrowsingInstance {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowsingInstance(BrowserContext* browser_context, int* delete_counter)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : BrowsingInstance(browser_context),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        delete_counter_(delete_counter) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a few methods public for tests.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using BrowsingInstance::browser_context;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using BrowsingInstance::HasSiteInstance;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using BrowsingInstance::GetSiteInstanceForURL;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using BrowsingInstance::RegisterSiteInstance;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using BrowsingInstance::UnregisterSiteInstance;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestBrowsingInstance() {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*delete_counter_)++;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int* delete_counter_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclass of SiteInstanceImpl that updates a counter when deleted.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestSiteInstance : public SiteInstanceImpl {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static TestSiteInstance* CreateTestSiteInstance(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserContext* browser_context,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int* site_delete_counter,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int* browsing_delete_counter) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestBrowsingInstance* browsing_instance =
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestBrowsingInstance(browser_context, browsing_delete_counter);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return new TestSiteInstance(browsing_instance, site_delete_counter);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSiteInstance(BrowsingInstance* browsing_instance, int* delete_counter)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : SiteInstanceImpl(browsing_instance), delete_counter_(delete_counter) {}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestSiteInstance() {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*delete_counter_)++;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int* delete_counter_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure no memory leaks for SiteInstance objects.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, SiteInstanceDestructor) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The existence of this object will cause WebContentsImpl to create our
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test one instead of the real one.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHostTestEnabler rvh_test_enabler;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int site_delete_counter = 0;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int browsing_delete_counter = 0;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("test:foo");
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that instances are deleted when their NavigationEntries are gone.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestSiteInstance* instance =
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               &browsing_delete_counter);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, site_delete_counter);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntryImpl* e1 = new NavigationEntryImpl(
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK,
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      false);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Redundantly setting e1's SiteInstance shouldn't affect the ref count.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  e1->set_site_instance(instance);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, site_delete_counter);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a second reference
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntryImpl* e2 = new NavigationEntryImpl(
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      instance, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK,
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      false);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now delete both entries and be sure the SiteInstance goes away.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete e1;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, site_delete_counter);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, browsing_delete_counter);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete e2;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, site_delete_counter);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // instance is now deleted
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, browsing_delete_counter);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browsing_instance is now deleted
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that instances are deleted when their RenderViewHosts are gone.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance =
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestSiteInstance::CreateTestSiteInstance(browser_context.get(),
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               &site_delete_counter,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               &browsing_delete_counter);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<WebContentsImpl> web_contents(static_cast<WebContentsImpl*>(
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        WebContents::Create(WebContents::CreateParams(
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser_context.get(), instance))));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, site_delete_counter);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, browsing_delete_counter);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that we flush any messages related to the above WebContentsImpl
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // destruction.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, site_delete_counter);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, browsing_delete_counter);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // contents is now deleted, along with instance and browsing_instance
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that NavigationEntries with SiteInstances can be cloned, but that their
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SiteInstances can be changed afterwards.  Also tests that the ref counts are
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// updated properly after the change.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, CloneNavigationEntry) {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int site_delete_counter1 = 0;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int site_delete_counter2 = 0;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int browsing_delete_counter = 0;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url("test:foo");
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstanceImpl* instance1 =
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter1,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               &browsing_delete_counter);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SiteInstanceImpl* instance2 =
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TestSiteInstance::CreateTestSiteInstance(NULL, &site_delete_counter2,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               &browsing_delete_counter);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntryImpl* e1 = new NavigationEntryImpl(
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      instance1, 0, url, Referrer(), base::string16(), ui::PAGE_TRANSITION_LINK,
270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      false);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clone the entry
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationEntryImpl* e2 = new NavigationEntryImpl(*e1);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able to change the SiteInstance of the cloned entry.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  e2->set_site_instance(instance2);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The first SiteInstance should go away after deleting e1, since e2 should
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // no longer be referencing it.
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete e1;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, site_delete_counter1);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, site_delete_counter2);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The second SiteInstance should go away after deleting e2.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete e2;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, site_delete_counter1);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, site_delete_counter2);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both BrowsingInstances are also now deleted
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, browsing_delete_counter);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure GetProcess returns and creates processes correctly.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, GetProcess) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that GetProcess returns a process.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> host1;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> instance(static_cast<SiteInstanceImpl*>(
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SiteInstance::Create(browser_context.get())));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host1.reset(instance->GetProcess());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host1.get() != NULL);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure that GetProcess creates a new process.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> instance2(static_cast<SiteInstanceImpl*>(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SiteInstance::Create(browser_context.get())));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> host2(instance2->GetProcess());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host2.get() != NULL);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(host1.get(), host2.get());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure SetSite and site() work properly.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, SetSite) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> instance(static_cast<SiteInstanceImpl*>(
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SiteInstance::Create(NULL)));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(instance->HasSite());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(instance->GetSiteURL().is_empty());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance->SetSite(GURL("http://www.google.com/index.html"));
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("http://google.com"), instance->GetSiteURL());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(instance->HasSite());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure GetSiteForURL properly returns sites for URLs.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, GetSiteForURL) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pages are irrelevant.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL test_url = GURL("http://www.google.com/index.html");
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("http://google.com"),
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SiteInstanceImpl::GetSiteForURL(NULL, test_url));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ports are irrlevant.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_url = GURL("https://www.google.com:8080");
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("https://google.com"),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            SiteInstanceImpl::GetSiteForURL(NULL, test_url));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Javascript URLs have no site.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_url = GURL("javascript:foo();");
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(), SiteInstanceImpl::GetSiteForURL(NULL, test_url));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_url = GURL("http://foo/a.html");
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL("http://foo"), SiteInstanceImpl::GetSiteForURL(
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, test_url));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_url = GURL("file:///C:/Downloads/");
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(), SiteInstanceImpl::GetSiteForURL(NULL, test_url));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::string guest_url(kGuestScheme);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  guest_url.append("://abc123");
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  test_url = GURL(guest_url);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_url, SiteInstanceImpl::GetSiteForURL(NULL, test_url));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(creis): Do we want to special case file URLs to ensure they have
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // either no site or a special "file://" site?  We currently return
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "file://home/" as the site, which seems broken.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test_url = GURL("file://home/");
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // EXPECT_EQ(GURL(), SiteInstanceImpl::GetSiteForURL(NULL, test_url));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test of distinguishing URLs from different sites.  Most of this logic is
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tested in RegistryControlledDomainTest.  This test focuses on URLs with
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different schemes or ports.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, IsSameWebSite) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_foo = GURL("http://foo/a.html");
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_foo2 = GURL("http://foo/b.html");
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_foo_https = GURL("https://foo/a.html");
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_foo_port = GURL("http://foo:8080/a.html");
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_javascript = GURL("javascript:alert(1);");
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GURL url_blank = GURL(url::kAboutBlankURL);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same scheme and port -> same site.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo, url_foo2));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Different scheme -> different site.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_foo, url_foo_https));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Different port -> same site.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (Changes to document.domain make renderer ignore the port.)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo, url_foo_port));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // JavaScript links should be considered same site for anything.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_javascript, url_foo));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_javascript, url_foo_https));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_javascript, url_foo_port));
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Navigating to a blank page is considered the same site.
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo, url_blank));
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo_https, url_blank));
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(SiteInstance::IsSameWebSite(NULL, url_foo_port, url_blank));
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Navigating from a blank site is not considered to be the same site.
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_blank, url_foo));
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_blank, url_foo_https));
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(SiteInstance::IsSameWebSite(NULL, url_blank, url_foo_port));
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure that there is only one SiteInstance per site in a given
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowsingInstance, when process-per-site is not in use.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, OneSiteInstancePerSite) {
4086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ASSERT_FALSE(base::CommandLine::ForCurrentProcess()->HasSwitch(
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kProcessPerSite));
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int delete_counter = 0;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowsingInstance* browsing_instance =
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowsingInstance(browser_context.get(), &delete_counter);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_a1("http://www.google.com/1.html");
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> site_instance_a1(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SiteInstanceImpl*>(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browsing_instance->GetSiteInstanceForURL(url_a1)));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(site_instance_a1.get() != NULL);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A separate site should create a separate SiteInstance.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_b1("http://www.yahoo.com/");
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> site_instance_b1(
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SiteInstanceImpl*>(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browsing_instance->GetSiteInstanceForURL(url_b1)));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(site_instance_a1.get(), site_instance_b1.get());
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get()));
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the new SiteInstance from the BrowsingInstance and from another
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SiteInstance in the BrowsingInstance should give the same result.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(site_instance_b1.get(),
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            site_instance_a1->GetRelatedSiteInstance(url_b1));
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A second visit to the original site should return the same SiteInstance.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_a2("http://www.google.com/2.html");
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(site_instance_a1.get(),
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browsing_instance->GetSiteInstanceForURL(url_a2));
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(site_instance_a1.get(),
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            site_instance_a1->GetRelatedSiteInstance(url_a2));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A visit to the original site in a new BrowsingInstance (same or different
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser context) should return a different SiteInstance.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowsingInstance* browsing_instance2 =
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowsingInstance(browser_context.get(), &delete_counter);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the new SiteInstance is ref counted so that it gets deleted.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> site_instance_a2_2(
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SiteInstanceImpl*>(
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browsing_instance2->GetSiteInstanceForURL(url_a2)));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(site_instance_a1.get(), site_instance_a2_2.get());
450868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(
451868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      site_instance_a1->IsRelatedSiteInstance(site_instance_a2_2.get()));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The two SiteInstances for http://google.com should not use the same process
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if process-per-site is not enabled.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> process_a2_2(site_instance_a2_2->GetProcess());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(process_a1.get(), process_a2_2.get());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able to see that we do have SiteInstances.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browsing_instance->HasSiteInstance(
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.google.com")));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browsing_instance2->HasSiteInstance(
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.google.com")));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browsing_instance->HasSiteInstance(
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.yahoo.com")));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able to see that we don't have SiteInstances.
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browsing_instance->HasSiteInstance(
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://www.google.com")));
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browsing_instance2->HasSiteInstance(
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.yahoo.com")));
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browsing_instances will be deleted when their SiteInstances are deleted.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The processes will be unregistered when the RPH scoped_ptrs go away.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure that there is only one RenderProcessHost per site for an
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// entire BrowserContext, if process-per-site is in use.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, OneSiteInstancePerSiteInBrowserContext) {
4826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::CommandLine::ForCurrentProcess()->AppendSwitch(
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kProcessPerSite);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int delete_counter = 0;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowsingInstance* browsing_instance =
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowsingInstance(browser_context.get(), &delete_counter);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_a1("http://www.google.com/1.html");
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> site_instance_a1(
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SiteInstanceImpl*>(
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browsing_instance->GetSiteInstanceForURL(url_a1)));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(site_instance_a1.get() != NULL);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> process_a1(site_instance_a1->GetProcess());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A separate site should create a separate SiteInstance.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_b1("http://www.yahoo.com/");
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> site_instance_b1(
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SiteInstanceImpl*>(
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browsing_instance->GetSiteInstanceForURL(url_b1)));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(site_instance_a1.get(), site_instance_b1.get());
502868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(site_instance_a1->IsRelatedSiteInstance(site_instance_b1.get()));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getting the new SiteInstance from the BrowsingInstance and from another
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SiteInstance in the BrowsingInstance should give the same result.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(site_instance_b1.get(),
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            site_instance_a1->GetRelatedSiteInstance(url_b1));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A second visit to the original site should return the same SiteInstance.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL url_a2("http://www.google.com/2.html");
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(site_instance_a1.get(),
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browsing_instance->GetSiteInstanceForURL(url_a2));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(site_instance_a1.get(),
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            site_instance_a1->GetRelatedSiteInstance(url_a2));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A visit to the original site in a new BrowsingInstance (same browser
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // context) should return a different SiteInstance with the same process.
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowsingInstance* browsing_instance2 =
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowsingInstance(browser_context.get(), &delete_counter);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> site_instance_a1_2(
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SiteInstanceImpl*>(
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browsing_instance2->GetSiteInstanceForURL(url_a1)));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(site_instance_a1.get() != NULL);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(site_instance_a1.get(), site_instance_a1_2.get());
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(process_a1.get(), site_instance_a1_2->GetProcess());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A visit to the original site in a new BrowsingInstance (different browser
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // context) should return a different SiteInstance with a different process.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context2(new TestBrowserContext());
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestBrowsingInstance* browsing_instance3 =
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new TestBrowsingInstance(browser_context2.get(), &delete_counter);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> site_instance_a2_3(
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SiteInstanceImpl*>(
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browsing_instance3->GetSiteInstanceForURL(url_a2)));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(site_instance_a2_3.get() != NULL);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> process_a2_3(site_instance_a2_3->GetProcess());
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(site_instance_a1.get(), site_instance_a2_3.get());
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(process_a1.get(), process_a2_3.get());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able to see that we do have SiteInstances.
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browsing_instance->HasSiteInstance(
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.google.com")));  // visited before
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browsing_instance2->HasSiteInstance(
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.google.com")));  // visited before
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browsing_instance->HasSiteInstance(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.yahoo.com")));  // visited before
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Should be able to see that we don't have SiteInstances.
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browsing_instance2->HasSiteInstance(
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.yahoo.com")));  // different BI, same browser context
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browsing_instance->HasSiteInstance(
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://www.google.com")));  // not visited before
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(browsing_instance3->HasSiteInstance(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.yahoo.com")));  // different BI, different context
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browsing_instances will be deleted when their SiteInstances are deleted.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The processes will be unregistered when the RPH scoped_ptrs go away.
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static SiteInstanceImpl* CreateSiteInstance(BrowserContext* browser_context,
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                            const GURL& url) {
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return static_cast<SiteInstanceImpl*>(
565868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SiteInstance::CreateForURL(browser_context, url));
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure that pages that require certain privileges are grouped
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in processes with similar pages.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, ProcessSharingByType) {
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This test shouldn't run with --site-per-process or
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // --enable-strict-site-isolation modes, since they don't allow render
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // process reuse, which this test explicitly exercises.
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const base::CommandLine& command_line =
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      *base::CommandLine::ForCurrentProcess();
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (command_line.HasSwitch(switches::kSitePerProcess) ||
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      command_line.HasSwitch(switches::kEnableStrictSiteIsolation))
578c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return;
579c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // On Android by default the number of renderer hosts is unlimited and process
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // sharing doesn't happen. We set the override so that the test can run
5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // everywhere.
5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderProcessHost::SetMaxRendererProcessCount(kMaxRendererProcessCount);
5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl* policy =
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ChildProcessSecurityPolicyImpl::GetInstance();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make a bunch of mock renderers so that we hit the limit.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
590a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ScopedVector<MockRenderProcessHost> hosts;
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < kMaxRendererProcessCount; ++i)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hosts.push_back(new MockRenderProcessHost(browser_context.get()));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create some extension instances and make sure they share a process.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> extension1_instance(
596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      CreateSiteInstance(browser_context.get(),
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL(kPrivilegedScheme + std::string("://foo/bar"))));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_privileged_process_id(extension1_instance->GetProcess()->GetID());
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> extension2_instance(
601868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      CreateSiteInstance(browser_context.get(),
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL(kPrivilegedScheme + std::string("://baz/bar"))));
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> extension_host(
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension1_instance->GetProcess());
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(extension1_instance->GetProcess(),
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            extension2_instance->GetProcess());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create some WebUI instances and make sure they share a process.
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> webui1_instance(CreateSiteInstance(
6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      browser_context.get(), GURL(kChromeUIScheme + std::string("://newtab"))));
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy->GrantWebUIBindings(webui1_instance->GetProcess()->GetID());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> webui2_instance(
6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      CreateSiteInstance(browser_context.get(),
6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         GURL(kChromeUIScheme + std::string("://history"))));
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> dom_host(webui1_instance->GetProcess());
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(webui1_instance->GetProcess(), webui2_instance->GetProcess());
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure none of differing privilege processes are mixed.
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(extension1_instance->GetProcess(), webui1_instance->GetProcess());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < kMaxRendererProcessCount; ++i) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(extension1_instance->GetProcess(), hosts[i]);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(webui1_instance->GetProcess(), hosts[i]);
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Disable the process limit override.
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RenderProcessHost::SetMaxRendererProcessCount(0u);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test to ensure that HasWrongProcessForURL behaves properly for different
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// types of URLs.
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SiteInstanceTest, HasWrongProcessForURL) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> host;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> instance(static_cast<SiteInstanceImpl*>(
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SiteInstance::Create(browser_context.get())));
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(instance->HasSite());
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(instance->GetSiteURL().is_empty());
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance->SetSite(GURL("http://evernote.com/"));
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(instance->HasSite());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check prior to "assigning" a process to the instance, which is expected
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to return false due to not being attached to any process yet.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://google.com")));
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The call to GetProcess actually creates a new real process, which works
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fine, but might be a cause for problems in different contexts.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host.reset(instance->GetProcess());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(host.get() != NULL);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(instance->HasProcess());
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://evernote.com")));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(instance->HasWrongProcessForURL(
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("javascript:alert(document.location.href);")));
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(instance->HasWrongProcessForURL(GURL("chrome://settings")));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that WebUI SiteInstances reject normal web URLs.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL webui_url("chrome://settings");
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> webui_instance(static_cast<SiteInstanceImpl*>(
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SiteInstance::Create(browser_context.get())));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_instance->SetSite(webui_url);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<RenderProcessHost> webui_host(webui_instance->GetProcess());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate granting WebUI bindings for the process.
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildProcessSecurityPolicyImpl::GetInstance()->GrantWebUIBindings(
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webui_host->GetID());
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(webui_instance->HasProcess());
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(webui_instance->HasWrongProcessForURL(webui_url));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(webui_instance->HasWrongProcessForURL(GURL("http://google.com")));
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUI uses process-per-site, so another instance will use the same process
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // even if we haven't called GetProcess yet.  Make sure HasWrongProcessForURL
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't crash (http://crbug.com/137070).
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<SiteInstanceImpl> webui_instance2(
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<SiteInstanceImpl*>(
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          SiteInstance::Create(browser_context.get())));
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  webui_instance2->SetSite(webui_url);
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(webui_instance2->HasWrongProcessForURL(webui_url));
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      webui_instance2->HasWrongProcessForURL(GURL("http://google.com")));
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DrainMessageLoops();
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test to ensure that HasWrongProcessForURL behaves properly even when
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// --site-per-process is used (http://crbug.com/160671).
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SiteInstanceTest, HasWrongProcessForURLInSitePerProcess) {
6976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::CommandLine::ForCurrentProcess()->AppendSwitch(
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kSitePerProcess);
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RenderProcessHost> host;
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SiteInstanceImpl> instance(static_cast<SiteInstanceImpl*>(
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SiteInstance::Create(browser_context.get())));
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance->SetSite(GURL("http://evernote.com/"));
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->HasSite());
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check prior to "assigning" a process to the instance, which is expected
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to return false due to not being attached to any process yet.
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://google.com")));
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The call to GetProcess actually creates a new real process, which works
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // fine, but might be a cause for problems in different contexts.
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host.reset(instance->GetProcess());
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host.get() != NULL);
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->HasProcess());
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(instance->HasWrongProcessForURL(GURL("http://evernote.com")));
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(instance->HasWrongProcessForURL(
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GURL("javascript:alert(document.location.href);")));
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->HasWrongProcessForURL(GURL("chrome://settings")));
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DrainMessageLoops();
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that we do not reuse a process in process-per-site mode if it has the
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// wrong bindings for its URL.  http://crbug.com/174059.
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SiteInstanceTest, ProcessPerSiteWithWrongBindings) {
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RenderProcessHost> host;
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RenderProcessHost> host2;
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SiteInstanceImpl> instance(static_cast<SiteInstanceImpl*>(
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SiteInstance::Create(browser_context.get())));
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(instance->HasSite());
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->GetSiteURL().is_empty());
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate navigating to a WebUI URL in a process that does not have WebUI
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // bindings.  This already requires bypassing security checks.
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const GURL webui_url("chrome://settings");
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance->SetSite(webui_url);
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->HasSite());
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The call to GetProcess actually creates a new real process.
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host.reset(instance->GetProcess());
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host.get() != NULL);
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->HasProcess());
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Without bindings, this should look like the wrong process.
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->HasWrongProcessForURL(webui_url));
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WebUI uses process-per-site, so another instance would normally use the
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // same process.  Make sure it doesn't use the same process if the bindings
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are missing.
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SiteInstanceImpl> instance2(
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<SiteInstanceImpl*>(
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          SiteInstance::Create(browser_context.get())));
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance2->SetSite(webui_url);
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host2.reset(instance2->GetProcess());
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(host2.get() != NULL);
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance2->HasProcess());
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(host.get(), host2.get());
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DrainMessageLoops();
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test that we do not register processes with empty sites for process-per-site
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// mode.
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(SiteInstanceTest, NoProcessPerSiteForEmptySite) {
7716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  base::CommandLine::ForCurrentProcess()->AppendSwitch(
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switches::kProcessPerSite);
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestBrowserContext> browser_context(new TestBrowserContext());
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<RenderProcessHost> host;
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<SiteInstanceImpl> instance(static_cast<SiteInstanceImpl*>(
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SiteInstance::Create(browser_context.get())));
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  instance->SetSite(GURL());
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->HasSite());
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(instance->GetSiteURL().is_empty());
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host.reset(instance->GetProcess());
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(RenderProcessHostImpl::GetProcessHostForSite(
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser_context.get(), GURL()));
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DrainMessageLoops();
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
790