extension_loading_browsertest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 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)// This file contains tests for extension loading, reloading, and
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unloading behavior.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/stringprintf.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/test_extension_dir.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h"
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "extensions/browser/extension_registry.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace extensions {
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionLoadingTest : public ExtensionBrowserTest {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Check the fix for http://crbug.com/178542.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionLoadingTest,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       UpgradeAfterNavigatingFromOverriddenNewTabPage) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  embedded_test_server()->ServeFilesFromDirectory(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestExtensionDir extension_dir;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* manifest_template =
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "{"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"name\": \"Overrides New Tab\","
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      "  \"version\": \"%d\","
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "  \"description\": \"Overrides New Tab\","
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      "  \"manifest_version\": 2,"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  \"background\": {"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"persistent\": false,"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"scripts\": [\"event.js\"]"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  },"
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "  \"chrome_url_overrides\": {"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    \"newtab\": \"newtab.html\""
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}";
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_dir.WriteManifest(base::StringPrintf(manifest_template, 1));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_dir.WriteFile(FILE_PATH_LITERAL("event.js"), "");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_dir.WriteFile(FILE_PATH_LITERAL("newtab.html"),
52c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                          "<h1>Overridden New Tab Page</h1>");
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* new_tab_extension =
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallExtension(extension_dir.Pack(), 1 /*new install*/);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_tab_extension);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Visit the New Tab Page to get a renderer using the extension into history.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("chrome://newtab"));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate that tab to a non-extension URL to swap out the extension's
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // renderer.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL test_link_from_NTP =
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      embedded_test_server()->GetURL("/README.chromium");
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(test_link_from_NTP.spec(), testing::EndsWith("/README.chromium"))
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Check that the test server started.";
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigateInRenderer(browser()->tab_strip_model()->GetActiveWebContents(),
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     test_link_from_NTP);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increase the extension's version.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_dir.WriteManifest(base::StringPrintf(manifest_template, 2));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Upgrade the extension.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_tab_extension = UpdateExtension(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_tab_extension->id(), extension_dir.Pack(), 0 /*expected upgrade*/);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(new_tab_extension->version()->components(),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              testing::ElementsAre(2));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension takes a couple round-trips to the renderer in order
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to crash, so open a new tab to wait long enough.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(browser()->tab_strip_model()->count(),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                GURL("http://www.google.com/"),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                content::PAGE_TRANSITION_TYPED);
84c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the extension hasn't crashed.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, registry->terminated_extensions().size());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(registry->enabled_extensions().Contains(new_tab_extension->id()));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)