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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_CRX_INSTALLER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_CRX_INSTALLER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/version.h" 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/extensions/blacklist.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/extension_install_checker.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_install_prompt.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/sandboxed_unpacker.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/webstore_installer.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/extensions/extension_constants.h" 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/install_flag.h" 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionService; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionServiceTest; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap; 31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)struct WebApplicationInfo; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SequencedTaskRunner; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CrxInstallerError; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionUpdaterTest; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RequirementsChecker; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class installs a crx file into a profile. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Installing a CRX is a multi-step process, including unpacking the crx, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// validating it, prompting the user, and installing. Since many of these 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// steps must occur on the file thread, this class contains a copy of all data 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// necessary to do its job. (This also minimizes external dependencies for 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// easier testing). 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lifetime management: 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is ref-counted by each call it makes to itself on another thread, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and by UtilityProcessHost. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Additionally, we hold a reference to our own client so that it lives at least 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// long enough to receive the result of unpacking. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IMPORTANT: Callers should keep a reference to a CrxInstaller while they are 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// working with it, eg: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scoped_refptr<CrxInstaller> installer(new CrxInstaller(...)); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installer->set_foo(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installer->set_bar(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// installer->InstallCrx(...); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Installation is aborted if the extension service learns that Chrome is 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// terminating during the install. We can't listen for the app termination 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notification here in this class because it can be destroyed on any thread 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and won't safely be able to clean up UI thread notification listeners. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CrxInstaller 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public SandboxedUnpackerClient, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ExtensionInstallPrompt::Delegate { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used in histograms; do not change order. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum OffStoreInstallAllowReason { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OffStoreInstallDisallowed, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OffStoreInstallAllowedFromSettingsPage, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OffStoreInstallAllowedBecausePref, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OffStoreInstallAllowedInTest, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NumOffStoreInstallAllowReasons 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Extensions will be installed into service->install_directory(), then 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // registered with |service|. This does a silent install - see below for 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // other options. 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch static scoped_refptr<CrxInstaller> CreateSilent(ExtensionService* service); 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Same as above, but use |client| to generate a confirmation prompt. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<CrxInstaller> Create( 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionService* service, 91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<ExtensionInstallPrompt> client); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as the previous method, except use the |approval| to bypass the 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prompt. Note that the caller retains ownership of |approval|. 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<CrxInstaller> Create( 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionService* service, 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<ExtensionInstallPrompt> client, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebstoreInstaller::Approval* approval); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install the crx in |source_file|. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InstallCrx(const base::FilePath& source_file); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the specified user script into an extension and install it. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void InstallUserScript(const base::FilePath& source_file, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& download_url); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the specified web app into an extension and install it. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InstallWebApp(const WebApplicationInfo& web_app); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from ExtensionInstallPrompt::Delegate: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallUIProceed() OVERRIDE; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InstallUIAbort(bool user_initiated) OVERRIDE; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int creation_flags() const { return creation_flags_; } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_creation_flags(int val) { creation_flags_ = val; } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& source_file() const { return source_file_; } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location install_source() const { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return install_source_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_install_source(Manifest::Location source) { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_source_ = source; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& expected_id() const { return expected_id_; } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_expected_id(const std::string& val) { expected_id_ = val; } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_expected_version(const Version& val) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_version_.reset(new Version(val)); 1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) expected_version_strict_checking_ = true; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool delete_source() const { return delete_source_; } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_delete_source(bool val) { delete_source_ = val; } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_silent_install() const { return allow_silent_install_; } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_allow_silent_install(bool val) { allow_silent_install_ = val; } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool grant_permissions() const { return grant_permissions_; } 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void set_grant_permissions(bool val) { grant_permissions_ = val; } 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_gallery_install() const { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (creation_flags_ & Extension::FROM_WEBSTORE) > 0; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_is_gallery_install(bool val) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creation_flags_ |= Extension::FROM_WEBSTORE; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) creation_flags_ &= ~Extension::FROM_WEBSTORE; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |apps_require_extension_mime_type_| is set to true, be sure to set 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |original_mime_type_| as well. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_apps_require_extension_mime_type( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool apps_require_extension_mime_type) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apps_require_extension_mime_type_ = apps_require_extension_mime_type; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_original_mime_type(const std::string& original_mime_type) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_mime_type_ = original_mime_type; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_misc::CrxInstallCause install_cause() const { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return install_cause_; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_install_cause(extension_misc::CrxInstallCause install_cause) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) install_cause_ = install_cause; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OffStoreInstallAllowReason off_store_install_allow_reason() const { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return off_store_install_allow_reason_; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_off_store_install_allow_reason(OffStoreInstallAllowReason reason) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) off_store_install_allow_reason_ = reason; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_page_ordinal(const syncer::StringOrdinal& page_ordinal) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_ordinal_ = page_ordinal; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_error_on_unsupported_requirements(bool val) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_on_unsupported_requirements_ = val; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void set_install_immediately(bool val) { 1876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) set_install_flag(kInstallFlagInstallImmediately, val); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void set_is_ephemeral(bool val) { 1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) set_install_flag(kInstallFlagIsEphemeral, val); 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void set_do_not_sync(bool val) { 1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) set_install_flag(kInstallFlagDoNotSync, val); 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_handle_successfully() const { return did_handle_successfully_; } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Profile* profile() { return install_checker_.profile(); } 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const Extension* extension() { return install_checker_.extension().get(); } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const std::string& current_version() const { return current_version_; } 2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class ::ExtensionServiceTest; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ExtensionUpdaterTest; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ExtensionCrxInstallerTest; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrxInstaller(base::WeakPtr<ExtensionService> service_weak, 210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_ptr<ExtensionInstallPrompt> client, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebstoreInstaller::Approval* approval); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CrxInstaller(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts the source user script to an extension. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConvertUserScriptOnFileThread(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts the source web app to an extension. 2186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void ConvertWebAppOnFileThread(const WebApplicationInfo& web_app); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called after OnUnpackSuccess as a last check to see whether the install 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should complete. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CrxInstallerError AllowInstall(const Extension* extension); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SandboxedUnpackerClient 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnUnpackFailure(const base::string16& error_message) OVERRIDE; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnUnpackSuccess(const base::FilePath& temp_dir, 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& extension_dir, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::DictionaryValue* original_manifest, 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const Extension* extension, 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const SkBitmap& install_icon) OVERRIDE; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Called on the UI thread to start the requirements, policy and blacklist 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // checks on the extension. 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void CheckInstall(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Runs on the UI thread. Callback from ExtensionInstallChecker. 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnInstallChecksComplete(int failed_checks); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Runs on the UI thread. Callback from Blacklist. 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void OnBlacklistChecked( 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) extensions::BlacklistState blacklist_state); 242a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Runs on the UI thread. Confirms the installation to the ExtensionService. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConfirmInstall(); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs on File thread. Install the unpacked extension into the profile and 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notify the frontend. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CompleteInstall(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Reloads extension on File thread and reports installation result back 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to UI thread. 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void ReloadExtensionAfterInstall(const base::FilePath& version_dir); 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Result reporting. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportFailureFromFileThread(const CrxInstallerError& error); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportFailureFromUIThread(const CrxInstallerError& error); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportSuccessFromFileThread(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReportSuccessFromUIThread(); 2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void NotifyCrxInstallBegin(); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void NotifyCrxInstallComplete(bool success); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Deletes temporary directory and crx file if needed. 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CleanupTempFiles(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checks whether the current installation is initiated by the user from 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the extension settings page to update an existing extension or app. 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CheckUpdateFromSettingsPage(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Show re-enable prompt if the update is initiated from the settings page 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and needs additional permissions. 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ConfirmReEnable(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) void set_install_flag(int flag, bool val) { 2746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (val) 2756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) install_flags_ |= flag; 2766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) else 2776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) install_flags_ &= ~flag; 2786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 2796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The file we're installing. 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath source_file_; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The URL the file was downloaded from. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL download_url_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The directory extensions are installed to. 2876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const base::FilePath install_directory_; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The location the installation came from (bundled with Chromium, registry, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // manual install, etc). This metadata is saved with the installation if 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // successful. Defaults to INTERNAL. 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Manifest::Location install_source_; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates whether the user has already approved the extension to be 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // installed. If true, |expected_manifest_| and |expected_id_| must match 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // those of the CRX. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool approved_; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For updates, external and webstore installs we have an ID we're expecting 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the extension to contain. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected_id_; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A parsed copy of the expected manifest, before any transformations like 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // localization have taken place. If |approved_| is true, then the 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension's manifest must match this for the install to proceed. 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Manifest> expected_manifest_; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // The level of checking when comparing the actual manifest against 3098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // the |expected_manifest_|. 3108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) WebstoreInstaller::ManifestCheckLevel expected_manifest_check_level_; 311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If non-NULL, contains the expected version of the extension we're 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // installing. Important for external sources, where claiming the wrong 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // version could cause unnecessary unpacking of an extension at every 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // restart. 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Version> expected_version_; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // If true, the actual version should be same with the |expected_version_|, 3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Otherwise the actual version should be equal to or newer than 3208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // the |expected_version_|. 3218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool expected_version_strict_checking_; 3228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether manual extension installation is enabled. We can't just check this 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before trying to install because themes are special-cased to always be 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // allowed. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool extensions_enabled_; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we're supposed to delete the source file on destruction. Defaults 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to false. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool delete_source_; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether to create an app shortcut after successful installation. This is 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // set based on the user's selection in the UI and can only ever be true for 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // apps. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool create_app_shortcut_; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The ordinal of the NTP apps page |extension_| will be shown on. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::StringOrdinal page_ordinal_; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A parsed copy of the unmodified original manifest, before any 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // transformations like localization have taken place. 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<Manifest> original_manifest_; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If non-empty, contains the current version of the extension we're 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // installing (for upgrades). 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string current_version_; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The icon we will display in the installation UI, if any. 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SkBitmap> install_icon_; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The temp directory extension resources were unpacked to. We own this and 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must delete it when we are done with it. 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath temp_dir_; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The frontend we will report results back to. 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtr<ExtensionService> service_weak_; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The client we will work with to do the installation. This can be NULL, in 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // which case the install is silent. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: we may be deleted on the file thread. To ensure the UI is deleted on 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the main thread we don't use a scoped_ptr here. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionInstallPrompt* client_; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The root of the unpacked extension directory. This is a subdirectory of 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // temp_dir_, so we don't have to delete it explicitly. 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath unpacked_extension_root_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True when the CRX being installed was just downloaded. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to trigger extra checks before installing. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool apps_require_extension_mime_type_; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows for the possibility of a normal install (one in which a |client| 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // is provided in the ctor) to proceed without showing the permissions prompt 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // dialog. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_silent_install_; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Allows for the possibility of an installation without granting any 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // permissions to the extension. 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool grant_permissions_; 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The value of the content type header sent with the CRX. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ignorred unless |require_extension_mime_type_| is true. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string original_mime_type_; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // What caused this install? Used only for histograms that report 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on failure rates, broken down by the cause of the install. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extension_misc::CrxInstallCause install_cause_; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creation flags to use for the extension. These flags will be used 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when calling Extenion::Create() by the crx installer. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int creation_flags_; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether to allow off store installation. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OffStoreInstallAllowReason off_store_install_allow_reason_; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the installation was handled successfully. This is used to 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicate to the client whether the file should be removed and any UI 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initiating the installation can be removed. This is different than whether 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there was an error; if there was an error that rejects installation we 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // still consider the installation 'handled'. 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_handle_successfully_; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether we should produce an error if the manifest declares requirements 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that are not met. If false and there is an unmet requirement, the install 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will continue but the extension will be distabled. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool error_on_unsupported_requirements_; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sequenced task runner where file I/O operations will be performed. 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> installer_task_runner_; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to show the install dialog. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionInstallPrompt::ShowDialogCallback show_dialog_callback_; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether the update is initiated by the user from the extension settings 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // page. 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool update_from_settings_page_; 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The flags for ExtensionService::OnExtensionInstalled. 419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int install_flags_; 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Performs requirements, policy and blacklist checks on the extension. 422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionInstallChecker install_checker_; 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CrxInstaller); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_CRX_INSTALLER_H_ 430