Index: chrome/common/extensions/extension_message_bundle.cc |
=================================================================== |
--- chrome/common/extensions/extension_message_bundle.cc (revision 36561) |
+++ chrome/common/extensions/extension_message_bundle.cc (working copy) |
@@ -7,12 +7,19 @@ |
#include <string> |
#include <vector> |
+#include "app/l10n_util.h" |
#include "base/hash_tables.h" |
#include "base/linked_ptr.h" |
#include "base/scoped_ptr.h" |
+#include "base/stl_util-inl.h" |
#include "base/string_util.h" |
#include "base/values.h" |
+#include "chrome/common/extensions/extension_constants.h" |
+#include "chrome/common/extensions/extension_error_utils.h" |
+#include "chrome/common/extensions/extension_l10n_util.h" |
+namespace errors = extension_manifest_errors; |
+ |
const wchar_t* ExtensionMessageBundle::kContentKey = L"content"; |
const wchar_t* ExtensionMessageBundle::kMessageKey = L"message"; |
const wchar_t* ExtensionMessageBundle::kPlaceholdersKey = L"placeholders"; |
@@ -22,6 +29,18 @@ |
const char* ExtensionMessageBundle::kMessageBegin = "__MSG_"; |
const char* ExtensionMessageBundle::kMessageEnd = "__"; |
+// Reserved messages names. |
+const char* ExtensionMessageBundle::kUILocaleKey = "@@ui_locale"; |
+const char* ExtensionMessageBundle::kBidiDirectionKey = "@@bidi_dir"; |
+const char* ExtensionMessageBundle::kBidiReversedDirectionKey = |
+ "@@bidi_reversed_dir"; |
+const char* ExtensionMessageBundle::kBidiStartEdgeKey = "@@bidi_start_edge"; |
+const char* ExtensionMessageBundle::kBidiEndEdgeKey = "@@bidi_end_edge"; |
+ |
+// Reserved messages values. |
+const char* ExtensionMessageBundle::kBidiLeftEdgeValue = "left"; |
+const char* ExtensionMessageBundle::kBidiRightEdgeValue = "right"; |
+ |
// Formats message in case we encounter a bad formed key in the JSON object. |
// Returns false and sets |error| to actual error message. |
static bool BadKeyMessage(const std::string& name, std::string* error) { |
@@ -62,9 +81,48 @@ |
} |
} |
+ if (!AppendReservedMessages(extension_l10n_util::CurrentLocaleOrDefault(), |
+ error)) |
+ return false; |
+ |
return true; |
} |
+bool ExtensionMessageBundle::AppendReservedMessages( |
+ const std::string& app_locale, std::string* error) { |
+ SubstitutionMap append_messages; |
+ append_messages[kUILocaleKey] = app_locale; |
+ |
+ // Calling l10n_util::GetTextDirection on non-UI threads doesn't seems safe, |
+ // so we use GetTextDirectionForLocale instead. |
+ if (l10n_util::GetTextDirectionForLocale(app_locale.c_str()) == |
+ l10n_util::RIGHT_TO_LEFT) { |
+ append_messages[kBidiDirectionKey] = "rtl"; |
+ append_messages[kBidiReversedDirectionKey] = "ltr"; |
+ append_messages[kBidiStartEdgeKey] = kBidiRightEdgeValue; |
+ append_messages[kBidiEndEdgeKey] = kBidiLeftEdgeValue; |
+ } else { |
+ append_messages[kBidiDirectionKey] = "ltr"; |
+ append_messages[kBidiReversedDirectionKey] = "rtl"; |
+ append_messages[kBidiStartEdgeKey] = kBidiLeftEdgeValue; |
+ append_messages[kBidiEndEdgeKey] = kBidiRightEdgeValue; |
+ } |
+ |
+ // Add all reserved messages to the dictionary, but check for collisions. |
+ SubstitutionMap::iterator it = append_messages.begin(); |
+ for (; it != append_messages.end(); ++it) { |
+ if (ContainsKey(dictionary_, it->first)) { |
+ *error = ExtensionErrorUtils::FormatErrorMessage( |
+ errors::kReservedMessageFound, it->first); |
+ return false; |
+ } else { |
+ dictionary_[it->first] = it->second; |
+ } |
+ } |
+ |
+ return true; |
+} |
+ |
bool ExtensionMessageBundle::GetMessageValue(const std::wstring& wkey, |
const DictionaryValue& catalog, |
std::string* value, |
@@ -215,7 +273,7 @@ |
for (typename str::const_iterator it = name.begin(); it != name.end(); ++it) { |
// Allow only ascii 0-9, a-z, A-Z, and _ in the name. |
- if (!IsAsciiAlpha(*it) && !IsAsciiDigit(*it) && *it != '_') |
+ if (!IsAsciiAlpha(*it) && !IsAsciiDigit(*it) && *it != '_' && *it != '@') |
return false; |
} |