Chromium Code Reviews| Index: chrome/renderer/extensions/extension_process_bindings.cc |
| =================================================================== |
| --- chrome/renderer/extensions/extension_process_bindings.cc (revision 27238) |
| +++ chrome/renderer/extensions/extension_process_bindings.cc (working copy) |
| @@ -2,10 +2,16 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <map> |
| +#include <set> |
| +#include <string> |
| +#include <vector> |
| + |
| #include "chrome/renderer/extensions/extension_process_bindings.h" |
| #include "base/singleton.h" |
| #include "chrome/common/extensions/extension.h" |
| +#include "chrome/common/extensions/extension_message_bundle.h" |
| #include "chrome/common/extensions/url_pattern.h" |
| #include "chrome/common/render_messages.h" |
| #include "chrome/common/url_constants.h" |
| @@ -41,6 +47,13 @@ |
| // A map of extension ID to permissions map. |
| typedef std::map<std::string, PermissionsMap> ExtensionPermissionsMap; |
| +// A map of message name to message. |
| +typedef std::map<std::string, std::string> L10nMessagesMap; |
| + |
| +// A map of extension ID to l10n message map. |
| +typedef std::map<std::string, L10nMessagesMap > |
| + ExtensionToL10nMessagesMap; |
| + |
| const char kExtensionName[] = "chrome/ExtensionProcessBindings"; |
| const char* kExtensionDeps[] = { |
| BaseJsV8Extension::kName, |
| @@ -54,6 +67,7 @@ |
| std::set<std::string> function_names_; |
| PageActionIdMap page_action_ids_; |
| ExtensionPermissionsMap permissions_; |
| + ExtensionToL10nMessagesMap extension_l10n_messages_map_; |
| }; |
| static std::set<std::string>* GetFunctionNameSet() { |
| @@ -68,6 +82,20 @@ |
| return &Singleton<SingletonData>()->permissions_[extension_id]; |
| } |
| +static ExtensionToL10nMessagesMap* GetExtensionToL10nMessagesMap() { |
| + return &Singleton<SingletonData>()->extension_l10n_messages_map_; |
| +} |
| + |
| +static L10nMessagesMap* GetL10nMessagesMap(const std::string extension_id) { |
| + ExtensionToL10nMessagesMap::iterator it = |
| + Singleton<SingletonData>()->extension_l10n_messages_map_.find(extension_id); |
| + if (it != Singleton<SingletonData>()->extension_l10n_messages_map_.end()) { |
| + return &(it->second); |
| + } else { |
| + return NULL; |
| + } |
| +} |
| + |
| class ExtensionImpl : public ExtensionBase { |
| public: |
| ExtensionImpl() : ExtensionBase( |
| @@ -109,6 +137,8 @@ |
| return v8::FunctionTemplate::New(StartRequest); |
| } else if (name->Equals(v8::String::New("GetRenderViewId"))) { |
| return v8::FunctionTemplate::New(GetRenderViewId); |
| + } else if (name->Equals(v8::String::New("GetL10nMessage"))) { |
| + return v8::FunctionTemplate::New(GetL10nMessage); |
| } |
| return ExtensionBase::GetNativeFunction(name); |
| @@ -131,7 +161,7 @@ |
| // TODO(erikkay) for now, special case mole as a type of toolstrip. |
| // Perhaps this isn't the right long-term thing to do. |
| - if (match == ViewType::EXTENSION_TOOLSTRIP && |
| + if (match == ViewType::EXTENSION_TOOLSTRIP && |
| type == ViewType::EXTENSION_MOLE) { |
| return true; |
| } |
| @@ -255,6 +285,45 @@ |
| return page_action_vector; |
| } |
| + static v8::Handle<v8::Value> GetL10nMessage(const v8::Arguments& args) { |
| + if (args.Length() != 2 || !args[0]->IsString()) |
|
Erik does not do reviews
2009/09/26 00:35:48
NOTREACHED()
|
| + return v8::String::New(""); |
|
Erik does not do reviews
2009/09/26 00:35:48
return V8::Undefined instead (and the other places
|
| + |
| + L10nMessagesMap* l10n_messages = |
| + GetL10nMessagesMap(ExtensionIdForCurrentContext()); |
| + if (!l10n_messages) |
| + return v8::String::New(""); |
| + |
| + std::string message_name = *v8::String::AsciiValue(args[0]); |
| + std::string message = |
| + ExtensionMessageBundle::GetL10nMessage(message_name, *l10n_messages); |
| + |
| + std::vector<string16> substitutions; |
| + if (args[1]->IsNull() || args[1]->IsUndefined()) { |
| + // chrome.i18n.getMessage("message_name"); |
| + // chrome.i18n.getMessage("message_name", null); |
| + return v8::String::New(message.c_str()); |
| + } else if (args[1]->IsString()) { |
| + // chrome.i18n.getMessage("message_name", "one param"); |
| + std::string substitute = *v8::String::Utf8Value(args[1]->ToString()); |
| + substitutions.push_back(UTF8ToUTF16(substitute)); |
| + } else if (args[1]->IsArray()) { |
| + // chrome.i18n.getMessage("message_name", ["more", "params"]); |
| + v8::Array* placeholders = static_cast<v8::Array*>(*args[1]); |
|
Erik does not do reviews
2009/09/26 00:35:48
verify that the length of placeholders is > 0 and
|
| + for (uint32_t i = 0; i < placeholders->Length(); ++i) { |
| + std::string substitute = |
| + *v8::String::Utf8Value( |
| + placeholders->Get(v8::Integer::New(i))->ToString()); |
| + substitutions.push_back(UTF8ToUTF16(substitute)); |
| + } |
| + } else { |
|
Erik does not do reviews
2009/09/26 00:35:48
NOTREACHED()
|
| + return v8::String::New(""); |
| + } |
| + |
| + return v8::String::New(UTF16ToUTF8(ReplaceStringPlaceholders( |
| + UTF8ToUTF16(message), substitutions, NULL)).c_str()); |
| + } |
| + |
| // Starts an API request to the browser, with an optional callback. The |
| // callback will be dispatched to EventBindings::HandleResponse. |
| static v8::Handle<v8::Value> StartRequest(const v8::Arguments& args) { |
| @@ -331,7 +400,7 @@ |
| argv[4] = v8::String::New(error.c_str()); |
| v8::Handle<v8::Value> retval = bindings_utils::CallFunctionInContext( |
| request->second->context, "handleResponse", arraysize(argv), argv); |
| - // In debug, the js will validate the callback parameters and return a |
| + // In debug, the js will validate the callback parameters and return a |
| // string if a validation error has occured. |
| #ifdef _DEBUG |
| if (!retval.IsEmpty() && !retval->IsUndefined()) { |
| @@ -357,6 +426,15 @@ |
| } |
| // static |
| +void ExtensionProcessBindings::SetL10nMessages( |
| + const std::string& extension_id, |
| + const std::map<std::string, std::string>& l10n_messages) { |
| + ExtensionToL10nMessagesMap& l10n_messages_map = |
| + *GetExtensionToL10nMessagesMap(); |
| + l10n_messages_map[extension_id] = l10n_messages; |
| +} |
| + |
| +// static |
| void ExtensionProcessBindings::SetAPIPermissions( |
| const std::string& extension_id, |
| const std::vector<std::string>& permissions) { |