extension_loading_browsertest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This file contains tests for extension loading, reloading, and
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// unloading behavior.
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h"
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/strings/stringprintf.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/extensions/test_extension_dir.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace extensions {
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ExtensionLoadingTest : public ExtensionBrowserTest {
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Check the fix for http://crbug.com/178542.
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionLoadingTest,
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       UpgradeAfterNavigatingFromOverriddenNewTabPage) {
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  embedded_test_server()->ServeFilesFromDirectory(
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("chrome/test/data")));
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestExtensionDir extension_dir;
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const char* manifest_template =
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "{"
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "  \"name\": \"Overrides New Tab\","
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "  \"version\": \"%d\","
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "  \"description\": \"Overrides New Tab\","
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "  \"manifest_version\": 2,"
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "  \"background\": {"
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "    \"persistent\": false,"
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "    \"scripts\": [\"event.js\"]"
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "  },"
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "  \"chrome_url_overrides\": {"
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "    \"newtab\": \"newtab.html\""
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "  }"
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      "}";
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  extension_dir.WriteManifest(base::StringPrintf(manifest_template, 1));
49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  extension_dir.WriteFile(FILE_PATH_LITERAL("event.js"), "");
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  extension_dir.WriteFile(FILE_PATH_LITERAL("newtab.html"),
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                          "<h1>Overridden New Tab Page</h1>");
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const Extension* new_tab_extension =
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      InstallExtension(extension_dir.Pack(), 1 /*new install*/);
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(new_tab_extension);
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Visit the New Tab Page to get a renderer using the extension into history.
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("chrome://newtab"));
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Navigate that tab to a non-extension URL to swap out the extension's
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // renderer.
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL test_link_from_NTP =
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      embedded_test_server()->GetURL("/README.chromium");
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_THAT(test_link_from_NTP.spec(), testing::EndsWith("/README.chromium"))
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "Check that the test server started.";
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  NavigateInRenderer(browser()->tab_strip_model()->GetActiveWebContents(),
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     test_link_from_NTP);
68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Increase the extension's version.
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  extension_dir.WriteManifest(base::StringPrintf(manifest_template, 2));
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Upgrade the extension.
73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  new_tab_extension = UpdateExtension(
74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new_tab_extension->id(), extension_dir.Pack(), 0 /*expected upgrade*/);
75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_THAT(new_tab_extension->version()->components(),
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              testing::ElementsAre(2));
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The extension takes a couple round-trips to the renderer in order
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // to crash, so open a new tab to wait long enough.
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddTabAtIndex(browser()->tab_strip_model()->count(),
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                GURL("http://www.google.com/"),
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                content::PAGE_TRANSITION_TYPED);
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Check that the extension hasn't crashed.
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ExtensionService* service =
86868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      ExtensionSystem::Get(profile())->extension_service();
87868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(0U, service->terminated_extensions()->size());
88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(service->extensions()->Contains(new_tab_extension->id()));
89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace extensions
93