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 = |