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