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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/scoped_observer.h" 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_apitest.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/lazy_background_page_test_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/location_bar.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_utils.h" 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.h" 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry.h" 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_registry_observer.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/process_manager.h" 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/extension_test_message_listener.h" 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h" 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension; 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing extensions::ResultCatcher; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This unfortunate bit of silliness is necessary when loading an extension in 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// incognito. The goal is to load the extension, enable incognito, then wait 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for both background pages to load and close. The problem is that enabling 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// incognito involves reloading the extension - and the background pages may 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// have already loaded once before then. So we wait until the extension is 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unloaded before listening to the background page notifications. 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass LoadedIncognitoObserver : public extensions::ExtensionRegistryObserver { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit LoadedIncognitoObserver(Profile* profile) 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : profile_(profile), extension_registry_observer_(this) { 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension_registry_observer_.Add( 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extensions::ExtensionRegistry::Get(profile_)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Wait() { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(original_complete_.get()); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_complete_->Wait(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_complete_->Wait(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnExtensionUnloaded( 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::BrowserContext* browser_context, 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* extension, 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extensions::UnloadedExtensionInfo::Reason reason) OVERRIDE { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_complete_.reset(new LazyBackgroundObserver(profile_)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incognito_complete_.reset( 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new LazyBackgroundObserver(profile_->GetOffTheRecordProfile())); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScopedObserver<extensions::ExtensionRegistry, 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extensions::ExtensionRegistryObserver> 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extension_registry_observer_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LazyBackgroundObserver> original_complete_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<LazyBackgroundObserver> incognito_complete_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LazyBackgroundPageApiTest : public ExtensionApiTest { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LazyBackgroundPageApiTest() {} 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~LazyBackgroundPageApiTest() {} 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetUpOnMainThread() OVERRIDE { 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExtensionApiTest::SetUpOnMainThread(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set shorter delays to prevent test timeouts. 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::ProcessManager::SetEventPageIdleTimeForTesting(1); 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci extensions::ProcessManager::SetEventPageSuspendingTimeForTesting(1); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads the extension, which temporarily starts the lazy background page 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to dispatch the onInstalled event. We wait until it shuts down again. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* LoadExtensionAndWait(const std::string& test_name) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII(test_name); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extdir); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (extension) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return extension; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns true if the lazy background page for the extension with 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |extension_id| is still running. 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool IsBackgroundPageAlive(const std::string& extension_id) { 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::ProcessManager* pm = extensions::ExtensionSystem::Get( 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) browser()->profile())->process_manager(); 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return pm->GetBackgroundHostForExtension(extension_id); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LazyBackgroundPageApiTest); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, BrowserActionCreateTab) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("browser_action_create_tab")); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_tabs_before = browser()->tab_strip_model()->count(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observe background page being created and closed after 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the browser action is clicked. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionTestUtil(browser()).Press(0); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Background page created a new tab before it closed. 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_tabs_before + 1, browser()->tab_strip_model()->count()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(chrome::kChromeUIExtensionsURL), 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()-> 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetURL().spec()); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionCreateTabAfterCallback) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("browser_action_with_callback")); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int num_tabs_before = browser()->tab_strip_model()->count(); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observe background page being created and closed after 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the browser action is clicked. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionTestUtil(browser()).Press(0); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Background page is closed after creating a new tab. 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(num_tabs_before + 1, browser()->tab_strip_model()->count()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, BroadcastEvent) { 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtensionAndWait("broadcast_event"); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_page_actions = browser()->window()->GetLocationBar()-> 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocationBarForTesting()->PageActionVisibleCount(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a tab to a URL that will trigger the page action to show. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Page action is shown. 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WaitForPageActionVisibilityChangeTo(num_page_actions + 1); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(num_page_actions + 1, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->window()->GetLocationBar()-> 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetLocationBarForTesting()->PageActionVisibleCount()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, Filters) { 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_TRUE(StartEmbeddedTestServer()); 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtensionAndWait("filters"); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open a tab to a URL that will fire a webNavigation event. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the lazy background page receives the onInstalled event and shuts 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// down. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, OnInstalled) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("on_installed")); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page has been shut down. 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests that a JavaScript alert keeps the lazy background page alive. 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, WaitForDialog) { 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LazyBackgroundObserver background_observer; 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppendASCII("wait_for_dialog"); 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Extension* extension = LoadExtension(extdir); 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(extension); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The test extension opens a dialog on installation. 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AppModalDialog* dialog = ui_test_utils::WaitForAppModalDialog(); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(dialog); 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // With the dialog open the background page is still alive. 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsBackgroundPageAlive(extension->id())); 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Close the dialog. The keep alive count is decremented. 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* pm = 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int previous_keep_alive_count = pm->GetLazyKeepaliveCount(extension); 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dialog->CloseModalDialog(); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(previous_keep_alive_count - 1, 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pm->GetLazyKeepaliveCount(extension)); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The background page closes now that the dialog is gone. 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) background_observer.WaitUntilClosed(); 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(extension->id())); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the lazy background page stays alive until all visible views are 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// closed. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, WaitForView) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII("wait_for_view"); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extdir); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension should've opened a new tab to an extension page. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(extension->GetResourceURL("extension_page.html").spec(), 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()-> 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetURL().spec()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page still exists, because the extension created a new tab 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to an extension page. 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsBackgroundPageAlive(last_loaded_extension_id())); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the new tab. 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->CloseWebContentsAt( 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->active_index(), TabStripModel::CLOSE_NONE); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page has been shut down. 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the lazy background page stays alive until all network requests 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are complete. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, WaitForRequest) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver()->AddRule("*", "127.0.0.1"); 273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII("wait_for_request"); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension = LoadExtension(extdir); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(extension); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page still exists, because the extension started a request. 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* pm = 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionHost* host = 2878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pm->GetBackgroundHostForExtension(last_loaded_extension_id()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(host); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Abort the request. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = false; 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->render_view_host(), "abortRequest()", &result)); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(result); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page has been shut down. 2988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that the lazy background page stays alive until all visible views are 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// closed. 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/175778; test fails frequently on OS X 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WaitForNTP DISABLED_WaitForNTP 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WaitForNTP WaitForNTP 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, MAYBE_WaitForNTP) { 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LazyBackgroundObserver lazybg; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResultCatcher catcher; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendASCII("wait_for_ntp"); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Extension* extension = LoadExtension(extdir); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(extension); 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The extension should've opened a new tab to an extension page. 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lazy Background Page still exists, because the extension created a new tab 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // to an extension page. 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsBackgroundPageAlive(last_loaded_extension_id())); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigate away from the NTP, which should close the event page. 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lazybg.Wait(); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Lazy Background Page has been shut down. 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that an incognito split mode extension gets 2 lazy background pages, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and they each load and unload at the proper times. 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// See crbug.com/248437 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, DISABLED_IncognitoSplitMode) { 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open incognito window. 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* incognito_browser = ui_test_utils::OpenURLOffTheRecord( 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser()->profile(), GURL("about:blank")); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load the extension with incognito enabled. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadedIncognitoObserver loaded(browser()->profile()); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppendASCII("incognito_split"); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionIncognito(extdir)); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) loaded.Wait(); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* pm = 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* pmi = 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::ExtensionSystem::Get(incognito_browser->profile())-> 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) process_manager(); 3578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); 3588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE(pmi->GetBackgroundHostForExtension(last_loaded_extension_id())); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger a browserAction event in the original profile and ensure only 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the original event page received it (since the event is scoped to the 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile). 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener listener("waiting", false); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener listener_incognito("waiting_incognito", false); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete(browser()->profile()); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionTestUtil(browser()).Press(0); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only the original event page received the message. 3728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); 3738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE( 3748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pmi->GetBackgroundHostForExtension(last_loaded_extension_id())); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(listener.was_satisfied()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(listener_incognito.was_satisfied()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Trigger a bookmark created event and ensure both pages receive it. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener listener("waiting", false); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener listener_incognito("waiting_incognito", false); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver page_complete(browser()->profile()), 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page2_complete(incognito_browser->profile()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model = 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelFactory::GetForProfile(browser()->profile()); 38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test::WaitForBookmarkModelToLoad(bookmark_model); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent = bookmark_model->bookmark_bar_node(); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model->AddURL( 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) parent, 0, base::ASCIIToUTF16("Title"), GURL("about:blank")); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_complete.Wait(); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page2_complete.Wait(); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both pages received the message. 3968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); 3978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) EXPECT_FALSE( 3988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) pmi->GetBackgroundHostForExtension(last_loaded_extension_id())); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(listener.was_satisfied()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(listener_incognito.was_satisfied()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that messages from the content script activate the lazy background 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page, and keep it alive until all channels are closed. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, Messaging) { 407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(StartEmbeddedTestServer()); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("messaging")); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate to a page that opens a message channel to the background page. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LazyBackgroundObserver lazybg; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL( 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lazybg.WaitUntilLoaded(); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Background page got the content script's message and is still loaded 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // until we close the channel. 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsBackgroundPageAlive(last_loaded_extension_id())); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Navigate away, closing the message channel and therefore the background 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lazybg.WaitUntilClosed(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Tests that a KeepaliveImpulse increments the keep alive count, but eventually 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// times out and background page will still close. 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, ImpulseAddsCount) { 437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(StartEmbeddedTestServer()); 438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const Extension* extension = LoadExtensionAndWait("messaging"); 439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(extension); 440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Lazy Background Page doesn't exist yet. 442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) extensions::ProcessManager* pm = 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); 444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); 445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(1, browser()->tab_strip_model()->count()); 446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 447a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Navigate to a page that opens a message channel to the background page. 448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResultCatcher catcher; 449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LazyBackgroundObserver lazybg; 450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui_test_utils::NavigateToURL( 451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) lazybg.WaitUntilLoaded(); 453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 454a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Add an impulse and the keep alive count increases. 455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int previous_keep_alive_count = pm->GetLazyKeepaliveCount(extension); 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pm->KeepaliveImpulse(extension); 457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(previous_keep_alive_count + 1, 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) pm->GetLazyKeepaliveCount(extension)); 459a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Navigate away, closing the message channel and therefore the background 461a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // page after the impulse times out. 462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL("about:blank")); 463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) lazybg.WaitUntilClosed(); 464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); 466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the lazy background page receives the unload event when we 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// close it, and that it can execute simple API calls that don't require an 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// asynchronous response. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, OnUnload) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(LoadExtensionAndWait("on_unload")); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lazy Background Page has been shut down. 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The browser action has a new title. 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserActionTestUtil browser_action(browser()); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1, browser_action.NumberOfBrowserActions()); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Success", browser_action.GetTooltip(0)); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that both a regular page and an event page will receive events when 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the event page is not loaded. 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, EventDispatchToTab) { 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResultCatcher catcher; 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci catcher.RestrictToBrowserContext(browser()->profile()); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* extension = 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadExtensionAndWait("event_dispatch_to_tab"); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener page_ready("ready", true); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL page_url = extension->GetResourceURL("page.html"); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), page_url); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(page_ready.WaitUntilSatisfied()); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After the event is sent below, wait for the event page to have received 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the event before proceeding with the test. This allows the regular page 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to test that the event page received the event, which makes the pass/fail 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // logic simpler. 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionTestMessageListener event_page_ready("ready", true); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send an event by making a bookmark. 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model = 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelFactory::GetForProfile(browser()->profile()); 50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test::WaitForBookmarkModelToLoad(bookmark_model); 507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bookmarks::AddIfNotBookmarked(bookmark_model, 508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GURL("http://www.google.com"), 509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::UTF8ToUTF16("Google")); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(event_page_ready.WaitUntilSatisfied()); 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_ready.Reply("go"); 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 518424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Tests that the lazy background page updates the chrome://extensions page 519424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// when it is destroyed. 520424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, UpdateExtensionsPage) { 521424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIExtensionsURL)); 522424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 523424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ResultCatcher catcher; 524424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::FilePath extdir = test_data_dir_.AppendASCII("lazy_background_page"). 525424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) AppendASCII("wait_for_view"); 526424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const Extension* extension = LoadExtension(extdir); 527424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_TRUE(extension); 528424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); 529424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 530424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The extension should've opened a new tab to an extension page. 531424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(extension->GetResourceURL("extension_page.html").spec(), 532424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()-> 533424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetURL().spec()); 534424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 535424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Lazy Background Page still exists, because the extension created a new tab 536424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // to an extension page. 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(IsBackgroundPageAlive(last_loaded_extension_id())); 538424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 539424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Close the new tab. 540424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LazyBackgroundObserver page_complete; 541424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser()->tab_strip_model()->CloseWebContentsAt( 542424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser()->tab_strip_model()->active_index(), TabStripModel::CLOSE_NONE); 543424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) page_complete.WaitUntilClosed(); 544424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 545424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Lazy Background Page has been shut down. 5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(IsBackgroundPageAlive(last_loaded_extension_id())); 547424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 548424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Verify that extensions page shows that the lazy background page is 549424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // inactive. 55023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) content::RenderFrameHost* frame = content::FrameMatchingPredicate( 551424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(), 55223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::Bind(&content::FrameHasSourceUrl, 55323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) GURL(chrome::kChromeUIExtensionsFrameURL))); 55423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool is_inactive; 55523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 55623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) frame, 557424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) "var ele = document.querySelectorAll('div.active-views');" 558424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) "window.domAutomationController.send(" 559424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) " ele[0].innerHTML.search('(Inactive)') > 0);", 560424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) &is_inactive)); 561424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(is_inactive); 562424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 563424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Tests that the lazy background page will be unloaded if the onSuspend event 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// handler calls an API function such as chrome.storage.local.set(). 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// See: http://crbug.com/296834 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, OnSuspendUseStorageApi) { 5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(LoadExtensionAndWait("on_suspend")); 5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: background page with timer. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: background page that interacts with popup. 573