Index: chrome/renderer/extensions/event_bindings.cc |
diff --git a/chrome/renderer/extensions/event_bindings.cc b/chrome/renderer/extensions/event_bindings.cc |
index 9bab21a945d08f7f2261a6f47c3a2499b18d8a9a..0c6461377fb98c4a24d3531f792d7661bbe06fe1 100644 |
--- a/chrome/renderer/extensions/event_bindings.cc |
+++ b/chrome/renderer/extensions/event_bindings.cc |
@@ -39,24 +39,22 @@ using content::RenderThread; |
namespace { |
+// TODO(koz): Merge this into EventBindings. |
class ExtensionImpl : public ChromeV8Extension { |
public: |
- explicit ExtensionImpl(ExtensionDispatcher* dispatcher) |
- : ChromeV8Extension("extensions/event.js", |
- IDR_EVENT_BINDINGS_JS, |
- dispatcher) { |
- } |
- ~ExtensionImpl() {} |
+ // A map of event names to the number of contexts listening to that event. |
+ // We notify the browser about event listeners when we transition between 0 |
+ // and 1. |
+ typedef std::map<std::string, int> EventListenerCounts; |
- virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction( |
- v8::Handle<v8::String> name) { |
- if (name->Equals(v8::String::New("AttachEvent"))) { |
- return v8::FunctionTemplate::New(AttachEvent, v8::External::New(this)); |
- } else if (name->Equals(v8::String::New("DetachEvent"))) { |
- return v8::FunctionTemplate::New(DetachEvent, v8::External::New(this)); |
- } |
- return ChromeV8Extension::GetNativeFunction(name); |
+ ExtensionImpl(ExtensionDispatcher* dispatcher, |
+ std::map<std::string, EventListenerCounts>* listener_counts) |
+ : ChromeV8Extension(dispatcher), |
+ listener_counts_(listener_counts) { |
+ RouteStaticFunction("AttachEvent", &AttachEvent); |
+ RouteStaticFunction("DetachEvent", &DetachEvent); |
} |
+ ~ExtensionImpl() {} |
// Attach an event name to an object. |
static v8::Handle<v8::Value> AttachEvent(const v8::Arguments& args) { |
@@ -76,7 +74,7 @@ class ExtensionImpl : public ChromeV8Extension { |
return v8::Undefined(); |
EventListenerCounts& listener_counts = |
- self->listener_counts_[context->extension_id()]; |
+ (*(self->listener_counts_))[context->extension_id()]; |
if (++listener_counts[event_name] == 1) { |
content::RenderThread::Get()->Send( |
new ExtensionHostMsg_AddListener(context->extension_id(), |
@@ -110,7 +108,7 @@ class ExtensionImpl : public ChromeV8Extension { |
return v8::Undefined(); |
EventListenerCounts& listener_counts = |
- self->listener_counts_[context->extension_id()]; |
+ (*(self->listener_counts_))[context->extension_id()]; |
std::string event_name(*v8::String::AsciiValue(args[0])); |
bool is_manual = args[1]->BooleanValue(); |
@@ -135,10 +133,6 @@ class ExtensionImpl : public ChromeV8Extension { |
} |
private: |
- // A map of event names to the number of contexts listening to that event. |
- // We notify the browser about event listeners when we transition between 0 |
- // and 1. |
- typedef std::map<std::string, int> EventListenerCounts; |
bool IsLazyBackgroundPage(const std::string& extension_id) { |
content::RenderView* render_view = GetCurrentRenderView(); |
@@ -152,13 +146,15 @@ class ExtensionImpl : public ChromeV8Extension { |
helper->view_type() == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); |
} |
- // A map of extension IDs to listener counts for that extension. |
- std::map<std::string, EventListenerCounts> listener_counts_; |
+ std::map<std::string, ExtensionImpl::EventListenerCounts>* listener_counts_; |
}; |
+// A map of extension IDs to listener counts for that extension. |
+base::LazyInstance<std::map<std::string, ExtensionImpl::EventListenerCounts> > |
+ g_listener_counts = LAZY_INSTANCE_INITIALIZER; |
Matt Perry
2012/03/01 23:23:06
If this is going to be a global, why not just have
koz (OOO until 15th September)
2012/03/02 01:13:58
Good point. Done.
|
+ |
} // namespace |
-v8::Extension* EventBindings::Get(ExtensionDispatcher* dispatcher) { |
- static v8::Extension* extension = new ExtensionImpl(dispatcher); |
- return extension; |
+ChromeV8Extension* EventBindings::Get(ExtensionDispatcher* dispatcher) { |
+ return new ExtensionImpl(dispatcher, g_listener_counts.Pointer()); |
} |