summaryrefslogtreecommitdiffstats
path: root/chrome/common/extensions/extension.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/common/extensions/extension.cc')
-rw-r--r--chrome/common/extensions/extension.cc208
1 files changed, 139 insertions, 69 deletions
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc
index e3e2122..741628d 100644
--- a/chrome/common/extensions/extension.cc
+++ b/chrome/common/extensions/extension.cc
@@ -98,6 +98,9 @@ bool IsBaseCrxKey(const std::string& key) {
return false;
}
+// Constant used to represent an undefined l10n message id.
+const int kUndefinedMessageId = -1;
+
// Names of API modules that do not require a permission.
const char kBrowserActionModuleName[] = "browserAction";
const char kBrowserActionsModuleName[] = "browserActions";
@@ -142,7 +145,8 @@ class ExtensionConfig {
return Singleton<ExtensionConfig>::get();
}
- int GetPermissionMessageId(const std::string& permission) {
+ Extension::PermissionMessage::MessageId GetPermissionMessageId(
+ const std::string& permission) {
return Extension::kPermissions[permission_map_[permission]].message_id;
}
@@ -281,25 +285,25 @@ const char Extension::kWebstorePrivatePermission[] = "webstorePrivate";
// See ExtensionsTest.PermissionMessages for an explanation of each
// exception.
const Extension::Permission Extension::kPermissions[] = {
- { kBackgroundPermission, 0 },
- { kBookmarkPermission, IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS },
- { kChromeosInfoPrivatePermissions, 0},
- { kContentSettingsPermission, 0 },
- { kContextMenusPermission, 0 },
- { kCookiePermission, 0 },
- { kDebuggerPermission, IDS_EXTENSION_PROMPT_WARNING_DEBUGGER },
- { kExperimentalPermission, 0 },
- { kFileBrowserHandlerPermission, 0 },
- { kFileBrowserPrivatePermission, 0 },
- { kGeolocationPermission, IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION },
- { kIdlePermission, 0 },
- { kHistoryPermission, IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY },
- { kManagementPermission, IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT },
- { kNotificationPermission, 0 },
- { kProxyPermission, 0 },
- { kTabPermission, IDS_EXTENSION_PROMPT_WARNING_TABS },
- { kUnlimitedStoragePermission, 0 },
- { kWebstorePrivatePermission, 0 },
+ { kBackgroundPermission, PermissionMessage::ID_NONE },
+ { kBookmarkPermission, PermissionMessage::ID_BOOKMARKS },
+ { kChromeosInfoPrivatePermissions, PermissionMessage::ID_NONE },
+ { kContentSettingsPermission, PermissionMessage::ID_NONE },
+ { kContextMenusPermission, PermissionMessage::ID_NONE },
+ { kCookiePermission, PermissionMessage::ID_NONE },
+ { kDebuggerPermission, PermissionMessage::ID_DEBUGGER },
+ { kExperimentalPermission, PermissionMessage::ID_NONE },
+ { kFileBrowserHandlerPermission, PermissionMessage::ID_NONE },
+ { kFileBrowserPrivatePermission, PermissionMessage::ID_NONE },
+ { kGeolocationPermission, PermissionMessage::ID_GEOLOCATION },
+ { kIdlePermission, PermissionMessage::ID_NONE },
+ { kHistoryPermission, PermissionMessage::ID_BROWSING_HISTORY },
+ { kManagementPermission, PermissionMessage::ID_MANAGEMENT },
+ { kNotificationPermission, PermissionMessage::ID_NONE },
+ { kProxyPermission, PermissionMessage::ID_NONE },
+ { kTabPermission, PermissionMessage::ID_TABS },
+ { kUnlimitedStoragePermission, PermissionMessage::ID_NONE },
+ { kWebstorePrivatePermission, PermissionMessage::ID_NONE }
};
const size_t Extension::kNumPermissions =
arraysize(Extension::kPermissions);
@@ -332,6 +336,83 @@ const int Extension::kValidHostPermissionSchemes =
UserScript::kValidUserScriptSchemes | URLPattern::SCHEME_CHROMEUI;
//
+// PermissionMessage
+//
+
+// static
+Extension::PermissionMessage Extension::PermissionMessage::CreateFromMessageId(
+ Extension::PermissionMessage::MessageId message_id) {
+ DCHECK_GT(PermissionMessage::ID_NONE, PermissionMessage::ID_UNKNOWN);
+ if (message_id <= ID_NONE)
+ return PermissionMessage(message_id, string16());
+
+ string16 message = l10n_util::GetStringUTF16(kMessageIds[message_id]);
+ return PermissionMessage(message_id, message);
+}
+
+// static
+Extension::PermissionMessage Extension::PermissionMessage::CreateFromHostList(
+ const std::vector<std::string> hosts) {
+ CHECK(hosts.size() > 0);
+
+ MessageId message_id;
+ string16 message;
+ switch (hosts.size()) {
+ case 1:
+ message_id = ID_HOSTS_1;
+ message = l10n_util::GetStringFUTF16(kMessageIds[message_id],
+ UTF8ToUTF16(hosts[0]));
+ break;
+ case 2:
+ message_id = ID_HOSTS_2;
+ message = l10n_util::GetStringFUTF16(kMessageIds[message_id],
+ UTF8ToUTF16(hosts[0]),
+ UTF8ToUTF16(hosts[1]));
+ break;
+ case 3:
+ message_id = ID_HOSTS_3;
+ message = l10n_util::GetStringFUTF16(kMessageIds[message_id],
+ UTF8ToUTF16(hosts[0]),
+ UTF8ToUTF16(hosts[1]),
+ UTF8ToUTF16(hosts[2]));
+ break;
+ default:
+ message_id = ID_HOSTS_4_OR_MORE;
+ message = l10n_util::GetStringFUTF16(
+ kMessageIds[message_id],
+ UTF8ToUTF16(hosts[0]),
+ UTF8ToUTF16(hosts[1]),
+ base::IntToString16(hosts.size() - 2));
+ break;
+ }
+
+ return PermissionMessage(message_id, message);
+}
+
+Extension::PermissionMessage::PermissionMessage(
+ Extension::PermissionMessage::MessageId message_id, string16 message)
+ : message_id_(message_id),
+ message_(message) {
+}
+
+const int Extension::PermissionMessage::kMessageIds[] = {
+ kUndefinedMessageId, // "unknown"
+ kUndefinedMessageId, // "none"
+ IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS,
+ IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION,
+ IDS_EXTENSION_PROMPT_WARNING_BROWSING_HISTORY,
+ IDS_EXTENSION_PROMPT_WARNING_TABS,
+ IDS_EXTENSION_PROMPT_WARNING_MANAGEMENT,
+ IDS_EXTENSION_PROMPT_WARNING_DEBUGGER,
+ IDS_EXTENSION_PROMPT_WARNING_1_HOST,
+ IDS_EXTENSION_PROMPT_WARNING_2_HOSTS,
+ IDS_EXTENSION_PROMPT_WARNING_3_HOSTS,
+ IDS_EXTENSION_PROMPT_WARNING_4_OR_MORE_HOSTS,
+ IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS,
+ IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS
+};
+
+//
// Extension
//
@@ -365,11 +446,6 @@ GURL Extension::GalleryUpdateUrl(bool secure) {
}
// static
-int Extension::GetPermissionMessageId(const std::string& permission) {
- return ExtensionConfig::GetInstance()->GetPermissionMessageId(permission);
-}
-
-// static
Extension::Location Extension::GetHigherPriorityLocation(
Extension::Location loc1, Extension::Location loc2) {
if (loc1 == loc2)
@@ -386,31 +462,54 @@ Extension::Location Extension::GetHigherPriorityLocation(
return (loc1_rank > loc2_rank ? loc1 : loc2 );
}
-std::vector<string16> Extension::GetPermissionMessages() const {
- std::vector<string16> messages;
+// static
+Extension::PermissionMessage::MessageId Extension::GetPermissionMessageId(
+ const std::string& permission) {
+ return ExtensionConfig::GetInstance()->GetPermissionMessageId(permission);
+}
+
+Extension::PermissionMessages Extension::GetPermissionMessages() const {
+ PermissionMessages messages;
if (!plugins().empty()) {
- messages.push_back(
- l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_FULL_ACCESS));
+ messages.push_back(PermissionMessage::CreateFromMessageId(
+ PermissionMessage::ID_FULL_ACCESS));
return messages;
}
- string16 host_msg = GetHostPermissionMessage();
- if (!host_msg.empty())
- messages.push_back(host_msg);
+ if (HasEffectiveAccessToAllHosts()) {
+ messages.push_back(PermissionMessage::CreateFromMessageId(
+ PermissionMessage::ID_HOSTS_ALL));
+ } else {
+ std::vector<std::string> hosts = GetDistinctHostsForDisplay(
+ GetEffectiveHostPermissions().patterns());
+ if (!hosts.empty())
+ messages.push_back(PermissionMessage::CreateFromHostList(hosts));
+ }
- std::set<string16> simple_msgs = GetSimplePermissionMessages();
+ std::set<PermissionMessage> simple_msgs = GetSimplePermissionMessages();
messages.insert(messages.end(), simple_msgs.begin(), simple_msgs.end());
return messages;
}
-std::set<string16> Extension::GetSimplePermissionMessages() const {
- std::set<string16> messages;
+std::vector<string16> Extension::GetPermissionMessageStrings() const {
+ std::vector<string16> messages;
+ PermissionMessages permissions = GetPermissionMessages();
+ for (PermissionMessages::const_iterator i = permissions.begin();
+ i != permissions.end(); ++i)
+ messages.push_back(i->message());
+ return messages;
+}
+
+std::set<Extension::PermissionMessage>
+ Extension::GetSimplePermissionMessages() const {
+ std::set<PermissionMessage> messages;
std::set<std::string>::const_iterator i;
for (i = api_permissions().begin(); i != api_permissions().end(); ++i) {
- int message_id = GetPermissionMessageId(*i);
- if (message_id)
- messages.insert(l10n_util::GetStringUTF16(message_id));
+ PermissionMessage::MessageId message_id = GetPermissionMessageId(*i);
+ DCHECK_GT(PermissionMessage::ID_NONE, PermissionMessage::ID_UNKNOWN);
+ if (message_id > PermissionMessage::ID_NONE)
+ messages.insert(PermissionMessage::CreateFromMessageId(message_id));
}
return messages;
}
@@ -503,36 +602,6 @@ std::vector<std::string> Extension::GetDistinctHosts(
return distinct_hosts;
}
-string16 Extension::GetHostPermissionMessage() const {
- if (HasEffectiveAccessToAllHosts())
- return l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WARNING_ALL_HOSTS);
-
- std::vector<std::string> hosts = GetDistinctHostsForDisplay(
- GetEffectiveHostPermissions().patterns());
-
- if (hosts.size() == 1) {
- return l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_1_HOST,
- UTF8ToUTF16(hosts[0]));
- } else if (hosts.size() == 2) {
- return l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_2_HOSTS,
- UTF8ToUTF16(hosts[0]),
- UTF8ToUTF16(hosts[1]));
- } else if (hosts.size() == 3) {
- return l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_3_HOSTS,
- UTF8ToUTF16(hosts[0]),
- UTF8ToUTF16(hosts[1]),
- UTF8ToUTF16(hosts[2]));
- } else if (hosts.size() >= 4) {
- return l10n_util::GetStringFUTF16(
- IDS_EXTENSION_PROMPT_WARNING_4_OR_MORE_HOSTS,
- UTF8ToUTF16(hosts[0]),
- UTF8ToUTF16(hosts[1]),
- base::IntToString16(hosts.size() - 2));
- }
-
- return string16();
-}
-
FilePath Extension::MaybeNormalizePath(const FilePath& path) {
#if defined(OS_WIN)
// Normalize any drive letter to upper-case. We do this for consistency with
@@ -1522,7 +1591,8 @@ bool Extension::IsPrivilegeIncrease(const bool granted_full_access,
size_t new_api_count = 0;
for (std::set<std::string>::iterator i = new_apis_only.begin();
i != new_apis_only.end(); ++i) {
- if (GetPermissionMessageId(*i))
+ DCHECK_GT(PermissionMessage::ID_NONE, PermissionMessage::ID_UNKNOWN);
+ if (GetPermissionMessageId(*i) > PermissionMessage::ID_NONE)
new_api_count++;
}