blob: 9aa454bd3d92d6f793db35c6ae39e3d9be3ff9e4 [file] [log] [blame]
[email protected]f3d3b382014-03-14 21:19:281// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]b2907fd2011-03-25 16:43:372// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]f3d3b382014-03-14 21:19:285#ifndef CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_
6#define CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_
[email protected]b2907fd2011-03-25 16:43:377
[email protected]51a3bf8b2012-06-08 22:53:068#include <list>
asargent56282ab72016-09-09 16:58:039#include <map>
[email protected]b2907fd2011-03-25 16:43:3710#include <string>
11
thestiga0e18cd2015-09-25 04:58:3612#include "base/gtest_prod_util.h"
avia2f4804a2015-12-24 23:11:1313#include "base/macros.h"
asargent56282ab72016-09-09 16:58:0314#include "base/time/time.h"
[email protected]f3d3b382014-03-14 21:19:2815#include "chrome/browser/extensions/pending_extension_info.h"
asargent56282ab72016-09-09 16:58:0316#include "extensions/common/extension_id.h"
[email protected]d42c11152013-08-22 19:36:3217#include "extensions/common/manifest.h"
[email protected]b2907fd2011-03-25 16:43:3718
[email protected]b2907fd2011-03-25 16:43:3719class GURL;
[email protected]1f04ef42013-04-22 07:35:5020
21namespace base {
[email protected]e3987852012-05-04 10:06:3022class Version;
[email protected]1f04ef42013-04-22 07:35:5023}
[email protected]42a08162012-03-16 18:09:1124
[email protected]46f3e102014-03-25 01:22:4525namespace content {
26class BrowserContext;
27}
28
Devlin Cronineea1b7a2018-05-26 02:46:2129namespace extensions {
[email protected]3f213ad2012-07-26 23:39:4130FORWARD_DECLARE_TEST(ExtensionServiceTest,
31 UpdatePendingExtensionAlreadyInstalled);
32
[email protected]b52f8ca2013-11-28 08:25:2233class PendingExtensionManager;
34
[email protected]42a08162012-03-16 18:09:1135class ExtensionUpdaterTest;
36void SetupPendingExtensionManagerForTest(
37 int count, const GURL& update_url,
38 PendingExtensionManager* pending_extension_manager);
[email protected]b2907fd2011-03-25 16:43:3739
40// Class PendingExtensionManager manages the set of extensions which are
[email protected]75764512011-12-19 19:54:2841// being installed or updated. In general, installation and updates take
[email protected]b2907fd2011-03-25 16:43:3742// time, because they involve downloading, unpacking, and installing.
43// This class allows us to avoid race cases where multiple sources install
44// the same extension.
[email protected]6c9bedf2014-05-21 03:55:5145// The ExtensionService creates an instance of this class, and manages its
46// lifetime. This class should only be used from the UI thread.
[email protected]b2907fd2011-03-25 16:43:3747class PendingExtensionManager {
48 public:
[email protected]6c9bedf2014-05-21 03:55:5149 explicit PendingExtensionManager(content::BrowserContext* context);
[email protected]b2907fd2011-03-25 16:43:3750 ~PendingExtensionManager();
51
52 // TODO(skerner): Many of these methods can be private once code in
53 // ExtensionService is moved into methods of this class.
54
[email protected]51a3bf8b2012-06-08 22:53:0655 // Remove extension with id |id| from the set of pending extensions. Returns
56 // true if such an extension was found and removed, false otherwise.
57 bool Remove(const std::string& id);
[email protected]b2907fd2011-03-25 16:43:3758
[email protected]51a3bf8b2012-06-08 22:53:0659 // Get the information for a pending extension. Returns a pointer to the
60 // pending extension with id |id|, or NULL if there is no such extension.
61 const PendingExtensionInfo* GetById(const std::string& id) const;
[email protected]b2907fd2011-03-25 16:43:3762
63 // Is |id| in the set of pending extensions?
64 bool IsIdPending(const std::string& id) const;
65
[email protected]9bd9a6862012-11-29 09:24:2266 // Returns true if there are any extensions pending.
67 bool HasPendingExtensions() const;
68
[email protected]d31e19e2012-08-22 00:19:0469 // Whether there is pending extension install from sync.
70 bool HasPendingExtensionFromSync() const;
71
Devlin Cronin2b3acda2019-05-30 19:11:3772 // Whether there is a high-priority pending extension (one from either policy
73 // or an external component extension).
74 bool HasHighPriorityPendingExtension() const;
Oleg Davydov6541a64f2019-04-17 13:17:3375
asargent56282ab72016-09-09 16:58:0376 // Notifies the manager that we are reinstalling the policy force-installed
77 // extension with |id| because we detected corruption in the current copy.
78 void ExpectPolicyReinstallForCorruption(const ExtensionId& id);
79
80 // Are we expecting a reinstall of the extension with |id| due to corruption?
81 bool IsPolicyReinstallForCorruptionExpected(const ExtensionId& id) const;
82
lazyboy77214d3c2017-04-04 16:46:1283 // Whether or not there are any corrupted policy extensions.
84 bool HasAnyPolicyReinstallForCorruption() const;
85
[email protected]b2907fd2011-03-25 16:43:3786 // Adds an extension in a pending state; the extension with the
87 // given info will be installed on the next auto-update cycle.
[email protected]145a317b2011-04-12 16:03:4688 // Return true if the extension was added. Will return false
89 // if the extension is pending from another source which overrides
90 // sync installs (such as a policy extension) or if the extension
91 // is already installed.
treibe960e282015-09-11 10:38:0892 // After installation, the extension will be granted permissions iff
93 // |version| is valid and matches the actual installed version.
[email protected]145a317b2011-04-12 16:03:4694 bool AddFromSync(
[email protected]b2907fd2011-03-25 16:43:3795 const std::string& id,
96 const GURL& update_url,
treibe960e282015-09-11 10:38:0897 const base::Version& version,
[email protected]b2907fd2011-03-25 16:43:3798 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install,
mamir192d7882016-06-22 17:10:1699 bool remote_install);
[email protected]b2907fd2011-03-25 16:43:37100
[email protected]9f4e4f082013-06-21 07:11:19101 // Adds an extension that was depended on by another extension.
102 bool AddFromExtensionImport(
103 const std::string& id,
104 const GURL& update_url,
105 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install);
106
[email protected]b2907fd2011-03-25 16:43:37107 // Given an extension id and an update URL, schedule the extension
108 // to be fetched, installed, and activated.
[email protected]9060d8b02012-01-13 02:14:30109 bool AddFromExternalUpdateUrl(const std::string& id,
[email protected]d8fd0fd2014-03-24 13:16:06110 const std::string& install_parameter,
[email protected]b2907fd2011-03-25 16:43:37111 const GURL& update_url,
[email protected]464213a2013-10-15 01:06:48112 Manifest::Location location,
113 int creation_flags,
114 bool mark_acknowledged);
[email protected]b2907fd2011-03-25 16:43:37115
[email protected]b2907fd2011-03-25 16:43:37116 // Add a pending extension record for an external CRX file.
[email protected]9060d8b02012-01-13 02:14:30117 // Return true if the CRX should be installed, false if an existing
118 // pending record overrides it.
119 bool AddFromExternalFile(
[email protected]b2907fd2011-03-25 16:43:37120 const std::string& id,
[email protected]1d5e58b2013-01-31 08:41:40121 Manifest::Location location,
[email protected]464213a2013-10-15 01:06:48122 const base::Version& version,
123 int creation_flags,
124 bool mark_acknowledged);
[email protected]b2907fd2011-03-25 16:43:37125
[email protected]51a3bf8b2012-06-08 22:53:06126 // Get the list of pending IDs that should be installed from an update URL.
[email protected]9060d8b02012-01-13 02:14:30127 // Pending extensions that will be installed from local files will not be
128 // included in the set.
129 void GetPendingIdsForUpdateCheck(
[email protected]51a3bf8b2012-06-08 22:53:06130 std::list<std::string>* out_ids_for_update_check) const;
[email protected]9060d8b02012-01-13 02:14:30131
[email protected]b2907fd2011-03-25 16:43:37132 private:
[email protected]51a3bf8b2012-06-08 22:53:06133 typedef std::list<PendingExtensionInfo> PendingExtensionList;
[email protected]9060d8b02012-01-13 02:14:30134
[email protected]b2907fd2011-03-25 16:43:37135 // Assumes an extension with id |id| is not already installed.
[email protected]145a317b2011-04-12 16:03:46136 // Return true if the extension was added.
137 bool AddExtensionImpl(
[email protected]b2907fd2011-03-25 16:43:37138 const std::string& id,
[email protected]d8fd0fd2014-03-24 13:16:06139 const std::string& install_parameter,
[email protected]b2907fd2011-03-25 16:43:37140 const GURL& update_url,
[email protected]1f04ef42013-04-22 07:35:50141 const base::Version& version,
[email protected]b2907fd2011-03-25 16:43:37142 PendingExtensionInfo::ShouldAllowInstallPredicate should_allow_install,
143 bool is_from_sync,
[email protected]464213a2013-10-15 01:06:48144 Manifest::Location install_source,
mamir0128d5a2016-07-15 20:55:48145 int creation_flags,
[email protected]21db9ef2014-05-16 02:06:27146 bool mark_acknowledged,
147 bool remote_install);
[email protected]b2907fd2011-03-25 16:43:37148
149 // Add a pending extension record directly. Used for unit tests that need
150 // to set an inital state. Use friendship to allow the tests to call this
151 // method.
[email protected]51a3bf8b2012-06-08 22:53:06152 void AddForTesting(const PendingExtensionInfo& pending_extension_info);
[email protected]b2907fd2011-03-25 16:43:37153
[email protected]46f3e102014-03-25 01:22:45154 // The BrowserContext with which the manager is associated.
155 content::BrowserContext* context_;
156
[email protected]51a3bf8b2012-06-08 22:53:06157 PendingExtensionList pending_extension_list_;
[email protected]b2907fd2011-03-25 16:43:37158
asargent56282ab72016-09-09 16:58:03159 // A set of policy force-installed extension ids that are being reinstalled
160 // due to corruption, mapped to the time we detected the corruption.
161 std::map<ExtensionId, base::TimeTicks> expected_policy_reinstalls_;
162
Devlin Cronineea1b7a2018-05-26 02:46:21163 FRIEND_TEST_ALL_PREFIXES(ExtensionServiceTest,
[email protected]b2907fd2011-03-25 16:43:37164 UpdatePendingExtensionAlreadyInstalled);
[email protected]3f213ad2012-07-26 23:39:41165 friend class ExtensionUpdaterTest;
166 friend void SetupPendingExtensionManagerForTest(
[email protected]b2907fd2011-03-25 16:43:37167 int count, const GURL& update_url,
168 PendingExtensionManager* pending_extension_manager);
169
170 DISALLOW_COPY_AND_ASSIGN(PendingExtensionManager);
171};
172
[email protected]3f213ad2012-07-26 23:39:41173} // namespace extensions
174
[email protected]f3d3b382014-03-14 21:19:28175#endif // CHROME_BROWSER_EXTENSIONS_PENDING_EXTENSION_MANAGER_H_