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
13class SkBitmap;
14
15namespace {
16
17class 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
44class 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
69IN_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