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