Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: chrome/browser/extensions/bundle_installer.h

Issue 855513002: Add/resurrect support for bundles of WebStore items. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@testext_bundle
Patch Set: cleanup;rebase Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 std::string icon_data;
72 SkBitmap icon;
77 State state; 73 State state;
78 }; 74 };
79 75
76 enum ApprovalState {
77 APPROVED,
78 USER_CANCELED,
79 APPROVAL_ERROR
80 };
81
82 typedef base::Callback<void(ApprovalState)> ApprovalCallback;
83
80 typedef std::vector<Item> ItemList; 84 typedef std::vector<Item> ItemList;
81 85
82 BundleInstaller(Browser* browser, const ItemList& items); 86 BundleInstaller(Browser* browser,
87 const std::string& name,
88 const SkBitmap& icon,
89 const std::string& authuser,
90 const ItemList& items);
91 ~BundleInstaller() override;
83 92
84 // Returns true if the user has approved the bundle's permissions. 93 // Returns true if the user has approved the bundle's permissions.
85 bool approved() const { return approved_; } 94 bool approved() const { return approved_; }
86 95
87 // Gets the items in the given state. 96 // Returns the browser window associated with the bundle's installation.
97 // Can return null if the browser is closed during the installation.
98 Browser* browser() { return browser_; }
99
100 // Gets the items in the given |state|.
88 ItemList GetItemsWithState(Item::State state) const; 101 ItemList GetItemsWithState(Item::State state) const;
89 102
103 // Returns whether there is at least one item with the given |state|.
104 bool HasItemWithState(Item::State state) const;
105
106 // Returns the number of items with the given |state|.
107 size_t CountItemsWithState(Item::State state) const;
108
90 // Parses the extension manifests and then prompts the user to approve their 109 // Parses the extension manifests and then prompts the user to approve their
91 // permissions. One of OnBundleInstallApproved or OnBundleInstallCanceled 110 // permissions.
92 // will be called when complete if |delegate| is not NULL. 111 void PromptForApproval(const ApprovalCallback& callback);
93 // Note: the |delegate| must stay alive until receiving the callback.
94 void PromptForApproval(Delegate* delegate);
95 112
96 // If the bundle has been approved, this downloads and installs the member 113 // If the bundle has been approved, this downloads and installs the member
97 // extensions. OnBundleInstallComplete will be called when the process is 114 // extensions. The download process uses the NavigationController of the
98 // complete and |delegate| is not NULL. The download process uses the 115 // specified |web_contents|. When complete, we show a confirmation bubble.
99 // NavigationController of the specified |web_contents|. When complete, we 116 void CompleteInstall(content::WebContents* web_contents,
100 // show a confirmation bubble in the specified |browser|. 117 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 118
104 // We change the headings in the install prompt and installed bubble depending 119 // 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 120 // 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 121 // the correct heading for the items in the specified |state|, or an empty
107 // string if no items are in the |state|. 122 // string if no items are in the |state|.
108 // STATE_PENDING - install prompt 123 // STATE_PENDING - install prompt
109 // STATE_INSTALLED - installed bubble successful installs list 124 // STATE_INSTALLED - installed bubble successful installs list
110 // STATE_FAILED - installed bubble failed installs list 125 // STATE_FAILED - installed bubble failed installs list
111 base::string16 GetHeadingTextFor(Item::State state) const; 126 base::string16 GetHeadingTextFor(Item::State state) const;
112 127
113 private: 128 private:
114 friend class base::RefCountedThreadSafe<BundleInstaller>;
115
116 typedef std::map<std::string, Item> ItemMap; 129 typedef std::map<std::string, Item> ItemMap;
117 typedef std::map<std::string, linked_ptr<base::DictionaryValue> > ManifestMap; 130 typedef std::map<std::string, linked_ptr<base::DictionaryValue> > ManifestMap;
118 131
119 ~BundleInstaller() override;
120
121 // Displays the install bubble for |bundle| on |browser|. 132 // Displays the install bubble for |bundle| on |browser|.
122 // Note: this is a platform specific implementation. 133 // Note: this is a platform specific implementation.
123 static void ShowInstalledBubble(const BundleInstaller* bundle, 134 static void ShowInstalledBubble(const BundleInstaller* bundle,
124 Browser* browser); 135 Browser* browser);
125 136
126 // Parses the manifests using WebstoreInstallHelper. 137 // Parses the manifests using WebstoreInstallHelper.
127 void ParseManifests(); 138 void ParseManifests();
128 139
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 140 // Prompts the user to install the bundle once we have dummy extensions for
139 // all the pending items. 141 // all the pending items.
140 void ShowPromptIfDoneParsing(); 142 void ShowPromptIfDoneParsing();
141 143
142 // Prompts the user to install the bundle. 144 // Prompts the user to install the bundle.
143 void ShowPrompt(); 145 void ShowPrompt();
144 146
145 // Displays the installed bubble once all items have installed or failed. 147 // Displays the installed bubble once all items have installed or failed.
146 void ShowInstalledBubbleIfDone(); 148 void ShowInstalledBubbleIfDone();
147 149
(...skipping 10 matching lines...) Expand all
158 void InstallUIAbort(bool user_initiated) override; 160 void InstallUIAbort(bool user_initiated) override;
159 161
160 // WebstoreInstaller::Delegate implementation: 162 // WebstoreInstaller::Delegate implementation:
161 void OnExtensionInstallSuccess(const std::string& id) override; 163 void OnExtensionInstallSuccess(const std::string& id) override;
162 void OnExtensionInstallFailure( 164 void OnExtensionInstallFailure(
163 const std::string& id, 165 const std::string& id,
164 const std::string& error, 166 const std::string& error,
165 WebstoreInstaller::FailureReason reason) override; 167 WebstoreInstaller::FailureReason reason) override;
166 168
167 // chrome::BrowserListObserver implementation: 169 // chrome::BrowserListObserver implementation:
168 void OnBrowserAdded(Browser* browser) override;
169 void OnBrowserRemoved(Browser* browser) override; 170 void OnBrowserRemoved(Browser* browser) override;
170 void OnBrowserSetLastActive(Browser* browser) override;
171 171
172 // Holds the Extensions used to generate the permission warnings. 172 // Holds the Extensions used to generate the permission warnings.
173 ExtensionList dummy_extensions_; 173 ExtensionList dummy_extensions_;
174 174
175 // Holds the parsed manifests, indexed by the extension ids. 175 // Holds the parsed manifests, indexed by the extension ids.
176 ManifestMap parsed_manifests_; 176 ManifestMap parsed_manifests_;
177 177
178 // True if the user has approved the bundle. 178 // True if the user has approved the bundle.
179 bool approved_; 179 bool approved_;
180 180
181 // Holds the bundle's Items, indexed by their ids. 181 // Holds the bundle's Items, indexed by their ids.
182 ItemMap items_; 182 ItemMap items_;
183 183
184 // The browser to show the confirmation bubble for. 184 // The browser to show the confirmation bubble for.
185 Browser* browser_; 185 Browser* browser_;
186 186
187 // The bundle's display name.
188 std::string name_;
189
190 // The bundle's icon.
191 SkBitmap icon_;
192
193 // The authuser query parameter value which should be used with CRX download
194 // requests. May be empty.
195 std::string authuser_;
196
187 // The desktop type of the browser. 197 // The desktop type of the browser.
188 chrome::HostDesktopType host_desktop_type_; 198 chrome::HostDesktopType host_desktop_type_;
189 199
190 // The profile that the bundle should be installed in. 200 // The profile that the bundle should be installed in.
191 Profile* profile_; 201 Profile* profile_;
192 202
193 // The UI that shows the confirmation prompt. 203 // The UI that shows the confirmation prompt.
194 scoped_ptr<ExtensionInstallPrompt> install_ui_; 204 scoped_ptr<ExtensionInstallPrompt> install_ui_;
195 205
196 Delegate* delegate_; 206 ApprovalCallback approval_callback_;
207 base::Closure install_callback_;
197 208
198 DISALLOW_COPY_AND_ASSIGN(BundleInstaller); 209 DISALLOW_COPY_AND_ASSIGN(BundleInstaller);
199 }; 210 };
200 211
201 } // namespace extensions 212 } // namespace extensions
202 213
203 #endif // CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_ 214 #endif // CHROME_BROWSER_EXTENSIONS_BUNDLE_INSTALLER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698