blob: 619822cfa479e0fb5fb3bd7a26c4a19e57c24ce8 [file] [log] [blame]
[email protected]35385332012-03-28 02:32:031// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]a01e00632010-11-05 16:58:142// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
mtomaszf7d99a5c2014-09-15 16:23:465#include "chrome/browser/extensions/crx_installer.h"
6
avia2f4804a2015-12-24 23:11:137#include <stddef.h>
dchengc963c7142016-04-08 03:55:228
dcheng1fc00f12015-12-26 22:18:039#include <utility>
avia2f4804a2015-12-24 23:11:1310
[email protected]5a145e82014-05-29 22:19:0711#include "base/at_exit.h"
Sebastien Marchandf1349f52019-01-25 03:16:4112#include "base/bind.h"
kalmanae342c92014-12-12 22:04:2313#include "base/files/file_path.h"
Minh X. Nguyen2c17b3982017-10-13 18:32:2914#include "base/files/scoped_temp_dir.h"
dchengc963c7142016-04-08 03:55:2215#include "base/memory/ptr_util.h"
[email protected]f8636f92013-08-09 21:02:3716#include "base/memory/ref_counted.h"
Sergey Poromovcc362382018-11-09 18:43:3217#include "base/optional.h"
Gabriel Charette53a9ef812017-07-26 12:36:2318#include "base/run_loop.h"
Avi Drissman5f0fb8c2018-12-25 23:20:4919#include "base/stl_util.h"
[email protected]253fc2bb2014-07-10 04:21:1820#include "base/strings/utf_string_conversions.h"
jam3f2d3932017-04-26 20:28:5121#include "base/threading/thread_restrictions.h"
avia2f4804a2015-12-24 23:11:1322#include "build/build_config.h"
[email protected]bf2fcd52012-04-16 22:59:3923#include "chrome/browser/download/download_crx_util.h"
[email protected]a01e00632010-11-05 16:58:1424#include "chrome/browser/extensions/extension_browsertest.h"
[email protected]c82da8c42012-06-08 19:49:1125#include "chrome/browser/extensions/extension_install_prompt.h"
pkotwicz2f181782014-10-29 17:33:4526#include "chrome/browser/extensions/extension_install_prompt_show_params.h"
[email protected]eaa7dd182010-12-14 11:09:0027#include "chrome/browser/extensions/extension_service.h"
mekc95f9d062015-01-10 00:52:0428#include "chrome/browser/extensions/extension_tab_util.h"
[email protected]658eae52014-06-14 20:28:0529#include "chrome/browser/extensions/extension_util.h"
[email protected]3f2a2fa2013-09-24 02:55:2530#include "chrome/browser/extensions/fake_safe_browsing_database_manager.h"
Oleg Davydovc00866812019-04-04 10:47:2731#include "chrome/browser/extensions/forced_extensions/installation_reporter.h"
[email protected]8ecad5e2010-12-02 21:18:3332#include "chrome/browser/profiles/profile.h"
[email protected]2ad4a902010-11-17 06:05:1333#include "chrome/browser/ui/browser.h"
[email protected]619f86182012-07-03 21:30:1834#include "chrome/browser/ui/browser_window.h"
Christopher Lam851605b2018-02-09 05:24:0435#include "chrome/browser/ui/extensions/browser_action_test_util.h"
[email protected]91e51d612012-10-21 23:03:0536#include "chrome/browser/ui/tabs/tab_strip_model.h"
dominickn675536f2015-11-06 03:25:3837#include "chrome/common/web_application_info.h"
[email protected]af39f002014-08-22 10:18:1838#include "chrome/grit/generated_resources.h"
[email protected]af44e7fb2011-07-29 18:32:3239#include "chrome/test/base/ui_test_utils.h"
Nico Weberbc5b06f2019-07-26 14:00:1340#include "components/safe_browsing/buildflags.h"
[email protected]5a145e82014-05-29 22:19:0741#include "content/public/browser/browser_thread.h"
[email protected]f34efa22013-03-05 19:14:2342#include "content/public/browser/download_manager.h"
[email protected]52b76592013-11-02 17:59:0343#include "content/public/browser/render_view_host.h"
[email protected]8ffad4e2014-01-02 23:18:2644#include "content/public/test/browser_test_utils.h"
[email protected]49b264f2012-08-14 17:12:2645#include "content/public/test/download_test_observer.h"
mtomaszf7d99a5c2014-09-15 16:23:4646#include "content/public/test/test_utils.h"
rdevlin.croninca5bf2da2015-12-17 21:21:0847#include "extensions/browser/extension_dialog_auto_confirm.h"
[email protected]dccba4f82014-05-29 00:52:5648#include "extensions/browser/extension_prefs.h"
gpdavis.chromium48f08c42014-09-18 22:09:3449#include "extensions/browser/extension_registry.h"
[email protected]59b0e602014-01-30 00:41:2450#include "extensions/browser/extension_system.h"
ginkage47e603e2015-02-27 08:42:4151#include "extensions/browser/install/crx_install_error.h"
Minh X. Nguyen8803f4e2018-05-25 01:03:1052#include "extensions/browser/install/sandboxed_unpacker_failure_reason.h"
[email protected]253fc2bb2014-07-10 04:21:1853#include "extensions/browser/management_policy.h"
[email protected]adf5a102014-07-31 12:44:0654#include "extensions/browser/notification_types.h"
[email protected]e4452d32013-11-15 23:07:4155#include "extensions/common/extension.h"
Minh X. Nguyen30975342017-12-04 22:02:4156#include "extensions/common/extension_builder.h"
[email protected]5ef835a2013-11-08 20:42:5757#include "extensions/common/feature_switch.h"
[email protected]85df9d12014-04-15 17:02:1458#include "extensions/common/file_util.h"
kalmanae342c92014-12-12 22:04:2359#include "extensions/common/permissions/api_permission.h"
[email protected]5a55f3f2013-10-29 01:08:2960#include "extensions/common/permissions/permission_set.h"
kalmanae342c92014-12-12 22:04:2361#include "extensions/common/permissions/permissions_data.h"
[email protected]c8d02992013-07-31 22:16:5162#include "extensions/common/switches.h"
Devlin Cronin4f455a22018-01-25 01:36:4563#include "extensions/test/test_extension_dir.h"
dominickn675536f2015-11-06 03:25:3864#include "third_party/skia/include/core/SkBitmap.h"
[email protected]a9736892012-05-30 15:58:0565#include "ui/base/l10n/l10n_util.h"
[email protected]a01e00632010-11-05 16:58:1466
[email protected]14a18bf2013-09-26 08:42:3067#if defined(OS_CHROMEOS)
merkulova793f3022015-02-04 10:18:3068#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
[email protected]5a145e82014-05-29 22:19:0769#include "chrome/browser/extensions/extension_assets_manager_chromeos.h"
Steven Bennetts38e9bde22019-01-03 17:31:1070#include "chromeos/constants/chromeos_switches.h"
Xiyuan Xiadfe3a9f2017-11-13 21:46:2671#include "components/user_manager/scoped_user_manager.h"
[email protected]14a18bf2013-09-26 08:42:3072#endif
73
[email protected]7a5452f2010-12-13 23:03:1974class SkBitmap;
75
dominickn675536f2015-11-06 03:25:3876namespace {
77
78const char kAppUrl[] = "http://www.google.com";
79const char kAppTitle[] = "Test title";
80const char kAppDescription[] = "Test description";
81
82} // anonymous namespace
83
[email protected]bf3d9df2012-07-24 23:20:2784namespace extensions {
[email protected]b70a2d92012-06-28 19:51:2185
[email protected]a01e00632010-11-05 16:58:1486namespace {
87
[email protected]f8636f92013-08-09 21:02:3788class MockInstallPrompt;
89
90// This class holds information about things that happen with a
91// MockInstallPrompt. We create the MockInstallPrompt but need to pass
92// ownership of it to CrxInstaller, so it isn't safe to hang this data on
93// MockInstallPrompt itself becuase we can't guarantee it's lifetime.
rdevlin.croninca5bf2da2015-12-17 21:21:0894class MockPromptProxy {
[email protected]f8636f92013-08-09 21:02:3795 public:
96 explicit MockPromptProxy(content::WebContents* web_contents);
rdevlin.croninca5bf2da2015-12-17 21:21:0897 ~MockPromptProxy();
[email protected]f8636f92013-08-09 21:02:3798
99 bool did_succeed() const { return !extension_id_.empty(); }
100 const std::string& extension_id() { return extension_id_; }
101 bool confirmation_requested() const { return confirmation_requested_; }
[email protected]439f1e32013-12-09 20:09:09102 const base::string16& error() const { return error_; }
[email protected]f8636f92013-08-09 21:02:37103
[email protected]f8636f92013-08-09 21:02:37104 void set_extension_id(const std::string& id) { extension_id_ = id; }
rdevlin.croninca5bf2da2015-12-17 21:21:08105 void set_confirmation_requested(bool requested) {
106 confirmation_requested_ = requested;
107 }
[email protected]439f1e32013-12-09 20:09:09108 void set_error(const base::string16& error) { error_ = error; }
[email protected]f8636f92013-08-09 21:02:37109
dchengc963c7142016-04-08 03:55:22110 std::unique_ptr<ExtensionInstallPrompt> CreatePrompt();
[email protected]f8636f92013-08-09 21:02:37111
112 private:
[email protected]f8636f92013-08-09 21:02:37113
114 // Data used to create a prompt.
115 content::WebContents* web_contents_;
[email protected]f8636f92013-08-09 21:02:37116
117 // Data reported back to us by the prompt we created.
118 bool confirmation_requested_;
119 std::string extension_id_;
[email protected]439f1e32013-12-09 20:09:09120 base::string16 error_;
rdevlin.croninca5bf2da2015-12-17 21:21:08121
dchengc963c7142016-04-08 03:55:22122 std::unique_ptr<ScopedTestDialogAutoConfirm> auto_confirm;
rdevlin.croninca5bf2da2015-12-17 21:21:08123
124 DISALLOW_COPY_AND_ASSIGN(MockPromptProxy);
[email protected]f8636f92013-08-09 21:02:37125};
[email protected]bf2fcd52012-04-16 22:59:39126
dominickn675536f2015-11-06 03:25:38127SkBitmap CreateSquareBitmap(int size) {
128 SkBitmap bitmap;
129 bitmap.allocN32Pixels(size, size);
130 bitmap.eraseColor(SK_ColorRED);
131 return bitmap;
132}
133
dominickn675536f2015-11-06 03:25:38134WebApplicationInfo CreateWebAppInfo(const char* title,
135 const char* description,
136 const char* app_url,
137 int size) {
138 WebApplicationInfo web_app_info;
139 web_app_info.title = base::UTF8ToUTF16(title);
140 web_app_info.description = base::UTF8ToUTF16(description);
141 web_app_info.app_url = GURL(app_url);
Giovanni Ortuño Urquidie7e79d452017-08-03 10:16:15142 web_app_info.scope = GURL(app_url);
Alan Cutterb891a622019-12-03 04:05:08143 web_app_info.icon_bitmaps[size] = CreateSquareBitmap(size);
dominickn675536f2015-11-06 03:25:38144
145 return web_app_info;
146}
147
[email protected]c82da8c42012-06-08 19:49:11148class MockInstallPrompt : public ExtensionInstallPrompt {
[email protected]a01e00632010-11-05 16:58:14149 public:
[email protected]f8636f92013-08-09 21:02:37150 MockInstallPrompt(content::WebContents* web_contents,
151 MockPromptProxy* proxy) :
[email protected]91e51d612012-10-21 23:03:05152 ExtensionInstallPrompt(web_contents),
[email protected]f8636f92013-08-09 21:02:37153 proxy_(proxy) {}
[email protected]a01e00632010-11-05 16:58:14154
[email protected]a01e00632010-11-05 16:58:14155 // Overriding some of the ExtensionInstallUI API.
Dana Friedc3c30222018-12-11 23:34:56156 void OnInstallSuccess(scoped_refptr<const Extension> extension,
157 SkBitmap* icon) override {
[email protected]f8636f92013-08-09 21:02:37158 proxy_->set_extension_id(extension->id());
rdevlin.croninca5bf2da2015-12-17 21:21:08159 proxy_->set_confirmation_requested(did_call_show_dialog());
[email protected]a01e00632010-11-05 16:58:14160 }
ginkage47e603e2015-02-27 08:42:41161 void OnInstallFailure(const CrxInstallError& error) override {
[email protected]f8636f92013-08-09 21:02:37162 proxy_->set_error(error.message());
rdevlin.croninca5bf2da2015-12-17 21:21:08163 proxy_->set_confirmation_requested(did_call_show_dialog());
[email protected]a01e00632010-11-05 16:58:14164 }
165
166 private:
rdevlin.croninca5bf2da2015-12-17 21:21:08167 MockPromptProxy* proxy_;
168
169 DISALLOW_COPY_AND_ASSIGN(MockInstallPrompt);
[email protected]a01e00632010-11-05 16:58:14170};
171
[email protected]658eae52014-06-14 20:28:05172MockPromptProxy::MockPromptProxy(content::WebContents* web_contents)
rdevlin.croninca5bf2da2015-12-17 21:21:08173 : web_contents_(web_contents),
174 confirmation_requested_(false),
175 auto_confirm(new ScopedTestDialogAutoConfirm(
176 ScopedTestDialogAutoConfirm::ACCEPT)) {
[email protected]f8636f92013-08-09 21:02:37177}
178
179MockPromptProxy::~MockPromptProxy() {}
180
dchengc963c7142016-04-08 03:55:22181std::unique_ptr<ExtensionInstallPrompt> MockPromptProxy::CreatePrompt() {
182 return std::unique_ptr<MockInstallPrompt>(
[email protected]f8636f92013-08-09 21:02:37183 new MockInstallPrompt(web_contents_, this));
[email protected]f8636f92013-08-09 21:02:37184}
185
dchengc963c7142016-04-08 03:55:22186std::unique_ptr<MockPromptProxy> CreateMockPromptProxyForBrowser(
[email protected]f8636f92013-08-09 21:02:37187 Browser* browser) {
Jinho Bangb5216cec2018-01-17 19:43:11188 return std::make_unique<MockPromptProxy>(
ricea91d6fc122016-08-30 08:47:14189 browser->tab_strip_model()->GetActiveWebContents());
[email protected]619f86182012-07-03 21:30:18190}
191
[email protected]253fc2bb2014-07-10 04:21:18192class ManagementPolicyMock : public extensions::ManagementPolicy::Provider {
193 public:
194 ManagementPolicyMock() {}
195
dchengae36a4a2014-10-21 12:36:36196 std::string GetDebugPolicyProviderName() const override {
[email protected]253fc2bb2014-07-10 04:21:18197 return "ManagementPolicyMock";
198 }
199
dchengae36a4a2014-10-21 12:36:36200 bool UserMayLoad(const Extension* extension,
201 base::string16* error) const override {
Karan Bhatia2a117232017-08-23 00:24:56202 if (error)
203 *error = base::UTF8ToUTF16("Dummy error message");
[email protected]253fc2bb2014-07-10 04:21:18204 return false;
205 }
206};
207
[email protected]a01e00632010-11-05 16:58:14208} // namespace
209
210class ExtensionCrxInstallerTest : public ExtensionBrowserTest {
kalmanae342c92014-12-12 22:04:23211 protected:
dchengc963c7142016-04-08 03:55:22212 std::unique_ptr<WebstoreInstaller::Approval> GetApproval(
[email protected]85290822013-08-23 20:27:38213 const char* manifest_dir,
[email protected]b70a2d92012-06-28 19:51:21214 const std::string& id,
[email protected]85290822013-08-23 20:27:38215 bool strict_manifest_checks) {
dchengc963c7142016-04-08 03:55:22216 std::unique_ptr<WebstoreInstaller::Approval> result;
[email protected]85290822013-08-23 20:27:38217
Minh X. Nguyen2c17b3982017-10-13 18:32:29218 base::ScopedAllowBlockingForTesting allow_io;
[email protected]85290822013-08-23 20:27:38219 base::FilePath ext_path = test_data_dir_.AppendASCII(manifest_dir);
220 std::string error;
dchengc963c7142016-04-08 03:55:22221 std::unique_ptr<base::DictionaryValue> parsed_manifest(
[email protected]85df9d12014-04-15 17:02:14222 file_util::LoadManifest(ext_path, &error));
[email protected]85290822013-08-23 20:27:38223 if (!parsed_manifest.get() || !error.empty())
dcheng1fc00f12015-12-26 22:18:03224 return result;
[email protected]85290822013-08-23 20:27:38225
226 return WebstoreInstaller::Approval::CreateWithNoInstallPrompt(
dcheng1fc00f12015-12-26 22:18:03227 browser()->profile(), id, std::move(parsed_manifest),
[email protected]85290822013-08-23 20:27:38228 strict_manifest_checks);
229 }
230
Minh X. Nguyen30975342017-12-04 22:02:41231 const Extension* GetInstalledExtension(const std::string& extension_id) {
David Bertoni9f897c92019-09-20 17:46:35232 return extension_registry()->GetInstalledExtension(extension_id);
Minh X. Nguyen30975342017-12-04 22:02:41233 }
234
235 std::unique_ptr<base::ScopedTempDir> UnpackedCrxTempDir() {
236 auto temp_dir = std::make_unique<base::ScopedTempDir>();
237 EXPECT_TRUE(temp_dir->CreateUniqueTempDir());
238 EXPECT_TRUE(base::PathExists(temp_dir->GetPath()));
239
Devlin Cronin19775cc2018-04-19 15:04:26240 base::FilePath unpacked_path =
241 test_data_dir_.AppendASCII("simple_with_popup");
Minh X. Nguyen30975342017-12-04 22:02:41242 EXPECT_TRUE(base::PathExists(unpacked_path));
243 EXPECT_TRUE(base::CopyDirectory(unpacked_path, temp_dir->GetPath(), false));
244
245 return temp_dir;
246 }
247
248 // Helper function that creates a file at |relative_path| within |directory|
249 // and fills it with |content|.
250 bool AddFileToDirectory(const base::FilePath& directory,
251 const base::FilePath& relative_path,
252 const std::string& content) const {
253 const base::FilePath full_path = directory.Append(relative_path);
254 if (!CreateDirectory(full_path.DirName()))
255 return false;
256 const int result =
257 base::WriteFile(full_path, content.data(), content.size());
258 return (static_cast<size_t>(result) == content.size());
259 }
260
261 void AddExtension(const std::string& extension_id,
262 const std::string& version) {
263 base::ScopedTempDir temp_dir;
264 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
265 ASSERT_TRUE(base::PathExists(temp_dir.GetPath()));
266
267 base::FilePath foo_js(FILE_PATH_LITERAL("foo.js"));
268 base::FilePath bar_html(FILE_PATH_LITERAL("bar/bar.html"));
269 ASSERT_TRUE(AddFileToDirectory(temp_dir.GetPath(), foo_js, "hello"))
270 << "Failed to write " << temp_dir.GetPath().value() << "/"
271 << foo_js.value();
272 ASSERT_TRUE(AddFileToDirectory(temp_dir.GetPath(), bar_html, "world"));
273
274 ExtensionBuilder builder;
275 builder.SetManifest(DictionaryBuilder()
276 .Set("name", "My First Extension")
277 .Set("version", version)
278 .Set("manifest_version", 2)
279 .Build());
280 builder.SetID(extension_id);
281 builder.SetPath(temp_dir.GetPath());
282 ExtensionRegistry::Get(browser()->profile())->AddEnabled(builder.Build());
283
284 const Extension* extension = GetInstalledExtension(extension_id);
285 ASSERT_NE(nullptr, extension);
286 ASSERT_EQ(version, extension->VersionString());
287 }
288
289 static void InstallerCallback(base::OnceClosure quit_closure,
290 CrxInstaller::InstallerResultCallback callback,
Minh X. Nguyen8803f4e2018-05-25 01:03:10291 const base::Optional<CrxInstallError>& error) {
Minh X. Nguyen30975342017-12-04 22:02:41292 if (!callback.is_null())
Minh X. Nguyen8803f4e2018-05-25 01:03:10293 std::move(callback).Run(error);
Minh X. Nguyen30975342017-12-04 22:02:41294 std::move(quit_closure).Run();
295 }
296
[email protected]85290822013-08-23 20:27:38297 void RunCrxInstaller(const WebstoreInstaller::Approval* approval,
dchengc963c7142016-04-08 03:55:22298 std::unique_ptr<ExtensionInstallPrompt> prompt,
Minh X. Nguyen2c17b3982017-10-13 18:32:29299 CrxInstaller::InstallerResultCallback callback,
[email protected]85290822013-08-23 20:27:38300 const base::FilePath& crx_path) {
Minh X. Nguyen30975342017-12-04 22:02:41301 base::RunLoop run_loop;
302
[email protected]a01e00632010-11-05 16:58:14303 scoped_refptr<CrxInstaller> installer(
Minh X. Nguyen30975342017-12-04 22:02:41304 CrxInstaller::Create(extension_service(), std::move(prompt), approval));
[email protected]a01e00632010-11-05 16:58:14305 installer->set_allow_silent_install(true);
[email protected]b1f04cc2010-11-10 22:59:30306 installer->set_is_gallery_install(true);
Minh X. Nguyen30975342017-12-04 22:02:41307 installer->set_installer_callback(
308 base::BindOnce(&ExtensionCrxInstallerTest::InstallerCallback,
309 run_loop.QuitWhenIdleClosure(), std::move(callback)));
[email protected]85290822013-08-23 20:27:38310 installer->InstallCrx(crx_path);
Minh X. Nguyen30975342017-12-04 22:02:41311
312 run_loop.Run();
[email protected]85290822013-08-23 20:27:38313 }
314
Minh X. Nguyen2c17b3982017-10-13 18:32:29315 void RunCrxInstallerFromUnpackedDirectory(
316 std::unique_ptr<ExtensionInstallPrompt> prompt,
317 CrxInstaller::InstallerResultCallback callback,
318 const std::string& extension_id,
319 const std::string& public_key,
320 const base::FilePath& crx_directory) {
Minh X. Nguyen30975342017-12-04 22:02:41321 base::RunLoop run_loop;
322
Minh X. Nguyen2c17b3982017-10-13 18:32:29323 scoped_refptr<CrxInstaller> installer(
Minh X. Nguyen30975342017-12-04 22:02:41324 CrxInstaller::Create(extension_service(), std::move(prompt)));
Minh X. Nguyen2c17b3982017-10-13 18:32:29325 installer->set_allow_silent_install(true);
326 installer->set_is_gallery_install(true);
Minh X. Nguyen30975342017-12-04 22:02:41327 installer->set_installer_callback(
328 base::BindOnce(&ExtensionCrxInstallerTest::InstallerCallback,
329 run_loop.QuitWhenIdleClosure(), std::move(callback)));
Minh X. Nguyen2c17b3982017-10-13 18:32:29330 installer->set_delete_source(true);
331 installer->InstallUnpackedCrx(extension_id, public_key, crx_directory);
Minh X. Nguyen30975342017-12-04 22:02:41332
333 run_loop.Run();
334 }
335
336 void RunUpdateExtension(std::unique_ptr<ExtensionInstallPrompt> prompt,
337 const std::string& extension_id,
338 const std::string& public_key,
339 const base::FilePath& unpacked_dir,
340 CrxInstaller::InstallerResultCallback callback) {
341 base::RunLoop run_loop;
342
343 scoped_refptr<CrxInstaller> installer(
344 CrxInstaller::Create(extension_service(), std::move(prompt)));
345 installer->set_delete_source(true);
346 installer->set_installer_callback(
347 base::BindOnce(&ExtensionCrxInstallerTest::InstallerCallback,
348 run_loop.QuitWhenIdleClosure(), std::move(callback)));
349 installer->UpdateExtensionFromUnpackedCrx(extension_id, public_key,
350 unpacked_dir);
351
352 run_loop.Run();
Minh X. Nguyen2c17b3982017-10-13 18:32:29353 }
354
[email protected]85290822013-08-23 20:27:38355 // Installs a crx from |crx_relpath| (a path relative to the extension test
356 // data dir) with expected id |id|.
357 void InstallWithPrompt(const char* ext_relpath,
358 const std::string& id,
Minh X. Nguyen2c17b3982017-10-13 18:32:29359 CrxInstaller::InstallerResultCallback callback,
rdevlin.croninca5bf2da2015-12-17 21:21:08360 MockPromptProxy* mock_install_prompt) {
[email protected]85290822013-08-23 20:27:38361 base::FilePath ext_path = test_data_dir_.AppendASCII(ext_relpath);
362
dchengc963c7142016-04-08 03:55:22363 std::unique_ptr<WebstoreInstaller::Approval> approval;
[email protected]85290822013-08-23 20:27:38364 if (!id.empty())
365 approval = GetApproval(ext_relpath, id, true);
366
367 base::FilePath crx_path = PackExtension(ext_path);
368 EXPECT_FALSE(crx_path.empty());
369 RunCrxInstaller(approval.get(), mock_install_prompt->CreatePrompt(),
Minh X. Nguyen2c17b3982017-10-13 18:32:29370 std::move(callback), crx_path);
[email protected]a01e00632010-11-05 16:58:14371
[email protected]c82da8c42012-06-08 19:49:11372 EXPECT_TRUE(mock_install_prompt->did_succeed());
[email protected]b70a2d92012-06-28 19:51:21373 }
374
375 // Installs an extension and checks that it has scopes granted IFF
376 // |record_oauth2_grant| is true.
Minh X. Nguyen2c17b3982017-10-13 18:32:29377 void CheckHasEmptyScopesAfterInstall(
378 const std::string& ext_relpath,
379 CrxInstaller::InstallerResultCallback callback,
380 bool record_oauth2_grant) {
dchengc963c7142016-04-08 03:55:22381 std::unique_ptr<MockPromptProxy> mock_prompt =
[email protected]f8636f92013-08-09 21:02:37382 CreateMockPromptProxyForBrowser(browser());
383
Minh X. Nguyen2c17b3982017-10-13 18:32:29384 InstallWithPrompt("browsertest/scopes", std::string(), std::move(callback),
385 mock_prompt.get());
[email protected]b70a2d92012-06-28 19:51:21386
dchengc963c7142016-04-08 03:55:22387 std::unique_ptr<const PermissionSet> permissions =
[email protected]7c82539c2014-02-19 06:09:17388 ExtensionPrefs::Get(browser()->profile())
389 ->GetGrantedPermissions(mock_prompt->extension_id());
[email protected]b70a2d92012-06-28 19:51:21390 ASSERT_TRUE(permissions.get());
[email protected]a01e00632010-11-05 16:58:14391 }
kalmanae342c92014-12-12 22:04:23392
dominickn675536f2015-11-06 03:25:38393 void InstallWebAppAndVerifyNoErrors() {
dominickn675536f2015-11-06 03:25:38394 scoped_refptr<CrxInstaller> crx_installer(
Minh X. Nguyen30975342017-12-04 22:02:41395 CrxInstaller::CreateSilent(extension_service()));
dominickn675536f2015-11-06 03:25:38396 crx_installer->set_error_on_unsupported_requirements(true);
397 crx_installer->InstallWebApp(
398 CreateWebAppInfo(kAppTitle, kAppDescription, kAppUrl, 64));
399 EXPECT_TRUE(WaitForCrxInstallerDone());
400 ASSERT_TRUE(crx_installer->extension());
dominickn675536f2015-11-06 03:25:38401 }
[email protected]a01e00632010-11-05 16:58:14402};
403
voodoo6ede9072016-03-09 07:47:53404class ExtensionCrxInstallerTestWithExperimentalApis
405 : public ExtensionCrxInstallerTest {
406 protected:
407 void SetUpCommandLine(base::CommandLine* command_line) override {
408 ExtensionCrxInstallerTest::SetUpCommandLine(command_line);
409 command_line->AppendSwitch(switches::kEnableExperimentalExtensionApis);
410 }
411};
412
[email protected]fc38935a2011-10-31 23:53:28413IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
kalmanae342c92014-12-12 22:04:23414 ExperimentalExtensionFromGallery) {
415 // Gallery-installed extensions should have their experimental permission
416 // preserved, since we allow the Webstore to make that decision.
voodoo6ede9072016-03-09 07:47:53417 const Extension* extension = InstallExtensionFromWebstore(
418 test_data_dir_.AppendASCII("experimental.crx"), 1);
kalmanae342c92014-12-12 22:04:23419 ASSERT_TRUE(extension);
420 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
421 APIPermission::kExperimental));
422}
[email protected]240cc92a2011-12-01 01:22:24423
kalmanae342c92014-12-12 22:04:23424IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
425 ExperimentalExtensionFromOutsideGallery) {
426 // Non-gallery-installed extensions should lose their experimental
427 // permission if the flag isn't enabled.
voodoo6ede9072016-03-09 07:47:53428 const Extension* extension = InstallExtension(
429 test_data_dir_.AppendASCII("experimental.crx"), 1);
kalmanae342c92014-12-12 22:04:23430 ASSERT_TRUE(extension);
431 EXPECT_FALSE(extension->permissions_data()->HasAPIPermission(
432 APIPermission::kExperimental));
433}
[email protected]240cc92a2011-12-01 01:22:24434
voodoo6ede9072016-03-09 07:47:53435IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTestWithExperimentalApis,
kalmanae342c92014-12-12 22:04:23436 ExperimentalExtensionFromOutsideGalleryWithFlag) {
437 // Non-gallery-installed extensions should maintain their experimental
438 // permission if the flag is enabled.
voodoo6ede9072016-03-09 07:47:53439 const Extension* extension = InstallExtension(
440 test_data_dir_.AppendASCII("experimental.crx"), 1);
kalmanae342c92014-12-12 22:04:23441 ASSERT_TRUE(extension);
442 EXPECT_TRUE(extension->permissions_data()->HasAPIPermission(
443 APIPermission::kExperimental));
[email protected]fc38935a2011-10-31 23:53:28444}
[email protected]ee14cad2012-03-29 01:59:37445
voodoo6ede9072016-03-09 07:47:53446IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTestWithExperimentalApis,
447 PlatformAppCrx) {
[email protected]ee14cad2012-03-29 01:59:37448 EXPECT_TRUE(InstallExtension(
[email protected]dc37b002012-04-23 23:02:26449 test_data_dir_.AppendASCII("minimal_platform_app.crx"), 1));
[email protected]ee14cad2012-03-29 01:59:37450}
[email protected]bf2fcd52012-04-16 22:59:39451
meacerb040d3a2016-09-09 03:20:20452IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, BlockedFileTypes) {
453 const Extension* extension =
454 InstallExtension(test_data_dir_.AppendASCII("blocked_file_types.crx"), 1);
Minh X. Nguyen2c17b3982017-10-13 18:32:29455 base::ScopedAllowBlockingForTesting allow_io;
meacerb040d3a2016-09-09 03:20:20456 EXPECT_TRUE(base::PathExists(extension->path().AppendASCII("test.html")));
457 EXPECT_TRUE(base::PathExists(extension->path().AppendASCII("test.nexe")));
458 EXPECT_FALSE(base::PathExists(extension->path().AppendASCII("test1.EXE")));
459 EXPECT_FALSE(base::PathExists(extension->path().AppendASCII("test2.exe")));
460}
461
meacerbd735062016-09-28 19:58:37462IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, AllowedThemeFileTypes) {
463 const Extension* extension = InstallExtension(
464 test_data_dir_.AppendASCII("theme_with_extension.crx"), 1);
465 ASSERT_TRUE(extension);
466 const base::FilePath& path = extension->path();
Minh X. Nguyen2c17b3982017-10-13 18:32:29467 base::ScopedAllowBlockingForTesting allow_io;
meacerbd735062016-09-28 19:58:37468 EXPECT_TRUE(
469 base::PathExists(path.AppendASCII("images/theme_frame_camo.PNG")));
470 EXPECT_TRUE(
471 base::PathExists(path.AppendASCII("images/theme_ntp_background.png")));
472 EXPECT_TRUE(base::PathExists(
473 path.AppendASCII("images/theme_ntp_background_norepeat.png")));
474 EXPECT_TRUE(
475 base::PathExists(path.AppendASCII("images/theme_toolbar_camo.png")));
476 EXPECT_TRUE(base::PathExists(path.AppendASCII("images/redirect_target.GIF")));
477 EXPECT_TRUE(base::PathExists(path.AppendASCII("test.image.bmp")));
478 EXPECT_TRUE(
479 base::PathExists(path.AppendASCII("test_image_with_no_extension")));
480
481 EXPECT_FALSE(base::PathExists(path.AppendASCII("non_images/test.html")));
482 EXPECT_FALSE(base::PathExists(path.AppendASCII("non_images/test.nexe")));
483 EXPECT_FALSE(base::PathExists(path.AppendASCII("non_images/test1.EXE")));
484 EXPECT_FALSE(base::PathExists(path.AppendASCII("non_images/test2.exe")));
485 EXPECT_FALSE(base::PathExists(path.AppendASCII("non_images/test.txt")));
486 EXPECT_FALSE(base::PathExists(path.AppendASCII("non_images/test.css")));
487}
488
rdevlin.cronin10f34542017-02-06 18:22:47489IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
490 PackAndInstallExtensionFromDownload) {
491 std::unique_ptr<base::AutoReset<bool>> allow_offstore_install =
492 download_crx_util::OverrideOffstoreInstallAllowedForTesting(true);
[email protected]89019d62012-05-17 18:47:09493
[email protected]bf2fcd52012-04-16 22:59:39494 const int kNumDownloadsExpected = 1;
[email protected]bf2fcd52012-04-16 22:59:39495
[email protected]650b2d52013-02-10 03:41:45496 base::FilePath crx_path = PackExtension(
[email protected]bf2fcd52012-04-16 22:59:39497 test_data_dir_.AppendASCII("common/background_page"));
498 ASSERT_FALSE(crx_path.empty());
499 std::string crx_path_string(crx_path.value().begin(), crx_path.value().end());
500 GURL url = GURL(std::string("file:///").append(crx_path_string));
501
dchengc963c7142016-04-08 03:55:22502 std::unique_ptr<MockPromptProxy> mock_prompt =
[email protected]f8636f92013-08-09 21:02:37503 CreateMockPromptProxyForBrowser(browser());
504 download_crx_util::SetMockInstallPromptForTesting(
505 mock_prompt->CreatePrompt());
[email protected]bf2fcd52012-04-16 22:59:39506
[email protected]bf2fcd52012-04-16 22:59:39507 content::DownloadManager* download_manager =
[email protected]b441a8492012-06-06 14:55:57508 content::BrowserContext::GetDownloadManager(browser()->profile());
[email protected]bf2fcd52012-04-16 22:59:39509
dchengc963c7142016-04-08 03:55:22510 std::unique_ptr<content::DownloadTestObserver> observer(
[email protected]49b264f2012-08-14 17:12:26511 new content::DownloadTestObserverTerminal(
[email protected]47665442012-07-27 02:31:22512 download_manager, kNumDownloadsExpected,
[email protected]49b264f2012-08-14 17:12:26513 content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT));
nick3b04f322016-08-31 19:29:19514 ui_test_utils::NavigateToURLWithDisposition(
515 browser(), url, WindowOpenDisposition::CURRENT_TAB,
[email protected]bf2fcd52012-04-16 22:59:39516 ui_test_utils::BROWSER_TEST_NONE);
517
[email protected]8c6af5b2012-06-15 20:10:26518 EXPECT_TRUE(WaitForCrxInstallerDone());
[email protected]c82da8c42012-06-08 19:49:11519 EXPECT_TRUE(mock_prompt->confirmation_requested());
[email protected]bf2fcd52012-04-16 22:59:39520}
[email protected]a9736892012-05-30 15:58:05521
[email protected]b70a2d92012-06-28 19:51:21522// Tests that scopes are only granted if |record_oauth2_grant_| on the prompt is
523// true.
[email protected]7a561912012-08-21 21:06:05524#if defined(OS_WIN)
[email protected]1e09ec82012-12-21 22:48:09525#define MAYBE_GrantScopes DISABLED_GrantScopes
Minh X. Nguyen2c17b3982017-10-13 18:32:29526#define MAYBE_GrantScopes_WithCallback DISABLED_GrantScopes_WithCallback
[email protected]7a561912012-08-21 21:06:05527#else
528#define MAYBE_GrantScopes GrantScopes
Minh X. Nguyen2c17b3982017-10-13 18:32:29529#define MAYBE_GrantScopes_WithCallback GrantScopes_WithCallback
[email protected]7a561912012-08-21 21:06:05530#endif
voodoo6ede9072016-03-09 07:47:53531IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTestWithExperimentalApis,
532 MAYBE_GrantScopes) {
Minh X. Nguyen2c17b3982017-10-13 18:32:29533 EXPECT_NO_FATAL_FAILURE(CheckHasEmptyScopesAfterInstall(
534 "browsertest/scopes", CrxInstaller::InstallerResultCallback(), true));
535}
536
537IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTestWithExperimentalApis,
538 MAYBE_GrantScopes_WithCallback) {
539 EXPECT_NO_FATAL_FAILURE(CheckHasEmptyScopesAfterInstall(
540 "browsertest/scopes",
Minh X. Nguyen8803f4e2018-05-25 01:03:10541 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
542 EXPECT_EQ(base::nullopt, error);
543 }),
544 true));
[email protected]b70a2d92012-06-28 19:51:21545}
546
voodoo6ede9072016-03-09 07:47:53547IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTestWithExperimentalApis,
548 DoNotGrantScopes) {
Minh X. Nguyen2c17b3982017-10-13 18:32:29549 EXPECT_NO_FATAL_FAILURE(CheckHasEmptyScopesAfterInstall(
550 "browsertest/scopes", CrxInstaller::InstallerResultCallback(), false));
551}
552
553IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTestWithExperimentalApis,
554 DoNotGrantScopes_WithCallback) {
555 EXPECT_NO_FATAL_FAILURE(CheckHasEmptyScopesAfterInstall(
556 "browsertest/scopes",
Minh X. Nguyen8803f4e2018-05-25 01:03:10557 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
558 EXPECT_EQ(base::nullopt, error);
559 }),
560 false));
[email protected]b70a2d92012-06-28 19:51:21561}
562
[email protected]d4b4d7af2014-08-20 10:45:15563IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, AllowOffStore) {
[email protected]a9736892012-05-30 15:58:05564 const bool kTestData[] = {false, true};
565
Avi Drissman5f0fb8c2018-12-25 23:20:49566 for (size_t i = 0; i < base::size(kTestData); ++i) {
dchengc963c7142016-04-08 03:55:22567 std::unique_ptr<MockPromptProxy> mock_prompt =
[email protected]f8636f92013-08-09 21:02:37568 CreateMockPromptProxyForBrowser(browser());
569
[email protected]a9736892012-05-30 15:58:05570 scoped_refptr<CrxInstaller> crx_installer(
Minh X. Nguyen30975342017-12-04 22:02:41571 CrxInstaller::Create(extension_service(), mock_prompt->CreatePrompt()));
[email protected]7224dbd2012-06-05 15:21:50572 crx_installer->set_install_cause(
573 extension_misc::INSTALL_CAUSE_USER_DOWNLOAD);
[email protected]d9039812012-06-09 06:05:48574
575 if (kTestData[i]) {
576 crx_installer->set_off_store_install_allow_reason(
577 CrxInstaller::OffStoreInstallAllowedInTest);
578 }
[email protected]a9736892012-05-30 15:58:05579
Minh X. Nguyen30975342017-12-04 22:02:41580 base::RunLoop run_loop;
581 crx_installer->set_installer_callback(
582 base::BindOnce(&ExtensionCrxInstallerTest::InstallerCallback,
583 run_loop.QuitWhenIdleClosure(),
584 CrxInstaller::InstallerResultCallback()));
[email protected]a9736892012-05-30 15:58:05585 crx_installer->InstallCrx(test_data_dir_.AppendASCII("good.crx"));
[email protected]d4b4d7af2014-08-20 10:45:15586 // The |mock_prompt| will quit running the loop once the |crx_installer|
587 // is done.
Minh X. Nguyen30975342017-12-04 22:02:41588 run_loop.Run();
[email protected]c82da8c42012-06-08 19:49:11589 EXPECT_EQ(kTestData[i], mock_prompt->did_succeed());
590 EXPECT_EQ(kTestData[i], mock_prompt->confirmation_requested()) <<
591 kTestData[i];
[email protected]a9736892012-05-30 15:58:05592 if (kTestData[i]) {
[email protected]b959d7d42013-12-13 17:26:37593 EXPECT_EQ(base::string16(), mock_prompt->error()) << kTestData[i];
[email protected]a9736892012-05-30 15:58:05594 } else {
595 EXPECT_EQ(l10n_util::GetStringUTF16(
596 IDS_EXTENSION_INSTALL_DISALLOWED_ON_SITE),
[email protected]c82da8c42012-06-08 19:49:11597 mock_prompt->error()) << kTestData[i];
[email protected]a9736892012-05-30 15:58:05598 }
599 }
[email protected]a9736892012-05-30 15:58:05600}
[email protected]bf3d9df2012-07-24 23:20:27601
[email protected]90d3c042013-06-06 10:10:39602IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, HiDpiThemeTest) {
603 base::FilePath crx_path = test_data_dir_.AppendASCII("theme_hidpi_crx");
604 crx_path = crx_path.AppendASCII("theme_hidpi.crx");
605
[email protected]658eae52014-06-14 20:28:05606 ASSERT_TRUE(InstallExtension(crx_path, 1));
[email protected]90d3c042013-06-06 10:10:39607
608 const std::string extension_id("gllekhaobjnhgeagipipnkpmmmpchacm");
gpdavis.chromium48f08c42014-09-18 22:09:34609 ExtensionRegistry* registry = ExtensionRegistry::Get(
610 browser()->profile());
[email protected]90d3c042013-06-06 10:10:39611 const extensions::Extension* extension =
gpdavis.chromium48f08c42014-09-18 22:09:34612 registry->enabled_extensions().GetByID(extension_id);
[email protected]90d3c042013-06-06 10:10:39613 ASSERT_TRUE(extension);
614 EXPECT_EQ(extension_id, extension->id());
615
616 UninstallExtension(extension_id);
gpdavis.chromium48f08c42014-09-18 22:09:34617 EXPECT_FALSE(registry->enabled_extensions().GetByID(extension_id));
[email protected]90d3c042013-06-06 10:10:39618}
619
[email protected]9e9c1d12013-07-31 01:58:12620IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
mekc95f9d062015-01-10 00:52:04621 InstallDelayedUntilNextUpdate) {
[email protected]9e9c1d12013-07-31 01:58:12622 const std::string extension_id("ldnnhddmnhbkjipkidpdiheffobcpfmf");
mekc95f9d062015-01-10 00:52:04623 base::FilePath base_path = test_data_dir_.AppendASCII("delayed_install");
624
Minh X. Nguyen30975342017-12-04 22:02:41625 ExtensionService* service = extension_service();
[email protected]9e9c1d12013-07-31 01:58:12626 ASSERT_TRUE(service);
gpdavis.chromium48f08c42014-09-18 22:09:34627 ExtensionRegistry* registry = ExtensionRegistry::Get(
628 browser()->profile());
629 ASSERT_TRUE(registry);
[email protected]9e9c1d12013-07-31 01:58:12630
631 // Install version 1 of the test extension. This extension does not have
632 // a background page but does have a browser action.
mekc95f9d062015-01-10 00:52:04633 base::FilePath v1_path = PackExtension(base_path.AppendASCII("v1"));
634 ASSERT_FALSE(v1_path.empty());
635 ASSERT_TRUE(InstallExtension(v1_path, 1));
[email protected]9e9c1d12013-07-31 01:58:12636 const extensions::Extension* extension =
gpdavis.chromium48f08c42014-09-18 22:09:34637 registry->enabled_extensions().GetByID(extension_id);
[email protected]9e9c1d12013-07-31 01:58:12638 ASSERT_TRUE(extension);
639 ASSERT_EQ(extension_id, extension->id());
Devlin Cronin03bf2d22017-12-20 08:21:05640 ASSERT_EQ("1.0", extension->version().GetString());
[email protected]9e9c1d12013-07-31 01:58:12641
mekc95f9d062015-01-10 00:52:04642 // Make test extension non-idle by opening the extension's options page.
643 ExtensionTabUtil::OpenOptionsPage(extension, browser());
644 WaitForExtensionNotIdle(extension_id);
[email protected]9e9c1d12013-07-31 01:58:12645
646 // Install version 2 of the extension and check that it is indeed delayed.
mekc95f9d062015-01-10 00:52:04647 base::FilePath v2_path = PackExtension(base_path.AppendASCII("v2"));
648 ASSERT_FALSE(v2_path.empty());
649 ASSERT_TRUE(UpdateExtensionWaitForIdle(extension_id, v2_path, 0));
[email protected]9e9c1d12013-07-31 01:58:12650
651 ASSERT_EQ(1u, service->delayed_installs()->size());
gpdavis.chromium48f08c42014-09-18 22:09:34652 extension = registry->enabled_extensions().GetByID(extension_id);
Devlin Cronin03bf2d22017-12-20 08:21:05653 ASSERT_EQ("1.0", extension->version().GetString());
[email protected]9e9c1d12013-07-31 01:58:12654
mekc95f9d062015-01-10 00:52:04655 // Make the extension idle again by navigating away from the options page.
656 // This should not trigger the delayed install.
657 ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
658 WaitForExtensionIdle(extension_id);
[email protected]9e9c1d12013-07-31 01:58:12659 ASSERT_EQ(1u, service->delayed_installs()->size());
mekc95f9d062015-01-10 00:52:04660 extension = registry->enabled_extensions().GetByID(extension_id);
Devlin Cronin03bf2d22017-12-20 08:21:05661 ASSERT_EQ("1.0", extension->version().GetString());
[email protected]9e9c1d12013-07-31 01:58:12662
663 // Install version 3 of the extension. Because the extension is idle,
664 // this install should succeed.
mekc95f9d062015-01-10 00:52:04665 base::FilePath v3_path = PackExtension(base_path.AppendASCII("v3"));
666 ASSERT_FALSE(v3_path.empty());
667 ASSERT_TRUE(UpdateExtensionWaitForIdle(extension_id, v3_path, 0));
gpdavis.chromium48f08c42014-09-18 22:09:34668 extension = registry->enabled_extensions().GetByID(extension_id);
Devlin Cronin03bf2d22017-12-20 08:21:05669 ASSERT_EQ("3.0", extension->version().GetString());
[email protected]9e9c1d12013-07-31 01:58:12670
671 // The version 2 delayed install should be cleaned up, and finishing
672 // delayed extension installation shouldn't break anything.
673 ASSERT_EQ(0u, service->delayed_installs()->size());
674 service->MaybeFinishDelayedInstallations();
gpdavis.chromium48f08c42014-09-18 22:09:34675 extension = registry->enabled_extensions().GetByID(extension_id);
Devlin Cronin03bf2d22017-12-20 08:21:05676 ASSERT_EQ("3.0", extension->version().GetString());
[email protected]9e9c1d12013-07-31 01:58:12677}
678
Nico Weberbc5b06f2019-07-26 14:00:13679#if BUILDFLAG(FULL_SAFE_BROWSING)
[email protected]9f3c8532013-07-31 19:52:07680IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, Blacklist) {
[email protected]3f2a2fa2013-09-24 02:55:25681 scoped_refptr<FakeSafeBrowsingDatabaseManager> blacklist_db(
682 new FakeSafeBrowsingDatabaseManager(true));
683 Blacklist::ScopedDatabaseManagerForTest scoped_blacklist_db(blacklist_db);
[email protected]9f3c8532013-07-31 19:52:07684
Sergey Poromovcc362382018-11-09 18:43:32685 const std::string extension_id = "gllekhaobjnhgeagipipnkpmmmpchacm";
686 blacklist_db->SetUnsafe(extension_id);
[email protected]9f3c8532013-07-31 19:52:07687
688 base::FilePath crx_path = test_data_dir_.AppendASCII("theme_hidpi_crx")
689 .AppendASCII("theme_hidpi.crx");
690 EXPECT_FALSE(InstallExtension(crx_path, 0));
Sergey Poromovcc362382018-11-09 18:43:32691
692 auto installation_failure =
Oleg Davydov66246bd92019-09-26 16:31:51693 InstallationReporter::Get(profile())->Get(extension_id);
Oleg Davydovc00866812019-04-04 10:47:27694 EXPECT_EQ(InstallationReporter::FailureReason::CRX_INSTALL_ERROR_DECLINED,
695 installation_failure.failure_reason);
Sergey Poromovcc362382018-11-09 18:43:32696 EXPECT_EQ(CrxInstallErrorDetail::EXTENSION_IS_BLOCKLISTED,
Oleg Davydovc00866812019-04-04 10:47:27697 installation_failure.install_error_detail);
[email protected]9f3c8532013-07-31 19:52:07698}
[email protected]e3767aa2013-11-08 23:49:07699#endif
[email protected]9f3c8532013-07-31 19:52:07700
[email protected]85290822013-08-23 20:27:38701IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, NonStrictManifestCheck) {
dchengc963c7142016-04-08 03:55:22702 std::unique_ptr<MockPromptProxy> mock_prompt =
[email protected]85290822013-08-23 20:27:38703 CreateMockPromptProxyForBrowser(browser());
704
705 // We want to simulate the case where the webstore sends a more recent
706 // version of the manifest, but the downloaded .crx file is old since
707 // the newly published version hasn't fully propagated to all the download
708 // servers yet. So load the v2 manifest, but then install the v1 crx file.
Joshua Pawlickiaf97ca02018-11-12 17:17:02709 std::string id = "ooklpoaelmiimcjipecogjfcejghbogp";
dchengc963c7142016-04-08 03:55:22710 std::unique_ptr<WebstoreInstaller::Approval> approval =
[email protected]85290822013-08-23 20:27:38711 GetApproval("crx_installer/v2_no_permission_change/", id, false);
712
713 RunCrxInstaller(approval.get(), mock_prompt->CreatePrompt(),
Minh X. Nguyen2c17b3982017-10-13 18:32:29714 CrxInstaller::InstallerResultCallback(),
[email protected]85290822013-08-23 20:27:38715 test_data_dir_.AppendASCII("crx_installer/v1.crx"));
716
717 EXPECT_TRUE(mock_prompt->did_succeed());
718}
719
Minh X. Nguyen2c17b3982017-10-13 18:32:29720IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
721 NonStrictManifestCheck_WithCallback) {
722 std::unique_ptr<MockPromptProxy> mock_prompt =
723 CreateMockPromptProxyForBrowser(browser());
724
725 // We want to simulate the case where the webstore sends a more recent
726 // version of the manifest, but the downloaded .crx file is old since
727 // the newly published version hasn't fully propagated to all the download
728 // servers yet. So load the v2 manifest, but then install the v1 crx file.
Joshua Pawlickiaf97ca02018-11-12 17:17:02729 const std::string id = "ooklpoaelmiimcjipecogjfcejghbogp";
Minh X. Nguyen2c17b3982017-10-13 18:32:29730 std::unique_ptr<WebstoreInstaller::Approval> approval =
731 GetApproval("crx_installer/v2_no_permission_change/", id, false);
732
Minh X. Nguyen8803f4e2018-05-25 01:03:10733 RunCrxInstaller(
734 approval.get(), mock_prompt->CreatePrompt(),
735 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
736 EXPECT_EQ(base::nullopt, error);
737 }),
738 test_data_dir_.AppendASCII("crx_installer/v1.crx"));
Minh X. Nguyen2c17b3982017-10-13 18:32:29739
740 EXPECT_TRUE(mock_prompt->did_succeed());
741}
742
743IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
744 InstallUnpackedCrx_FolderDoesNotExist) {
745 base::ScopedAllowBlockingForTesting allow_io;
746 std::unique_ptr<MockPromptProxy> mock_prompt =
747 CreateMockPromptProxyForBrowser(browser());
748
749 base::ScopedTempDir temp_dir;
750 EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
751
752 const base::FilePath folder = temp_dir.GetPath().AppendASCII("abcdef");
753 EXPECT_FALSE(base::PathExists(folder));
754
755 const std::string public_key = "123456";
756 RunCrxInstallerFromUnpackedDirectory(
757 mock_prompt->CreatePrompt(),
Minh X. Nguyen8803f4e2018-05-25 01:03:10758 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
759 ASSERT_NE(base::nullopt, error);
760 ASSERT_EQ(CrxInstallErrorType::SANDBOXED_UNPACKER_FAILURE,
761 error->type());
762 EXPECT_EQ(SandboxedUnpackerFailureReason::DIRECTORY_MOVE_FAILED,
763 error->sandbox_failure_detail());
764 }),
Minh X. Nguyen2c17b3982017-10-13 18:32:29765 std::string(), public_key, folder);
766
767 EXPECT_FALSE(mock_prompt->did_succeed());
768}
769
770IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
771 InstallUnpackedCrx_EmptyFolder) {
772 base::ScopedAllowBlockingForTesting allow_io;
773 std::unique_ptr<MockPromptProxy> mock_prompt =
774 CreateMockPromptProxyForBrowser(browser());
775
776 base::ScopedTempDir temp_dir;
777 EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
778 EXPECT_TRUE(base::PathExists(temp_dir.GetPath()));
779
780 const std::string public_key = "123456";
781 RunCrxInstallerFromUnpackedDirectory(
782 mock_prompt->CreatePrompt(),
Minh X. Nguyen8803f4e2018-05-25 01:03:10783 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
784 ASSERT_NE(base::nullopt, error);
785 ASSERT_EQ(CrxInstallErrorType::SANDBOXED_UNPACKER_FAILURE,
786 error->type());
787 EXPECT_EQ(SandboxedUnpackerFailureReason::UNPACKER_CLIENT_FAILED,
788 error->sandbox_failure_detail());
789 }),
Minh X. Nguyen2c17b3982017-10-13 18:32:29790 std::string(), public_key, temp_dir.GetPath());
791
792 EXPECT_FALSE(mock_prompt->did_succeed());
793 EXPECT_FALSE(base::PathExists(temp_dir.GetPath()));
794}
795
796IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
797 InstallUnpackedCrx_InvalidPublicKey) {
798 base::ScopedAllowBlockingForTesting allow_io;
799 std::unique_ptr<MockPromptProxy> mock_prompt =
800 CreateMockPromptProxyForBrowser(browser());
801
802 base::ScopedTempDir temp_dir;
803 EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
804 EXPECT_TRUE(base::PathExists(temp_dir.GetPath()));
805
806 const base::FilePath unpacked_path =
Devlin Cronin19775cc2018-04-19 15:04:26807 test_data_dir_.AppendASCII("simple_with_popup");
Minh X. Nguyen2c17b3982017-10-13 18:32:29808 EXPECT_TRUE(base::PathExists(unpacked_path));
809 EXPECT_TRUE(base::CopyDirectory(unpacked_path, temp_dir.GetPath(), false));
810
811 const std::string public_key = "123456";
812 RunCrxInstallerFromUnpackedDirectory(
813 mock_prompt->CreatePrompt(),
Minh X. Nguyen8803f4e2018-05-25 01:03:10814 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
815 ASSERT_NE(base::nullopt, error);
816 ASSERT_EQ(CrxInstallErrorType::SANDBOXED_UNPACKER_FAILURE,
817 error->type());
818 EXPECT_EQ(SandboxedUnpackerFailureReason::INVALID_MANIFEST,
819 error->sandbox_failure_detail());
820 }),
Minh X. Nguyen2c17b3982017-10-13 18:32:29821 std::string(), public_key, temp_dir.GetPath());
822
823 EXPECT_FALSE(mock_prompt->did_succeed());
824 EXPECT_FALSE(base::PathExists(temp_dir.GetPath()));
825}
826
827IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, InstallUnpackedCrx_Success) {
828 base::ScopedAllowBlockingForTesting allow_io;
829 std::unique_ptr<MockPromptProxy> mock_prompt =
830 CreateMockPromptProxyForBrowser(browser());
831
832 base::ScopedTempDir temp_dir;
833 EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
834 EXPECT_TRUE(base::PathExists(temp_dir.GetPath()));
835
836 const base::FilePath unpacked_path =
Devlin Cronin19775cc2018-04-19 15:04:26837 test_data_dir_.AppendASCII("simple_with_popup");
Minh X. Nguyen2c17b3982017-10-13 18:32:29838 EXPECT_TRUE(base::PathExists(unpacked_path));
839 EXPECT_TRUE(base::CopyDirectory(unpacked_path, temp_dir.GetPath(), false));
840
841 const std::string public_key =
842 "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8c4fBSPZ6utYoZ8NiWF/"
843 "DSaimBhihjwgOsskyleFGaurhi3TDClTVSGPxNkgCzrz0wACML7M4aNjpd05qupdbR2d294j"
844 "kDuI7caxEGUucpP7GJRRHnm8Sx+"
845 "y0ury28n8jbN0PnInKKWcxpIXXmNQyC19HBuO3QIeUq9Dqc+7YFQIDAQAB";
846 RunCrxInstallerFromUnpackedDirectory(
847 mock_prompt->CreatePrompt(),
Minh X. Nguyen8803f4e2018-05-25 01:03:10848 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
849 EXPECT_EQ(base::nullopt, error);
850 }),
851 std::string(), public_key, temp_dir.GetPath());
Minh X. Nguyen2c17b3982017-10-13 18:32:29852
853 EXPECT_TRUE(mock_prompt->did_succeed());
854 EXPECT_FALSE(base::PathExists(temp_dir.GetPath()));
855}
856
Minh X. Nguyen30975342017-12-04 22:02:41857IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
858 UpdateExtensionFromUnpackedCrx_NewExtension) {
859 base::ScopedAllowBlockingForTesting allow_io;
860 std::unique_ptr<MockPromptProxy> mock_prompt =
861 CreateMockPromptProxyForBrowser(browser());
862
863 // Update won't work as the extension doesn't exist.
864 const std::string extension_id = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
865 const std::string public_key =
866 "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8c4fBSPZ6utYoZ8NiWF/"
867 "DSaimBhihjwgOsskyleFGaurhi3TDClTVSGPxNkgCzrz0wACML7M4aNjpd05qupdbR2d294j"
868 "kDuI7caxEGUucpP7GJRRHnm8Sx+"
869 "y0ury28n8jbN0PnInKKWcxpIXXmNQyC19HBuO3QIeUq9Dqc+7YFQIDAQAB";
870 ASSERT_EQ(nullptr, GetInstalledExtension(extension_id));
871 auto temp_dir = UnpackedCrxTempDir();
Minh X. Nguyen8803f4e2018-05-25 01:03:10872 RunUpdateExtension(
873 mock_prompt->CreatePrompt(), extension_id, public_key,
874 temp_dir->GetPath(),
875 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
876 ASSERT_NE(base::nullopt, error);
877 EXPECT_EQ(CrxInstallErrorType::OTHER, error->type());
878 EXPECT_EQ(CrxInstallErrorDetail::UPDATE_NON_EXISTING_EXTENSION,
879 error->detail());
880 }));
Minh X. Nguyen30975342017-12-04 22:02:41881
882 // The unpacked folder should be deleted.
883 EXPECT_FALSE(mock_prompt->did_succeed());
884 EXPECT_FALSE(base::PathExists(temp_dir->GetPath()));
885 EXPECT_EQ(nullptr, GetInstalledExtension(extension_id));
886}
887
888IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
889 UpdateExtensionFromUnpackedCrx_UpdateExistingExtension) {
890 base::ScopedAllowBlockingForTesting allow_io;
891 std::unique_ptr<MockPromptProxy> mock_prompt =
892 CreateMockPromptProxyForBrowser(browser());
893
894 const std::string extension_id = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
895 const std::string public_key =
896 "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8c4fBSPZ6utYoZ8NiWF/"
897 "DSaimBhihjwgOsskyleFGaurhi3TDClTVSGPxNkgCzrz0wACML7M4aNjpd05qupdbR2d294j"
898 "kDuI7caxEGUucpP7GJRRHnm8Sx+"
899 "y0ury28n8jbN0PnInKKWcxpIXXmNQyC19HBuO3QIeUq9Dqc+7YFQIDAQAB";
900
901 // Test updating an existing extension.
902 AddExtension(extension_id, "0.0");
903
904 auto temp_dir = UnpackedCrxTempDir();
Minh X. Nguyen8803f4e2018-05-25 01:03:10905 RunUpdateExtension(
906 mock_prompt->CreatePrompt(), extension_id, public_key,
907 temp_dir->GetPath(),
908 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
909 EXPECT_EQ(base::nullopt, error);
910 }));
Minh X. Nguyen30975342017-12-04 22:02:41911
912 EXPECT_TRUE(mock_prompt->did_succeed());
913
914 // The unpacked folder should be deleted.
915 EXPECT_FALSE(base::PathExists(temp_dir->GetPath()));
916
917 const Extension* extension = GetInstalledExtension(extension_id);
918 ASSERT_NE(nullptr, extension);
919 EXPECT_EQ("1.0", extension->VersionString());
920}
921
922IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
923 UpdateExtensionFromUnpackedCrx_InvalidPublicKey) {
924 base::ScopedAllowBlockingForTesting allow_io;
925 std::unique_ptr<MockPromptProxy> mock_prompt =
926 CreateMockPromptProxyForBrowser(browser());
927
928 const std::string extension_id = "ldnnhddmnhbkjipkidpdiheffobcpfmf";
929 const std::string public_key = "invalid public key";
930
931 // Test updating an existing extension.
932 AddExtension(extension_id, "0.0");
933
934 auto temp_dir = UnpackedCrxTempDir();
Minh X. Nguyen8803f4e2018-05-25 01:03:10935 RunUpdateExtension(
936 mock_prompt->CreatePrompt(), extension_id, public_key,
937 temp_dir->GetPath(),
938 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
939 ASSERT_NE(base::nullopt, error);
940 ASSERT_EQ(CrxInstallErrorType::SANDBOXED_UNPACKER_FAILURE,
941 error->type());
942 EXPECT_EQ(SandboxedUnpackerFailureReason::INVALID_MANIFEST,
943 error->sandbox_failure_detail());
944 }));
Minh X. Nguyen30975342017-12-04 22:02:41945
946 EXPECT_FALSE(mock_prompt->did_succeed());
947
948 // The unpacked folder should be deleted.
949 EXPECT_FALSE(base::PathExists(temp_dir->GetPath()));
950
951 const Extension* extension = GetInstalledExtension(extension_id);
952 ASSERT_NE(nullptr, extension);
953 EXPECT_EQ("0.0", extension->VersionString());
Sergey Poromovcc362382018-11-09 18:43:32954
955 auto installation_failure =
Oleg Davydov66246bd92019-09-26 16:31:51956 InstallationReporter::Get(profile())->Get(extension_id);
Oleg Davydovc00866812019-04-04 10:47:27957 EXPECT_EQ(InstallationReporter::FailureReason::
Sergey Poromovcc362382018-11-09 18:43:32958 CRX_INSTALL_ERROR_SANDBOXED_UNPACKER_FAILURE,
Oleg Davydovc00866812019-04-04 10:47:27959 installation_failure.failure_reason);
960 EXPECT_EQ(base::nullopt, installation_failure.install_error_detail);
Minh X. Nguyen30975342017-12-04 22:02:41961}
962
963IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
964 UpdateExtensionFromUnpackedCrx_WrongPublicKey) {
965 base::ScopedAllowBlockingForTesting allow_io;
966 std::unique_ptr<MockPromptProxy> mock_prompt =
967 CreateMockPromptProxyForBrowser(browser());
968
969 const std::string extension_id = "gllekhaobjnhgeagipipnkpmmmpchacm";
970 const std::string public_key =
971 "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8c4fBSPZ6utYoZ8NiWF/"
972 "DSaimBhihjwgOsskyleFGaurhi3TDClTVSGPxNkgCzrz0wACML7M4aNjpd05qupdbR2d294j"
973 "kDuI7caxEGUucpP7GJRRHnm8Sx+"
974 "y0ury28n8jbN0PnInKKWcxpIXXmNQyC19HBuO3QIeUq9Dqc+7YFQIDAQAB";
975
976 // Test updating an existing extension.
977 AddExtension(extension_id, "0.0");
978
979 auto temp_dir = UnpackedCrxTempDir();
Minh X. Nguyen8803f4e2018-05-25 01:03:10980 RunUpdateExtension(
981 mock_prompt->CreatePrompt(), extension_id, public_key,
982 temp_dir->GetPath(),
983 base::BindOnce([](const base::Optional<CrxInstallError>& error) {
984 ASSERT_NE(base::nullopt, error);
985 EXPECT_EQ(CrxInstallErrorType::OTHER, error->type());
986 EXPECT_EQ(CrxInstallErrorDetail::UNEXPECTED_ID, error->detail());
987 }));
Minh X. Nguyen30975342017-12-04 22:02:41988
989 EXPECT_FALSE(mock_prompt->did_succeed());
990
991 // The unpacked folder should be deleted.
992 EXPECT_FALSE(base::PathExists(temp_dir->GetPath()));
993
994 const Extension* extension = GetInstalledExtension(extension_id);
995 ASSERT_NE(nullptr, extension);
996 EXPECT_EQ("0.0", extension->VersionString());
Sergey Poromovcc362382018-11-09 18:43:32997
998 auto installation_failure =
Oleg Davydov66246bd92019-09-26 16:31:51999 InstallationReporter::Get(profile())->Get(extension_id);
Oleg Davydovc00866812019-04-04 10:47:271000 EXPECT_EQ(InstallationReporter::FailureReason::CRX_INSTALL_ERROR_OTHER,
1001 installation_failure.failure_reason);
1002 EXPECT_EQ(CrxInstallErrorDetail::UNEXPECTED_ID,
1003 *installation_failure.install_error_detail);
Minh X. Nguyen30975342017-12-04 22:02:411004}
1005
limasdfebff7fd02015-12-25 14:45:311006#if defined(OS_CHROMEOS)
[email protected]14a18bf2013-09-26 08:42:301007IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, KioskOnlyTest) {
Sam McNallyfb8bfc32018-10-30 06:51:111008 base::ScopedAllowBlockingForTesting allow_io;
limasdfebff7fd02015-12-25 14:45:311009 // kiosk_only is whitelisted from non-chromeos.
[email protected]14a18bf2013-09-26 08:42:301010 base::FilePath crx_path =
1011 test_data_dir_.AppendASCII("kiosk/kiosk_only.crx");
1012 EXPECT_FALSE(InstallExtension(crx_path, 0));
[email protected]14a18bf2013-09-26 08:42:301013 // Simulate ChromeOS kiosk mode. |scoped_user_manager| will take over
1014 // lifetime of |user_manager|.
merkulova793f3022015-02-04 10:18:301015 chromeos::FakeChromeUserManager* fake_user_manager =
1016 new chromeos::FakeChromeUserManager();
alemate3ffbde6f2015-11-03 02:02:551017 const AccountId account_id(AccountId::FromUserEmail("[email protected]"));
1018 fake_user_manager->AddKioskAppUser(account_id);
1019 fake_user_manager->LoginUser(account_id);
Xiyuan Xiadfe3a9f2017-11-13 21:46:261020 user_manager::ScopedUserManager scoped_user_manager(
1021 base::WrapUnique(fake_user_manager));
[email protected]14a18bf2013-09-26 08:42:301022 EXPECT_TRUE(InstallExtension(crx_path, 1));
[email protected]14a18bf2013-09-26 08:42:301023}
1024
dpolukhincbd48d192015-06-04 14:09:371025IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, InstallToSharedLocation) {
Sam McNallyfb8bfc32018-10-30 06:51:111026 base::ScopedAllowBlockingForTesting allow_io;
avi3ef9ec9e2014-12-22 22:50:171027 base::CommandLine::ForCurrentProcess()->AppendSwitch(
[email protected]5a145e82014-05-29 22:19:071028 chromeos::switches::kEnableExtensionAssetsSharing);
1029 base::ScopedTempDir cache_dir;
1030 ASSERT_TRUE(cache_dir.CreateUniqueTempDir());
1031 ExtensionAssetsManagerChromeOS::SetSharedInstallDirForTesting(
vabr9142fe22016-09-08 13:19:221032 cache_dir.GetPath());
[email protected]5a145e82014-05-29 22:19:071033
1034 base::FilePath crx_path = test_data_dir_.AppendASCII("crx_installer/v1.crx");
1035 const extensions::Extension* extension = InstallExtension(
1036 crx_path, 1, extensions::Manifest::EXTERNAL_PREF);
1037 base::FilePath extension_path = extension->path();
vabr9142fe22016-09-08 13:19:221038 EXPECT_TRUE(cache_dir.GetPath().IsParent(extension_path));
[email protected]5a145e82014-05-29 22:19:071039 EXPECT_TRUE(base::PathExists(extension_path));
1040
1041 std::string extension_id = extension->id();
1042 UninstallExtension(extension_id);
gpdavis.chromium48f08c42014-09-18 22:09:341043 ExtensionRegistry* registry = ExtensionRegistry::Get(
1044 browser()->profile());
1045 EXPECT_FALSE(registry->enabled_extensions().GetByID(extension_id));
[email protected]5a145e82014-05-29 22:19:071046
Gabriel Charette01507a22017-09-27 21:30:081047 content::RunAllTasksUntilIdle();
[email protected]5a145e82014-05-29 22:19:071048
1049 EXPECT_FALSE(base::PathExists(extension_path));
1050}
1051#endif
1052
[email protected]658eae52014-06-14 20:28:051053IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, DoNotSync) {
[email protected]658eae52014-06-14 20:28:051054 scoped_refptr<CrxInstaller> crx_installer(
Minh X. Nguyen30975342017-12-04 22:02:411055 CrxInstaller::CreateSilent(extension_service()));
[email protected]c30bda262014-06-19 04:10:131056 crx_installer->set_do_not_sync(true);
[email protected]658eae52014-06-14 20:28:051057 crx_installer->InstallCrx(test_data_dir_.AppendASCII("good.crx"));
1058 EXPECT_TRUE(WaitForCrxInstallerDone());
1059 ASSERT_TRUE(crx_installer->extension());
1060
1061 const ExtensionPrefs* extension_prefs =
1062 ExtensionPrefs::Get(browser()->profile());
1063 EXPECT_TRUE(extension_prefs->DoNotSync(crx_installer->extension()->id()));
treibc644a1c2015-07-13 08:37:041064 EXPECT_FALSE(extensions::util::ShouldSync(crx_installer->extension(),
1065 browser()->profile()));
[email protected]658eae52014-06-14 20:28:051066}
1067
[email protected]253fc2bb2014-07-10 04:21:181068IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, ManagementPolicy) {
1069 ManagementPolicyMock policy;
1070 extensions::ExtensionSystem::Get(profile())
1071 ->management_policy()
1072 ->RegisterProvider(&policy);
1073
1074 base::FilePath crx_path = test_data_dir_.AppendASCII("crx_installer/v1.crx");
1075 EXPECT_FALSE(InstallExtension(crx_path, 0));
1076}
1077
dominickn675536f2015-11-06 03:25:381078IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, InstallWebApp) {
1079 InstallWebAppAndVerifyNoErrors();
1080}
1081
1082IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest,
1083 InstallWebAppSucceedsWithBlockPolicy) {
1084 // Verify that the install still works when a management policy blocking
1085 // extension installation is in force. Bookmark apps are special-cased to skip
1086 // these checks (see https://crbug.com/545541).
1087 ManagementPolicyMock policy;
1088 extensions::ExtensionSystem::Get(profile())
1089 ->management_policy()
1090 ->RegisterProvider(&policy);
1091
1092 InstallWebAppAndVerifyNoErrors();
1093}
1094
robbc66c4b2016-02-13 09:38:571095IN_PROC_BROWSER_TEST_F(ExtensionCrxInstallerTest, UpdateWithFileAccess) {
1096 base::FilePath ext_source =
1097 test_data_dir_.AppendASCII("permissions").AppendASCII("files");
1098 base::FilePath crx_with_file_permission = PackExtension(ext_source);
1099 ASSERT_FALSE(crx_with_file_permission.empty());
1100
Minh X. Nguyen30975342017-12-04 22:02:411101 ExtensionService* service = extension_service();
robbc66c4b2016-02-13 09:38:571102
1103 const std::string extension_id("bdkapipdccfifhdghmblnenbbncfcpid");
1104 {
1105 // Install extension.
1106 scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service));
1107 installer->InstallCrx(crx_with_file_permission);
1108 EXPECT_TRUE(WaitForCrxInstallerDone());
1109 const Extension* extension = installer->extension();
1110 ASSERT_TRUE(extension);
1111 // IDs must match, otherwise the test doesn't make any sense.
1112 ASSERT_EQ(extension_id, extension->id());
1113 // Sanity check: File access should be disabled by default.
1114 EXPECT_FALSE(ExtensionPrefs::Get(profile())->AllowFileAccess(extension_id));
1115 EXPECT_FALSE(extension->creation_flags() & Extension::ALLOW_FILE_ACCESS);
1116 }
1117
1118 {
1119 // Uninstall and re-install the extension. Any previously granted file
1120 // permissions should be gone.
1121 ExtensionPrefs::Get(profile())->SetAllowFileAccess(extension_id, true);
1122 EXPECT_TRUE(ExtensionPrefs::Get(profile())->AllowFileAccess(extension_id));
1123 UninstallExtension(extension_id);
1124 EXPECT_FALSE(ExtensionPrefs::Get(profile())->AllowFileAccess(extension_id));
1125
1126 scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service));
1127 installer->InstallCrx(crx_with_file_permission);
1128 EXPECT_TRUE(WaitForCrxInstallerDone());
1129 const Extension* extension = installer->extension();
1130 ASSERT_TRUE(extension);
1131 ASSERT_EQ(extension_id, extension->id());
1132 EXPECT_FALSE(ExtensionPrefs::Get(profile())->AllowFileAccess(extension_id));
1133 EXPECT_FALSE(extension->creation_flags() & Extension::ALLOW_FILE_ACCESS);
1134 }
1135
1136 {
1137 // Grant file access and update the extension. File access should be kept.
1138 ExtensionPrefs::Get(profile())->SetAllowFileAccess(extension_id, true);
1139 EXPECT_TRUE(ExtensionPrefs::Get(profile())->AllowFileAccess(extension_id));
1140 base::FilePath crx_update_with_file_permission = PackExtension(ext_source);
1141
1142 scoped_refptr<CrxInstaller> installer(CrxInstaller::CreateSilent(service));
1143 installer->InstallCrx(crx_update_with_file_permission);
1144 EXPECT_TRUE(WaitForCrxInstallerDone());
1145 const Extension* extension = installer->extension();
1146 ASSERT_TRUE(extension);
1147 ASSERT_EQ(extension_id, extension->id());
1148 EXPECT_TRUE(ExtensionPrefs::Get(profile())->AllowFileAccess(extension_id));
1149 EXPECT_TRUE(extension->creation_flags() & Extension::ALLOW_FILE_ACCESS);
1150 }
1151}
1152
[email protected]bf3d9df2012-07-24 23:20:271153} // namespace extensions