• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
MockInstallUI(Profile * profile)19   explicit MockInstallUI(Profile* profile) :
20       ExtensionInstallUI(profile), confirmation_requested_(false) {}
21 
22   // Did the Delegate request confirmation?
confirmation_requested()23   bool confirmation_requested() { return confirmation_requested_; }
24 
25   // Overriding some of the ExtensionInstallUI API.
ConfirmInstall(Delegate * delegate,const Extension * extension)26   void ConfirmInstall(Delegate* delegate, const Extension* extension) {
27     confirmation_requested_ = true;
28     delegate->InstallUIProceed();
29   }
OnInstallSuccess(const Extension * extension,SkBitmap * icon)30   void OnInstallSuccess(const Extension* extension, SkBitmap* icon) {
31     MessageLoopForUI::current()->Quit();
32   }
OnInstallFailure(const std::string & error)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.
DidWhitelistInstallPrompt(const std::string & crx_relpath,const std::string & id)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 
IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,Whitelisting)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