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..9e7726d2d0f81b1905903854329174480a25efd7 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,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: |
+ prompt_permissions_.permissions = permissions; |
+ break; |
+ case WITHHELD_PERMISSIONS: |
+ withheld_prompt_permissions_.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) { |
Devlin
2014/09/08 16:09:22
Two improvements here:
- reduce duplicate code by
gpdavis
2014/09/08 20:07:05
Done.
|
+ case REGULAR_PERMISSIONS: |
+ prompt_permissions_.details = details; |
+ prompt_permissions_.is_showing_details.clear(); |
+ for (size_t i = 0; i < details.size(); ++i) |
+ prompt_permissions_.is_showing_details.push_back(false); |
+ break; |
+ case WITHHELD_PERMISSIONS: |
+ withheld_prompt_permissions_.details = details; |
+ withheld_prompt_permissions_.is_showing_details.clear(); |
+ for (size_t i = 0; i < details.size(); ++i) |
+ withheld_prompt_permissions_.is_showing_details.push_back(false); |
+ break; |
+ case ALL_PERMISSIONS: |
+ NOTREACHED(); |
+ break; |
+ } |
} |
void ExtensionInstallPrompt::Prompt::SetIsShowingDetails( |
@@ -237,7 +270,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 +391,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 +421,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 +471,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 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 { |
+ switch (permissions_type) { |
+ case REGULAR_PERMISSIONS: |
+ CHECK_LT(index, prompt_permissions_.permissions.size()); |
+ return prompt_permissions_.permissions[index]; |
+ case WITHHELD_PERMISSIONS: |
+ CHECK_LT(index, withheld_prompt_permissions_.permissions.size()); |
+ return withheld_prompt_permissions_.permissions[index]; |
+ case ALL_PERMISSIONS: |
+ NOTREACHED(); |
Devlin
2014/09/08 16:09:22
Actually, let's even make a
InstallPromptPermissi
gpdavis
2014/09/08 20:07:05
I like this idea, but we've got a const problem.
Devlin
2014/09/09 15:53:21
Hmm... Lame. I think I might opt for still making
gpdavis
2014/09/09 17:32:41
The file is six lines longer with the two helper m
Devlin
2014/09/09 17:46:22
I say go for it. Readability wins out.
gpdavis
2014/09/09 20:28:15
Sounds good!
|
+ 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, prompt_permissions_.details.size()); |
+ return prompt_permissions_.details[index]; |
+ case WITHHELD_PERMISSIONS: |
+ CHECK_LT(index, withheld_prompt_permissions_.details.size()); |
+ return withheld_prompt_permissions_.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, 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 +632,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 +646,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 +671,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 +697,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 +724,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 +737,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 +750,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 +823,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 +844,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()) { |