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 #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/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL, | 94 ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL, |
95 ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL, | 95 ui::DIALOG_BUTTON_OK | ui::DIALOG_BUTTON_CANCEL, |
96 }; | 96 }; |
97 static const int kAcceptButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { | 97 static const int kAcceptButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { |
98 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, | 98 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, |
99 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, | 99 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, |
100 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, | 100 IDS_EXTENSION_PROMPT_INSTALL_BUTTON, |
101 IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON, | 101 IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON, |
102 IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON, | 102 IDS_EXTENSION_PROMPT_PERMISSIONS_BUTTON, |
103 0, // External installs use different strings for extensions/apps. | 103 0, // External installs use different strings for extensions/apps. |
104 IDS_EXTENSION_PROMPT_PERMISSIONS_CLEAR_RETAINED_FILES_BUTTON, | 104 0, // Different strings depending on the files and devices retained. |
105 IDS_EXTENSION_PROMPT_LAUNCH_BUTTON, | 105 IDS_EXTENSION_PROMPT_LAUNCH_BUTTON, |
106 IDS_EXTENSION_PROMPT_REMOTE_INSTALL_BUTTON, | 106 IDS_EXTENSION_PROMPT_REMOTE_INSTALL_BUTTON, |
107 IDS_EXTENSION_PROMPT_REPAIR_BUTTON, | 107 IDS_EXTENSION_PROMPT_REPAIR_BUTTON, |
108 }; | 108 }; |
109 static const int kAbortButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { | 109 static const int kAbortButtonIds[ExtensionInstallPrompt::NUM_PROMPT_TYPES] = { |
110 0, // These all use the platform's default cancel label. | 110 0, // These all use the platform's default cancel label. |
111 0, | 111 0, |
112 0, | 112 0, |
113 0, | 113 0, |
114 IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON, | 114 IDS_EXTENSION_PROMPT_PERMISSIONS_ABORT_BUTTON, |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 case ExtensionInstallPrompt::UNSET_PROMPT_TYPE: | 222 case ExtensionInstallPrompt::UNSET_PROMPT_TYPE: |
223 case ExtensionInstallPrompt::NUM_PROMPT_TYPES: | 223 case ExtensionInstallPrompt::NUM_PROMPT_TYPES: |
224 break; | 224 break; |
225 } | 225 } |
226 return "OTHER"; | 226 return "OTHER"; |
227 } | 227 } |
228 | 228 |
229 ExtensionInstallPrompt::Prompt::Prompt(PromptType type) | 229 ExtensionInstallPrompt::Prompt::Prompt(PromptType type) |
230 : type_(type), | 230 : type_(type), |
231 is_showing_details_for_retained_files_(false), | 231 is_showing_details_for_retained_files_(false), |
| 232 is_showing_details_for_retained_devices_(false), |
232 extension_(NULL), | 233 extension_(NULL), |
233 bundle_(NULL), | 234 bundle_(NULL), |
234 average_rating_(0.0), | 235 average_rating_(0.0), |
235 rating_count_(0), | 236 rating_count_(0), |
236 show_user_count_(false), | 237 show_user_count_(false), |
237 has_webstore_data_(false) { | 238 has_webstore_data_(false) { |
238 } | 239 } |
239 | 240 |
240 ExtensionInstallPrompt::Prompt::~Prompt() { | 241 ExtensionInstallPrompt::Prompt::~Prompt() { |
241 } | 242 } |
(...skipping 23 matching lines...) Expand all Loading... |
265 case PERMISSIONS_DETAILS: | 266 case PERMISSIONS_DETAILS: |
266 prompt_permissions_.is_showing_details[index] = is_showing_details; | 267 prompt_permissions_.is_showing_details[index] = is_showing_details; |
267 break; | 268 break; |
268 case WITHHELD_PERMISSIONS_DETAILS: | 269 case WITHHELD_PERMISSIONS_DETAILS: |
269 withheld_prompt_permissions_.is_showing_details[index] = | 270 withheld_prompt_permissions_.is_showing_details[index] = |
270 is_showing_details; | 271 is_showing_details; |
271 break; | 272 break; |
272 case RETAINED_FILES_DETAILS: | 273 case RETAINED_FILES_DETAILS: |
273 is_showing_details_for_retained_files_ = is_showing_details; | 274 is_showing_details_for_retained_files_ = is_showing_details; |
274 break; | 275 break; |
| 276 case RETAINED_DEVICES_DETAILS: |
| 277 is_showing_details_for_retained_devices_ = is_showing_details; |
| 278 break; |
275 } | 279 } |
276 } | 280 } |
277 | 281 |
278 void ExtensionInstallPrompt::Prompt::SetWebstoreData( | 282 void ExtensionInstallPrompt::Prompt::SetWebstoreData( |
279 const std::string& localized_user_count, | 283 const std::string& localized_user_count, |
280 bool show_user_count, | 284 bool show_user_count, |
281 double average_rating, | 285 double average_rating, |
282 int rating_count) { | 286 int rating_count) { |
283 CHECK(AllowWebstoreData(type_)); | 287 CHECK(AllowWebstoreData(type_)); |
284 localized_user_count_ = localized_user_count; | 288 localized_user_count_ = localized_user_count; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 else | 334 else |
331 resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_EXTENSION; | 335 resource_id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_HEADING_EXTENSION; |
332 return l10n_util::GetStringUTF16(resource_id); | 336 return l10n_util::GetStringUTF16(resource_id); |
333 } else { | 337 } else { |
334 return l10n_util::GetStringFUTF16( | 338 return l10n_util::GetStringFUTF16( |
335 kHeadingIds[type_], base::UTF8ToUTF16(extension_->name())); | 339 kHeadingIds[type_], base::UTF8ToUTF16(extension_->name())); |
336 } | 340 } |
337 } | 341 } |
338 | 342 |
339 int ExtensionInstallPrompt::Prompt::GetDialogButtons() const { | 343 int ExtensionInstallPrompt::Prompt::GetDialogButtons() const { |
340 if (type_ == POST_INSTALL_PERMISSIONS_PROMPT && | 344 if (type_ == POST_INSTALL_PERMISSIONS_PROMPT && ShouldDisplayRevokeButton()) { |
341 ShouldDisplayRevokeFilesButton()) { | |
342 return kButtons[type_] | ui::DIALOG_BUTTON_OK; | 345 return kButtons[type_] | ui::DIALOG_BUTTON_OK; |
343 } | 346 } |
344 | 347 |
345 return kButtons[type_]; | 348 return kButtons[type_]; |
346 } | 349 } |
347 | 350 |
348 bool ExtensionInstallPrompt::Prompt::ShouldShowExplanationText() const { | 351 bool ExtensionInstallPrompt::Prompt::ShouldShowExplanationText() const { |
349 return type_ == INSTALL_PROMPT && extension_->is_extension() && | 352 return type_ == INSTALL_PROMPT && extension_->is_extension() && |
350 experiment_.get() && experiment_->text_only(); | 353 experiment_.get() && experiment_->text_only(); |
351 } | 354 } |
352 | 355 |
353 bool ExtensionInstallPrompt::Prompt::HasAcceptButtonLabel() const { | 356 bool ExtensionInstallPrompt::Prompt::HasAcceptButtonLabel() const { |
| 357 if (type_ == POST_INSTALL_PERMISSIONS_PROMPT) |
| 358 return ShouldDisplayRevokeButton(); |
| 359 |
354 if (kAcceptButtonIds[type_] == 0) | 360 if (kAcceptButtonIds[type_] == 0) |
355 return false; | 361 return false; |
356 | 362 |
357 if (type_ == POST_INSTALL_PERMISSIONS_PROMPT) | |
358 return ShouldDisplayRevokeFilesButton(); | |
359 | |
360 return true; | 363 return true; |
361 } | 364 } |
362 | 365 |
363 base::string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const { | 366 base::string16 ExtensionInstallPrompt::Prompt::GetAcceptButtonLabel() const { |
364 if (type_ == EXTERNAL_INSTALL_PROMPT) { | 367 if (type_ == EXTERNAL_INSTALL_PROMPT) { |
365 int id = -1; | 368 int id = -1; |
366 if (extension_->is_app()) | 369 if (extension_->is_app()) |
367 id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_APP; | 370 id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_APP; |
368 else if (extension_->is_theme()) | 371 else if (extension_->is_theme()) |
369 id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_THEME; | 372 id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_THEME; |
370 else | 373 else |
371 id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_EXTENSION; | 374 id = IDS_EXTENSION_EXTERNAL_INSTALL_PROMPT_ACCEPT_BUTTON_EXTENSION; |
372 return l10n_util::GetStringUTF16(id); | 375 return l10n_util::GetStringUTF16(id); |
| 376 } else if (type_ == POST_INSTALL_PERMISSIONS_PROMPT) { |
| 377 int id = -1; |
| 378 if (GetRetainedFileCount() && GetRetainedDeviceCount()) { |
| 379 id = |
| 380 IDS_EXTENSION_PROMPT_PERMISSIONS_CLEAR_RETAINED_FILES_AND_DEVICES_BUTT
ON; |
| 381 } else if (GetRetainedFileCount()) { |
| 382 id = IDS_EXTENSION_PROMPT_PERMISSIONS_CLEAR_RETAINED_FILES_BUTTON; |
| 383 } else { |
| 384 DCHECK_LT(0U, GetRetainedDeviceCount()); |
| 385 id = IDS_EXTENSION_PROMPT_PERMISSIONS_CLEAR_RETAINED_DEVICES_BUTTON; |
| 386 } |
| 387 return l10n_util::GetStringUTF16(id); |
373 } | 388 } |
374 if (ShouldShowExplanationText()) | 389 if (ShouldShowExplanationText()) |
375 return experiment_->GetOkButtonText(); | 390 return experiment_->GetOkButtonText(); |
376 return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]); | 391 return l10n_util::GetStringUTF16(kAcceptButtonIds[type_]); |
377 } | 392 } |
378 | 393 |
379 bool ExtensionInstallPrompt::Prompt::HasAbortButtonLabel() const { | 394 bool ExtensionInstallPrompt::Prompt::HasAbortButtonLabel() const { |
380 if (ShouldShowExplanationText()) | 395 if (ShouldShowExplanationText()) |
381 return true; | 396 return true; |
382 return kAbortButtonIds[type_] > 0; | 397 return kAbortButtonIds[type_] > 0; |
(...skipping 22 matching lines...) Expand all Loading... |
405 | 420 |
406 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const { | 421 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const { |
407 const int kRetainedFilesMessageIDs[6] = { | 422 const int kRetainedFilesMessageIDs[6] = { |
408 IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT, | 423 IDS_EXTENSION_PROMPT_RETAINED_FILES_DEFAULT, |
409 IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR, | 424 IDS_EXTENSION_PROMPT_RETAINED_FILE_SINGULAR, |
410 IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO, | 425 IDS_EXTENSION_PROMPT_RETAINED_FILES_ZERO, |
411 IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO, | 426 IDS_EXTENSION_PROMPT_RETAINED_FILES_TWO, |
412 IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW, | 427 IDS_EXTENSION_PROMPT_RETAINED_FILES_FEW, |
413 IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY, | 428 IDS_EXTENSION_PROMPT_RETAINED_FILES_MANY, |
414 }; | 429 }; |
415 std::vector<int> message_ids; | 430 std::vector<int> message_ids( |
416 for (size_t i = 0; i < arraysize(kRetainedFilesMessageIDs); i++) { | 431 kRetainedFilesMessageIDs, |
417 message_ids.push_back(kRetainedFilesMessageIDs[i]); | 432 kRetainedFilesMessageIDs + arraysize(kRetainedFilesMessageIDs)); |
418 } | 433 |
419 return l10n_util::GetPluralStringFUTF16(message_ids, GetRetainedFileCount()); | 434 return l10n_util::GetPluralStringFUTF16(message_ids, GetRetainedFileCount()); |
420 } | 435 } |
421 | 436 |
| 437 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedDevicesHeading() |
| 438 const { |
| 439 const int kRetainedDevicesMessageIDs[6] = { |
| 440 IDS_EXTENSION_PROMPT_RETAINED_DEVICES_DEFAULT, |
| 441 IDS_EXTENSION_PROMPT_RETAINED_DEVICE_SINGULAR, |
| 442 IDS_EXTENSION_PROMPT_RETAINED_DEVICES_ZERO, |
| 443 IDS_EXTENSION_PROMPT_RETAINED_DEVICES_TWO, |
| 444 IDS_EXTENSION_PROMPT_RETAINED_DEVICES_FEW, |
| 445 IDS_EXTENSION_PROMPT_RETAINED_DEVICES_MANY, |
| 446 }; |
| 447 std::vector<int> message_ids( |
| 448 kRetainedDevicesMessageIDs, |
| 449 kRetainedDevicesMessageIDs + arraysize(kRetainedDevicesMessageIDs)); |
| 450 |
| 451 return l10n_util::GetPluralStringFUTF16(message_ids, |
| 452 GetRetainedDeviceCount()); |
| 453 } |
| 454 |
422 bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const { | 455 bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const { |
423 return GetPermissionCount(ALL_PERMISSIONS) > 0 || | 456 return GetPermissionCount(ALL_PERMISSIONS) > 0 || |
424 type_ == POST_INSTALL_PERMISSIONS_PROMPT; | 457 type_ == POST_INSTALL_PERMISSIONS_PROMPT; |
425 } | 458 } |
426 | 459 |
427 void ExtensionInstallPrompt::Prompt::AppendRatingStars( | 460 void ExtensionInstallPrompt::Prompt::AppendRatingStars( |
428 StarAppender appender, void* data) const { | 461 StarAppender appender, void* data) const { |
429 CHECK(appender); | 462 CHECK(appender); |
430 CHECK(AllowWebstoreData(type_)); | 463 CHECK(AllowWebstoreData(type_)); |
431 int rating_integer = floor(average_rating_); | 464 int rating_integer = floor(average_rating_); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 DetailsType type, size_t index) const { | 556 DetailsType type, size_t index) const { |
524 switch (type) { | 557 switch (type) { |
525 case PERMISSIONS_DETAILS: | 558 case PERMISSIONS_DETAILS: |
526 CHECK_LT(index, prompt_permissions_.is_showing_details.size()); | 559 CHECK_LT(index, prompt_permissions_.is_showing_details.size()); |
527 return prompt_permissions_.is_showing_details[index]; | 560 return prompt_permissions_.is_showing_details[index]; |
528 case WITHHELD_PERMISSIONS_DETAILS: | 561 case WITHHELD_PERMISSIONS_DETAILS: |
529 CHECK_LT(index, withheld_prompt_permissions_.is_showing_details.size()); | 562 CHECK_LT(index, withheld_prompt_permissions_.is_showing_details.size()); |
530 return withheld_prompt_permissions_.is_showing_details[index]; | 563 return withheld_prompt_permissions_.is_showing_details[index]; |
531 case RETAINED_FILES_DETAILS: | 564 case RETAINED_FILES_DETAILS: |
532 return is_showing_details_for_retained_files_; | 565 return is_showing_details_for_retained_files_; |
| 566 case RETAINED_DEVICES_DETAILS: |
| 567 return is_showing_details_for_retained_devices_; |
533 } | 568 } |
534 return false; | 569 return false; |
535 } | 570 } |
536 | 571 |
537 size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const { | 572 size_t ExtensionInstallPrompt::Prompt::GetRetainedFileCount() const { |
538 return retained_files_.size(); | 573 return retained_files_.size(); |
539 } | 574 } |
540 | 575 |
541 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index) | 576 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFile(size_t index) |
542 const { | 577 const { |
543 CHECK_LT(index, retained_files_.size()); | 578 CHECK_LT(index, retained_files_.size()); |
544 return retained_files_[index].AsUTF16Unsafe(); | 579 return retained_files_[index].AsUTF16Unsafe(); |
545 } | 580 } |
546 | 581 |
| 582 size_t ExtensionInstallPrompt::Prompt::GetRetainedDeviceCount() const { |
| 583 return retained_device_messages_.size(); |
| 584 } |
| 585 |
| 586 base::string16 ExtensionInstallPrompt::Prompt::GetRetainedDeviceMessageString( |
| 587 size_t index) const { |
| 588 CHECK_LT(index, retained_device_messages_.size()); |
| 589 return retained_device_messages_[index]; |
| 590 } |
| 591 |
| 592 bool ExtensionInstallPrompt::Prompt::ShouldDisplayRevokeButton() const { |
| 593 return !retained_files_.empty() || !retained_device_messages_.empty(); |
| 594 } |
| 595 |
547 ExtensionInstallPrompt::Prompt::InstallPromptPermissions& | 596 ExtensionInstallPrompt::Prompt::InstallPromptPermissions& |
548 ExtensionInstallPrompt::Prompt::GetPermissionsForType( | 597 ExtensionInstallPrompt::Prompt::GetPermissionsForType( |
549 PermissionsType permissions_type) { | 598 PermissionsType permissions_type) { |
550 DCHECK_NE(ALL_PERMISSIONS, permissions_type); | 599 DCHECK_NE(ALL_PERMISSIONS, permissions_type); |
551 return permissions_type == REGULAR_PERMISSIONS ? prompt_permissions_ | 600 return permissions_type == REGULAR_PERMISSIONS ? prompt_permissions_ |
552 : withheld_prompt_permissions_; | 601 : withheld_prompt_permissions_; |
553 } | 602 } |
554 | 603 |
555 const ExtensionInstallPrompt::Prompt::InstallPromptPermissions& | 604 const ExtensionInstallPrompt::Prompt::InstallPromptPermissions& |
556 ExtensionInstallPrompt::Prompt::GetPermissionsForType( | 605 ExtensionInstallPrompt::Prompt::GetPermissionsForType( |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 custom_permissions_ = permissions; | 795 custom_permissions_ = permissions; |
747 delegate_ = delegate; | 796 delegate_ = delegate; |
748 prompt_ = new Prompt(PERMISSIONS_PROMPT); | 797 prompt_ = new Prompt(PERMISSIONS_PROMPT); |
749 | 798 |
750 LoadImageIfNeeded(); | 799 LoadImageIfNeeded(); |
751 } | 800 } |
752 | 801 |
753 void ExtensionInstallPrompt::ReviewPermissions( | 802 void ExtensionInstallPrompt::ReviewPermissions( |
754 Delegate* delegate, | 803 Delegate* delegate, |
755 const Extension* extension, | 804 const Extension* extension, |
756 const std::vector<base::FilePath>& retained_file_paths) { | 805 const std::vector<base::FilePath>& retained_file_paths, |
| 806 const std::vector<base::string16>& retained_device_messages) { |
757 DCHECK(ui_loop_ == base::MessageLoop::current()); | 807 DCHECK(ui_loop_ == base::MessageLoop::current()); |
758 extension_ = extension; | 808 extension_ = extension; |
759 prompt_ = new Prompt(POST_INSTALL_PERMISSIONS_PROMPT); | 809 prompt_ = new Prompt(POST_INSTALL_PERMISSIONS_PROMPT); |
760 prompt_->set_retained_files(retained_file_paths); | 810 prompt_->set_retained_files(retained_file_paths); |
| 811 prompt_->set_retained_device_messages(retained_device_messages); |
761 delegate_ = delegate; | 812 delegate_ = delegate; |
762 | 813 |
763 LoadImageIfNeeded(); | 814 LoadImageIfNeeded(); |
764 } | 815 } |
765 | 816 |
766 void ExtensionInstallPrompt::OnInstallSuccess(const Extension* extension, | 817 void ExtensionInstallPrompt::OnInstallSuccess(const Extension* extension, |
767 SkBitmap* icon) { | 818 SkBitmap* icon) { |
768 extension_ = extension; | 819 extension_ = extension; |
769 SetIcon(icon); | 820 SetIcon(icon); |
770 | 821 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 } | 945 } |
895 | 946 |
896 if (AutoConfirmPrompt(delegate_)) | 947 if (AutoConfirmPrompt(delegate_)) |
897 return; | 948 return; |
898 | 949 |
899 if (show_dialog_callback_.is_null()) | 950 if (show_dialog_callback_.is_null()) |
900 GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_); | 951 GetDefaultShowDialogCallback().Run(show_params_, delegate_, prompt_); |
901 else | 952 else |
902 show_dialog_callback_.Run(show_params_, delegate_, prompt_); | 953 show_dialog_callback_.Run(show_params_, delegate_, prompt_); |
903 } | 954 } |
OLD | NEW |