NaCl: Update revision in DEPS, r12770 -> r12773
[chromium-blink-merge.git] / chrome / browser / extensions / updater / extension_updater.h
blobb6be1e10829ad6672595e2e65e654574823a447e
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_EXTENSIONS_UPDATER_EXTENSION_UPDATER_H_
6 #define CHROME_BROWSER_EXTENSIONS_UPDATER_EXTENSION_UPDATER_H_
8 #include <list>
9 #include <map>
10 #include <set>
11 #include <stack>
12 #include <string>
14 #include "base/callback_forward.h"
15 #include "base/compiler_specific.h"
16 #include "base/files/file_path.h"
17 #include "base/gtest_prod_util.h"
18 #include "base/memory/scoped_ptr.h"
19 #include "base/memory/weak_ptr.h"
20 #include "base/time/time.h"
21 #include "base/timer/timer.h"
22 #include "chrome/browser/extensions/updater/extension_downloader_delegate.h"
23 #include "chrome/browser/extensions/updater/manifest_fetch_data.h"
24 #include "content/public/browser/notification_observer.h"
25 #include "content/public/browser/notification_registrar.h"
26 #include "url/gurl.h"
28 class ExtensionServiceInterface;
29 class PrefService;
30 class Profile;
32 namespace extensions {
34 class ExtensionCache;
35 class ExtensionDownloader;
36 class ExtensionPrefs;
37 class ExtensionSet;
38 class ExtensionUpdaterTest;
40 // A class for doing auto-updates of installed Extensions. Used like this:
42 // ExtensionUpdater* updater = new ExtensionUpdater(my_extensions_service,
43 // extension_prefs,
44 // pref_service,
45 // profile,
46 // update_frequency_secs);
47 // updater->Start();
48 // ....
49 // updater->Stop();
50 class ExtensionUpdater : public ExtensionDownloaderDelegate,
51 public content::NotificationObserver {
52 public:
53 typedef base::Closure FinishedCallback;
55 struct CheckParams {
56 // Creates a default CheckParams instance that checks for all extensions.
57 CheckParams();
58 ~CheckParams();
60 // The set of extensions that should be checked for updates. If empty
61 // all extensions will be included in the update check.
62 std::list<std::string> ids;
64 // Normally extension updates get installed only when the extension is idle.
65 // Setting this to true causes any updates that are found to be installed
66 // right away.
67 bool install_immediately;
69 // Callback to call when the update check is complete. Can be null, if
70 // you're not interested in when this happens.
71 FinishedCallback callback;
74 // Holds a pointer to the passed |service|, using it for querying installed
75 // extensions and installing updated ones. The |frequency_seconds| parameter
76 // controls how often update checks are scheduled.
77 ExtensionUpdater(ExtensionServiceInterface* service,
78 ExtensionPrefs* extension_prefs,
79 PrefService* prefs,
80 Profile* profile,
81 int frequency_seconds,
82 ExtensionCache* cache);
84 virtual ~ExtensionUpdater();
86 // Starts the updater running. Should be called at most once.
87 void Start();
89 // Stops the updater running, cancelling any outstanding update manifest and
90 // crx downloads. Does not cancel any in-progress installs.
91 void Stop();
93 // Posts a task to do an update check. Does nothing if there is
94 // already a pending task that has not yet run.
95 void CheckSoon();
97 // Starts an update check for the specified extension soon. If a check
98 // is already running, or finished too recently without an update being
99 // installed, this method returns false and the check won't be scheduled.
100 bool CheckExtensionSoon(const std::string& extension_id,
101 const FinishedCallback& callback);
103 // Starts an update check right now, instead of waiting for the next
104 // regularly scheduled check or a pending check from CheckSoon().
105 void CheckNow(const CheckParams& params);
107 // Returns true iff CheckSoon() has been called but the update check
108 // hasn't been performed yet. This is used mostly by tests; calling
109 // code should just call CheckSoon().
110 bool WillCheckSoon() const;
112 // Changes the params that are used for the automatic periodic update checks,
113 // as well as for explicit calls to CheckSoon.
114 void set_default_check_params(const CheckParams& params) {
115 default_params_ = params;
118 private:
119 friend class ExtensionUpdaterTest;
120 friend class ExtensionUpdaterFileHandler;
122 // FetchedCRXFile holds information about a CRX file we fetched to disk,
123 // but have not yet installed.
124 struct FetchedCRXFile {
125 FetchedCRXFile();
126 FetchedCRXFile(const std::string& id,
127 const base::FilePath& path,
128 bool file_ownership_passed,
129 const GURL& download_url,
130 const std::set<int>& request_ids);
131 ~FetchedCRXFile();
133 std::string extension_id;
134 base::FilePath path;
135 bool file_ownership_passed;
136 GURL download_url;
137 std::set<int> request_ids;
140 struct InProgressCheck {
141 InProgressCheck();
142 ~InProgressCheck();
144 bool install_immediately;
145 FinishedCallback callback;
146 // The ids of extensions that have in-progress update checks.
147 std::list<std::string> in_progress_ids_;
150 struct ThrottleInfo;
152 // Computes when to schedule the first update check.
153 base::TimeDelta DetermineFirstCheckDelay();
155 // Sets the timer to call TimerFired after roughly |target_delay| from now.
156 // To help spread load evenly on servers, this method adds some random
157 // jitter. It also saves the scheduled time so it can be reloaded on
158 // browser restart.
159 void ScheduleNextCheck(const base::TimeDelta& target_delay);
161 // Add fetch records for extensions that are installed to the downloader,
162 // ignoring |pending_ids| so the extension isn't fetched again.
163 void AddToDownloader(const ExtensionSet* extensions,
164 const std::list<std::string>& pending_ids,
165 int request_id);
167 // BaseTimer::ReceiverMethod callback.
168 void TimerFired();
170 // Posted by CheckSoon().
171 void DoCheckSoon();
173 // Implenentation of ExtensionDownloaderDelegate.
174 virtual void OnExtensionDownloadFailed(
175 const std::string& id,
176 Error error,
177 const PingResult& ping,
178 const std::set<int>& request_ids) OVERRIDE;
180 virtual void OnExtensionDownloadFinished(
181 const std::string& id,
182 const base::FilePath& path,
183 bool file_ownership_passed,
184 const GURL& download_url,
185 const std::string& version,
186 const PingResult& ping,
187 const std::set<int>& request_id) OVERRIDE;
189 virtual bool GetPingDataForExtension(
190 const std::string& id,
191 ManifestFetchData::PingData* ping_data) OVERRIDE;
193 virtual std::string GetUpdateUrlData(const std::string& id) OVERRIDE;
195 virtual bool IsExtensionPending(const std::string& id) OVERRIDE;
197 virtual bool GetExtensionExistingVersion(const std::string& id,
198 std::string* version) OVERRIDE;
200 void UpdatePingData(const std::string& id, const PingResult& ping_result);
202 // Starts installing a crx file that has been fetched but not installed yet.
203 void MaybeInstallCRXFile();
205 // content::NotificationObserver implementation.
206 virtual void Observe(int type,
207 const content::NotificationSource& source,
208 const content::NotificationDetails& details) OVERRIDE;
210 // Send a notification that update checks are starting.
211 void NotifyStarted();
213 // Send a notification if we're finished updating.
214 void NotifyIfFinished(int request_id);
216 void ExtensionCheckFinished(const std::string& extension_id,
217 const FinishedCallback& callback);
219 // Whether Start() has been called but not Stop().
220 bool alive_;
222 base::WeakPtrFactory<ExtensionUpdater> weak_ptr_factory_;
224 // Pointer back to the service that owns this ExtensionUpdater.
225 ExtensionServiceInterface* service_;
227 // Fetches the crx files for the extensions that have an available update.
228 scoped_ptr<ExtensionDownloader> downloader_;
230 base::OneShotTimer<ExtensionUpdater> timer_;
231 int frequency_seconds_;
232 bool will_check_soon_;
234 ExtensionPrefs* extension_prefs_;
235 PrefService* prefs_;
236 Profile* profile_;
238 std::map<int, InProgressCheck> requests_in_progress_;
239 int next_request_id_;
241 // Observes CRX installs we initiate.
242 content::NotificationRegistrar registrar_;
244 // True when a CrxInstaller is doing an install. Used in MaybeUpdateCrxFile()
245 // to keep more than one install from running at once.
246 bool crx_install_is_running_;
248 // Fetched CRX files waiting to be installed.
249 std::stack<FetchedCRXFile> fetched_crx_files_;
250 FetchedCRXFile current_crx_file_;
252 CheckParams default_params_;
254 ExtensionCache* extension_cache_;
256 // Keeps track of when an extension tried to update itself, so we can throttle
257 // checks to prevent too many requests from being made.
258 std::map<std::string, ThrottleInfo> throttle_info_;
260 DISALLOW_COPY_AND_ASSIGN(ExtensionUpdater);
263 } // namespace extensions
265 #endif // CHROME_BROWSER_EXTENSIONS_UPDATER_EXTENSION_UPDATER_H_