extension_updater.h revision 4a5e2dc747d50c653511c68ccb2cfbfb740bd5a7
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" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extensions_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), 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch theme_count(0) {} 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int no_url_count, google_url_count, other_url_count, theme_count; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AddExtensionData(Extension::Location location, 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& id, 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Version& version, 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick PendingExtensionInfo::ExpectedCrxType crx_type, 1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch GURL update_url, 1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const std::string& update_url_data); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionUpdateService* service_; 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // List of data on fetches we're going to do. We limit the number of 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // extensions grouped together in one batch to avoid running into the limits 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // on the length of http GET requests, so there might be multiple 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // ManifestFetchData* objects with the same base_url. 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::multimap<GURL, ManifestFetchData*> fetches_; 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLStats url_stats_; 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(ManifestFetchesBuilder); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A class for doing auto-updates of installed Extensions. Used like this: 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExtensionUpdater* updater = new ExtensionUpdater(my_extensions_service, 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// pref_service, 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// update_frequency_secs); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// updater.Start(); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// .... 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// updater.Stop(); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionUpdater 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : public URLFetcher::Delegate, 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public base::RefCountedThreadSafe<ExtensionUpdater> { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Holds a pointer to the passed |service|, using it for querying installed 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // extensions and installing updated ones. The |frequency_seconds| parameter 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // controls how often update checks are scheduled. 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionUpdater(ExtensionUpdateService* service, 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PrefService* prefs, 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int frequency_seconds); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Starts the updater running. Should be called at most once. 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Start(); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Stops the updater running, cancelling any outstanding update manifest and 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // crx downloads. Does not cancel any in-progress installs. 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Stop(); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Starts an update check right now, instead of waiting for the next regularly 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // scheduled check. 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CheckNow(); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set blacklist checks on or off. 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void set_blacklist_checks_enabled(bool enabled) { 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch blacklist_checks_enabled_ = enabled; 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class base::RefCountedThreadSafe<ExtensionUpdater>; 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class ExtensionUpdaterTest; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class ExtensionUpdaterFileHandler; 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class SafeManifestParser; 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~ExtensionUpdater(); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need to keep track of some information associated with a url 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // when doing a fetch. 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct ExtensionFetch { 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string id; 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL url; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string package_hash; 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string version; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionFetch() : id(""), url(), package_hash(""), version("") {} 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionFetch(const std::string& i, const GURL& u, 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& h, const std::string& v) 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : id(i), url(u), package_hash(h), version(v) {} 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These are needed for unit testing, to help identify the correct mock 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // URLFetcher objects. 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int kManifestFetcherId = 1; 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int kExtensionFetcherId = 2; 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const char* kBlacklistUpdateUrl; 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const char* kBlacklistAppID; 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Does common work from constructors. 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Init(); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Computes when to schedule the first update check. 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeDelta DetermineFirstCheckDelay(); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // URLFetcher::Delegate interface. 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnURLFetchComplete(const URLFetcher* source, 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url, 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const URLRequestStatus& status, 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int response_code, 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ResponseCookies& cookies, 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& data); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These do the actual work when a URL fetch completes. 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnManifestFetchComplete(const GURL& url, 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const URLRequestStatus& status, 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int response_code, 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& data); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void OnCRXFetchComplete(const GURL& url, 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const URLRequestStatus& status, 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int response_code, 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& data); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Called when a crx file has been written into a temp file, and is ready 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to be installed. 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void OnCRXFileWritten(const std::string& id, const FilePath& path, 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& download_url); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Verifies downloaded blacklist. Based on the blacklist, calls extension 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // service to unload blacklisted extensions and update pref. 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ProcessBlacklist(const std::string& data); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the timer to call TimerFired after roughly |target_delay| from now. 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // To help spread load evenly on servers, this method adds some random 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // jitter. It also saves the scheduled time so it can be reloaded on 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // browser restart. 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ScheduleNextCheck(const base::TimeDelta& target_delay); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // BaseTimer::ReceiverMethod callback. 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void TimerFired(); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Begins an update check. Takes ownership of |fetch_data|. 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void StartUpdateCheck(ManifestFetchData* fetch_data); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Begins (or queues up) download of an updated extension. 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void FetchUpdatedExtension(const std::string& id, const GURL& url, 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& hash, const std::string& version); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Once a manifest is parsed, this starts fetches of any relevant crx files. 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void HandleManifestResults(const ManifestFetchData& fetch_data, 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const UpdateManifest::Results& results); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Determines the version of an existing extension. 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true on success and false on failures. 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetExistingVersion(const std::string& id, std::string* version); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Given a list of potential updates, returns the indices of the ones that are 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // applicable (are actually a new version, etc.) in |result|. 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<int> DetermineUpdates(const ManifestFetchData& fetch_data, 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const UpdateManifest::Results& possible_updates); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether Start() has been called but not Stop(). 2584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool alive_; 2594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Outstanding url fetch requests for manifests and updates. 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<URLFetcher> manifest_fetcher_; 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<URLFetcher> extension_fetcher_; 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Pending manifests and extensions to be fetched when the appropriate fetcher 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is available. 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::deque<ManifestFetchData*> manifests_pending_; 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::deque<ExtensionFetch> extensions_pending_; 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The manifest currently being fetched (if any). 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<ManifestFetchData> current_manifest_fetch_; 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The extension currently being fetched (if any). 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionFetch current_extension_fetch_; 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Pointer back to the service that owns this ExtensionUpdater. 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExtensionUpdateService* service_; 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::OneShotTimer<ExtensionUpdater> timer_; 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int frequency_seconds_; 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PrefService* prefs_; 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<ExtensionUpdaterFileHandler> file_handler_; 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool blacklist_checks_enabled_; 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FRIEND_TEST(ExtensionUpdaterTest, TestStartUpdateCheckMemory); 2874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FRIEND_TEST(ExtensionUpdaterTest, TestAfterStopBehavior); 2884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(ExtensionUpdater); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_UPDATER_H_ 293