[email protected] | 29679dea | 2012-03-10 03:20:28 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_H_ |
| 6 | #define CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_H_ |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 7 | |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 8 | #include <list> |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 9 | #include <memory> |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 10 | #include <string> |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 11 | |
| 12 | #include "base/compiler_specific.h" |
thestig | a0e18cd | 2015-09-25 04:58:36 | [diff] [blame] | 13 | #include "base/gtest_prod_util.h" |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 14 | #include "base/memory/ref_counted.h" |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 15 | #include "base/scoped_observer.h" |
[email protected] | d59d40c | 2012-08-08 18:18:37 | [diff] [blame] | 16 | #include "base/supports_user_data.h" |
[email protected] | c80fe5f | 2014-03-26 04:36:30 | [diff] [blame] | 17 | #include "base/timer/timer.h" |
[email protected] | 21a5ad6 | 2012-04-03 04:48:45 | [diff] [blame] | 18 | #include "base/values.h" |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 19 | #include "base/version.h" |
[email protected] | af6efb2 | 2012-10-12 02:23:05 | [diff] [blame] | 20 | #include "chrome/browser/extensions/extension_install_prompt.h" |
Min Qin | eb78b7a | 2018-02-03 00:43:16 | [diff] [blame] | 21 | #include "components/download/public/common/download_interrupt_reasons.h" |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 22 | #include "components/download/public/common/download_item.h" |
[email protected] | ed0757ec | 2012-08-02 17:23:26 | [diff] [blame] | 23 | #include "content/public/browser/browser_thread.h" |
[email protected] | 6c2381d | 2011-10-19 02:52:53 | [diff] [blame] | 24 | #include "content/public/browser/notification_observer.h" |
| 25 | #include "content/public/browser/notification_registrar.h" |
[email protected] | 2acf3a5 | 2014-02-13 00:26:00 | [diff] [blame] | 26 | #include "content/public/browser/web_contents_observer.h" |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 27 | #include "extensions/browser/extension_registry_observer.h" |
[email protected] | 301116c6 | 2013-11-26 10:37:45 | [diff] [blame] | 28 | #include "extensions/common/manifest_handlers/shared_module_info.h" |
[email protected] | 7b4eea60 | 2013-02-08 06:19:47 | [diff] [blame] | 29 | #include "ui/gfx/image/image_skia.h" |
[email protected] | a6483d2 | 2013-07-03 22:11:00 | [diff] [blame] | 30 | #include "url/gurl.h" |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 31 | |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 32 | class Profile; |
| 33 | |
[email protected] | a3ef483 | 2013-02-02 05:12:33 | [diff] [blame] | 34 | namespace base { |
| 35 | class FilePath; |
| 36 | } |
| 37 | |
[email protected] | cdcb1dee | 2012-01-04 00:46:20 | [diff] [blame] | 38 | namespace content { |
[email protected] | 2acf3a5 | 2014-02-13 00:26:00 | [diff] [blame] | 39 | class WebContents; |
[email protected] | cdcb1dee | 2012-01-04 00:46:20 | [diff] [blame] | 40 | } |
| 41 | |
[email protected] | 3d61a7f | 2012-07-12 19:11:25 | [diff] [blame] | 42 | namespace extensions { |
| 43 | |
[email protected] | 5206ae8 | 2014-04-23 12:03:33 | [diff] [blame] | 44 | class CrxInstaller; |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 45 | class Extension; |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 46 | class ExtensionRegistry; |
[email protected] | 21c0104 | 2013-03-10 23:41:14 | [diff] [blame] | 47 | class Manifest; |
| 48 | |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 49 | // Downloads and installs extensions from the web store. |
[email protected] | 2acf3a5 | 2014-02-13 00:26:00 | [diff] [blame] | 50 | class WebstoreInstaller : public content::NotificationObserver, |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 51 | public ExtensionRegistryObserver, |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 52 | public download::DownloadItem::Observer, |
[email protected] | 2acf3a5 | 2014-02-13 00:26:00 | [diff] [blame] | 53 | public content::WebContentsObserver, |
| 54 | public base::RefCountedThreadSafe< |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 55 | WebstoreInstaller, |
| 56 | content::BrowserThread::DeleteOnUIThread> { |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 57 | public: |
[email protected] | 084e3548 | 2013-09-25 02:46:19 | [diff] [blame] | 58 | enum InstallSource { |
[email protected] | 99dfecd | 2011-10-18 01:11:50 | [diff] [blame] | 59 | // Inline installs trigger slightly different behavior (install source |
| 60 | // is different, download referrers are the item's page in the gallery). |
Benjamin Ackerman | c4fb0230 | 2018-10-03 19:55:41 | [diff] [blame] | 61 | // TODO(ackermanb): Remove once server side metrics (omaha) tracking with |
| 62 | // this enum is figured out with any of the subclasses of |
| 63 | // WebstoreStandaloneInstaller. |
[email protected] | 084e3548 | 2013-09-25 02:46:19 | [diff] [blame] | 64 | INSTALL_SOURCE_INLINE, |
| 65 | INSTALL_SOURCE_APP_LAUNCHER, |
| 66 | INSTALL_SOURCE_OTHER |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 67 | }; |
| 68 | |
[email protected] | bcd1eaf7 | 2012-10-03 05:42:29 | [diff] [blame] | 69 | enum FailureReason { |
| 70 | FAILURE_REASON_CANCELLED, |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 71 | FAILURE_REASON_DEPENDENCY_NOT_FOUND, |
| 72 | FAILURE_REASON_DEPENDENCY_NOT_SHARED_MODULE, |
[email protected] | bcd1eaf7 | 2012-10-03 05:42:29 | [diff] [blame] | 73 | FAILURE_REASON_OTHER |
| 74 | }; |
| 75 | |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 76 | enum ManifestCheckLevel { |
| 77 | // Do not check for any manifest equality. |
| 78 | MANIFEST_CHECK_LEVEL_NONE, |
| 79 | |
| 80 | // Only check that the expected and actual permissions have the same |
| 81 | // effective permissions. |
| 82 | MANIFEST_CHECK_LEVEL_LOOSE, |
| 83 | |
| 84 | // All data in the expected and actual manifests must match. |
| 85 | MANIFEST_CHECK_LEVEL_STRICT, |
| 86 | }; |
| 87 | |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 88 | class Delegate { |
| 89 | public: |
[email protected] | bcd1eaf7 | 2012-10-03 05:42:29 | [diff] [blame] | 90 | virtual void OnExtensionDownloadStarted(const std::string& id, |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 91 | download::DownloadItem* item); |
[email protected] | bcd1eaf7 | 2012-10-03 05:42:29 | [diff] [blame] | 92 | virtual void OnExtensionDownloadProgress(const std::string& id, |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 93 | download::DownloadItem* item); |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 94 | virtual void OnExtensionInstallSuccess(const std::string& id) = 0; |
| 95 | virtual void OnExtensionInstallFailure(const std::string& id, |
[email protected] | bcd1eaf7 | 2012-10-03 05:42:29 | [diff] [blame] | 96 | const std::string& error, |
| 97 | FailureReason reason) = 0; |
[email protected] | 512d03f | 2012-06-26 01:06:06 | [diff] [blame] | 98 | |
| 99 | protected: |
| 100 | virtual ~Delegate() {} |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 101 | }; |
| 102 | |
[email protected] | 89019d6 | 2012-05-17 18:47:09 | [diff] [blame] | 103 | // Contains information about what parts of the extension install process can |
| 104 | // be skipped or modified. If one of these is present, it means that a CRX |
| 105 | // download was initiated by WebstoreInstaller. The Approval instance should |
| 106 | // be checked further for additional details. |
[email protected] | d59d40c | 2012-08-08 18:18:37 | [diff] [blame] | 107 | struct Approval : public base::SupportsUserData::Data { |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 108 | static std::unique_ptr<Approval> CreateWithInstallPrompt(Profile* profile); |
[email protected] | 8529082 | 2013-08-23 20:27:38 | [diff] [blame] | 109 | |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 110 | // Creates an Approval for installing a shared module. |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 111 | static std::unique_ptr<Approval> CreateForSharedModule(Profile* profile); |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 112 | |
[email protected] | 8529082 | 2013-08-23 20:27:38 | [diff] [blame] | 113 | // Creates an Approval that will skip putting up an install confirmation |
| 114 | // prompt if the actual manifest from the extension to be installed matches |
| 115 | // |parsed_manifest|. The |strict_manifest_check| controls whether we want |
| 116 | // to require an exact manifest match, or are willing to tolerate a looser |
| 117 | // check just that the effective permissions are the same. |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 118 | static std::unique_ptr<Approval> CreateWithNoInstallPrompt( |
[email protected] | 89019d6 | 2012-05-17 18:47:09 | [diff] [blame] | 119 | Profile* profile, |
| 120 | const std::string& extension_id, |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 121 | std::unique_ptr<base::DictionaryValue> parsed_manifest, |
[email protected] | 8529082 | 2013-08-23 20:27:38 | [diff] [blame] | 122 | bool strict_manifest_check); |
[email protected] | 89019d6 | 2012-05-17 18:47:09 | [diff] [blame] | 123 | |
dcheng | ae36a4a | 2014-10-21 12:36:36 | [diff] [blame] | 124 | ~Approval() override; |
[email protected] | 21a5ad6 | 2012-04-03 04:48:45 | [diff] [blame] | 125 | |
| 126 | // The extension id that was approved for installation. |
| 127 | std::string extension_id; |
| 128 | |
| 129 | // The profile the extension should be installed into. |
| 130 | Profile* profile; |
| 131 | |
| 132 | // The expected manifest, before localization. |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 133 | std::unique_ptr<Manifest> manifest; |
[email protected] | 21a5ad6 | 2012-04-03 04:48:45 | [diff] [blame] | 134 | |
| 135 | // Whether to use a bubble notification when an app is installed, instead of |
| 136 | // the default behavior of transitioning to the new tab page. |
| 137 | bool use_app_installed_bubble; |
| 138 | |
| 139 | // Whether to skip the post install UI like the extension installed bubble. |
| 140 | bool skip_post_install_ui; |
[email protected] | 89019d6 | 2012-05-17 18:47:09 | [diff] [blame] | 141 | |
| 142 | // Whether to skip the install dialog once the extension has been downloaded |
| 143 | // and unpacked. One reason this can be true is that in the normal webstore |
| 144 | // installation, the dialog is shown earlier, before any download is done, |
| 145 | // so there's no need to show it again. |
| 146 | bool skip_install_dialog; |
| 147 | |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 148 | // Manifest check level for checking actual manifest against expected |
| 149 | // manifest. |
| 150 | ManifestCheckLevel manifest_check_level; |
[email protected] | 8529082 | 2013-08-23 20:27:38 | [diff] [blame] | 151 | |
[email protected] | af6efb2 | 2012-10-12 02:23:05 | [diff] [blame] | 152 | // Used to show the install dialog. |
| 153 | ExtensionInstallPrompt::ShowDialogCallback show_dialog_callback; |
| 154 | |
[email protected] | 7b4eea60 | 2013-02-08 06:19:47 | [diff] [blame] | 155 | // The icon to use to display the extension while it is installing. |
| 156 | gfx::ImageSkia installing_icon; |
| 157 | |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 158 | // A dummy extension created from |manifest|; |
| 159 | scoped_refptr<Extension> dummy_extension; |
| 160 | |
| 161 | // Required minimum version. |
pwnall | cbd7319 | 2016-08-22 18:59:17 | [diff] [blame] | 162 | std::unique_ptr<base::Version> minimum_version; |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 163 | |
[email protected] | e768495 | 2014-05-09 21:41:35 | [diff] [blame] | 164 | // The authuser index required to download the item being installed. May be |
| 165 | // the empty string, in which case no authuser parameter is used. |
| 166 | std::string authuser; |
| 167 | |
[email protected] | 89019d6 | 2012-05-17 18:47:09 | [diff] [blame] | 168 | private: |
| 169 | Approval(); |
[email protected] | 21a5ad6 | 2012-04-03 04:48:45 | [diff] [blame] | 170 | }; |
| 171 | |
| 172 | // Gets the Approval associated with the |download|, or NULL if there's none. |
| 173 | // Note that the Approval is owned by |download|. |
| 174 | static const Approval* GetAssociatedApproval( |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 175 | const download::DownloadItem& download); |
[email protected] | 21a5ad6 | 2012-04-03 04:48:45 | [diff] [blame] | 176 | |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 177 | // Creates a WebstoreInstaller for downloading and installing the extension |
| 178 | // with the given |id| from the Chrome Web Store. If |delegate| is not NULL, |
| 179 | // it will be notified when the install succeeds or fails. The installer will |
| 180 | // use the specified |controller| to download the extension. Only one |
[email protected] | 21a5ad6 | 2012-04-03 04:48:45 | [diff] [blame] | 181 | // WebstoreInstaller can use a specific controller at any given time. This |
| 182 | // also associates the |approval| with this install. |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 183 | // Note: the delegate should stay alive until being called back. |
| 184 | WebstoreInstaller(Profile* profile, |
| 185 | Delegate* delegate, |
[email protected] | 2acf3a5 | 2014-02-13 00:26:00 | [diff] [blame] | 186 | content::WebContents* web_contents, |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 187 | const std::string& id, |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 188 | std::unique_ptr<Approval> approval, |
[email protected] | 084e3548 | 2013-09-25 02:46:19 | [diff] [blame] | 189 | InstallSource source); |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 190 | |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 191 | // Starts downloading and installing the extension. |
| 192 | void Start(); |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 193 | |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 194 | // content::NotificationObserver. |
dcheng | ae36a4a | 2014-10-21 12:36:36 | [diff] [blame] | 195 | void Observe(int type, |
| 196 | const content::NotificationSource& source, |
| 197 | const content::NotificationDetails& details) override; |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 198 | |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 199 | // ExtensionRegistryObserver. |
dcheng | ae36a4a | 2014-10-21 12:36:36 | [diff] [blame] | 200 | void OnExtensionInstalled(content::BrowserContext* browser_context, |
| 201 | const Extension* extension, |
| 202 | bool is_update) override; |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 203 | |
[email protected] | e074e32 | 2012-10-30 01:12:09 | [diff] [blame] | 204 | // Removes the reference to the delegate passed in the constructor. Used when |
| 205 | // the delegate object must be deleted before this object. |
| 206 | void InvalidateDelegate(); |
| 207 | |
[email protected] | 9c265d0 | 2011-12-29 22:13:43 | [diff] [blame] | 208 | // Instead of using the default download directory, use |directory| instead. |
| 209 | // This does *not* transfer ownership of |directory|. |
[email protected] | a3ef483 | 2013-02-02 05:12:33 | [diff] [blame] | 210 | static void SetDownloadDirectoryForTests(base::FilePath* directory); |
[email protected] | 9c265d0 | 2011-12-29 22:13:43 | [diff] [blame] | 211 | |
amistry | 7d82d50a | 2015-01-12 20:17:28 | [diff] [blame] | 212 | protected: |
| 213 | // For testing. |
| 214 | ~WebstoreInstaller() override; |
| 215 | |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 216 | private: |
[email protected] | 902a8a01 | 2013-05-04 05:04:16 | [diff] [blame] | 217 | FRIEND_TEST_ALL_PREFIXES(WebstoreInstallerTest, PlatformParams); |
[email protected] | ed0757ec | 2012-08-02 17:23:26 | [diff] [blame] | 218 | friend struct content::BrowserThread::DeleteOnThread< |
amistry | 7d82d50a | 2015-01-12 20:17:28 | [diff] [blame] | 219 | content::BrowserThread::UI>; |
[email protected] | ed0757ec | 2012-08-02 17:23:26 | [diff] [blame] | 220 | friend class base::DeleteHelper<WebstoreInstaller>; |
[email protected] | 5f2a475 | 2012-04-27 22:18:58 | [diff] [blame] | 221 | |
[email protected] | 902a8a01 | 2013-05-04 05:04:16 | [diff] [blame] | 222 | // Helper to get install URL. |
| 223 | static GURL GetWebstoreInstallURL(const std::string& extension_id, |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 224 | InstallSource source); |
[email protected] | 902a8a01 | 2013-05-04 05:04:16 | [diff] [blame] | 225 | |
[email protected] | 8adbe311 | 2012-03-27 05:42:22 | [diff] [blame] | 226 | // DownloadManager::DownloadUrl callback. |
amistry | 7d82d50a | 2015-01-12 20:17:28 | [diff] [blame] | 227 | void OnDownloadStarted(const std::string& extension_id, |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 228 | download::DownloadItem* item, |
Min Qin | eb78b7a | 2018-02-03 00:43:16 | [diff] [blame] | 229 | download::DownloadInterruptReason interrupt_reason); |
[email protected] | 8adbe311 | 2012-03-27 05:42:22 | [diff] [blame] | 230 | |
| 231 | // DownloadItem::Observer implementation: |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 232 | void OnDownloadUpdated(download::DownloadItem* download) override; |
| 233 | void OnDownloadDestroyed(download::DownloadItem* download) override; |
[email protected] | 8adbe311 | 2012-03-27 05:42:22 | [diff] [blame] | 234 | |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 235 | // Downloads next pending module in |pending_modules_|. |
| 236 | void DownloadNextPendingModule(); |
| 237 | |
| 238 | // Downloads and installs a single Crx with the given |extension_id|. |
| 239 | // This function is used for both the extension Crx and dependences. |
| 240 | void DownloadCrx(const std::string& extension_id, InstallSource source); |
| 241 | |
amistry | 7d82d50a | 2015-01-12 20:17:28 | [diff] [blame] | 242 | // Starts downloading the extension with ID |extension_id| to |file_path|. |
| 243 | void StartDownload(const std::string& extension_id, |
| 244 | const base::FilePath& file_path); |
[email protected] | f66a50a | 2011-11-02 23:53:46 | [diff] [blame] | 245 | |
[email protected] | c80fe5f | 2014-03-26 04:36:30 | [diff] [blame] | 246 | // Updates the InstallTracker with the latest download progress. |
| 247 | void UpdateDownloadProgress(); |
| 248 | |
[email protected] | 5206ae8 | 2014-04-23 12:03:33 | [diff] [blame] | 249 | // Creates and starts CrxInstaller for the downloaded extension package. |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 250 | void StartCrxInstaller(const download::DownloadItem& item); |
[email protected] | 5206ae8 | 2014-04-23 12:03:33 | [diff] [blame] | 251 | |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 252 | // Reports an install |error| to the delegate for the given extension if this |
| 253 | // managed its installation. This also removes the associated PendingInstall. |
[email protected] | bcd1eaf7 | 2012-10-03 05:42:29 | [diff] [blame] | 254 | void ReportFailure(const std::string& error, FailureReason reason); |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 255 | |
| 256 | // Reports a successful install to the delegate for the given extension if |
| 257 | // this managed its installation. This also removes the associated |
| 258 | // PendingInstall. |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 259 | void ReportSuccess(); |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 260 | |
[email protected] | 0a2a724 | 2013-11-20 20:49:24 | [diff] [blame] | 261 | // Records stats regarding an interrupted webstore download item. |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 262 | void RecordInterrupt(const download::DownloadItem* download) const; |
[email protected] | 0a2a724 | 2013-11-20 20:49:24 | [diff] [blame] | 263 | |
[email protected] | 6c2381d | 2011-10-19 02:52:53 | [diff] [blame] | 264 | content::NotificationRegistrar registrar_; |
[email protected] | 17f0782 | 2014-05-22 08:45:15 | [diff] [blame] | 265 | ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver> |
| 266 | extension_registry_observer_; |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 267 | Profile* profile_; |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 268 | Delegate* delegate_; |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 269 | std::string id_; |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 270 | InstallSource install_source_; |
[email protected] | 8adbe311 | 2012-03-27 05:42:22 | [diff] [blame] | 271 | // The DownloadItem is owned by the DownloadManager and is valid from when |
[email protected] | 81b80bc | 2012-08-31 18:27:44 | [diff] [blame] | 272 | // OnDownloadStarted is called (with no error) until OnDownloadDestroyed(). |
Min Qin | a9f48787 | 2018-02-09 20:43:23 | [diff] [blame] | 273 | download::DownloadItem* download_item_; |
[email protected] | c80fe5f | 2014-03-26 04:36:30 | [diff] [blame] | 274 | // Used to periodically update the extension's download status. This will |
| 275 | // trigger at least every second, though sometimes more frequently (depending |
| 276 | // on number of modules, etc). |
danakj | 8c3eb80 | 2015-09-24 07:53:00 | [diff] [blame] | 277 | base::OneShotTimer download_progress_timer_; |
dcheng | c963c714 | 2016-04-08 03:55:22 | [diff] [blame] | 278 | std::unique_ptr<Approval> approval_; |
[email protected] | 98e4e52 | 2011-10-25 13:00:16 | [diff] [blame] | 279 | GURL download_url_; |
[email protected] | 5206ae8 | 2014-04-23 12:03:33 | [diff] [blame] | 280 | scoped_refptr<CrxInstaller> crx_installer_; |
[email protected] | 669b237 | 2013-10-17 15:04:58 | [diff] [blame] | 281 | |
| 282 | // Pending modules. |
| 283 | std::list<SharedModuleInfo::ImportInfo> pending_modules_; |
| 284 | // Total extension modules we need download and install (the main module and |
| 285 | // depedences). |
| 286 | int total_modules_; |
| 287 | bool download_started_; |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 288 | }; |
| 289 | |
[email protected] | 3d61a7f | 2012-07-12 19:11:25 | [diff] [blame] | 290 | } // namespace extensions |
| 291 | |
[email protected] | 655b2b1a | 2011-10-13 17:13:06 | [diff] [blame] | 292 | #endif // CHROME_BROWSER_EXTENSIONS_WEBSTORE_INSTALLER_H_ |