Index: chrome/renderer/extensions/event_unittest.cc |
diff --git a/chrome/renderer/extensions/event_unittest.cc b/chrome/renderer/extensions/event_unittest.cc |
index ca1d9b04631f8f0fdb1a01783c9ffd0886647be4..b0de4e8da3df717a2c346e165631d94eeaf2813e 100644 |
--- a/chrome/renderer/extensions/event_unittest.cc |
+++ b/chrome/renderer/extensions/event_unittest.cc |
@@ -20,13 +20,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, filter) {" |
+ " var id = nextId++;" |
+ " idToName[id] = name;" |
+ " attachedFilteredListeners[name] =" |
+ " attachedFilteredListeners[name] || [];" |
+ " attachedFilteredListeners[name][id] = filter;" |
+ " 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 = {};" |
@@ -56,6 +84,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", |
@@ -86,4 +147,78 @@ 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 = {" |
+ " 'hostSuffix': 'google.com'," |
Matt Perry
2012/05/15 19:28:27
this filter should be url: {etc}
koz (OOO until 15th September)
2012/05/16 01:26:12
Fixed here and elsewhere where the 'url' field was
|
+ "};" |
+ "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"); |
+} |
+ |
} // namespace |