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. 4 5 #ifndef CHROME_BROWSER_EXTENSIONS_UPDATER_EXTENSION_DOWNLOADER_DELEGATE_H_ 6 #define CHROME_BROWSER_EXTENSIONS_UPDATER_EXTENSION_DOWNLOADER_DELEGATE_H_ 7 8 #include <set> 9 #include <string> 10 11 #include "base/time/time.h" 12 #include "extensions/browser/updater/manifest_fetch_data.h" 13 14 class GURL; 15 16 namespace base { 17 class FilePath; 18 } 19 20 namespace extensions { 21 22 class ExtensionDownloaderDelegate { 23 public: 24 virtual ~ExtensionDownloaderDelegate(); 25 26 // Passed as an argument to ExtensionDownloader::OnExtensionDownloadFailed() 27 // to detail the reason for the failure. 28 enum Error { 29 // Background networking is disabled. 30 DISABLED, 31 32 // Failed to fetch the manifest for this extension. 33 MANIFEST_FETCH_FAILED, 34 35 // The manifest couldn't be parsed. 36 MANIFEST_INVALID, 37 38 // The manifest was fetched and parsed, and there are no updates for 39 // this extension. 40 NO_UPDATE_AVAILABLE, 41 42 // There was an update for this extension but the download of the crx 43 // failed. 44 CRX_FETCH_FAILED, 45 }; 46 47 // Passed as an argument to the completion callbacks to signal whether 48 // the extension update sent a ping. 49 struct PingResult { 50 PingResult(); 51 ~PingResult(); 52 53 // Whether a ping was sent. 54 bool did_ping; 55 56 // The start of day, from the server's perspective. This is only valid 57 // when |did_ping| is true. 58 base::Time day_start; 59 }; 60 61 // One of the following 3 methods is always invoked for a given extension 62 // id, if AddExtension() or AddPendingExtension() returned true when that 63 // extension was added to the ExtensionDownloader. 64 // To avoid duplicate work, ExtensionDownloader might merge multiple identical 65 // requests, so there is not necessarily a separate invocation of one of these 66 // methods for each call to AddExtension/AddPendingExtension. If it is 67 // important to be able to match up AddExtension calls with 68 // OnExtensionDownload callbacks, you need to make sure that for every call to 69 // AddExtension/AddPendingExtension the combination of extension id and 70 // request id is unique. The OnExtensionDownload related callbacks will then 71 // be called with all request ids that resulted in that extension being 72 // checked. 73 74 // Invoked if the extension couldn't be downloaded. |error| contains the 75 // failure reason. 76 virtual void OnExtensionDownloadFailed(const std::string& id, 77 Error error, 78 const PingResult& ping_result, 79 const std::set<int>& request_ids); 80 81 // Invoked if the extension had an update available and its crx was 82 // successfully downloaded to |path|. |ownership_passed| is true if delegate 83 // should get ownership of the file. 84 virtual void OnExtensionDownloadFinished( 85 const std::string& id, 86 const base::FilePath& path, 87 bool file_ownership_passed, 88 const GURL& download_url, 89 const std::string& version, 90 const PingResult& ping_result, 91 const std::set<int>& request_ids) = 0; 92 93 // The remaining methods are used by the ExtensionDownloader to retrieve 94 // information about extensions from the delegate. 95 96 // Invoked to fill the PingData for the given extension id. Returns false 97 // if PingData should not be included for this extension's update check 98 // (this is the default). 99 virtual bool GetPingDataForExtension(const std::string& id, 100 ManifestFetchData::PingData* ping); 101 102 // Invoked to get the update url data for this extension's update url, if 103 // there is any. The default implementation returns an empty string. 104 virtual std::string GetUpdateUrlData(const std::string& id); 105 106 // Invoked to determine whether extension |id| is currently 107 // pending installation. 108 virtual bool IsExtensionPending(const std::string& id) = 0; 109 110 // Invoked to get the current version of extension |id|. Returns false if 111 // that extension is not installed. 112 virtual bool GetExtensionExistingVersion(const std::string& id, 113 std::string* version) = 0; 114 115 // Determines if a given extension should be forced to update and (if so) 116 // what the source of this forcing is (i.e. what string will be passed 117 // in |installsource| as part of the update query parameters). The default 118 // implementation always returns |false|. 119 virtual bool ShouldForceUpdate(const std::string& id, 120 std::string* source); 121 }; 122 123 } // namespace extensions 124 125 #endif // CHROME_BROWSER_EXTENSIONS_UPDATER_EXTENSION_DOWNLOADER_DELEGATE_H_ 126