OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ | 5 #ifndef CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ |
6 #define CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
| 11 #include "base/callback_forward.h" |
11 #include "base/memory/linked_ptr.h" | 12 #include "base/memory/linked_ptr.h" |
12 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
13 #include "base/strings/string16.h" | 14 #include "base/strings/string16.h" |
14 #include "chrome/browser/extensions/extension_install_prompt.h" | 15 #include "chrome/browser/extensions/extension_install_prompt.h" |
15 #include "chrome/browser/extensions/webstore_install_helper.h" | 16 #include "chrome/browser/extensions/webstore_install_helper.h" |
16 #include "chrome/browser/extensions/webstore_installer.h" | 17 #include "chrome/browser/extensions/webstore_installer.h" |
17 #include "chrome/browser/ui/browser_list_observer.h" | 18 #include "chrome/browser/ui/browser_list_observer.h" |
18 #include "chrome/browser/ui/host_desktop.h" | 19 #include "chrome/browser/ui/host_desktop.h" |
19 #include "extensions/common/extension.h" | 20 #include "extensions/common/extension.h" |
| 21 #include "third_party/skia/include/core/SkBitmap.h" |
| 22 #include "url/gurl.h" |
20 | 23 |
21 namespace base { | 24 namespace base { |
22 class DictionaryValue; | 25 class DictionaryValue; |
23 } // namespace base | 26 } // namespace base |
24 | 27 |
25 namespace content { | 28 namespace content { |
26 class WebContents; | 29 class WebContents; |
27 } // namespace content | 30 } // namespace content |
28 | 31 |
29 class Browser; | 32 class Browser; |
30 class Profile; | 33 class Profile; |
31 | 34 |
32 namespace extensions { | 35 namespace extensions { |
33 | 36 |
34 // Manages the installation life cycle for extension bundles. | 37 // Manages the installation life cycle for extension bundles. |
35 // | 38 // |
36 // We install bundles in two steps: | 39 // We install bundles in two steps: |
37 // 1) PromptForApproval: parse manifests and prompt the user | 40 // 1) PromptForApproval: parse manifests and prompt the user |
38 // 2) CompleteInstall: install the CRXs and show confirmation bubble | 41 // 2) CompleteInstall: install the CRXs and show confirmation bubble |
39 // | 42 // |
40 class BundleInstaller : public WebstoreInstallHelper::Delegate, | 43 class BundleInstaller : public WebstoreInstallHelper::Delegate, |
41 public ExtensionInstallPrompt::Delegate, | 44 public ExtensionInstallPrompt::Delegate, |
42 public WebstoreInstaller::Delegate, | 45 public WebstoreInstaller::Delegate, |
43 public chrome::BrowserListObserver, | 46 public chrome::BrowserListObserver { |
44 public base::RefCountedThreadSafe<BundleInstaller> { | |
45 public: | 47 public: |
46 // Auto approve or cancel the permission prompt. | 48 // Auto approve or cancel the permission prompt. |
47 static void SetAutoApproveForTesting(bool approve); | 49 static void SetAutoApproveForTesting(bool approve); |
48 | 50 |
49 class Delegate { | |
50 public: | |
51 virtual void OnBundleInstallApproved() {} | |
52 virtual void OnBundleInstallCanceled(bool user_initiated) {} | |
53 virtual void OnBundleInstallCompleted() {} | |
54 | |
55 protected: | |
56 virtual ~Delegate() {} | |
57 }; | |
58 | |
59 // Represents an individual member of the bundle. | 51 // Represents an individual member of the bundle. |
60 struct Item { | 52 struct Item { |
61 // Items are in the PENDING state until they've been installed, or the | 53 // Items are in the PENDING state until they've been installed, or the |
62 // install has failed or been canceled. | 54 // install has failed or been canceled. |
63 enum State { | 55 enum State { |
64 STATE_PENDING, | 56 STATE_PENDING, |
65 STATE_INSTALLED, | 57 STATE_INSTALLED, |
66 STATE_FAILED | 58 STATE_FAILED |
67 }; | 59 }; |
68 | 60 |
69 Item(); | 61 Item(); |
| 62 ~Item(); |
70 | 63 |
71 // Gets the localized name, formatted for display in the prompt or bubble. | 64 // Gets the localized name, formatted for display in the bubble. |
72 base::string16 GetNameForDisplay(); | 65 base::string16 GetNameForDisplay() const; |
73 | 66 |
74 std::string id; | 67 std::string id; |
75 std::string manifest; | 68 std::string manifest; |
76 std::string localized_name; | 69 std::string localized_name; |
| 70 GURL icon_url; |
| 71 SkBitmap icon; |
77 State state; | 72 State state; |
78 }; | 73 }; |
79 | 74 |
| 75 enum ApprovalState { |
| 76 APPROVED, |
| 77 USER_CANCELED, |
| 78 APPROVAL_ERROR |
| 79 }; |
| 80 |
| 81 typedef base::Callback<void(ApprovalState)> ApprovalCallback; |
| 82 |
80 typedef std::vector<Item> ItemList; | 83 typedef std::vector<Item> ItemList; |
81 | 84 |
82 BundleInstaller(Browser* browser, const ItemList& items); | 85 BundleInstaller(Browser* browser, |
| 86 const std::string& name, |
| 87 const SkBitmap& icon, |
| 88 const std::string& authuser, |
| 89 const ItemList& items); |
| 90 ~BundleInstaller() override; |
83 | 91 |
84 // Returns true if the user has approved the bundle's permissions. | 92 // Returns true if the user has approved the bundle's permissions. |
85 bool approved() const { return approved_; } | 93 bool approved() const { return approved_; } |
86 | 94 |
87 // Gets the items in the given state. | 95 // Returns the browser window associated with the bundle's installation. |
| 96 // Can return null if the browser is closed during the installation. |
| 97 Browser* browser() { return browser_; } |
| 98 |
| 99 // Gets the items in the given |state|. |
88 ItemList GetItemsWithState(Item::State state) const; | 100 ItemList GetItemsWithState(Item::State state) const; |
89 | 101 |
| 102 // Returns whether there is at least one item with the given |state|. |
| 103 bool HasItemWithState(Item::State state) const; |
| 104 |
| 105 // Returns the number of items with the given |state|. |
| 106 size_t CountItemsWithState(Item::State state) const; |
| 107 |
90 // Parses the extension manifests and then prompts the user to approve their | 108 // Parses the extension manifests and then prompts the user to approve their |
91 // permissions. One of OnBundleInstallApproved or OnBundleInstallCanceled | 109 // permissions. |
92 // will be called when complete if |delegate| is not NULL. | 110 void PromptForApproval(const ApprovalCallback& callback); |
93 // Note: the |delegate| must stay alive until receiving the callback. | |
94 void PromptForApproval(Delegate* delegate); | |
95 | 111 |
96 // If the bundle has been approved, this downloads and installs the member | 112 // If the bundle has been approved, this downloads and installs the member |
97 // extensions. OnBundleInstallComplete will be called when the process is | 113 // extensions. The download process uses the NavigationController of the |
98 // complete and |delegate| is not NULL. The download process uses the | 114 // specified |web_contents|. When complete, we show a confirmation bubble. |
99 // NavigationController of the specified |web_contents|. When complete, we | 115 void CompleteInstall(content::WebContents* web_contents, |
100 // show a confirmation bubble in the specified |browser|. | 116 const base::Closure& callback); |
101 // Note: the |delegate| must stay alive until receiving the callback. | |
102 void CompleteInstall(content::WebContents* web_contents, Delegate* delegate); | |
103 | 117 |
104 // We change the headings in the install prompt and installed bubble depending | 118 // We change the headings in the install prompt and installed bubble depending |
105 // on whether the bundle contains apps, extensions or both. This method gets | 119 // on whether the bundle contains apps, extensions or both. This method gets |
106 // the correct heading for the items in the specified |state|, or an empty | 120 // the correct heading for the items in the specified |state|, or an empty |
107 // string if no items are in the |state|. | 121 // string if no items are in the |state|. |
108 // STATE_PENDING - install prompt | 122 // STATE_PENDING - install prompt |
109 // STATE_INSTALLED - installed bubble successful installs list | 123 // STATE_INSTALLED - installed bubble successful installs list |
110 // STATE_FAILED - installed bubble failed installs list | 124 // STATE_FAILED - installed bubble failed installs list |
111 base::string16 GetHeadingTextFor(Item::State state) const; | 125 base::string16 GetHeadingTextFor(Item::State state) const; |
112 | 126 |
113 private: | 127 private: |
114 friend class base::RefCountedThreadSafe<BundleInstaller>; | |
115 | |
116 typedef std::map<std::string, Item> ItemMap; | 128 typedef std::map<std::string, Item> ItemMap; |
117 typedef std::map<std::string, linked_ptr<base::DictionaryValue> > ManifestMap; | 129 typedef std::map<std::string, linked_ptr<base::DictionaryValue> > ManifestMap; |
118 | 130 |
119 ~BundleInstaller() override; | |
120 | |
121 // Displays the install bubble for |bundle| on |browser|. | 131 // Displays the install bubble for |bundle| on |browser|. |
122 // Note: this is a platform specific implementation. | 132 // Note: this is a platform specific implementation. |
123 static void ShowInstalledBubble(const BundleInstaller* bundle, | 133 static void ShowInstalledBubble(const BundleInstaller* bundle, |
124 Browser* browser); | 134 Browser* browser); |
125 | 135 |
126 // Parses the manifests using WebstoreInstallHelper. | 136 // Parses the manifests using WebstoreInstallHelper. |
127 void ParseManifests(); | 137 void ParseManifests(); |
128 | 138 |
129 // Notifies the delegate that the installation has been approved. | |
130 void ReportApproved(); | |
131 | |
132 // Notifies the delegate that the installation was canceled. | |
133 void ReportCanceled(bool user_initiated); | |
134 | |
135 // Notifies the delegate that the installation is complete. | |
136 void ReportComplete(); | |
137 | |
138 // Prompts the user to install the bundle once we have dummy extensions for | 139 // Prompts the user to install the bundle once we have dummy extensions for |
139 // all the pending items. | 140 // all the pending items. |
140 void ShowPromptIfDoneParsing(); | 141 void ShowPromptIfDoneParsing(); |
141 | 142 |
142 // Prompts the user to install the bundle. | 143 // Prompts the user to install the bundle. |
143 void ShowPrompt(); | 144 void ShowPrompt(); |
144 | 145 |
145 // Displays the installed bubble once all items have installed or failed. | 146 // Displays the installed bubble once all items have installed or failed. |
146 void ShowInstalledBubbleIfDone(); | 147 void ShowInstalledBubbleIfDone(); |
147 | 148 |
(...skipping 10 matching lines...) Expand all Loading... |
158 void InstallUIAbort(bool user_initiated) override; | 159 void InstallUIAbort(bool user_initiated) override; |
159 | 160 |
160 // WebstoreInstaller::Delegate implementation: | 161 // WebstoreInstaller::Delegate implementation: |
161 void OnExtensionInstallSuccess(const std::string& id) override; | 162 void OnExtensionInstallSuccess(const std::string& id) override; |
162 void OnExtensionInstallFailure( | 163 void OnExtensionInstallFailure( |
163 const std::string& id, | 164 const std::string& id, |
164 const std::string& error, | 165 const std::string& error, |
165 WebstoreInstaller::FailureReason reason) override; | 166 WebstoreInstaller::FailureReason reason) override; |
166 | 167 |
167 // chrome::BrowserListObserver implementation: | 168 // chrome::BrowserListObserver implementation: |
168 void OnBrowserAdded(Browser* browser) override; | |
169 void OnBrowserRemoved(Browser* browser) override; | 169 void OnBrowserRemoved(Browser* browser) override; |
170 void OnBrowserSetLastActive(Browser* browser) override; | |
171 | 170 |
172 // Holds the Extensions used to generate the permission warnings. | 171 // Holds the Extensions used to generate the permission warnings. |
173 ExtensionList dummy_extensions_; | 172 ExtensionList dummy_extensions_; |
174 | 173 |
175 // Holds the parsed manifests, indexed by the extension ids. | 174 // Holds the parsed manifests, indexed by the extension ids. |
176 ManifestMap parsed_manifests_; | 175 ManifestMap parsed_manifests_; |
177 | 176 |
178 // True if the user has approved the bundle. | 177 // True if the user has approved the bundle. |
179 bool approved_; | 178 bool approved_; |
180 | 179 |
181 // Holds the bundle's Items, indexed by their ids. | 180 // Holds the bundle's Items, indexed by their ids. |
182 ItemMap items_; | 181 ItemMap items_; |
183 | 182 |
184 // The browser to show the confirmation bubble for. | 183 // The browser to show the confirmation bubble for. |
185 Browser* browser_; | 184 Browser* browser_; |
186 | 185 |
| 186 // The bundle's display name. |
| 187 std::string name_; |
| 188 |
| 189 // The bundle's icon. |
| 190 SkBitmap icon_; |
| 191 |
| 192 // The authuser query parameter value which should be used with CRX download |
| 193 // requests. May be empty. |
| 194 std::string authuser_; |
| 195 |
187 // The desktop type of the browser. | 196 // The desktop type of the browser. |
188 chrome::HostDesktopType host_desktop_type_; | 197 chrome::HostDesktopType host_desktop_type_; |
189 | 198 |
190 // The profile that the bundle should be installed in. | 199 // The profile that the bundle should be installed in. |
191 Profile* profile_; | 200 Profile* profile_; |
192 | 201 |
193 // The UI that shows the confirmation prompt. | 202 // The UI that shows the confirmation prompt. |
194 scoped_ptr<ExtensionInstallPrompt> install_ui_; | 203 scoped_ptr<ExtensionInstallPrompt> install_ui_; |
195 | 204 |
196 Delegate* delegate_; | 205 ApprovalCallback approval_callback_; |
| 206 base::Closure install_callback_; |
197 | 207 |
198 DISALLOW_COPY_AND_ASSIGN(BundleInstaller); | 208 DISALLOW_COPY_AND_ASSIGN(BundleInstaller); |
199 }; | 209 }; |
200 | 210 |
201 } // namespace extensions | 211 } // namespace extensions |
202 | 212 |
203 #endif // CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ | 213 #endif // CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ |
OLD | NEW |