Chromium Code Reviews| Index: chrome/common/extensions/permissions/chrome_permission_message_provider.cc |
| diff --git a/chrome/common/extensions/permissions/chrome_permission_message_provider.cc b/chrome/common/extensions/permissions/chrome_permission_message_provider.cc |
| index f0c415d5f79b70d1c8f4d86d16a28c3d99da7408..f3e51a0b5826b19490559821dd362a1f8d754d2f 100644 |
| --- a/chrome/common/extensions/permissions/chrome_permission_message_provider.cc |
| +++ b/chrome/common/extensions/permissions/chrome_permission_message_provider.cc |
| @@ -21,6 +21,8 @@ namespace extensions { |
| namespace { |
| +typedef std::set<PermissionMessage> PermissionMsgSet; |
| + |
| bool ShouldWarnAllHosts(const PermissionSet* permissions) { |
| if (permissions->HasEffectiveAccessToAllHosts()) |
| return true; |
| @@ -62,17 +64,28 @@ bool ShouldWarnAllHosts(const PermissionSet* permissions) { |
| return false; |
| } |
| -PermissionMessages::iterator FindMessageByID(PermissionMessages& messages, |
| - int id) { |
| - for (PermissionMessages::iterator it = messages.begin(); |
| +template<typename T> |
| +typename T::iterator FindMessageByID(T& messages, int id) { |
|
Devlin
2014/04/15 15:09:16
Isn't this almost exactly the same as std::find()?
meacer
2014/04/15 16:46:16
Using std::find with id field would require Permis
Devlin
2014/04/15 16:52:45
Oh, shoot, missed that... and std::find_if would
|
| + for (typename T::iterator it = messages.begin(); |
| it != messages.end(); ++it) { |
| if (it->id() == id) |
| return it; |
| } |
| - |
| return messages.end(); |
| } |
| +template<typename T> |
| +void SuppressMessage(T& messages, |
| + int suppressing_message, |
| + int suppressed_message) { |
| + typename T::iterator suppressed = FindMessageByID(messages, |
| + suppressed_message); |
| + if (suppressed != messages.end() && |
| + FindMessageByID(messages, suppressing_message) != messages.end()) { |
| + messages.erase(suppressed); |
| + } |
| +} |
| + |
| } // namespace |
| ChromePermissionMessageProvider::ChromePermissionMessageProvider() { |
| @@ -94,26 +107,24 @@ PermissionMessages ChromePermissionMessageProvider::GetPermissionMessages( |
| return messages; |
| } |
| - std::set<PermissionMessage> host_msgs = |
| + PermissionMsgSet host_msgs = |
| GetHostPermissionMessages(permissions, extension_type); |
| - std::set<PermissionMessage> api_msgs = GetAPIPermissionMessages(permissions); |
| - std::set<PermissionMessage> manifest_permission_msgs = |
| + PermissionMsgSet api_msgs = GetAPIPermissionMessages(permissions); |
| + PermissionMsgSet manifest_permission_msgs = |
| GetManifestPermissionMessages(permissions); |
| messages.insert(messages.end(), host_msgs.begin(), host_msgs.end()); |
| messages.insert(messages.end(), api_msgs.begin(), api_msgs.end()); |
| messages.insert(messages.end(), manifest_permission_msgs.begin(), |
| manifest_permission_msgs.end()); |
| - // Special hack: bookmarks permission message supersedes override bookmarks UI |
| - // permission message if both permissions are specified. |
| - PermissionMessages::iterator override_bookmarks_ui = |
| - FindMessageByID(messages, PermissionMessage::kOverrideBookmarksUI); |
| - if (override_bookmarks_ui != messages.end() && |
| - FindMessageByID(messages, PermissionMessage::kBookmarks) != |
| - messages.end()) { |
| - messages.erase(override_bookmarks_ui); |
| - } |
| - |
| + // Some warnings are more generic and/or powerful and superseed other |
| + // warnings. In that case, suppress the superseeded warning. |
| + SuppressMessage(messages, |
| + PermissionMessage::kBookmarks, |
| + PermissionMessage::kOverrideBookmarksUI); |
| + SuppressMessage(messages, |
| + PermissionMessage::kBrowsingHistory, |
| + PermissionMessage::kTabs); |
| return messages; |
| } |
| @@ -231,7 +242,7 @@ bool ChromePermissionMessageProvider::IsPrivilegeIncrease( |
| std::set<PermissionMessage> |
| ChromePermissionMessageProvider::GetAPIPermissionMessages( |
| const PermissionSet* permissions) const { |
| - std::set<PermissionMessage> messages; |
| + PermissionMsgSet messages; |
| for (APIPermissionSet::const_iterator permission_it = |
| permissions->apis().begin(); |
| permission_it != permissions->apis().end(); ++permission_it) { |
| @@ -245,18 +256,12 @@ ChromePermissionMessageProvider::GetAPIPermissionMessages( |
| // kFileSystemDirectory and and kFileSystemWrite as the write directory |
| // message implies the other two. |
| // TODO(sammc): Remove this. See http://crbug.com/284849. |
| - std::set<PermissionMessage>::iterator write_directory_message = |
| - messages.find(PermissionMessage( |
| - PermissionMessage::kFileSystemWriteDirectory, base::string16())); |
| - if (write_directory_message != messages.end()) { |
| - messages.erase( |
| - PermissionMessage(PermissionMessage::kFileSystemWrite, |
| - base::string16())); |
| - messages.erase( |
| - PermissionMessage(PermissionMessage::kFileSystemDirectory, |
| - base::string16())); |
| - } |
| - |
| + SuppressMessage(messages, |
| + PermissionMessage::kFileSystemWriteDirectory, |
| + PermissionMessage::kFileSystemWrite); |
| + SuppressMessage(messages, |
| + PermissionMessage::kFileSystemWriteDirectory, |
| + PermissionMessage::kFileSystemDirectory); |
| // A special hack: The warning message for declarativeWebRequest |
| // permissions speaks about blocking parts of pages, which is a |
| // subset of what the "<all_urls>" access allows. Therefore we |
| @@ -267,14 +272,13 @@ ChromePermissionMessageProvider::GetAPIPermissionMessages( |
| PermissionMessage( |
| PermissionMessage::kDeclarativeWebRequest, base::string16())); |
| } |
| - |
| return messages; |
| } |
| std::set<PermissionMessage> |
| ChromePermissionMessageProvider::GetManifestPermissionMessages( |
| const PermissionSet* permissions) const { |
| - std::set<PermissionMessage> messages; |
| + PermissionMsgSet messages; |
| for (ManifestPermissionSet::const_iterator permission_it = |
| permissions->manifest_permissions().begin(); |
| permission_it != permissions->manifest_permissions().end(); |
| @@ -291,7 +295,7 @@ std::set<PermissionMessage> |
| ChromePermissionMessageProvider::GetHostPermissionMessages( |
| const PermissionSet* permissions, |
| Manifest::Type extension_type) const { |
| - std::set<PermissionMessage> messages; |
| + PermissionMsgSet messages; |
| // Since platform apps always use isolated storage, they can't (silently) |
| // access user data on other domains, so there's no need to prompt. |
| // Note: this must remain consistent with IsHostPrivilegeIncrease. |
| @@ -322,7 +326,6 @@ bool ChromePermissionMessageProvider::IsAPIPrivilegeIncrease( |
| if (new_permissions == NULL) |
| return false; |
| - typedef std::set<PermissionMessage> PermissionMsgSet; |
| PermissionMsgSet old_warnings = GetAPIPermissionMessages(old_permissions); |
| PermissionMsgSet new_warnings = GetAPIPermissionMessages(new_permissions); |
| PermissionMsgSet delta_warnings = |
| @@ -352,7 +355,6 @@ bool ChromePermissionMessageProvider::IsManifestPermissionPrivilegeIncrease( |
| if (new_permissions == NULL) |
| return false; |
| - typedef std::set<PermissionMessage> PermissionMsgSet; |
| PermissionMsgSet old_warnings = |
| GetManifestPermissionMessages(old_permissions); |
| PermissionMsgSet new_warnings = |