Index: chrome/browser/extensions/crx_installer.h |
diff --git a/chrome/browser/extensions/crx_installer.h b/chrome/browser/extensions/crx_installer.h |
index 9e5ff7ca17bec159951715f0327d8717ada539f0..d9d18534c8c3e54d4b22322dba7be7bc5616dae5 100644 |
--- a/chrome/browser/extensions/crx_installer.h |
+++ b/chrome/browser/extensions/crx_installer.h |
@@ -14,6 +14,24 @@ |
#include "chrome/browser/extensions/sandboxed_extension_unpacker.h" |
#include "chrome/common/extensions/extension.h" |
+// Classes that want to know about install completion, or that want to have an |
+// opportunity to reject the unpacked extension before installation, should |
+// implement this interface. |
+class CrxInstallerClient |
+ : public base::RefCountedThreadSafe<CrxInstallerClient> { |
+ public: |
+ virtual ~CrxInstallerClient() {} |
+ |
+ // Return true to indicate that installation should proceed, false otherwise. |
+ virtual bool ConfirmInstall(Extension* extension) = 0; |
+ |
+ // Installation was successful. |
+ virtual void OnInstallSuccess(Extension* extension) = 0; |
+ |
+ // Intallation failed. |
+ virtual void OnInstallFailure(const std::string& error) = 0; |
+}; |
+ |
// This class installs a crx file into a profile. |
// |
// Installing a CRX is a multi-step process, including unpacking the crx, |
@@ -22,7 +40,6 @@ |
// necessary to do its job. (This also minimizes external dependencies for |
// easier testing). |
// |
-// |
// Lifetime management: |
// |
// This class is ref-counted by each call it makes to itself on another thread, |
@@ -30,46 +47,54 @@ |
// |
// Additionally, we hold a reference to our own client so that it lives at least |
// long enough to receive the result of unpacking. |
-// |
// |
-// NOTE: This class is rather huge at the moment because it is handling all |
-// types of installation (external, autoupdate, and manual). In the future, |
-// manual installation will probably pulled out of it. |
-// |
-// TODO(aa): Pull out the manual installation bits. |
// TODO(aa): Pull out a frontend interface for testing? |
class CrxInstaller : public SandboxedExtensionUnpackerClient { |
public: |
+ // Starts the installation of the crx file in |crx_path| into |
+ // |install_directory|. |
+ // |
+ // Other params: |
+ // install_source: The source of the install (external, --load-extension, etc |
+ // expected_id: Optional. If the caller knows what the ID of this extension |
+ // should be after unpacking, it can be specified here as a |
+ // sanity check. |
+ // delete_crx: Whether the crx should be deleted on completion. |
+ // file_loop: The message loop to do file IO on. |
+ // frontend: The ExtensionsService to report the successfully installed |
+ // extension to. |
+ // client: Optional. If specified, will be used to confirm installation and |
+ // also notified of success/fail. Note that we hold a reference to |
+ // this, so it can outlive its creator (eg the UI). |
+ static void Start(const FilePath& crx_path, |
+ const FilePath& install_directory, |
+ Extension::Location install_source, |
+ const std::string& expected_id, |
+ bool delete_crx, |
+ MessageLoop* file_loop, |
+ ExtensionsService* frontend, |
+ CrxInstallerClient* client); |
+ |
+ private: |
CrxInstaller(const FilePath& crx_path, |
const FilePath& install_directory, |
Extension::Location install_source, |
const std::string& expected_id, |
- bool extensions_enabled, |
- bool is_from_gallery, |
- bool show_prompts, |
bool delete_crx, |
MessageLoop* file_loop, |
- ExtensionsService* frontend); |
- ~CrxInstaller() { |
- // This is only here for debugging purposes, as a convenient place to set |
- // breakpoints. |
- } |
+ ExtensionsService* frontend, |
+ CrxInstallerClient* client); |
+ ~CrxInstaller(); |
- private: |
// SandboxedExtensionUnpackerClient |
virtual void OnUnpackFailure(const std::string& error_message); |
virtual void OnUnpackSuccess(const FilePath& temp_dir, |
const FilePath& extension_dir, |
Extension* extension); |
- // Confirm with the user that it is OK to install this extension. |
- // |
- // Note that this runs on the file thread. It happens to be OK to do this on |
- // Windows and Mac, and although ugly, we leave it because this is all getting |
- // pulled out soon, anyway. |
- // |
- // TODO(aa): Pull this up, closer to the UI layer. |
- bool ConfirmInstall(); |
+ // Runs on the UI thread. Confirms with the user (via CrxInstallerClient) that |
+ // it is OK to install this extension. |
+ void ConfirmInstall(); |
// Runs on File thread. Install the unpacked extension into the profile and |
// notify the frontend. |
@@ -96,18 +121,11 @@ class CrxInstaller : public SandboxedExtensionUnpackerClient { |
// extension to contain. |
std::string expected_id_; |
- // Whether extension installation is set. We can't just check this before |
- // trying to install because themes are special-cased to always be allowed. |
+ // Whether manual extension installation is enabled. We can't just check this |
+ // before trying to install because themes are special-cased to always be |
+ // allowed. |
bool extensions_enabled_; |
- // Whether this installation was initiated from the gallery. We trust it more |
- // and have special UI if it was. |
- bool is_from_gallery_; |
- |
- // Whether we shoud should show prompts. This is sometimes false for testing |
- // and autoupdate. |
- bool show_prompts_; |
- |
// Whether we're supposed to delete the source crx file on destruction. |
bool delete_crx_; |
@@ -128,6 +146,10 @@ class CrxInstaller : public SandboxedExtensionUnpackerClient { |
// The frontend we will report results back to. |
scoped_refptr<ExtensionsService> frontend_; |
+ // The client we will work with to do the installation. This can be NULL, in |
+ // which case the install is silent. |
+ scoped_refptr<CrxInstallerClient> client_; |
+ |
// The root of the unpacked extension directory. This is a subdirectory of |
// temp_dir_, so we don't have to delete it explicitly. |
FilePath unpacked_extension_root_; |