extension_updater.h revision 21d179b334e59e9a3bfcaed4c4430bef1bc5759d
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_UPDATER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_EXTENSIONS_EXTENSION_UPDATER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <deque>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/gtest_prod_util.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/ref_counted.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/scoped_ptr.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/scoped_temp_dir.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/task.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/timer.h"
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/update_manifest.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/url_fetcher.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Extension;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionUpdaterTest;
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionUpdaterFileHandler;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass PrefService;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To save on server resources we can request updates for multiple extensions
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in one manifest check. This class helps us keep track of the id's for a
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// given fetch, building up the actual URL, and what if anything to include
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the ping parameter.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ManifestFetchData {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kNeverPinged = -1;
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  explicit ManifestFetchData(const GURL& update_url);
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~ManifestFetchData();
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if this extension information was successfully added. If the
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // return value is false it means the full_url would have become too long, and
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this ManifestFetchData object remains unchanged.
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool AddExtension(std::string id, std::string version, int ping_days,
474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                    const std::string& update_url_data);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL& base_url() const { return base_url_; }
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL& full_url() const { return full_url_; }
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int extension_count() { return extension_ids_.size(); }
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::set<std::string>& extension_ids() const { return extension_ids_; }
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the given id is included in this manifest fetch.
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool Includes(std::string extension_id) const;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if a ping parameter was added to full_url for this extension
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // id.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool DidPing(std::string extension_id) const;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if we should include a ping parameter for a given number of
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // days.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ShouldPing(int days) const;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::set<std::string> extension_ids_;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Keeps track of the day value to use for the extensions where we want to
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // send a 'days since last ping' parameter in the check.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::map<std::string, int> ping_days_;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The base update url without any arguments added.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL base_url_;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The base update url plus arguments indicating the id, version, etc.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // information about each extension.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL full_url_;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ManifestFetchData);
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A class for building a set of ManifestFetchData objects from
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// extensions and pending extensions.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ManifestFetchesBuilder {
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit ManifestFetchesBuilder(ExtensionUpdateService* service);
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~ManifestFetchesBuilder();
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddExtension(const Extension& extension);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddPendingExtension(const std::string& id,
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           const PendingExtensionInfo& info);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds all recorded stats taken so far to histogram counts.
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ReportStats() const;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Caller takes ownership of the returned ManifestFetchData
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // objects.  Clears all recorded stats.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ManifestFetchData*> GetFetches();
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct URLStats {
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    URLStats()
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        : no_url_count(0),
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          google_url_count(0),
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          other_url_count(0),
10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          extension_count(0),
10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          theme_count(0),
10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          app_count(0),
11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen          pending_count(0) {}
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int no_url_count, google_url_count, other_url_count;
11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    int extension_count, theme_count, app_count, pending_count;
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddExtensionData(Extension::Location location,
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const std::string& id,
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const Version& version,
11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                        Extension::Type extension_type,
1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        GURL update_url,
1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        const std::string& update_url_data);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionUpdateService* service_;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // List of data on fetches we're going to do. We limit the number of
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // extensions grouped together in one batch to avoid running into the limits
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // on the length of http GET requests, so there might be multiple
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ManifestFetchData* objects with the same base_url.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::multimap<GURL, ManifestFetchData*> fetches_;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLStats url_stats_;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ManifestFetchesBuilder);
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A class for doing auto-updates of installed Extensions. Used like this:
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExtensionUpdater* updater = new ExtensionUpdater(my_extensions_service,
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//                                                  pref_service,
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//                                                  update_frequency_secs);
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// updater.Start();
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ....
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// updater.Stop();
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionUpdater
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public URLFetcher::Delegate,
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      public base::RefCountedThreadSafe<ExtensionUpdater> {
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Holds a pointer to the passed |service|, using it for querying installed
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // extensions and installing updated ones. The |frequency_seconds| parameter
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // controls how often update checks are scheduled.
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionUpdater(ExtensionUpdateService* service,
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   PrefService* prefs,
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   int frequency_seconds);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Starts the updater running.  Should be called at most once.
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Start();
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stops the updater running, cancelling any outstanding update manifest and
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // crx downloads. Does not cancel any in-progress installs.
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Stop();
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts an update check right now, instead of waiting for the next regularly
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // scheduled check.
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckNow();
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set blacklist checks on or off.
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_blacklist_checks_enabled(bool enabled) {
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    blacklist_checks_enabled_ = enabled;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<ExtensionUpdater>;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class ExtensionUpdaterTest;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class ExtensionUpdaterFileHandler;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class SafeManifestParser;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~ExtensionUpdater();
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We need to keep track of some information associated with a url
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when doing a fetch.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct ExtensionFetch {
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string id;
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL url;
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string package_hash;
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string version;
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionFetch() : id(""), url(), package_hash(""), version("") {}
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ExtensionFetch(const std::string& i, const GURL& u,
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::string& h, const std::string& v)
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : id(i), url(u), package_hash(h), version(v) {}
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These are needed for unit testing, to help identify the correct mock
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URLFetcher objects.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kManifestFetcherId = 1;
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kExtensionFetcherId = 2;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const char* kBlacklistAppID;
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Does common work from constructors.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Init();
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Computes when to schedule the first update check.
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeDelta DetermineFirstCheckDelay();
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URLFetcher::Delegate interface.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const GURL& url,
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const URLRequestStatus& status,
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  int response_code,
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const ResponseCookies& cookies,
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const std::string& data);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // These do the actual work when a URL fetch completes.
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnManifestFetchComplete(const GURL& url,
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const URLRequestStatus& status,
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       int response_code,
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                       const std::string& data);
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnCRXFetchComplete(const GURL& url,
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const URLRequestStatus& status,
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  int response_code,
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const std::string& data);
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when a crx file has been written into a temp file, and is ready
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to be installed.
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnCRXFileWritten(const std::string& id, const FilePath& path,
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const GURL& download_url);
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verifies downloaded blacklist. Based on the blacklist, calls extension
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // service to unload blacklisted extensions and update pref.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ProcessBlacklist(const std::string& data);
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the timer to call TimerFired after roughly |target_delay| from now.
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // To help spread load evenly on servers, this method adds some random
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // jitter. It also saves the scheduled time so it can be reloaded on
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // browser restart.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ScheduleNextCheck(const base::TimeDelta& target_delay);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // BaseTimer::ReceiverMethod callback.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void TimerFired();
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Begins an update check. Takes ownership of |fetch_data|.
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartUpdateCheck(ManifestFetchData* fetch_data);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Begins (or queues up) download of an updated extension.
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void FetchUpdatedExtension(const std::string& id, const GURL& url,
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const std::string& hash, const std::string& version);
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Once a manifest is parsed, this starts fetches of any relevant crx files.
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void HandleManifestResults(const ManifestFetchData& fetch_data,
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             const UpdateManifest::Results& results);
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Determines the version of an existing extension.
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true on success and false on failures.
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetExistingVersion(const std::string& id, std::string* version);
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Given a list of potential updates, returns the indices of the ones that are
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // applicable (are actually a new version, etc.) in |result|.
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<int> DetermineUpdates(const ManifestFetchData& fetch_data,
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const UpdateManifest::Results& possible_updates);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Whether Start() has been called but not Stop().
2614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool alive_;
2624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Outstanding url fetch requests for manifests and updates.
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<URLFetcher> manifest_fetcher_;
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<URLFetcher> extension_fetcher_;
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Pending manifests and extensions to be fetched when the appropriate fetcher
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is available.
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::deque<ManifestFetchData*> manifests_pending_;
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::deque<ExtensionFetch> extensions_pending_;
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The manifest currently being fetched (if any).
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<ManifestFetchData> current_manifest_fetch_;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The extension currently being fetched (if any).
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionFetch current_extension_fetch_;
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Pointer back to the service that owns this ExtensionUpdater.
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionUpdateService* service_;
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::OneShotTimer<ExtensionUpdater> timer_;
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int frequency_seconds_;
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* prefs_;
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<ExtensionUpdaterFileHandler> file_handler_;
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool blacklist_checks_enabled_;
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  FRIEND_TEST(ExtensionUpdaterTest, TestStartUpdateCheckMemory);
2904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  FRIEND_TEST(ExtensionUpdaterTest, TestAfterStopBehavior);
2914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionUpdater);
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_UPDATER_H_
296