Chromium Code Reviews| Index: chrome/browser/extensions/extension_install_prompt.cc |
| diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc |
| index dec1aa54f3b756b3d1ba147b74b8179e6c912cf0..395659608322379afd6acf1e26ebb7b14cfc3e7e 100644 |
| --- a/chrome/browser/extensions/extension_install_prompt.cc |
| +++ b/chrome/browser/extensions/extension_install_prompt.cc |
| @@ -16,6 +16,7 @@ |
| #include "chrome/browser/extensions/bundle_installer.h" |
| #include "chrome/browser/extensions/extension_install_ui.h" |
| #include "chrome/browser/extensions/extension_util.h" |
| +#include "chrome/browser/extensions/permissions_updater.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_window.h" |
| @@ -172,6 +173,11 @@ gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) { |
| } // namespace |
| +ExtensionInstallPrompt::Prompt::PermissionsInfo::PermissionsInfo() { |
| +} |
| +ExtensionInstallPrompt::Prompt::PermissionsInfo::~PermissionsInfo() { |
| +} |
| + |
| // static |
| ExtensionInstallPrompt::AutoConfirmForTests |
| ExtensionInstallPrompt::g_auto_confirm_for_tests = ExtensionInstallPrompt::NONE; |
| @@ -219,16 +225,41 @@ ExtensionInstallPrompt::Prompt::~Prompt() { |
| } |
| void ExtensionInstallPrompt::Prompt::SetPermissions( |
| - const std::vector<base::string16>& permissions) { |
| - permissions_ = permissions; |
| + const std::vector<base::string16>& permissions, |
| + PermissionsType permissions_type) { |
| + switch (permissions_type) { |
| + case REGULAR_PERMISSIONS: |
| + permissions_info_.permissions = permissions; |
| + break; |
| + case WITHHELD_PERMISSIONS: |
| + withheld_permissions_info_.permissions = permissions; |
| + break; |
| + case ALL_PERMISSIONS: |
| + NOTREACHED(); |
| + break; |
| + } |
| } |
| void ExtensionInstallPrompt::Prompt::SetPermissionsDetails( |
| - const std::vector<base::string16>& details) { |
| - details_ = details; |
| - is_showing_details_for_permissions_.clear(); |
| - for (size_t i = 0; i < details.size(); ++i) |
| - is_showing_details_for_permissions_.push_back(false); |
| + const std::vector<base::string16>& details, |
| + PermissionsType permissions_type) { |
| + switch (permissions_type) { |
| + case REGULAR_PERMISSIONS: |
| + permissions_info_.details = details; |
| + permissions_info_.is_showing_details.clear(); |
| + for (size_t i = 0; i < details.size(); ++i) |
| + permissions_info_.is_showing_details.push_back(false); |
| + break; |
| + case WITHHELD_PERMISSIONS: |
| + withheld_permissions_info_.details = details; |
| + withheld_permissions_info_.is_showing_details.clear(); |
| + for (size_t i = 0; i < details.size(); ++i) |
| + withheld_permissions_info_.is_showing_details.push_back(false); |
| + break; |
| + case ALL_PERMISSIONS: |
| + NOTREACHED(); |
| + break; |
| + } |
| } |
| void ExtensionInstallPrompt::Prompt::SetIsShowingDetails( |
| @@ -237,7 +268,10 @@ void ExtensionInstallPrompt::Prompt::SetIsShowingDetails( |
| bool is_showing_details) { |
| switch (type) { |
| case PERMISSIONS_DETAILS: |
| - is_showing_details_for_permissions_[index] = is_showing_details; |
| + permissions_info_.is_showing_details[index] = is_showing_details; |
| + break; |
| + case WITHHELD_PERMISSIONS_DETAILS: |
| + withheld_permissions_info_.is_showing_details[index] = is_showing_details; |
| break; |
| case RETAINED_FILES_DETAILS: |
| is_showing_details_for_retained_files_ = is_showing_details; |
| @@ -354,8 +388,17 @@ base::string16 ExtensionInstallPrompt::Prompt::GetAbortButtonLabel() const { |
| return l10n_util::GetStringUTF16(kAbortButtonIds[type_]); |
| } |
| -base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading() const { |
| - return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]); |
| +base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsHeading( |
| + PermissionsType permissions_type) const { |
| + switch (permissions_type) { |
| + case REGULAR_PERMISSIONS: |
| + return l10n_util::GetStringUTF16(kPermissionsHeaderIds[type_]); |
| + case WITHHELD_PERMISSIONS: |
| + return l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WITHHELD); |
| + case ALL_PERMISSIONS: |
| + NOTREACHED(); |
| + return base::string16(); |
| + } |
| } |
| base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const { |
| @@ -375,7 +418,9 @@ base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const { |
| } |
| bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const { |
| - return GetPermissionCount() > 0 || type_ == POST_INSTALL_PERMISSIONS_PROMPT; |
| + return GetPermissionCount(REGULAR_PERMISSIONS) > 0 || |
| + GetPermissionCount(WITHHELD_PERMISSIONS) > 0 || |
| + type_ == POST_INSTALL_PERMISSIONS_PROMPT; |
| } |
| void ExtensionInstallPrompt::Prompt::AppendRatingStars( |
| @@ -423,32 +468,73 @@ base::string16 ExtensionInstallPrompt::Prompt::GetUserCount() const { |
| return base::string16(); |
| } |
| -size_t ExtensionInstallPrompt::Prompt::GetPermissionCount() const { |
| - return permissions_.size(); |
| +size_t ExtensionInstallPrompt::Prompt::GetPermissionCount( |
| + PermissionsType permissions_type) const { |
| + switch (permissions_type) { |
| + case REGULAR_PERMISSIONS: |
| + return permissions_info_.permissions.size(); |
| + case WITHHELD_PERMISSIONS: |
| + return withheld_permissions_info_.permissions.size(); |
| + case ALL_PERMISSIONS: |
| + return permissions_info_.permissions.size() + |
| + withheld_permissions_info_.permissions.size(); |
| + } |
| } |
| -size_t ExtensionInstallPrompt::Prompt::GetPermissionsDetailsCount() const { |
| - return details_.size(); |
| +size_t ExtensionInstallPrompt::Prompt::GetPermissionsDetailsCount( |
| + PermissionsType permissions_type) const { |
| + switch (permissions_type) { |
| + case REGULAR_PERMISSIONS: |
| + return permissions_info_.details.size(); |
| + case WITHHELD_PERMISSIONS: |
| + return withheld_permissions_info_.details.size(); |
| + case ALL_PERMISSIONS: |
| + return permissions_info_.details.size() + |
| + withheld_permissions_info_.details.size(); |
| + } |
| } |
| -base::string16 ExtensionInstallPrompt::Prompt::GetPermission(size_t index) |
| - const { |
| - CHECK_LT(index, permissions_.size()); |
| - return permissions_[index]; |
| +base::string16 ExtensionInstallPrompt::Prompt::GetPermission( |
| + size_t index, |
| + PermissionsType permissions_type) const { |
| + switch (permissions_type) { |
| + case REGULAR_PERMISSIONS: |
| + CHECK_LT(index, permissions_info_.permissions.size()); |
| + return permissions_info_.permissions[index]; |
| + case WITHHELD_PERMISSIONS: |
| + CHECK_LT(index, withheld_permissions_info_.permissions.size()); |
| + return withheld_permissions_info_.permissions[index]; |
| + case ALL_PERMISSIONS: |
| + NOTREACHED(); |
| + return base::string16(); |
| + } |
| } |
| base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsDetails( |
| - size_t index) const { |
| - CHECK_LT(index, details_.size()); |
| - return details_[index]; |
| + size_t index, |
| + PermissionsType permissions_type) const { |
| + switch (permissions_type) { |
| + case REGULAR_PERMISSIONS: |
| + CHECK_LT(index, permissions_info_.details.size()); |
| + return permissions_info_.details[index]; |
| + case WITHHELD_PERMISSIONS: |
| + CHECK_LT(index, withheld_permissions_info_.details.size()); |
| + return withheld_permissions_info_.details[index]; |
| + case ALL_PERMISSIONS: |
| + NOTREACHED(); |
| + return base::string16(); |
| + } |
| } |
| bool ExtensionInstallPrompt::Prompt::GetIsShowingDetails( |
| DetailsType type, size_t index) const { |
| switch (type) { |
| case PERMISSIONS_DETAILS: |
| - CHECK_LT(index, is_showing_details_for_permissions_.size()); |
| - return is_showing_details_for_permissions_[index]; |
| + CHECK_LT(index, permissions_info_.is_showing_details.size()); |
| + return permissions_info_.is_showing_details[index]; |
| + case WITHHELD_PERMISSIONS_DETAILS: |
| + CHECK_LT(index, withheld_permissions_info_.is_showing_details.size()); |
| + return withheld_permissions_info_.is_showing_details[index]; |
| case RETAINED_FILES_DETAILS: |
| return is_showing_details_for_retained_files_; |
| } |
| @@ -557,7 +643,6 @@ void ExtensionInstallPrompt::ConfirmStandaloneInstall( |
| scoped_refptr<Prompt> prompt) { |
| DCHECK(ui_loop_ == base::MessageLoop::current()); |
| extension_ = extension; |
| - permissions_ = extension->permissions_data()->active_permissions(); |
| delegate_ = delegate; |
| prompt_ = prompt; |
| @@ -583,7 +668,6 @@ void ExtensionInstallPrompt::ConfirmInstall( |
| const ShowDialogCallback& show_dialog_callback) { |
| DCHECK(ui_loop_ == base::MessageLoop::current()); |
| extension_ = extension; |
| - permissions_ = extension->permissions_data()->active_permissions(); |
| delegate_ = delegate; |
| prompt_ = new Prompt(INSTALL_PROMPT); |
| show_dialog_callback_ = show_dialog_callback; |
| @@ -610,7 +694,6 @@ void ExtensionInstallPrompt::ConfirmReEnable(Delegate* delegate, |
| const Extension* extension) { |
| DCHECK(ui_loop_ == base::MessageLoop::current()); |
| extension_ = extension; |
| - permissions_ = extension->permissions_data()->active_permissions(); |
| delegate_ = delegate; |
| bool is_remote_install = |
| install_ui_->profile() && |
| @@ -638,7 +721,6 @@ void ExtensionInstallPrompt::ConfirmExternalInstall( |
| scoped_refptr<Prompt> prompt) { |
| DCHECK(ui_loop_ == base::MessageLoop::current()); |
| extension_ = extension; |
| - permissions_ = extension->permissions_data()->active_permissions(); |
| delegate_ = delegate; |
| prompt_ = prompt; |
| show_dialog_callback_ = show_dialog_callback; |
| @@ -665,7 +747,6 @@ void ExtensionInstallPrompt::ReviewPermissions( |
| const std::vector<base::FilePath>& retained_file_paths) { |
| DCHECK(ui_loop_ == base::MessageLoop::current()); |
| extension_ = extension; |
| - permissions_ = extension->permissions_data()->active_permissions(); |
| prompt_ = new Prompt(POST_INSTALL_PERMISSIONS_PROMPT); |
| prompt_->set_retained_files(retained_file_paths); |
| delegate_ = delegate; |
| @@ -739,6 +820,16 @@ void ExtensionInstallPrompt::ShowConfirmation() { |
| else |
| prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup()); |
| + if (extension_ && !permissions_) { |
| + // Initialize |permissions_| if they have not already been set so that |
|
Devlin
2014/09/04 22:06:08
This just seems so fragile. Let's make it a littl
gpdavis
2014/09/05 20:23:01
Clever! I like it. Done.
|
| + // withheld permissions don't end up in the install prompt. Special cases |
| + // that do not require this will have already set |permissions_|. |
| + extensions::PermissionsUpdater(install_ui_->profile()) |
| + .InitializePermissions( |
| + extension_, extensions::PermissionsUpdater::INIT_FLAG_TRANSIENT); |
| + permissions_ = extension_->permissions_data()->active_permissions(); |
| + } |
| + |
| if (permissions_.get() && |
| (!extension_ || |
| !extensions::PermissionsData::ShouldSkipPermissionWarnings( |
| @@ -748,9 +839,22 @@ void ExtensionInstallPrompt::ShowConfirmation() { |
| const extensions::PermissionMessageProvider* message_provider = |
| extensions::PermissionMessageProvider::Get(); |
| prompt_->SetPermissions( |
| - message_provider->GetWarningMessages(permissions_.get(), type)); |
| + message_provider->GetWarningMessages(permissions_.get(), type), |
| + REGULAR_PERMISSIONS); |
| prompt_->SetPermissionsDetails( |
| - message_provider->GetWarningMessagesDetails(permissions_.get(), type)); |
| + message_provider->GetWarningMessagesDetails(permissions_.get(), type), |
| + REGULAR_PERMISSIONS); |
| + |
| + scoped_refptr<const extensions::PermissionSet> withheld = |
| + extension_->permissions_data()->withheld_permissions(); |
| + if (!withheld->IsEmpty()) { |
| + prompt_->SetPermissions( |
| + message_provider->GetWarningMessages(withheld.get(), type), |
| + PermissionsType::WITHHELD_PERMISSIONS); |
| + prompt_->SetPermissionsDetails( |
| + message_provider->GetWarningMessagesDetails(withheld.get(), type), |
| + PermissionsType::WITHHELD_PERMISSIONS); |
| + } |
| } |
| switch (prompt_->type()) { |