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)