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_EXTENSION_INSTALL_PROMPT_H_ | 5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_PROMPT_H_ |
6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_PROMPT_H_ | 6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_PROMPT_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/callback.h" | 11 #include "base/callback.h" |
12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/memory/weak_ptr.h" |
15 #include "base/strings/string16.h" | 16 #include "base/strings/string16.h" |
16 #include "chrome/browser/extensions/crx_installer_error.h" | 17 #include "chrome/browser/extensions/crx_installer_error.h" |
17 #include "chrome/browser/extensions/extension_install_prompt_experiment.h" | 18 #include "chrome/browser/extensions/extension_install_prompt_experiment.h" |
18 #include "extensions/common/url_pattern.h" | 19 #include "extensions/common/url_pattern.h" |
19 #include "google_apis/gaia/oauth2_mint_token_flow.h" | |
20 #include "google_apis/gaia/oauth2_token_service.h" | |
21 #include "third_party/skia/include/core/SkBitmap.h" | 20 #include "third_party/skia/include/core/SkBitmap.h" |
22 #include "ui/gfx/image/image.h" | 21 #include "ui/gfx/image/image.h" |
23 #include "ui/gfx/image/image_skia.h" | 22 #include "ui/gfx/image/image_skia.h" |
24 #include "ui/gfx/native_widget_types.h" | 23 #include "ui/gfx/native_widget_types.h" |
25 | 24 |
26 class Browser; | 25 class Browser; |
27 class ExtensionInstallUI; | 26 class ExtensionInstallUI; |
28 class Profile; | 27 class Profile; |
29 | 28 |
30 namespace base { | 29 namespace base { |
(...skipping 13 matching lines...) Expand all Loading... |
44 class MockGetAuthTokenFunction; | 43 class MockGetAuthTokenFunction; |
45 class PermissionSet; | 44 class PermissionSet; |
46 } // namespace extensions | 45 } // namespace extensions |
47 | 46 |
48 namespace infobars { | 47 namespace infobars { |
49 class InfoBarDelegate; | 48 class InfoBarDelegate; |
50 } | 49 } |
51 | 50 |
52 // Displays all the UI around extension installation. | 51 // Displays all the UI around extension installation. |
53 class ExtensionInstallPrompt | 52 class ExtensionInstallPrompt |
54 : public OAuth2MintTokenFlow::Delegate, | 53 : public base::SupportsWeakPtr<ExtensionInstallPrompt> { |
55 public OAuth2TokenService::Consumer, | |
56 public base::SupportsWeakPtr<ExtensionInstallPrompt> { | |
57 public: | 54 public: |
58 // This enum is associated with Extensions.InstallPrompt_Type UMA histogram. | 55 // This enum is associated with Extensions.InstallPrompt_Type UMA histogram. |
59 // Do not modify existing values and add new values only to the end. | 56 // Do not modify existing values and add new values only to the end. |
60 enum PromptType { | 57 enum PromptType { |
61 UNSET_PROMPT_TYPE = -1, | 58 UNSET_PROMPT_TYPE = -1, |
62 INSTALL_PROMPT = 0, | 59 INSTALL_PROMPT = 0, |
63 INLINE_INSTALL_PROMPT, | 60 INLINE_INSTALL_PROMPT, |
64 BUNDLE_INSTALL_PROMPT, | 61 BUNDLE_INSTALL_PROMPT, |
65 RE_ENABLE_PROMPT, | 62 RE_ENABLE_PROMPT, |
66 PERMISSIONS_PROMPT, | 63 PERMISSIONS_PROMPT, |
67 EXTERNAL_INSTALL_PROMPT, | 64 EXTERNAL_INSTALL_PROMPT, |
68 POST_INSTALL_PERMISSIONS_PROMPT, | 65 POST_INSTALL_PERMISSIONS_PROMPT, |
69 LAUNCH_PROMPT, | 66 LAUNCH_PROMPT, |
70 REMOTE_INSTALL_PROMPT, | 67 REMOTE_INSTALL_PROMPT, |
71 NUM_PROMPT_TYPES | 68 NUM_PROMPT_TYPES |
72 }; | 69 }; |
73 | 70 |
74 enum DetailsType { | 71 enum DetailsType { |
75 PERMISSIONS_DETAILS = 0, | 72 PERMISSIONS_DETAILS = 0, |
76 OAUTH_DETAILS, | |
77 RETAINED_FILES_DETAILS, | 73 RETAINED_FILES_DETAILS, |
78 }; | 74 }; |
79 | 75 |
80 // Extra information needed to display an installation or uninstallation | 76 // Extra information needed to display an installation or uninstallation |
81 // prompt. Gets populated with raw data and exposes getters for formatted | 77 // prompt. Gets populated with raw data and exposes getters for formatted |
82 // strings so that the GTK/views/Cocoa install dialogs don't have to repeat | 78 // strings so that the GTK/views/Cocoa install dialogs don't have to repeat |
83 // that logic. | 79 // that logic. |
84 class Prompt { | 80 class Prompt { |
85 public: | 81 public: |
86 explicit Prompt(PromptType type); | 82 explicit Prompt(PromptType type); |
87 ~Prompt(); | 83 ~Prompt(); |
88 | 84 |
89 // Sets the permission list for this prompt. | 85 // Sets the permission list for this prompt. |
90 void SetPermissions(const std::vector<base::string16>& permissions); | 86 void SetPermissions(const std::vector<base::string16>& permissions); |
91 // Sets the permission list details for this prompt. | 87 // Sets the permission list details for this prompt. |
92 void SetPermissionsDetails(const std::vector<base::string16>& details); | 88 void SetPermissionsDetails(const std::vector<base::string16>& details); |
93 void SetIsShowingDetails(DetailsType type, | 89 void SetIsShowingDetails(DetailsType type, |
94 size_t index, | 90 size_t index, |
95 bool is_showing_details); | 91 bool is_showing_details); |
96 void SetWebstoreData(const std::string& localized_user_count, | 92 void SetWebstoreData(const std::string& localized_user_count, |
97 bool show_user_count, | 93 bool show_user_count, |
98 double average_rating, | 94 double average_rating, |
99 int rating_count); | 95 int rating_count); |
100 void SetOAuthIssueAdvice(const IssueAdviceInfo& issue_advice); | |
101 void SetUserNameFromProfile(Profile* profile); | 96 void SetUserNameFromProfile(Profile* profile); |
102 | 97 |
103 PromptType type() const { return type_; } | 98 PromptType type() const { return type_; } |
104 void set_type(PromptType type) { type_ = type; } | 99 void set_type(PromptType type) { type_ = type; } |
105 | 100 |
106 // Getters for UI element labels. | 101 // Getters for UI element labels. |
107 base::string16 GetDialogTitle() const; | 102 base::string16 GetDialogTitle() const; |
108 base::string16 GetHeading() const; | 103 base::string16 GetHeading() const; |
109 int GetDialogButtons() const; | 104 int GetDialogButtons() const; |
110 bool HasAcceptButtonLabel() const; | 105 bool HasAcceptButtonLabel() const; |
111 base::string16 GetAcceptButtonLabel() const; | 106 base::string16 GetAcceptButtonLabel() const; |
112 bool HasAbortButtonLabel() const; | 107 bool HasAbortButtonLabel() const; |
113 base::string16 GetAbortButtonLabel() const; | 108 base::string16 GetAbortButtonLabel() const; |
114 base::string16 GetPermissionsHeading() const; | 109 base::string16 GetPermissionsHeading() const; |
115 base::string16 GetOAuthHeading() const; | |
116 base::string16 GetRetainedFilesHeading() const; | 110 base::string16 GetRetainedFilesHeading() const; |
117 | 111 |
118 bool ShouldShowPermissions() const; | 112 bool ShouldShowPermissions() const; |
119 bool ShouldShowExplanationText() const; | 113 bool ShouldShowExplanationText() const; |
120 | 114 |
121 // Getters for webstore metadata. Only populated when the type is | 115 // Getters for webstore metadata. Only populated when the type is |
122 // INLINE_INSTALL_PROMPT. | 116 // INLINE_INSTALL_PROMPT. |
123 | 117 |
124 // The star display logic replicates the one used by the webstore (from | 118 // The star display logic replicates the one used by the webstore (from |
125 // components.ratingutils.setFractionalYellowStars). Callers pass in an | 119 // components.ratingutils.setFractionalYellowStars). Callers pass in an |
126 // "appender", which will be repeatedly called back with the star images | 120 // "appender", which will be repeatedly called back with the star images |
127 // that they append to the star display area. | 121 // that they append to the star display area. |
128 typedef void(*StarAppender)(const gfx::ImageSkia*, void*); | 122 typedef void(*StarAppender)(const gfx::ImageSkia*, void*); |
129 void AppendRatingStars(StarAppender appender, void* data) const; | 123 void AppendRatingStars(StarAppender appender, void* data) const; |
130 base::string16 GetRatingCount() const; | 124 base::string16 GetRatingCount() const; |
131 base::string16 GetUserCount() const; | 125 base::string16 GetUserCount() const; |
132 size_t GetPermissionCount() const; | 126 size_t GetPermissionCount() const; |
133 size_t GetPermissionsDetailsCount() const; | 127 size_t GetPermissionsDetailsCount() const; |
134 base::string16 GetPermission(size_t index) const; | 128 base::string16 GetPermission(size_t index) const; |
135 base::string16 GetPermissionsDetails(size_t index) const; | 129 base::string16 GetPermissionsDetails(size_t index) const; |
136 bool GetIsShowingDetails(DetailsType type, size_t index) const; | 130 bool GetIsShowingDetails(DetailsType type, size_t index) const; |
137 size_t GetOAuthIssueCount() const; | |
138 const IssueAdviceInfoEntry& GetOAuthIssue(size_t index) const; | |
139 size_t GetRetainedFileCount() const; | 131 size_t GetRetainedFileCount() const; |
140 base::string16 GetRetainedFile(size_t index) const; | 132 base::string16 GetRetainedFile(size_t index) const; |
141 | 133 |
142 // Populated for BUNDLE_INSTALL_PROMPT. | 134 // Populated for BUNDLE_INSTALL_PROMPT. |
143 const extensions::BundleInstaller* bundle() const { return bundle_; } | 135 const extensions::BundleInstaller* bundle() const { return bundle_; } |
144 void set_bundle(const extensions::BundleInstaller* bundle) { | 136 void set_bundle(const extensions::BundleInstaller* bundle) { |
145 bundle_ = bundle; | 137 bundle_ = bundle; |
146 } | 138 } |
147 | 139 |
148 // Populated for all other types. | 140 // Populated for all other types. |
(...skipping 22 matching lines...) Expand all Loading... |
171 private: | 163 private: |
172 bool ShouldDisplayRevokeFilesButton() const; | 164 bool ShouldDisplayRevokeFilesButton() const; |
173 | 165 |
174 PromptType type_; | 166 PromptType type_; |
175 | 167 |
176 // Permissions that are being requested (may not be all of an extension's | 168 // Permissions that are being requested (may not be all of an extension's |
177 // permissions if only additional ones are being requested) | 169 // permissions if only additional ones are being requested) |
178 std::vector<base::string16> permissions_; | 170 std::vector<base::string16> permissions_; |
179 std::vector<base::string16> details_; | 171 std::vector<base::string16> details_; |
180 std::vector<bool> is_showing_details_for_permissions_; | 172 std::vector<bool> is_showing_details_for_permissions_; |
181 std::vector<bool> is_showing_details_for_oauth_; | |
182 bool is_showing_details_for_retained_files_; | 173 bool is_showing_details_for_retained_files_; |
183 | 174 |
184 // Descriptions and details for OAuth2 permissions to display to the user. | |
185 // These correspond to permission scopes. | |
186 IssueAdviceInfo oauth_issue_advice_; | |
187 | |
188 // User name to be used in Oauth heading label. | |
189 base::string16 oauth_user_name_; | |
190 | |
191 // The extension or bundle being installed. | 175 // The extension or bundle being installed. |
192 const extensions::Extension* extension_; | 176 const extensions::Extension* extension_; |
193 const extensions::BundleInstaller* bundle_; | 177 const extensions::BundleInstaller* bundle_; |
194 | 178 |
195 // The icon to be displayed. | 179 // The icon to be displayed. |
196 gfx::Image icon_; | 180 gfx::Image icon_; |
197 | 181 |
198 // These fields are populated only when the prompt type is | 182 // These fields are populated only when the prompt type is |
199 // INLINE_INSTALL_PROMPT | 183 // INLINE_INSTALL_PROMPT |
200 // Already formatted to be locale-specific. | 184 // Already formatted to be locale-specific. |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
272 | 256 |
273 // Creates a prompt with a profile, a native window and a page navigator. | 257 // Creates a prompt with a profile, a native window and a page navigator. |
274 ExtensionInstallPrompt(Profile* profile, | 258 ExtensionInstallPrompt(Profile* profile, |
275 gfx::NativeWindow native_window, | 259 gfx::NativeWindow native_window, |
276 content::PageNavigator* navigator); | 260 content::PageNavigator* navigator); |
277 | 261 |
278 virtual ~ExtensionInstallPrompt(); | 262 virtual ~ExtensionInstallPrompt(); |
279 | 263 |
280 ExtensionInstallUI* install_ui() const { return install_ui_.get(); } | 264 ExtensionInstallUI* install_ui() const { return install_ui_.get(); } |
281 | 265 |
282 bool record_oauth2_grant() const { return record_oauth2_grant_; } | |
283 | |
284 content::WebContents* parent_web_contents() const { | 266 content::WebContents* parent_web_contents() const { |
285 return show_params_.parent_web_contents; | 267 return show_params_.parent_web_contents; |
286 } | 268 } |
287 | 269 |
288 // This is called by the bundle installer to verify whether the bundle | 270 // This is called by the bundle installer to verify whether the bundle |
289 // should be installed. | 271 // should be installed. |
290 // | 272 // |
291 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. | 273 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. |
292 virtual void ConfirmBundleInstall( | 274 virtual void ConfirmBundleInstall( |
293 extensions::BundleInstaller* bundle, | 275 extensions::BundleInstaller* bundle, |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 const Prompt& prompt); | 322 const Prompt& prompt); |
341 | 323 |
342 // This is called by the extension permissions API to verify whether an | 324 // This is called by the extension permissions API to verify whether an |
343 // extension may be granted additional permissions. | 325 // extension may be granted additional permissions. |
344 // | 326 // |
345 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. | 327 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. |
346 virtual void ConfirmPermissions(Delegate* delegate, | 328 virtual void ConfirmPermissions(Delegate* delegate, |
347 const extensions::Extension* extension, | 329 const extensions::Extension* extension, |
348 const extensions::PermissionSet* permissions); | 330 const extensions::PermissionSet* permissions); |
349 | 331 |
350 // This is called by the extension identity API to verify whether an | |
351 // extension can be granted an OAuth2 token. | |
352 // | |
353 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. | |
354 virtual void ConfirmIssueAdvice(Delegate* delegate, | |
355 const extensions::Extension* extension, | |
356 const IssueAdviceInfo& issue_advice); | |
357 | |
358 // This is called by the app handler launcher to review what permissions the | 332 // This is called by the app handler launcher to review what permissions the |
359 // extension or app currently has. | 333 // extension or app currently has. |
360 // | 334 // |
361 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. | 335 // We *MUST* eventually call either Proceed() or Abort() on |delegate|. |
362 virtual void ReviewPermissions( | 336 virtual void ReviewPermissions( |
363 Delegate* delegate, | 337 Delegate* delegate, |
364 const extensions::Extension* extension, | 338 const extensions::Extension* extension, |
365 const std::vector<base::FilePath>& retained_file_paths); | 339 const std::vector<base::FilePath>& retained_file_paths); |
366 | 340 |
367 // Installation was successful. This is declared virtual for testing. | 341 // Installation was successful. This is declared virtual for testing. |
368 virtual void OnInstallSuccess(const extensions::Extension* extension, | 342 virtual void OnInstallSuccess(const extensions::Extension* extension, |
369 SkBitmap* icon); | 343 SkBitmap* icon); |
370 | 344 |
371 // Installation failed. This is declared virtual for testing. | 345 // Installation failed. This is declared virtual for testing. |
372 virtual void OnInstallFailure(const extensions::CrxInstallerError& error); | 346 virtual void OnInstallFailure(const extensions::CrxInstallerError& error); |
373 | 347 |
374 protected: | 348 protected: |
375 friend class extensions::ExtensionWebstorePrivateApiTest; | 349 friend class extensions::ExtensionWebstorePrivateApiTest; |
376 friend class extensions::MockGetAuthTokenFunction; | |
377 friend class WebstoreStartupInstallUnpackFailureTest; | 350 friend class WebstoreStartupInstallUnpackFailureTest; |
378 | 351 |
379 // Whether or not we should record the oauth2 grant upon successful install. | 352 // Whether or not we should record the oauth2 grant upon successful install. |
380 bool record_oauth2_grant_; | 353 bool record_oauth2_grant_; |
381 | 354 |
382 private: | 355 private: |
383 friend class GalleryInstallApiTestObserver; | 356 friend class GalleryInstallApiTestObserver; |
384 | 357 |
385 // Sets the icon that will be used in any UI. If |icon| is NULL, or contains | 358 // Sets the icon that will be used in any UI. If |icon| is NULL, or contains |
386 // an empty bitmap, then a default icon will be used instead. | 359 // an empty bitmap, then a default icon will be used instead. |
387 void SetIcon(const SkBitmap* icon); | 360 void SetIcon(const SkBitmap* icon); |
388 | 361 |
389 // ImageLoader callback. | 362 // ImageLoader callback. |
390 void OnImageLoaded(const gfx::Image& image); | 363 void OnImageLoaded(const gfx::Image& image); |
391 | 364 |
392 // Starts the process of showing a confirmation UI, which is split into two. | 365 // Starts the process of showing a confirmation UI, which is split into two. |
393 // 1) Set off a 'load icon' task. | 366 // 1) Set off a 'load icon' task. |
394 // 2) Handle the load icon response and show the UI (OnImageLoaded). | 367 // 2) Handle the load icon response and show the UI (OnImageLoaded). |
395 void LoadImageIfNeeded(); | 368 void LoadImageIfNeeded(); |
396 | 369 |
397 // OAuth2TokenService::Consumer implementation: | |
398 virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request, | |
399 const std::string& access_token, | |
400 const base::Time& expiration_time) OVERRIDE; | |
401 virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, | |
402 const GoogleServiceAuthError& error) OVERRIDE; | |
403 | |
404 // OAuth2MintTokenFlow::Delegate implementation: | |
405 virtual void OnIssueAdviceSuccess( | |
406 const IssueAdviceInfo& issue_advice) OVERRIDE; | |
407 virtual void OnMintTokenFailure( | |
408 const GoogleServiceAuthError& error) OVERRIDE; | |
409 | |
410 // Shows the actual UI (the icon should already be loaded). | 370 // Shows the actual UI (the icon should already be loaded). |
411 void ShowConfirmation(); | 371 void ShowConfirmation(); |
412 | 372 |
413 base::MessageLoop* ui_loop_; | 373 base::MessageLoop* ui_loop_; |
414 | 374 |
415 // The extensions installation icon. | 375 // The extensions installation icon. |
416 SkBitmap icon_; | 376 SkBitmap icon_; |
417 | 377 |
418 // The extension we are showing the UI for, if type is not | 378 // The extension we are showing the UI for, if type is not |
419 // BUNDLE_INSTALL_PROMPT. | 379 // BUNDLE_INSTALL_PROMPT. |
(...skipping 10 matching lines...) Expand all Loading... |
430 | 390 |
431 // Parameters to show the confirmation UI. | 391 // Parameters to show the confirmation UI. |
432 ShowParams show_params_; | 392 ShowParams show_params_; |
433 | 393 |
434 // The delegate we will call Proceed/Abort on after confirmation UI. | 394 // The delegate we will call Proceed/Abort on after confirmation UI. |
435 Delegate* delegate_; | 395 Delegate* delegate_; |
436 | 396 |
437 // A pre-filled prompt. | 397 // A pre-filled prompt. |
438 Prompt prompt_; | 398 Prompt prompt_; |
439 | 399 |
440 scoped_ptr<OAuth2TokenService::Request> login_token_request_; | |
441 scoped_ptr<OAuth2MintTokenFlow> token_flow_; | |
442 | |
443 // Used to show the confirm dialog. | 400 // Used to show the confirm dialog. |
444 ShowDialogCallback show_dialog_callback_; | 401 ShowDialogCallback show_dialog_callback_; |
445 }; | 402 }; |
446 | 403 |
447 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_PROMPT_H_ | 404 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_INSTALL_PROMPT_H_ |
OLD | NEW |