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