| 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 |