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" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_utils.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_test_message_listener.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/lazy_background_page_test_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/omnibox/location_bar.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h" 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This unfortunate bit of silliness is necessary when loading an extension in 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// incognito. The goal is to load the extension, enable incognito, then wait 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for both background pages to load and close. The problem is that enabling 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// incognito involves reloading the extension - and the background pages may 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have already loaded once before then. So we wait until the extension is 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unloaded before listening to the background page notifications. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LoadedIncognitoObserver : public content::NotificationObserver { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit LoadedIncognitoObserver(Profile* profile) : profile_(profile) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::Source<Profile>(profile)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Wait() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(original_complete_.get()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_complete_->Wait(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_complete_->Wait(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe( 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int type, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) OVERRIDE { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_complete_.reset(new LazyBackgroundObserver(profile_)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_complete_.reset( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new LazyBackgroundObserver(profile_->GetOffTheRecordProfile())); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LazyBackgroundObserver> original_complete_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LazyBackgroundObserver> incognito_complete_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LazyBackgroundPageApiTest : public ExtensionApiTest { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionApiTest::SetUpCommandLine(command_line); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set shorter delays to prevent test timeouts. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) command_line->AppendSwitchASCII(switches::kEventPageIdleTime, "1"); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) command_line->AppendSwitchASCII(switches::kEventPageSuspendingTime, "1"); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads the extension, which temporarily starts the lazy background page 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to dispatch the onInstalled event. We wait until it shuts down again. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* LoadExtensionAndWait(const std::string& test_name) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII(test_name); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extdir); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, BrowserActionCreateTab) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("browser_action_create_tab")); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_tabs_before = browser()->tab_strip_model()->count(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observe background page being created and closed after 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the browser action is clicked. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionTestUtil(browser()).Press(0); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Background page created a new tab before it closed. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_tabs_before + 1, browser()->tab_strip_model()->count()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(chrome::kChromeUIExtensionsURL), 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()-> 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetURL().spec()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionCreateTabAfterCallback) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("browser_action_with_callback")); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_tabs_before = browser()->tab_strip_model()->count(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observe background page being created and closed after 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the browser action is clicked. 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionTestUtil(browser()).Press(0); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Background page is closed after creating a new tab. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_tabs_before + 1, browser()->tab_strip_model()->count()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, BroadcastEvent) { 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtensionAndWait("broadcast_event"); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_page_actions = browser()->window()->GetLocationBar()-> 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocationBarForTesting()->PageActionVisibleCount(); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a tab to a URL that will trigger the page action to show. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WindowedNotificationObserver page_action_changed( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationService::AllSources()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Page action is shown. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_action_changed.Wait(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_page_actions + 1, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->window()->GetLocationBar()-> 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocationBarForTesting()->PageActionVisibleCount()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, Filters) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtensionAndWait("filters"); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a tab to a URL that will fire a webNavigation event. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the lazy background page receives the onInstalled event and shuts 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// down. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, OnInstalled) { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("on_installed")); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page has been shut down. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the lazy background page stays alive until all visible views are 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// closed. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, WaitForView) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII("wait_for_view"); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extdir); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension should've opened a new tab to an extension page. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->GetResourceURL("extension_page.html").spec(), 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()-> 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetURL().spec()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page still exists, because the extension created a new tab 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to an extension page. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the new tab. 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->CloseWebContentsAt( 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->active_index(), TabStripModel::CLOSE_NONE); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page has been shut down. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the lazy background page stays alive until all network requests 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are complete. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, WaitForRequest) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule("*", "127.0.0.1"); 238eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII("wait_for_request"); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extdir); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page still exists, because the extension started a request. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionHost* host = 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pm->GetBackgroundHostForExtension(last_loaded_extension_id_); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(host); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Abort the request. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = false; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->render_view_host(), "abortRequest()", &result)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page has been shut down. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the lazy background page stays alive until all visible views are 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// closed. 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/175778; test fails frequently on OS X 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WaitForNTP DISABLED_WaitForNTP 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WaitForNTP WaitForNTP 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, MAYBE_WaitForNTP) { 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LazyBackgroundObserver lazybg; 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResultCatcher catcher; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendASCII("wait_for_ntp"); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = LoadExtension(extdir); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(extension); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The extension should've opened a new tab to an extension page. 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(std::string(chrome::kChromeUINewTabURL), 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()-> 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetURL().spec()); 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lazy Background Page still exists, because the extension created a new tab 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to an extension page. 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionProcessManager* pm = 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigate away from the NTP, which should close the event page. 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lazybg.Wait(); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lazy Background Page has been shut down. 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// See crbug.com/248437 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_WIN) 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_IncognitoSplitMode DISABLED_IncognitoSplitMode 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else 306868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MAYBE_IncognitoSplitMode IncognitoSplitMode 307868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif 308868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that an incognito split mode extension gets 2 lazy background pages, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and they each load and unload at the proper times. 311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, MAYBE_IncognitoSplitMode) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open incognito window. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* incognito_browser = ui_test_utils::OpenURLOffTheRecord( 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile(), GURL("about:blank")); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the extension with incognito enabled. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadedIncognitoObserver loaded(browser()->profile()); 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII("incognito_split"); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionIncognito(extdir)); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded.Wait(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pmi = 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(incognito_browser->profile())-> 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_manager(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pmi->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger a browserAction event in the original profile and ensure only 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the original event page received it (since the event is scoped to the 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile). 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener listener("waiting", false); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener listener_incognito("waiting_incognito", false); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete(browser()->profile()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionTestUtil(browser()).Press(0); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only the original event page received the message. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pmi->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(listener.was_satisfied()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(listener_incognito.was_satisfied()); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger a bookmark created event and ensure both pages receive it. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener listener("waiting", false); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener listener_incognito("waiting_incognito", false); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete(browser()->profile()), 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page2_complete(incognito_browser->profile()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model = 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelFactory::GetForProfile(browser()->profile()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::WaitForBookmarkModelToLoad(bookmark_model); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent = bookmark_model->bookmark_bar_node(); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model->AddURL( 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) parent, 0, ASCIIToUTF16("Title"), GURL("about:blank")); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page2_complete.Wait(); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both pages received the message. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pmi->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(listener.was_satisfied()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(listener_incognito.was_satisfied()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that messages from the content script activate the lazy background 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page, and keep it alive until all channels are closed. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, Messaging) { 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("messaging")); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to a page that opens a message channel to the background page. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver lazybg; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lazybg.WaitUntilLoaded(); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Background page got the content script's message and is still loaded 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // until we close the channel. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate away, closing the message channel and therefore the background 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lazybg.WaitUntilClosed(); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the lazy background page receives the unload event when we 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// close it, and that it can execute simple API calls that don't require an 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// asynchronous response. 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, OnUnload) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("on_unload")); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page has been shut down. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionProcessManager* pm = 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id_)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The browser action has a new title. 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionTestUtil browser_action(browser()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, browser_action.NumberOfBrowserActions()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Success", browser_action.GetTooltip(0)); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that both a regular page and an event page will receive events when 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the event page is not loaded. 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, EventDispatchToTab) { 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catcher.RestrictToProfile(browser()->profile()); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension = 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtensionAndWait("event_dispatch_to_tab"); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener page_ready("ready", true); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url = extension->GetResourceURL("page.html"); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), page_url); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(page_ready.WaitUntilSatisfied()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After the event is sent below, wait for the event page to have received 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the event before proceeding with the test. This allows the regular page 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to test that the event page received the event, which makes the pass/fail 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // logic simpler. 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener event_page_ready("ready", true); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send an event by making a bookmark. 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model = 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelFactory::GetForProfile(browser()->profile()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::WaitForBookmarkModelToLoad(bookmark_model); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_utils::AddIfNotBookmarked( 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model, 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL("http://www.google.com"), 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16("Google")); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(event_page_ready.WaitUntilSatisfied()); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_ready.Reply("go"); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: background page with timer. 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: background page that interacts with popup. 463