| 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..5eebab1d9def229f0feb0f1a55b02425102e1502 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,13 @@ gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
|
|
|
| } // namespace
|
|
|
| +ExtensionInstallPrompt::Prompt::InstallPromptPermissions::
|
| + InstallPromptPermissions() {
|
| +}
|
| +ExtensionInstallPrompt::Prompt::InstallPromptPermissions::
|
| + ~InstallPromptPermissions() {
|
| +}
|
| +
|
| // static
|
| ExtensionInstallPrompt::AutoConfirmForTests
|
| ExtensionInstallPrompt::g_auto_confirm_for_tests = ExtensionInstallPrompt::NONE;
|
| @@ -219,16 +227,26 @@ ExtensionInstallPrompt::Prompt::~Prompt() {
|
| }
|
|
|
| void ExtensionInstallPrompt::Prompt::SetPermissions(
|
| - const std::vector<base::string16>& permissions) {
|
| - permissions_ = permissions;
|
| + const std::vector<base::string16>& permissions,
|
| + PermissionsType permissions_type) {
|
| + DCHECK_NE(ALL_PERMISSIONS, permissions_type);
|
| + InstallPromptPermissions& install_permissions =
|
| + permissions_type == REGULAR_PERMISSIONS ? prompt_permissions_
|
| + : withheld_prompt_permissions_;
|
| + install_permissions.permissions = permissions;
|
| }
|
|
|
| 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) {
|
| + DCHECK_NE(ALL_PERMISSIONS, permissions_type);
|
| + InstallPromptPermissions& install_permissions =
|
| + permissions_type == REGULAR_PERMISSIONS ? prompt_permissions_
|
| + : withheld_prompt_permissions_;
|
| + install_permissions.details = details;
|
| + install_permissions.is_showing_details.clear();
|
| + install_permissions.is_showing_details.insert(
|
| + install_permissions.is_showing_details.begin(), details.size(), false);
|
| }
|
|
|
| void ExtensionInstallPrompt::Prompt::SetIsShowingDetails(
|
| @@ -237,7 +255,11 @@ void ExtensionInstallPrompt::Prompt::SetIsShowingDetails(
|
| bool is_showing_details) {
|
| switch (type) {
|
| case PERMISSIONS_DETAILS:
|
| - is_showing_details_for_permissions_[index] = is_showing_details;
|
| + prompt_permissions_.is_showing_details[index] = is_showing_details;
|
| + break;
|
| + case WITHHELD_PERMISSIONS_DETAILS:
|
| + withheld_prompt_permissions_.is_showing_details[index] =
|
| + is_showing_details;
|
| break;
|
| case RETAINED_FILES_DETAILS:
|
| is_showing_details_for_retained_files_ = is_showing_details;
|
| @@ -354,8 +376,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 +406,8 @@ base::string16 ExtensionInstallPrompt::Prompt::GetRetainedFilesHeading() const {
|
| }
|
|
|
| bool ExtensionInstallPrompt::Prompt::ShouldShowPermissions() const {
|
| - return GetPermissionCount() > 0 || type_ == POST_INSTALL_PERMISSIONS_PROMPT;
|
| + return GetPermissionCount(ALL_PERMISSIONS) > 0 ||
|
| + type_ == POST_INSTALL_PERMISSIONS_PROMPT;
|
| }
|
|
|
| void ExtensionInstallPrompt::Prompt::AppendRatingStars(
|
| @@ -423,32 +455,63 @@ 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 prompt_permissions_.permissions.size();
|
| + case WITHHELD_PERMISSIONS:
|
| + return withheld_prompt_permissions_.permissions.size();
|
| + case ALL_PERMISSIONS:
|
| + return prompt_permissions_.permissions.size() +
|
| + withheld_prompt_permissions_.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 prompt_permissions_.details.size();
|
| + case WITHHELD_PERMISSIONS:
|
| + return withheld_prompt_permissions_.details.size();
|
| + case ALL_PERMISSIONS:
|
| + return prompt_permissions_.details.size() +
|
| + withheld_prompt_permissions_.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 {
|
| + DCHECK_NE(ALL_PERMISSIONS, permissions_type);
|
| + const InstallPromptPermissions& install_permissions =
|
| + permissions_type == REGULAR_PERMISSIONS ? prompt_permissions_
|
| + : withheld_prompt_permissions_;
|
| + CHECK_LT(index, install_permissions.permissions.size());
|
| + return install_permissions.permissions[index];
|
| }
|
|
|
| base::string16 ExtensionInstallPrompt::Prompt::GetPermissionsDetails(
|
| - size_t index) const {
|
| - CHECK_LT(index, details_.size());
|
| - return details_[index];
|
| + size_t index,
|
| + PermissionsType permissions_type) const {
|
| + DCHECK_NE(ALL_PERMISSIONS, permissions_type);
|
| + const InstallPromptPermissions& install_permissions =
|
| + permissions_type == REGULAR_PERMISSIONS ? prompt_permissions_
|
| + : withheld_prompt_permissions_;
|
| + CHECK_LT(index, install_permissions.details.size());
|
| + return install_permissions.details[index];
|
| }
|
|
|
| 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, prompt_permissions_.is_showing_details.size());
|
| + return prompt_permissions_.is_showing_details[index];
|
| + case WITHHELD_PERMISSIONS_DETAILS:
|
| + CHECK_LT(index, withheld_prompt_permissions_.is_showing_details.size());
|
| + return withheld_prompt_permissions_.is_showing_details[index];
|
| case RETAINED_FILES_DETAILS:
|
| return is_showing_details_for_retained_files_;
|
| }
|
| @@ -543,7 +606,7 @@ void ExtensionInstallPrompt::ConfirmBundleInstall(
|
| const PermissionSet* permissions) {
|
| DCHECK(ui_loop_ == base::MessageLoop::current());
|
| bundle_ = bundle;
|
| - permissions_ = permissions;
|
| + custom_permissions_ = permissions;
|
| delegate_ = bundle;
|
| prompt_ = new Prompt(BUNDLE_INSTALL_PROMPT);
|
|
|
| @@ -557,7 +620,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 +645,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 +671,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 +698,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;
|
| @@ -652,7 +711,7 @@ void ExtensionInstallPrompt::ConfirmPermissions(
|
| const PermissionSet* permissions) {
|
| DCHECK(ui_loop_ == base::MessageLoop::current());
|
| extension_ = extension;
|
| - permissions_ = permissions;
|
| + custom_permissions_ = permissions;
|
| delegate_ = delegate;
|
| prompt_ = new Prompt(PERMISSIONS_PROMPT);
|
|
|
| @@ -665,7 +724,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,7 +797,20 @@ void ExtensionInstallPrompt::ShowConfirmation() {
|
| else
|
| prompt_->set_experiment(ExtensionInstallPromptExperiment::ControlGroup());
|
|
|
| - if (permissions_.get() &&
|
| + scoped_refptr<const PermissionSet> permissions_to_display;
|
| + if (custom_permissions_.get()) {
|
| + permissions_to_display = custom_permissions_;
|
| + } else if (extension_) {
|
| + // Initialize permissions if they have not already been set so that
|
| + // withheld permissions don't end up in the install prompt.
|
| + extensions::PermissionsUpdater(install_ui_->profile())
|
| + .InitializePermissions(
|
| + extension_, extensions::PermissionsUpdater::INIT_FLAG_TRANSIENT);
|
| + permissions_to_display =
|
| + extension_->permissions_data()->active_permissions();
|
| + }
|
| +
|
| + if (permissions_to_display.get() &&
|
| (!extension_ ||
|
| !extensions::PermissionsData::ShouldSkipPermissionWarnings(
|
| extension_->id()))) {
|
| @@ -747,10 +818,23 @@ void ExtensionInstallPrompt::ShowConfirmation() {
|
| extension_ ? extension_->GetType() : Manifest::TYPE_UNKNOWN;
|
| const extensions::PermissionMessageProvider* message_provider =
|
| extensions::PermissionMessageProvider::Get();
|
| - prompt_->SetPermissions(
|
| - message_provider->GetWarningMessages(permissions_.get(), type));
|
| - prompt_->SetPermissionsDetails(
|
| - message_provider->GetWarningMessagesDetails(permissions_.get(), type));
|
| + prompt_->SetPermissions(message_provider->GetWarningMessages(
|
| + permissions_to_display.get(), type),
|
| + REGULAR_PERMISSIONS);
|
| + prompt_->SetPermissionsDetails(message_provider->GetWarningMessagesDetails(
|
| + permissions_to_display.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()) {
|
|
|