1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/crx_installer.h" 6 #include "chrome/browser/extensions/extension_browsertest.h" 7 #include "chrome/browser/extensions/extension_install_ui.h" 8 #include "chrome/browser/extensions/extension_service.h" 9 #include "chrome/browser/profiles/profile.h" 10 #include "chrome/browser/ui/browser.h" 11 #include "chrome/test/ui_test_utils.h" 12 13 class SkBitmap; 14 15 namespace { 16 17 class MockInstallUI : public ExtensionInstallUI { 18 public: 19 explicit MockInstallUI(Profile* profile) : 20 ExtensionInstallUI(profile), confirmation_requested_(false) {} 21 22 // Did the Delegate request confirmation? 23 bool confirmation_requested() { return confirmation_requested_; } 24 25 // Overriding some of the ExtensionInstallUI API. 26 void ConfirmInstall(Delegate* delegate, const Extension* extension) { 27 confirmation_requested_ = true; 28 delegate->InstallUIProceed(); 29 } 30 void OnInstallSuccess(const Extension* extension, SkBitmap* icon) { 31 MessageLoopForUI::current()->Quit(); 32 } 33 void OnInstallFailure(const std::string& error) { 34 ADD_FAILURE() << "install failed"; 35 MessageLoopForUI::current()->Quit(); 36 } 37 38 private: 39 bool confirmation_requested_; 40 }; 41 42 } // namespace 43 44 class ExtensionCrxInstallerTest : public ExtensionBrowserTest { 45 public: 46 // Installs a crx from |crx_relpath| (a path relative to the extension test 47 // data dir) with expected id |id|. Returns whether a confirmation prompt 48 // happened or not. 49 bool DidWhitelistInstallPrompt(const std::string& crx_relpath, 50 const std::string& id) { 51 ExtensionService* service = browser()->profile()->GetExtensionService(); 52 MockInstallUI* mock_install_ui = new MockInstallUI(browser()->profile()); 53 54 scoped_refptr<CrxInstaller> installer( 55 new CrxInstaller(service, mock_install_ui /* ownership transferred */)); 56 57 installer->set_allow_silent_install(true); 58 installer->set_is_gallery_install(true); 59 CrxInstaller::SetWhitelistedInstallId(id); 60 61 FilePath crx_path = test_data_dir_.AppendASCII(crx_relpath); 62 installer->InstallCrx(crx_path); 63 ui_test_utils::RunMessageLoop(); 64 65 return mock_install_ui->confirmation_requested(); 66 } 67 }; 68 69 IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, Whitelisting) { 70 // A regular extension should give no prompt. 71 EXPECT_FALSE(DidWhitelistInstallPrompt("good.crx", 72 "ldnnhddmnhbkjipkidpdiheffobcpfmf")); 73 #if !defined(OS_CHROMEOS) 74 // An extension with NPAPI should give a prompt. 75 EXPECT_TRUE(DidWhitelistInstallPrompt("uitest/plugins.crx", 76 "hdgllgikmikobbofgnabhfimcfoopgnd")); 77 #endif // !defined(OS_CHROMEOS) 78 } 79