Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: chrome/renderer/extensions/extension_process_bindings.cc

Issue 225009: Implementing chrome.i18n.getMessage call, that loads message from the extensi... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/renderer/extensions/extension_process_bindings.h ('k') | chrome/renderer/render_thread.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
« no previous file with comments | « chrome/renderer/extensions/extension_process_bindings.h ('k') | chrome/renderer/render_thread.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698