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

Unified Diff: extensions/renderer/event_bindings.cc

Issue 773073002: extensions: Make sure a valid key is used to track the event-listener counts. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 6 years 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/event_bindings.cc
diff --git a/extensions/renderer/event_bindings.cc b/extensions/renderer/event_bindings.cc
index 385906c33989dcbf508b716b1f9f707a5a81fe9a..bad6a02542c6d7c49943f0c6e0718015ae5f0a2f 100644
--- a/extensions/renderer/event_bindings.cc
+++ b/extensions/renderer/event_bindings.cc
@@ -13,6 +13,7 @@
#include "base/bind.h"
#include "base/lazy_instance.h"
#include "base/memory/scoped_ptr.h"
+#include "components/crx_file/id_util.h"
#include "content/public/renderer/render_thread.h"
#include "content/public/renderer/render_view.h"
#include "content/public/renderer/v8_value_converter.h"
@@ -53,6 +54,31 @@ base::LazyInstance<std::map<std::string, FilteredEventListenerCounts> >
base::LazyInstance<EventFilter> g_event_filter = LAZY_INSTANCE_INITIALIZER;
+std::string GetKeyForScriptContext(ScriptContext* script_context) {
+ const std::string& extension_id = script_context->GetExtensionID();
+ CHECK(crx_file::id_util::IdIsValid(extension_id) ||
+ script_context->GetURL().is_valid());
+ return crx_file::id_util::IdIsValid(extension_id)
+ ? extension_id
+ : script_context->GetURL().spec();
+}
+
+// Increments the number of event-listeners for the given |event_name| and
+// ScriptContext. Returns the count after the increment.
+int IncrementEventListenerCount(ScriptContext* script_context,
+ const std::string& event_name) {
+ return ++g_listener_counts
+ .Get()[GetKeyForScriptContext(script_context)][event_name];
+}
+
+// Decrements the number of event-listeners for the given |event_name| and
+// ScriptContext. Returns the count after the increment.
+int DecrementEventListenerCount(ScriptContext* script_context,
+ const std::string& event_name) {
+ return --g_listener_counts
+ .Get()[GetKeyForScriptContext(script_context)][event_name];
+}
+
bool IsLazyBackgroundPage(content::RenderView* render_view,
const Extension* extension) {
if (!render_view)
@@ -147,9 +173,8 @@ void EventBindings::AttachEvent(
if (!dispatcher_->CheckContextAccessToExtensionAPI(event_name, context()))
return;
- std::string extension_id = context()->GetExtensionID();
- EventListenerCounts& listener_counts = g_listener_counts.Get()[extension_id];
- if (++listener_counts[event_name] == 1) {
+ const std::string& extension_id = context()->GetExtensionID();
+ if (IncrementEventListenerCount(context(), event_name) == 1) {
content::RenderThread::Get()->Send(new ExtensionHostMsg_AddListener(
extension_id, context()->GetURL(), event_name));
}
@@ -173,10 +198,8 @@ void EventBindings::DetachEvent(
std::string event_name = *v8::String::Utf8Value(args[0]);
bool is_manual = args[1]->BooleanValue();
- std::string extension_id = context()->GetExtensionID();
- EventListenerCounts& listener_counts = g_listener_counts.Get()[extension_id];
-
- if (--listener_counts[event_name] == 0) {
+ const std::string& extension_id = context()->GetExtensionID();
+ if (DecrementEventListenerCount(context(), event_name) == 0) {
content::RenderThread::Get()->Send(new ExtensionHostMsg_RemoveListener(
extension_id, context()->GetURL(), event_name));
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698