1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/process_manager.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "chrome/test/base/ui_test_utils.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/browser/notification_service.h" 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/browser/web_contents.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/test/test_utils.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/dns/mock_host_resolver.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions { 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Exists as a browser test because ExtensionHosts are hard to create without 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// a real browser. 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef ExtensionBrowserTest ProcessManagerBrowserTest; 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that basic extension loading creates the appropriate ExtensionHosts 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// and background pages. 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ExtensionHostCreation) { 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProcessManager* pm = ExtensionSystem::Get(profile())->process_manager(); 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We start with no background hosts. 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(0u, pm->background_hosts().size()); 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(0u, pm->GetAllViews().size()); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Load an extension with a background page. 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<const Extension> extension = 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LoadExtension(test_data_dir_.AppendASCII("api_test") 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .AppendASCII("browser_action") 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .AppendASCII("none")); 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(extension.get()); 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Process manager gains a background host. 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1u, pm->background_hosts().size()); 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1u, pm->GetAllViews().size()); 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(pm->GetBackgroundHostForExtension(extension->id())); 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(pm->GetSiteInstanceForURL(extension->url())); 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1u, pm->GetRenderViewHostsForExtension(extension->id()).size()); 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(pm->IsBackgroundHostClosing(extension->id())); 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pm->GetLazyKeepaliveCount(extension.get())); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Unload the extension. 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UnloadExtension(extension->id()); 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Background host disappears. 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0u, pm->background_hosts().size()); 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0u, pm->GetAllViews().size()); 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(extension->id())); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(pm->GetSiteInstanceForURL(extension->url())); 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0u, pm->GetRenderViewHostsForExtension(extension->id()).size()); 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(pm->IsBackgroundHostClosing(extension->id())); 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pm->GetLazyKeepaliveCount(extension.get())); 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Test that loading an extension with a browser action does not create a 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// background page and that clicking on the action creates the appropriate 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// ExtensionHost. 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Disabled due to flake, see http://crbug.com/315242 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISABLED_PopupHostCreation) { 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProcessManager* pm = ExtensionSystem::Get(profile())->process_manager(); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Load an extension with the ability to open a popup but no background 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // page. 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<const Extension> popup = 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LoadExtension(test_data_dir_.AppendASCII("api_test") 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .AppendASCII("browser_action") 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) .AppendASCII("popup")); 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(popup.get()); 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // No background host was added. 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0u, pm->background_hosts().size()); 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0u, pm->GetAllViews().size()); 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(popup->id())); 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0u, pm->GetRenderViewHostsForExtension(popup->id()).size()); 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(pm->GetSiteInstanceForURL(popup->url())); 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(pm->IsBackgroundHostClosing(popup->id())); 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pm->GetLazyKeepaliveCount(popup.get())); 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Simulate clicking on the action to open a popup. 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserActionTestUtil test_util(browser()); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::WindowedNotificationObserver frame_observer( 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NOTIFICATION_LOAD_COMPLETED_MAIN_FRAME, 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::NotificationService::AllSources()); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Open popup in the first extension. 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) test_util.Press(0); 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) frame_observer.Wait(); 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(test_util.HasPopup()); 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We now have a view, but still no background hosts. 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0u, pm->background_hosts().size()); 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1u, pm->GetAllViews().size()); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(popup->id())); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(1u, pm->GetRenderViewHostsForExtension(popup->id()).size()); 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(pm->GetSiteInstanceForURL(popup->url())); 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(pm->IsBackgroundHostClosing(popup->id())); 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pm->GetLazyKeepaliveCount(popup.get())); 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Content loaded from http://hlogonemlfkgpejgnedahbkiabcdhnnn should not 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// interact with an installed extension with that ID. Regression test 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// for bug 357382. 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochIN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, HttpHostMatchingExtensionId) { 114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ProcessManager* pm = ExtensionSystem::Get(profile())->process_manager(); 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // We start with no background hosts. 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_EQ(0u, pm->background_hosts().size()); 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_EQ(0u, pm->GetAllViews().size()); 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Load an extension with a background page. 121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<const Extension> extension = 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch LoadExtension(test_data_dir_.AppendASCII("api_test") 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch .AppendASCII("browser_action") 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch .AppendASCII("none")); 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Set up a test server running at http://[extension-id] 127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(extension.get()); 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string aliased_host = extension->id(); 129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch host_resolver()->AddRule(aliased_host, "127.0.0.1"); 130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GURL url = 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch embedded_test_server()->GetURL("/extensions/test_file_with_body.html"); 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GURL::Replacements replace_host; 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch replace_host.SetHostStr(aliased_host); 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch url = url.ReplaceComponents(replace_host); 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Load a page from the test host in a new tab. 138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui_test_utils::NavigateToURLWithDisposition( 139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch browser(), 140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch url, 141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NEW_FOREGROUND_TAB, 142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); 143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Sanity check that there's no bleeding between the extension and the tab. 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::WebContents* tab_web_contents = 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch browser()->tab_strip_model()->GetActiveWebContents(); 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(url, tab_web_contents->GetVisibleURL()); 148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(NULL == pm->GetExtensionForRenderViewHost( 149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch tab_web_contents->GetRenderViewHost())) 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch << "Non-extension content must not have an associated extension"; 151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ASSERT_EQ(1u, pm->GetRenderViewHostsForExtension(extension->id()).size()); 152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::WebContents* extension_web_contents = 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::WebContents::FromRenderViewHost( 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *pm->GetRenderViewHostsForExtension(extension->id()).begin()); 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(extension_web_contents->GetSiteInstance() != 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch tab_web_contents->GetSiteInstance()); 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(pm->GetSiteInstanceForURL(extension->url()) != 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch tab_web_contents->GetSiteInstance()); 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_TRUE(pm->GetBackgroundHostForExtension(extension->id())); 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace extensions 163