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