15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/crx_installer.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/at_exit.h"
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/memory/ref_counted.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_crx_util.h"
110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/extensions/browser_action_test_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_install_prompt.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/extensions/extension_util.h"
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/test_extension_dir.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/download_manager.h"
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/download_test_observer.h"
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/test/test_utils.h"
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_prefs.h"
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/extension_registry.h"
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/management_policy.h"
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h"
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/common/file_util.h"
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/permissions/permission_set.h"
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "extensions/common/switches.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_CHROMEOS)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/fake_user_manager.h"
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/chromeos_switches.h"
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass MockInstallPrompt;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// This class holds information about things that happen with a
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// MockInstallPrompt. We create the MockInstallPrompt but need to pass
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// ownership of it to CrxInstaller, so it isn't safe to hang this data on
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// MockInstallPrompt itself becuase we can't guarantee it's lifetime.
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MockPromptProxy : public base::RefCountedThreadSafe<MockPromptProxy> {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  explicit MockPromptProxy(content::WebContents* web_contents);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool did_succeed() const { return !extension_id_.empty(); }
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const std::string& extension_id() { return extension_id_; }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool confirmation_requested() const { return confirmation_requested_; }
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16& error() const { return error_; }
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // To have any effect, this should be called before CreatePrompt.
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void set_record_oauth2_grant(bool record_oauth2_grant) {
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    record_oauth2_grant_.reset(new bool(record_oauth2_grant));
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void set_extension_id(const std::string& id) { extension_id_ = id; }
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void set_confirmation_requested() { confirmation_requested_ = true; }
77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void set_error(const base::string16& error) { error_ = error; }
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<ExtensionInstallPrompt> CreatePrompt();
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private:
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  friend class base::RefCountedThreadSafe<MockPromptProxy>;
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  virtual ~MockPromptProxy();
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Data used to create a prompt.
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::WebContents* web_contents_;
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<bool> record_oauth2_grant_;
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Data reported back to us by the prompt we created.
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool confirmation_requested_;
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::string extension_id_;
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 error_;
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch};
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass MockInstallPrompt : public ExtensionInstallPrompt {
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public:
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  MockInstallPrompt(content::WebContents* web_contents,
98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                    MockPromptProxy* proxy) :
99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      ExtensionInstallPrompt(web_contents),
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      proxy_(proxy) {}
101ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_record_oauth2_grant(bool record) { record_oauth2_grant_ = record; }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overriding some of the ExtensionInstallUI API.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ConfirmInstall(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Delegate* delegate,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const Extension* extension,
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ShowDialogCallback& show_dialog_callback) OVERRIDE {
109ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proxy_->set_confirmation_requested();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate->InstallUIProceed();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnInstallSuccess(const Extension* extension,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                SkBitmap* icon) OVERRIDE {
114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proxy_->set_extension_id(extension->id());
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoopForUI::current()->Quit();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnInstallFailure(const CrxInstallerError& error) OVERRIDE {
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    proxy_->set_error(error.message());
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoopForUI::current()->Quit();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_refptr<MockPromptProxy> proxy_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)MockPromptProxy::MockPromptProxy(content::WebContents* web_contents)
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    : web_contents_(web_contents), confirmation_requested_(false) {
128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochMockPromptProxy::~MockPromptProxy() {}
131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_ptr<ExtensionInstallPrompt> MockPromptProxy::CreatePrompt() {
133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_ptr<MockInstallPrompt> prompt(
134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      new MockInstallPrompt(web_contents_, this));
135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (record_oauth2_grant_.get())
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    prompt->set_record_oauth2_grant(*record_oauth2_grant_.get());
137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return prompt.PassAs<ExtensionInstallPrompt>();
138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_refptr<MockPromptProxy> CreateMockPromptProxyForBrowser(
142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    Browser* browser) {
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return new MockPromptProxy(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser->tab_strip_model()->GetActiveWebContents());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ManagementPolicyMock : public extensions::ManagementPolicy::Provider {
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ManagementPolicyMock() {}
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual std::string GetDebugPolicyProviderName() const OVERRIDE {
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return "ManagementPolicyMock";
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual bool UserMayLoad(const Extension* extension,
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                           base::string16* error) const OVERRIDE {
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    *error = base::UTF8ToUTF16("Dummy error message");
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionCrxInstallerTest : public ExtensionBrowserTest {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<WebstoreInstaller::Approval> GetApproval(
167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      const char* manifest_dir,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      bool strict_manifest_checks) {
170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    scoped_ptr<WebstoreInstaller::Approval> result;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::FilePath ext_path = test_data_dir_.AppendASCII(manifest_dir);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string error;
174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    scoped_ptr<base::DictionaryValue> parsed_manifest(
175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        file_util::LoadManifest(ext_path, &error));
176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (!parsed_manifest.get() || !error.empty())
177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return result.Pass();
178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        browser()->profile(),
181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        id,
182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        parsed_manifest.Pass(),
183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        strict_manifest_checks);
184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void RunCrxInstaller(const WebstoreInstaller::Approval* approval,
187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                       scoped_ptr<ExtensionInstallPrompt> prompt,
188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                       const base::FilePath& crx_path) {
189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    ExtensionService* service = extensions::ExtensionSystem::Get(
190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        browser()->profile())->extension_service();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<CrxInstaller> installer(
192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        CrxInstaller::Create(service, prompt.Pass(), approval));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer->set_allow_silent_install(true);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    installer->set_is_gallery_install(true);
195424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    installer->InstallCrx(crx_path);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunMessageLoop();
197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
198424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
199424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Installs a crx from |crx_relpath| (a path relative to the extension test
200424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // data dir) with expected id |id|.
201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void InstallWithPrompt(const char* ext_relpath,
202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                         const std::string& id,
203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                         scoped_refptr<MockPromptProxy> mock_install_prompt) {
204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::FilePath ext_path = test_data_dir_.AppendASCII(ext_relpath);
205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    scoped_ptr<WebstoreInstaller::Approval> approval;
207424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (!id.empty())
208424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      approval = GetApproval(ext_relpath, id, true);
209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
210424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    base::FilePath crx_path = PackExtension(ext_path);
211424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    EXPECT_FALSE(crx_path.empty());
212424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    RunCrxInstaller(approval.get(), mock_install_prompt->CreatePrompt(),
213424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                    crx_path);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(mock_install_prompt->did_succeed());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs an extension and checks that it has scopes granted IFF
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |record_oauth2_grant| is true.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckHasEmptyScopesAfterInstall(const std::string& ext_relpath,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool record_oauth2_grant) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        switches::kEnableExperimentalExtensionApis);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_refptr<MockPromptProxy> mock_prompt =
226ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        CreateMockPromptProxyForBrowser(browser());
227ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mock_prompt->set_record_oauth2_grant(record_oauth2_grant);
229424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    InstallWithPrompt("browsertest/scopes", std::string(), mock_prompt);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<PermissionSet> permissions =
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ExtensionPrefs::Get(browser()->profile())
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            ->GetGrantedPermissions(mock_prompt->extension_id());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(permissions.get());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// This test is skipped on ChromeOS because it requires the NPAPI,
23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// which is not available on that platform.
24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if !defined(OS_CHROMEOS)
24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, Whitelisting) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string id = "hdgllgikmikobbofgnabhfimcfoopgnd";
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionRegistry* registry = ExtensionRegistry::Get(
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser()->profile());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Even whitelisted extensions with NPAPI should not prompt.
247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_refptr<MockPromptProxy> mock_prompt =
248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      CreateMockPromptProxyForBrowser(browser());
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  InstallWithPrompt("uitest/plugins", id, mock_prompt);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(mock_prompt->confirmation_requested());
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(registry->enabled_extensions().GetByID(id));
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       GalleryInstallGetsExperimental) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We must modify the command line temporarily in order to pack an extension
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that requests the experimental permission.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine old_command_line = *command_line;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crx_path = PackExtension(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("experimental"));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(crx_path.empty());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now reset the command line so that we are testing specifically whether
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // installing from webstore enables experimental permissions.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *(CommandLine::ForCurrentProcess()) = old_command_line;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(InstallExtension(crx_path, 0));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InstallExtensionFromWebstore(crx_path, 1));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, PlatformAppCrx) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kEnableExperimentalExtensionApis);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InstallExtension(
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("minimal_platform_app.crx"), 1));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, PackAndInstallExtension) {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!FeatureSwitch::easy_off_store_install()->IsEnabled())
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kNumDownloadsExpected = 1;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "PackAndInstallExtension: Packing extension";
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath crx_path = PackExtension(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_data_dir_.AppendASCII("common/background_page"));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(crx_path.empty());
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string crx_path_string(crx_path.value().begin(), crx_path.value().end());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = GURL(std::string("file:///").append(crx_path_string));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
294ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  scoped_refptr<MockPromptProxy> mock_prompt =
295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      CreateMockPromptProxyForBrowser(browser());
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  download_crx_util::SetMockInstallPromptForTesting(
297ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      mock_prompt->CreatePrompt());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "PackAndInstallExtension: Getting download manager";
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::DownloadManager* download_manager =
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserContext::GetDownloadManager(browser()->profile());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "PackAndInstallExtension: Setting observer";
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<content::DownloadTestObserver> observer(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new content::DownloadTestObserverTerminal(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          download_manager, kNumDownloadsExpected,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "PackAndInstallExtension: Navigating to URL";
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURLWithDisposition(browser(), url, CURRENT_TAB,
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui_test_utils::BROWSER_TEST_NONE);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(WaitForCrxInstallerDone());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "PackAndInstallExtension: Extension install";
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mock_prompt->confirmation_requested());
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LOG(ERROR) << "PackAndInstallExtension: Extension install confirmed";
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that scopes are only granted if |record_oauth2_grant_| on the prompt is
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// true.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_GrantScopes DISABLED_GrantScopes
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_GrantScopes GrantScopes
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, MAYBE_GrantScopes) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckHasEmptyScopesAfterInstall("browsertest/scopes",
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          true));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, DoNotGrantScopes) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckHasEmptyScopesAfterInstall("browsertest/scopes",
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          false));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, AllowOffStore) {
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kTestData[] = {false, true};
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kTestData); ++i) {
341ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    scoped_refptr<MockPromptProxy> mock_prompt =
342ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        CreateMockPromptProxyForBrowser(browser());
343ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<CrxInstaller> crx_installer(
345ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        CrxInstaller::Create(service, mock_prompt->CreatePrompt()));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crx_installer->set_install_cause(
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        extension_misc::INSTALL_CAUSE_USER_DOWNLOAD);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (kTestData[i]) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      crx_installer->set_off_store_install_allow_reason(
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          CrxInstaller::OffStoreInstallAllowedInTest);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crx_installer->InstallCrx(test_data_dir_.AppendASCII("good.crx"));
35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // The |mock_prompt| will quit running the loop once the |crx_installer|
35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // is done.
35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    content::RunMessageLoop();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestData[i], mock_prompt->did_succeed());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(kTestData[i], mock_prompt->confirmation_requested()) <<
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kTestData[i];
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (kTestData[i]) {
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_EQ(base::string16(), mock_prompt->error()) << kTestData[i];
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(l10n_util::GetStringUTF16(
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_EXTENSION_INSTALL_DISALLOWED_ON_SITE),
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mock_prompt->error()) << kTestData[i];
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
371868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, HiDpiThemeTest) {
372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::FilePath crx_path = test_data_dir_.AppendASCII("theme_hidpi_crx");
373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  crx_path = crx_path.AppendASCII("theme_hidpi.crx");
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(crx_path, 1));
376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::string extension_id("gllekhaobjnhgeagipipnkpmmmpchacm");
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionRegistry* registry = ExtensionRegistry::Get(
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser()->profile());
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const extensions::Extension* extension =
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     registry->enabled_extensions().GetByID(extension_id);
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(extension);
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(extension_id, extension->id());
384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UninstallExtension(extension_id);
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(registry->enabled_extensions().GetByID(extension_id));
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// See http://crbug.com/315299.
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_LINUX)
391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_InstallDelayedUntilNextUpdate \
392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        DISABLED_InstallDelayedUntilNextUpdate
393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else
394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MAYBE_InstallDelayedUntilNextUpdate InstallDelayedUntilNextUpdate
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       MAYBE_InstallDelayedUntilNextUpdate) {
398a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::string extension_id("ldnnhddmnhbkjipkidpdiheffobcpfmf");
399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath crx_path = test_data_dir_.AppendASCII("delayed_install");
400a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExtensionSystem* extension_system = extensions::ExtensionSystem::Get(
401a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      browser()->profile());
402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ExtensionService* service = extension_system->extension_service();
403a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(service);
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionRegistry* registry = ExtensionRegistry::Get(
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser()->profile());
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(registry);
407a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
408a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Install version 1 of the test extension. This extension does not have
409a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // a background page but does have a browser action.
410a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(InstallExtension(crx_path.AppendASCII("v1.crx"), 1));
411a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const extensions::Extension* extension =
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     registry->enabled_extensions().GetByID(extension_id);
413a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(extension);
414a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_EQ(extension_id, extension->id());
415a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_EQ("1.0", extension->version()->GetString());
416a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Make test extension non-idle by opening the extension's browser action
418a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // popup. This should cause the installation to be delayed.
4190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  content::WindowedNotificationObserver loading_observer(
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING,
4210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      content::Source<Profile>(profile()));
4220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  BrowserActionTestUtil util(browser());
4230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // There is only one extension, so just click the first browser action.
4240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ASSERT_EQ(1, util.NumberOfBrowserActions());
4250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  util.Press(0);
4260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  loading_observer.Wait();
4270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ExtensionHost* extension_host =
4280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      content::Details<ExtensionHost>(loading_observer.details()).ptr();
429a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
430a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Install version 2 of the extension and check that it is indeed delayed.
431a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(UpdateExtensionWaitForIdle(
432a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      extension_id, crx_path.AppendASCII("v2.crx"), 0));
433a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
434a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_EQ(1u, service->delayed_installs()->size());
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extension = registry->enabled_extensions().GetByID(extension_id);
436a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_EQ("1.0", extension->version()->GetString());
437a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Make the extension idle again by closing the popup. This should not trigger
439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // the delayed install.
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::RenderProcessHostWatcher terminated_observer(
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      extension_host->render_process_host(),
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      content::RenderProcessHostWatcher::WATCH_FOR_HOST_DESTRUCTION);
4430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  extension_host->render_view_host()->ClosePage();
4440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  terminated_observer.Wait();
445a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_EQ(1u, service->delayed_installs()->size());
446a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
447a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Install version 3 of the extension. Because the extension is idle,
448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // this install should succeed.
449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(UpdateExtensionWaitForIdle(
450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      extension_id, crx_path.AppendASCII("v3.crx"), 0));
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extension = registry->enabled_extensions().GetByID(extension_id);
452a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_EQ("3.0", extension->version()->GetString());
453a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // The version 2 delayed install should be cleaned up, and finishing
455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // delayed extension installation shouldn't break anything.
456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_EQ(0u, service->delayed_installs()->size());
457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  service->MaybeFinishDelayedInstallations();
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extension = registry->enabled_extensions().GetByID(extension_id);
459a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_EQ("3.0", extension->version()->GetString());
460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
461a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(FULL_SAFE_BROWSING)
463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, Blacklist) {
46468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db(
46568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new FakeSafeBrowsingDatabaseManager(true));
46668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db(blacklist_db);
467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
46868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  blacklist_db->SetUnsafe("gllekhaobjnhgeagipipnkpmmmpchacm");
469a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
470a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::FilePath crx_path = test_data_dir_.AppendASCII("theme_hidpi_crx")
471a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                          .AppendASCII("theme_hidpi.crx");
472a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(InstallExtension(crx_path, 0));
473a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
475a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
476424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, NonStrictManifestCheck) {
477424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_refptr<MockPromptProxy> mock_prompt =
478424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      CreateMockPromptProxyForBrowser(browser());
479424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
480424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // We want to simulate the case where the webstore sends a more recent
481424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // version of the manifest, but the downloaded .crx file is old since
482424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // the newly published version hasn't fully propagated to all the download
483424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // servers yet. So load the v2 manifest, but then install the v1 crx file.
484424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  std::string id = "lhnaeclnpobnlbjbgogdanmhadigfnjp";
485424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_ptr<WebstoreInstaller::Approval> approval =
486424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      GetApproval("crx_installer/v2_no_permission_change/", id, false);
487424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
488424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RunCrxInstaller(approval.get(), mock_prompt->CreatePrompt(),
489424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                  test_data_dir_.AppendASCII("crx_installer/v1.crx"));
490424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
491424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_TRUE(mock_prompt->did_succeed());
492424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
493424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
49468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, KioskOnlyTest) {
49568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::FilePath crx_path =
49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      test_data_dir_.AppendASCII("kiosk/kiosk_only.crx");
49768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(InstallExtension(crx_path, 0));
49868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_CHROMEOS)
49968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Simulate ChromeOS kiosk mode. |scoped_user_manager| will take over
50068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // lifetime of |user_manager|.
50168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  chromeos::FakeUserManager* fake_user_manager =
50268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new chromeos::FakeUserManager();
50368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  fake_user_manager->AddKioskAppUser("example@example.com");
50468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  fake_user_manager->LoginUser("example@example.com");
50568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  chromeos::ScopedUserManagerEnabler scoped_user_manager(fake_user_manager);
50668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(InstallExtension(crx_path, 1));
50768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif
50868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
50968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, InstallToSharedLocation) {
512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ShadowingAtExitManager at_exit_manager;
513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      chromeos::switches::kEnableExtensionAssetsSharing);
515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::ScopedTempDir cache_dir;
516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(cache_dir.CreateUniqueTempDir());
517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ExtensionAssetsManagerChromeOS::SetSharedInstallDirForTesting(
518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      cache_dir.path());
519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath crx_path = test_data_dir_.AppendASCII("crx_installer/v1.crx");
521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const extensions::Extension* extension = InstallExtension(
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      crx_path, 1, extensions::Manifest::EXTERNAL_PREF);
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::FilePath extension_path = extension->path();
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(cache_dir.path().IsParent(extension_path));
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(base::PathExists(extension_path));
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string extension_id = extension->id();
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UninstallExtension(extension_id);
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionRegistry* registry = ExtensionRegistry::Get(
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser()->profile());
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(registry->enabled_extensions().GetByID(extension_id));
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::RunAllBlockingPoolTasksUntilIdle();
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(base::PathExists(extension_path));
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, DoNotSync) {
540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
541f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                  browser()->profile())->extension_service();
542f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_refptr<CrxInstaller> crx_installer(
543f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      CrxInstaller::CreateSilent(service));
5446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  crx_installer->set_do_not_sync(true);
545f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  crx_installer->InstallCrx(test_data_dir_.AppendASCII("good.crx"));
546f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(WaitForCrxInstallerDone());
547f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ASSERT_TRUE(crx_installer->extension());
548f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
549f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const ExtensionPrefs* extension_prefs =
550f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ExtensionPrefs::Get(browser()->profile());
551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(extension_prefs->DoNotSync(crx_installer->extension()->id()));
552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(extensions::util::ShouldSyncApp(crx_installer->extension(),
553f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                               browser()->profile()));
554f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
556116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, ManagementPolicy) {
557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ManagementPolicyMock policy;
558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::ExtensionSystem::Get(profile())
559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ->management_policy()
560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ->RegisterProvider(&policy);
561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::FilePath crx_path = test_data_dir_.AppendASCII("crx_installer/v1.crx");
563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(InstallExtension(crx_path, 0));
564116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, WithheldElevationCheck) {
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Enable consent flag and install extension. The <all_hosts> permission will
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // be withheld.
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<FeatureSwitch::ScopedOverride> enable_scripts_switch(
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new FeatureSwitch::ScopedOverride(
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          FeatureSwitch::scripts_require_action(), true));
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char kManifest[] =
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "{"
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "  \"name\": \"Withheld test\","
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "  \"version\": \"1.0\","
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "  \"permissions\": ["
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "    \"http://*/*\""
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "  ],"
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "  \"manifest_version\": 2"
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "}";
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestExtensionDir dir;
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  dir.WriteManifest(kManifest);
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::FilePath crx_path = dir.Pack();
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(crx_path.empty());
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const Extension* extension = InstallExtension(crx_path, 1);
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(base::PathExists(extension->path()));
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string extension_id = extension->id();
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionRegistry* registry = ExtensionRegistry::Get(
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser()->profile());
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(registry->enabled_extensions().GetByID(extension_id));
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Disable consent flag and reinstall extension. It should now be disabled
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // because previously withheld permissions are now being requested.
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enable_scripts_switch.reset();
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extension = InstallExtension(crx_path, -1);
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(registry->enabled_extensions().GetByID(extension_id));
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(registry->disabled_extensions().GetByID(extension_id));
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(ExtensionPrefs::Get(browser()->profile())->GetDisableReasons(
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extension_id) & Extension::DISABLE_PERMISSIONS_INCREASE);
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
605