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

Side by Side Diff: chrome/browser/extensions/extension_install_prompt.cc

Issue 11150002: New post-sideload UI: (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 2 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 | Annotate | Revision Log
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 #include "chrome/browser/extensions/extension_install_prompt.h" 5 #include "chrome/browser/extensions/extension_install_prompt.h"
6 6
7 #include <map> 7 #include <map>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 26 matching lines...) Expand all
37 #include "grit/generated_resources.h" 37 #include "grit/generated_resources.h"
38 #include "grit/theme_resources.h" 38 #include "grit/theme_resources.h"
39 #include "ui/base/l10n/l10n_util.h" 39 #include "ui/base/l10n/l10n_util.h"
40 #include "ui/base/resource/resource_bundle.h" 40 #include "ui/base/resource/resource_bundle.h"
41 #include "ui/gfx/image/image.h" 41 #include "ui/gfx/image/image.h"
42 42
43 using extensions::BundleInstaller; 43 using extensions::BundleInstaller;
44 using extensions::Extension; 44 using extensions::Extension;
45 using extensions::PermissionSet; 45 using extensions::PermissionSet;
46 46
47 namespace {
48
47 static const int kTitleIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { 49 static const int kTitleIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
48 0, // The regular install prompt depends on what's being installed. 50 0, // The regular install prompt depends on what's being installed.
49 IDS_EXTENSION_INLINE_INSTALL_PROMPT_TITLE, 51 IDS_EXTENSION_INLINE_INSTALL_PROMPT_TITLE,
50 IDS_EXTENSION_INSTALL_PROMPT_TITLE, 52 IDS_EXTENSION_INSTALL_PROMPT_TITLE,
51 IDS_EXTENSION_RE_ENABLE_PROMPT_TITLE, 53 IDS_EXTENSION_RE_ENABLE_PROMPT_TITLE,
52 IDS_EXTENSION_PERMISSIONS_PROMPT_TITLE 54 IDS_EXTENSION_PERMISSIONS_PROMPT_TITLE,
55 IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_TITLE,
53 }; 56 };
54 static const int kHeadingIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { 57 static const int kHeadingIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
55 IDS_EXTENSION_INSTALL_PROMPT_HEADING, 58 IDS_EXTENSION_INSTALL_PROMPT_HEADING,
56 0, // Inline installs use the extension name. 59 0, // Inline installs use the extension name.
57 0, // Heading for bundle installs depends on the bundle contents. 60 0, // Heading for bundle installs depends on the bundle contents.
58 IDS_EXTENSION_RE_ENABLE_PROMPT_HEADING, 61 IDS_EXTENSION_RE_ENABLE_PROMPT_HEADING,
59 IDS_EXTENSION_PERMISSIONS_PROMPT_HEADING 62 IDS_EXTENSION_PERMISSIONS_PROMPT_HEADING,
63 IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING,
60 }; 64 };
61 static const int kAcceptButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { 65 static const int kAcceptButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
62 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, 66 IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
63 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, 67 IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
64 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, 68 IDS_EXTENSION_PROMPT_INSTALL_BUTTON,
65 IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON, 69 IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON,
66 IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON 70 IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON,
71 IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON,
67 }; 72 };
68 static const int kAbortButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { 73 static const int kAbortButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
69 0, // These all use the platform's default cancel label. 74 0, // These all use the platform's default cancel label.
70 0, 75 0,
71 0, 76 0,
72 0, 77 0,
73 IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON 78 IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON,
79 IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ABORT_BUTTON,
74 }; 80 };
75 static const int kPermissionsHeaderIds[ 81 static const int kPermissionsHeaderIds[
76 ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { 82 ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
77 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, 83 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
78 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO, 84 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
79 IDS_EXTENSION_PROMPT_THESE_WILL_HAVE_ACCESS_TO, 85 IDS_EXTENSION_PROMPT_THESE_WILL_HAVE_ACCESS_TO,
80 IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO, 86 IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO,
81 IDS_EXTENSION_PROMPT_WANTS_ACCESS_TO, 87 IDS_EXTENSION_PROMPT_WANTS_ACCESS_TO,
88 IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO,
82 }; 89 };
83 static const int kOAuthHeaderIds[ 90 static const int kOAuthHeaderIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
84 ExtensionInstallPrompt::NUM_PROMPT_TYPES] = {
85 IDS_EXTENSION_PROMPT_OAUTH_HEADER, 91 IDS_EXTENSION_PROMPT_OAUTH_HEADER,
86 0, // Inline installs don't show OAuth permissions. 92 0, // Inline installs don't show OAuth permissions.
87 0, // Bundle installs don't show OAuth permissions. 93 0, // Bundle installs don't show OAuth permissions.
88 IDS_EXTENSION_PROMPT_OAUTH_REENABLE_HEADER, 94 IDS_EXTENSION_PROMPT_OAUTH_REENABLE_HEADER,
89 IDS_EXTENSION_PROMPT_OAUTH_PERMISSIONS_HEADER, 95 IDS_EXTENSION_PROMPT_OAUTH_PERMISSIONS_HEADER,
96 0, // TODO(mpcomplete): Do we need this for external install UI?
Jeffrey Yasskin 2012/10/13 21:17:35 I'd assume external extensions can ask for oauth p
90 }; 97 };
91 98
92 namespace {
93
94 // Size of extension icon in top left of dialog. 99 // Size of extension icon in top left of dialog.
95 const int kIconSize = 69; 100 const int kIconSize = 69;
96 101
97 // Returns pixel size under maximal scale factor for the icon whose device 102 // Returns pixel size under maximal scale factor for the icon whose device
98 // independent size is |size_in_dip| 103 // independent size is |size_in_dip|
99 int GetSizeForMaxScaleFactor(int size_in_dip) { 104 int GetSizeForMaxScaleFactor(int size_in_dip) {
100 std::vector<ui::ScaleFactor> supported_scale_factors = 105 std::vector<ui::ScaleFactor> supported_scale_factors =
101 ui::GetSupportedScaleFactors(); 106 ui::GetSupportedScaleFactors();
102 // Scale factors are in ascending order, so the last one is the one we need. 107 // Scale factors are in ascending order, so the last one is the one we need.
103 ui::ScaleFactor max_scale_factor = supported_scale_factors.back(); 108 ui::ScaleFactor max_scale_factor = supported_scale_factors.back();
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 string16 ExtensionInstallPrompt::Prompt::GetDialogTitle() const { 194 string16 ExtensionInstallPrompt::Prompt::GetDialogTitle() const {
190 int resource_id = kTitleIds[type_]; 195 int resource_id = kTitleIds[type_];
191 196
192 if (type_ == INSTALL_PROMPT) { 197 if (type_ == INSTALL_PROMPT) {
193 if (extension_->is_app()) 198 if (extension_->is_app())
194 resource_id = IDS_EXTENSION_INSTALL_APP_PROMPT_TITLE; 199 resource_id = IDS_EXTENSION_INSTALL_APP_PROMPT_TITLE;
195 else if (extension_->is_theme()) 200 else if (extension_->is_theme())
196 resource_id = IDS_EXTENSION_INSTALL_THEME_PROMPT_TITLE; 201 resource_id = IDS_EXTENSION_INSTALL_THEME_PROMPT_TITLE;
197 else 202 else
198 resource_id = IDS_EXTENSION_INSTALL_EXTENSION_PROMPT_TITLE; 203 resource_id = IDS_EXTENSION_INSTALL_EXTENSION_PROMPT_TITLE;
204 } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
205 return l10n_util::GetStringFUTF16(
206 resource_id, UTF8ToUTF16(extension_->name()));
199 } 207 }
200 208
201 return l10n_util::GetStringUTF16(resource_id); 209 return l10n_util::GetStringUTF16(resource_id);
202 } 210 }
203 211
204 string16 ExtensionInstallPrompt::Prompt::GetHeading() const { 212 string16 ExtensionInstallPrompt::Prompt::GetHeading() const {
205 if (type_ == INLINE_INSTALL_PROMPT) { 213 if (type_ == INLINE_INSTALL_PROMPT) {
206 return UTF8ToUTF16(extension_->name()); 214 return UTF8ToUTF16(extension_->name());
207 } else if (type_ == BUNDLE_INSTALL_PROMPT) { 215 } else if (type_ == BUNDLE_INSTALL_PROMPT) {
208 return bundle_->GetHeadingTextFor(BundleInstaller::Item::STATE_PENDING); 216 return bundle_->GetHeadingTextFor(BundleInstaller::Item::STATE_PENDING);
217 } else if (type_ == EXTERNAL_INSTALL_PROMPT) {
218 return l10n_util::GetStringUTF16(kHeadingIds[type_]);
209 } else { 219 } else {
210 return l10n_util::GetStringFUTF16( 220 return l10n_util::GetStringFUTF16(
211 kHeadingIds[type_], UTF8ToUTF16(extension_->name())); 221 kHeadingIds[type_], UTF8ToUTF16(extension_->name()));
212 } 222 }
213 } 223 }
214 224
215 string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const { 225 string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const {
216 return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]); 226 return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]);
217 } 227 }
218 228
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 const Extension* extension) { 436 const Extension* extension) {
427 DCHECK(ui_loop_ == MessageLoop::current()); 437 DCHECK(ui_loop_ == MessageLoop::current());
428 extension_ = extension; 438 extension_ = extension;
429 permissions_ = extension->GetActivePermissions(); 439 permissions_ = extension->GetActivePermissions();
430 delegate_ = delegate; 440 delegate_ = delegate;
431 prompt_type_ = RE_ENABLE_PROMPT; 441 prompt_type_ = RE_ENABLE_PROMPT;
432 442
433 LoadImageIfNeeded(); 443 LoadImageIfNeeded();
434 } 444 }
435 445
446 void ExtensionInstallPrompt::ConfirmExternalInstall(
447 Delegate* delegate, const Extension* extension) {
448 DCHECK(ui_loop_ == MessageLoop::current());
449 extension_ = extension;
450 permissions_ = extension->GetActivePermissions();
451 delegate_ = delegate;
452 prompt_type_ = EXTERNAL_INSTALL_PROMPT;
453 show_dialog_callback_ = // @@@MP
Matt Perry 2012/10/13 00:33:18 I'll remove this once http://codereview.chromium.o
454 ExtensionInstallPrompt::GetDefaultShowDialogCallback();
455
456 LoadImageIfNeeded();
Jeffrey Yasskin 2012/10/13 21:17:35 Wow, that's a subtle name for the "go show the dia
457 }
458
436 void ExtensionInstallPrompt::ConfirmPermissions( 459 void ExtensionInstallPrompt::ConfirmPermissions(
437 Delegate* delegate, 460 Delegate* delegate,
438 const Extension* extension, 461 const Extension* extension,
439 const PermissionSet* permissions) { 462 const PermissionSet* permissions) {
440 DCHECK(ui_loop_ == MessageLoop::current()); 463 DCHECK(ui_loop_ == MessageLoop::current());
441 extension_ = extension; 464 extension_ = extension;
442 permissions_ = permissions; 465 permissions_ = permissions;
443 delegate_ = delegate; 466 delegate_ = delegate;
444 prompt_type_ = PERMISSIONS_PROMPT; 467 prompt_type_ = PERMISSIONS_PROMPT;
445 468
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
489 512
490 void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image, 513 void ExtensionInstallPrompt::OnImageLoaded(const gfx::Image& image,
491 const std::string& extension_id, 514 const std::string& extension_id,
492 int index) { 515 int index) {
493 SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap()); 516 SetIcon(image.IsEmpty() ? NULL : image.ToSkBitmap());
494 FetchOAuthIssueAdviceIfNeeded(); 517 FetchOAuthIssueAdviceIfNeeded();
495 } 518 }
496 519
497 void ExtensionInstallPrompt::LoadImageIfNeeded() { 520 void ExtensionInstallPrompt::LoadImageIfNeeded() {
498 // Bundle install prompts do not have an icon. 521 // Bundle install prompts do not have an icon.
499 if (!icon_.empty()) { 522 if (!icon_.empty()) {
Jeffrey Yasskin 2012/10/13 21:17:35 Not related to this CL, but !icon_.empty() seems t
500 FetchOAuthIssueAdviceIfNeeded(); 523 FetchOAuthIssueAdviceIfNeeded();
501 return; 524 return;
502 } 525 }
503 526
504 // Load the image asynchronously. For the response, check OnImageLoaded. 527 // Load the image asynchronously. For the response, check OnImageLoaded.
505 ExtensionResource image = 528 ExtensionResource image =
506 extension_->GetIconResource(extension_misc::EXTENSION_ICON_LARGE, 529 extension_->GetIconResource(extension_misc::EXTENSION_ICON_LARGE,
507 ExtensionIconSet::MATCH_BIGGER); 530 ExtensionIconSet::MATCH_BIGGER);
508 // Load the icon whose pixel size is large enough to be displayed under 531 // Load the icon whose pixel size is large enough to be displayed under
509 // maximal supported scale factor. UI code will scale the icon down if needed. 532 // maximal supported scale factor. UI code will scale the icon down if needed.
510 // TODO(tbarzic): We should use IconImage here and load the required bitmap 533 // TODO(tbarzic): We should use IconImage here and load the required bitmap
511 // lazily. 534 // lazily.
512 int pixel_size = GetSizeForMaxScaleFactor(kIconSize); 535 int pixel_size = GetSizeForMaxScaleFactor(kIconSize);
513 tracker_.LoadImage(extension_, image, 536 tracker_.LoadImage(extension_, image,
514 gfx::Size(pixel_size, pixel_size), 537 gfx::Size(pixel_size, pixel_size),
515 ImageLoadingTracker::DONT_CACHE); 538 ImageLoadingTracker::DONT_CACHE);
516 } 539 }
517 540
518 void ExtensionInstallPrompt::FetchOAuthIssueAdviceIfNeeded() { 541 void ExtensionInstallPrompt::FetchOAuthIssueAdviceIfNeeded() {
519 // |extension_| may be NULL, e.g. in the bundle install case. 542 // |extension_| may be NULL, e.g. in the bundle install case.
520 if (!extension_ || 543 if (!extension_ ||
521 prompt_type_ == BUNDLE_INSTALL_PROMPT || 544 prompt_type_ == BUNDLE_INSTALL_PROMPT ||
522 prompt_type_ == INLINE_INSTALL_PROMPT || 545 prompt_type_ == INLINE_INSTALL_PROMPT ||
Jeffrey Yasskin 2012/10/13 21:17:35 Do you need to include EXTERNAL_INSTALL_PROMPT in
Matt Perry 2012/10/15 19:13:38 Good catch. Done.
523 prompt_.GetOAuthIssueCount() != 0U) { 546 prompt_.GetOAuthIssueCount() != 0U) {
524 ShowConfirmation(); 547 ShowConfirmation();
525 return; 548 return;
526 } 549 }
527 550
528 const Extension::OAuth2Info& oauth2_info = extension_->oauth2_info(); 551 const Extension::OAuth2Info& oauth2_info = extension_->oauth2_info();
529 if (oauth2_info.client_id.empty() || 552 if (oauth2_info.client_id.empty() ||
530 oauth2_info.scopes.empty()) { 553 oauth2_info.scopes.empty()) {
531 ShowConfirmation(); 554 ShowConfirmation();
532 return; 555 return;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
565 if (permissions_) { 588 if (permissions_) {
566 Extension::Type extension_type = prompt_type_ == BUNDLE_INSTALL_PROMPT ? 589 Extension::Type extension_type = prompt_type_ == BUNDLE_INSTALL_PROMPT ?
567 Extension::TYPE_UNKNOWN : extension_->GetType(); 590 Extension::TYPE_UNKNOWN : extension_->GetType();
568 prompt_.SetPermissions(permissions_->GetWarningMessages(extension_type)); 591 prompt_.SetPermissions(permissions_->GetWarningMessages(extension_type));
569 } 592 }
570 593
571 switch (prompt_type_) { 594 switch (prompt_type_) {
572 case PERMISSIONS_PROMPT: 595 case PERMISSIONS_PROMPT:
573 case RE_ENABLE_PROMPT: 596 case RE_ENABLE_PROMPT:
574 case INLINE_INSTALL_PROMPT: 597 case INLINE_INSTALL_PROMPT:
598 case EXTERNAL_INSTALL_PROMPT:
575 case INSTALL_PROMPT: { 599 case INSTALL_PROMPT: {
576 prompt_.set_extension(extension_); 600 prompt_.set_extension(extension_);
577 prompt_.set_icon(gfx::Image(icon_)); 601 prompt_.set_icon(gfx::Image(icon_));
578 break; 602 break;
579 } 603 }
580 case BUNDLE_INSTALL_PROMPT: { 604 case BUNDLE_INSTALL_PROMPT: {
581 prompt_.set_bundle(bundle_); 605 prompt_.set_bundle(bundle_);
582 break; 606 break;
583 } 607 }
584 default: 608 default:
(...skipping 14 matching lines...) Expand all
599 Browser* browser) { 623 Browser* browser) {
600 // |browser| can be NULL in unit tests. 624 // |browser| can be NULL in unit tests.
601 if (!browser) 625 if (!browser)
602 return new ExtensionInstallPrompt(NULL, NULL, NULL); 626 return new ExtensionInstallPrompt(NULL, NULL, NULL);
603 gfx::NativeWindow parent = 627 gfx::NativeWindow parent =
604 browser->window() ? browser->window()->GetNativeWindow() : NULL; 628 browser->window() ? browser->window()->GetNativeWindow() : NULL;
605 return new ExtensionInstallPrompt(parent, browser, browser->profile()); 629 return new ExtensionInstallPrompt(parent, browser, browser->profile());
606 } 630 }
607 631
608 } // namespace chrome 632 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698