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
14class GURL;
15
16namespace base {
17class FilePath;
18}
19
20namespace extensions {
21
22class 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