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

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

Issue 10514013: Filtered events. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: split out event_filter changes Created 8 years, 6 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/event_unittest.cc
diff --git a/chrome/renderer/extensions/event_unittest.cc b/chrome/renderer/extensions/event_unittest.cc
index 61fa9caf489861ad87bd8b0d58e3b4a50b58c00e..5ce79733fff8f858c7f3ce17f38ea327653370b4 100644
--- a/chrome/renderer/extensions/event_unittest.cc
+++ b/chrome/renderer/extensions/event_unittest.cc
@@ -21,13 +21,41 @@ class EventUnittest : public ModuleSystemTest {
OverrideNativeHandler("event_bindings",
"var assert = requireNative('assert');"
"var attachedListeners = exports.attachedListeners = {};"
+ "var attachedFilteredListeners = "
+ " exports.attachedFilteredListeners = {};"
+ "var nextId = 0;"
+ "var idToName = {};"
+
"exports.AttachEvent = function(eventName) {"
" assert.AssertFalse(!!attachedListeners[eventName]);"
" attachedListeners[eventName] = 1;"
"};"
+
"exports.DetachEvent = function(eventName) {"
" assert.AssertTrue(!!attachedListeners[eventName]);"
" delete attachedListeners[eventName];"
+ "};"
+
+ "exports.IsEventAttached = function(eventName) {"
+ " return !!attachedListeners[eventName];"
+ "};"
+
+ "exports.AttachFilteredEvent = function(name, filters) {"
+ " var id = nextId++;"
+ " idToName[id] = name;"
+ " attachedFilteredListeners[name] ="
+ " attachedFilteredListeners[name] || [];"
+ " attachedFilteredListeners[name][id] = filters;"
+ " return id;"
+ "};"
+
+ "exports.DetachFilteredEvent = function(id, manual) {"
+ " var i = attachedFilteredListeners[idToName[id]].indexOf(id);"
+ " attachedFilteredListeners[idToName[id]].splice(i, 1);"
+ "};"
+
+ "exports.HasFilteredListener = function(name) {"
+ " return attachedFilteredListeners[name].length;"
"};");
OverrideNativeHandler("chrome_hidden",
"var chromeHidden = {};"
@@ -61,6 +89,39 @@ TEST_F(EventUnittest, AddRemoveTwoListeners) {
module_system_->Require("test");
}
+TEST_F(EventUnittest, OnUnloadDetachesAllListeners) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "var event = require('event');"
+ "var eventBindings = requireNative('event_bindings');"
+ "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
+ "var myEvent = new event.Event('named-event');"
+ "var cb1 = function() {};"
+ "var cb2 = function() {};"
+ "myEvent.addListener(cb1);"
+ "myEvent.addListener(cb2);"
+ "chromeHidden.dispatchOnUnload();"
+ "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
+ module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var assert = requireNative('assert');"
+ "var event = require('event');"
+ "var eventBindings = requireNative('event_bindings');"
+ "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
+ "var myEvent = new event.Event('named-event');"
+ "var cb1 = function() {};"
+ "myEvent.addListener(cb1);"
+ "myEvent.addListener(cb1);"
+ "chromeHidden.dispatchOnUnload();"
+ "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
+ module_system_->Require("test");
+}
+
TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
RegisterModule("test",
@@ -91,4 +152,97 @@ TEST_F(EventUnittest, NamedEventDispatch) {
module_system_->Require("test");
}
+TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var event = require('event');"
+ "var assert = requireNative('assert');"
+ "var e = new event.Event('myevent');"
+ "var filter = [{"
+ " url: {hostSuffix: 'google.com'},"
+ "}];"
+ "var caught = false;"
+ "try {"
+ " e.addListener(function() {}, filter);"
+ "} catch (e) {"
+ " caught = true;"
+ "}"
+ "assert.AssertTrue(caught);");
+ module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, FilteredEventsAttachment) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var event = require('event');"
+ "var assert = requireNative('assert');"
+ "var bindings = requireNative('event_bindings');"
+ "var eventOpts = {supportsListeners: true, supportsFilters: true};"
+ "var e = new event.Event('myevent', undefined, eventOpts);"
+ "var cb = function() {};"
+ "var filters = {url: [{hostSuffix: 'google.com'}]};"
+ "e.addListener(cb, filters);"
+ "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
+ "e.removeListener(cb);"
+ "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
+ module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, DetachFilteredEvent) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var event = require('event');"
+ "var assert = requireNative('assert');"
+ "var bindings = requireNative('event_bindings');"
+ "var eventOpts = {supportsListeners: true, supportsFilters: true};"
+ "var e = new event.Event('myevent', undefined, eventOpts);"
+ "var cb1 = function() {};"
+ "var cb2 = function() {};"
+ "var filters = {url: [{hostSuffix: 'google.com'}]};"
+ "e.addListener(cb1, filters);"
+ "e.addListener(cb2, filters);"
+ "e.detach_();"
+ "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
+ module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var event = require('event');"
+ "var assert = requireNative('assert');"
+ "var bindings = requireNative('event_bindings');"
+ "var eventOpts = {supportsListeners: true, supportsFilters: true};"
+ "var e = new event.Event('myevent', undefined, eventOpts);"
+ "var cb = function() {};"
+ "var filters = {url: [{hostSuffix: 'google.com'}]};"
+ "e.addListener(cb, filters);"
+ "e.addListener(cb, filters);"
+ "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
+ "e.removeListener(cb);"
+ "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
+ "e.removeListener(cb);"
+ "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
+ module_system_->Require("test");
+}
+
+TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) {
+ ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
+ RegisterModule("test",
+ "var event = require('event');"
+ "var assert = requireNative('assert');"
+ "var eventOpts = {supportsListeners: true, supportsFilters: true};"
+ "var e = new event.Event('myevent', undefined, eventOpts);"
+ "var cb = function() {};"
+ "var filters = {url: {hostSuffix: 'google.com'}};"
+ "var caught = false;"
+ "try {"
+ " e.addListener(cb, filters);"
+ "} catch (e) {"
+ " caught = true;"
+ "}"
+ "assert.AssertTrue(caught);");
+ module_system_->Require("test");
+}
+
} // namespace

Powered by Google App Engine
This is Rietveld 408576698