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