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

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

Issue 7888064: Only deliver extension messages to contexts that care. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Nail down a bit further. Only poke relevant RenderView in the case of chrome.tabs.connect(). Created 9 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
Index: chrome/renderer/extensions/renderer_extension_bindings.cc
diff --git a/chrome/renderer/extensions/renderer_extension_bindings.cc b/chrome/renderer/extensions/renderer_extension_bindings.cc
index ec8619c1d8ed064771197eac54bb93d2a7014c6f..773a2e35894c00ee0c997017de77d3e8ecb44fd4 100644
--- a/chrome/renderer/extensions/renderer_extension_bindings.cc
+++ b/chrome/renderer/extensions/renderer_extension_bindings.cc
@@ -253,3 +253,41 @@ v8::Extension* RendererExtensionBindings::Get(ExtensionDispatcher* dispatcher) {
static v8::Extension* extension = new ExtensionImpl(dispatcher);
return extension;
}
+
+void RendererExtensionBindings::DeliverMessage(
+ int target_port_id,
+ const std::string& message,
+ RenderView* restrict_to_render_view) {
+ v8::HandleScope handle_scope;
+
+ bindings_utils::ContextList contexts = bindings_utils::GetContexts();
+ for (bindings_utils::ContextList::iterator it = contexts.begin();
+ it != contexts.end(); ++it) {
+
+ v8::Handle<v8::Context> context = (*it)->context;
+ if (context.IsEmpty())
+ continue;
+
+ if (restrict_to_render_view != NULL &&
Matt Perry 2011/09/15 01:42:37 nit: chrome style is to use boolean-style checks f
+ (*it)->GetRenderView() != restrict_to_render_view) {
+ continue;
+ }
+
+ // Check to see whether the context has this port before bothering to create
+ // the message.
+ v8::Handle<v8::Value> port_id_handle = v8::Integer::New(target_port_id);
+ v8::Handle<v8::Value> has_port =
+ bindings_utils::CallFunctionInContext(
+ context, "Port.hasPort", 1, &port_id_handle);
+ CHECK(!has_port.IsEmpty());
+ if (!has_port->BooleanValue())
+ continue;
+
+ std::vector<v8::Handle<v8::Value> > arguments;
+ arguments.push_back(v8::String::New(message.c_str(), message.size()));
+ arguments.push_back(port_id_handle);
+ bindings_utils::CallFunctionInContext(
+ context, "Port.dispatchOnMessage",
+ arguments.size(), &arguments[0]);
+ }
+}
« no previous file with comments | « chrome/renderer/extensions/renderer_extension_bindings.h ('k') | chrome/renderer/resources/renderer_extension_bindings.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698