OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/renderer/extensions/renderer_extension_bindings.h" | 5 #include "chrome/renderer/extensions/renderer_extension_bindings.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "app/resource_bundle.h" | 10 #include "app/resource_bundle.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 // new chrome.Extension('00123456789abcdef0123456789abcdef0123456'); | 28 // new chrome.Extension('00123456789abcdef0123456789abcdef0123456'); |
29 // var port = extension.connect(); | 29 // var port = extension.connect(); |
30 // port.postMessage('Can you hear me now?'); | 30 // port.postMessage('Can you hear me now?'); |
31 // port.onmessage.addListener(function(msg, port) { | 31 // port.onmessage.addListener(function(msg, port) { |
32 // alert('response=' + msg); | 32 // alert('response=' + msg); |
33 // port.postMessage('I got your reponse'); | 33 // port.postMessage('I got your reponse'); |
34 // }); | 34 // }); |
35 | 35 |
36 namespace { | 36 namespace { |
37 | 37 |
38 // A map of message name to message. | |
39 typedef std::map<std::string, std::string> L10nMessagesMap; | |
40 | |
41 // A map of extension ID to l10n message map. | |
42 typedef std::map<std::string, L10nMessagesMap > ExtensionToL10nMessagesMap; | |
43 | |
44 struct ExtensionData { | 38 struct ExtensionData { |
45 struct PortData { | 39 struct PortData { |
46 int ref_count; // how many contexts have a handle to this port | 40 int ref_count; // how many contexts have a handle to this port |
47 bool disconnected; // true if this port was forcefully disconnected | 41 bool disconnected; // true if this port was forcefully disconnected |
48 PortData() : ref_count(0), disconnected(false) {} | 42 PortData() : ref_count(0), disconnected(false) {} |
49 }; | 43 }; |
50 std::map<int, PortData> ports; // port ID -> data | 44 std::map<int, PortData> ports; // port ID -> data |
51 // Maps extension ID to message map. | |
52 ExtensionToL10nMessagesMap extension_l10n_messages_map_; | |
53 }; | 45 }; |
54 | 46 |
55 static bool HasPortData(int port_id) { | 47 static bool HasPortData(int port_id) { |
56 return Singleton<ExtensionData>::get()->ports.find(port_id) != | 48 return Singleton<ExtensionData>::get()->ports.find(port_id) != |
57 Singleton<ExtensionData>::get()->ports.end(); | 49 Singleton<ExtensionData>::get()->ports.end(); |
58 } | 50 } |
59 | 51 |
60 static ExtensionData::PortData& GetPortData(int port_id) { | 52 static ExtensionData::PortData& GetPortData(int port_id) { |
61 return Singleton<ExtensionData>::get()->ports[port_id]; | 53 return Singleton<ExtensionData>::get()->ports[port_id]; |
62 } | 54 } |
63 | 55 |
64 static void ClearPortData(int port_id) { | 56 static void ClearPortData(int port_id) { |
65 Singleton<ExtensionData>::get()->ports.erase(port_id); | 57 Singleton<ExtensionData>::get()->ports.erase(port_id); |
66 } | 58 } |
67 | 59 |
68 static ExtensionToL10nMessagesMap* GetExtensionToL10nMessagesMap() { | |
69 return &Singleton<ExtensionData>()->extension_l10n_messages_map_; | |
70 } | |
71 | |
72 static L10nMessagesMap* GetL10nMessagesMap(const std::string extension_id) { | |
73 ExtensionToL10nMessagesMap::iterator it = | |
74 Singleton<ExtensionData>()->extension_l10n_messages_map_.find( | |
75 extension_id); | |
76 if (it != Singleton<ExtensionData>()->extension_l10n_messages_map_.end()) { | |
77 return &(it->second); | |
78 } else { | |
79 return NULL; | |
80 } | |
81 } | |
82 | |
83 const char kPortClosedError[] = "Attempting to use a disconnected port object"; | 60 const char kPortClosedError[] = "Attempting to use a disconnected port object"; |
84 const char* kExtensionDeps[] = { EventBindings::kName }; | 61 const char* kExtensionDeps[] = { EventBindings::kName }; |
85 | 62 |
86 class ExtensionImpl : public ExtensionBase { | 63 class ExtensionImpl : public ExtensionBase { |
87 public: | 64 public: |
88 ExtensionImpl() | 65 ExtensionImpl() |
89 : ExtensionBase(RendererExtensionBindings::kName, | 66 : ExtensionBase(RendererExtensionBindings::kName, |
90 GetStringResource<IDR_RENDERER_EXTENSION_BINDINGS_JS>(), | 67 GetStringResource<IDR_RENDERER_EXTENSION_BINDINGS_JS>(), |
91 arraysize(kExtensionDeps), kExtensionDeps) { | 68 arraysize(kExtensionDeps), kExtensionDeps) { |
92 } | 69 } |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 | 200 |
224 if (messages.empty()) | 201 if (messages.empty()) |
225 return v8::Undefined(); | 202 return v8::Undefined(); |
226 | 203 |
227 // Save messages we got. | 204 // Save messages we got. |
228 ExtensionToL10nMessagesMap& l10n_messages_map = | 205 ExtensionToL10nMessagesMap& l10n_messages_map = |
229 *GetExtensionToL10nMessagesMap(); | 206 *GetExtensionToL10nMessagesMap(); |
230 l10n_messages_map[extension_id] = messages; | 207 l10n_messages_map[extension_id] = messages; |
231 | 208 |
232 l10n_messages = GetL10nMessagesMap(extension_id); | 209 l10n_messages = GetL10nMessagesMap(extension_id); |
233 if (!l10n_messages) | |
234 return v8::Undefined(); | |
235 } | 210 } |
236 | 211 |
237 std::string message_name = *v8::String::AsciiValue(args[0]); | 212 std::string message_name = *v8::String::AsciiValue(args[0]); |
238 std::string message = | 213 std::string message = |
239 ExtensionMessageBundle::GetL10nMessage(message_name, *l10n_messages); | 214 ExtensionMessageBundle::GetL10nMessage(message_name, *l10n_messages); |
240 | 215 |
241 std::vector<std::string> substitutions; | 216 std::vector<std::string> substitutions; |
242 if (args[1]->IsNull() || args[1]->IsUndefined()) { | 217 if (args[1]->IsNull() || args[1]->IsUndefined()) { |
243 // chrome.i18n.getMessage("message_name"); | 218 // chrome.i18n.getMessage("message_name"); |
244 // chrome.i18n.getMessage("message_name", null); | 219 // chrome.i18n.getMessage("message_name", null); |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 return extension; | 299 return extension; |
325 } | 300 } |
326 | 301 |
327 void RendererExtensionBindings::Invoke(const std::string& function_name, | 302 void RendererExtensionBindings::Invoke(const std::string& function_name, |
328 const ListValue& args, | 303 const ListValue& args, |
329 RenderView* renderview) { | 304 RenderView* renderview) { |
330 v8::HandleScope handle_scope; | 305 v8::HandleScope handle_scope; |
331 std::vector< v8::Handle<v8::Value> > argv = ListValueToV8(args); | 306 std::vector< v8::Handle<v8::Value> > argv = ListValueToV8(args); |
332 EventBindings::CallFunction(function_name, argv.size(), &argv[0], renderview); | 307 EventBindings::CallFunction(function_name, argv.size(), &argv[0], renderview); |
333 } | 308 } |
OLD | NEW |