| Index: chrome/renderer/extensions/event_unittest.cc
|
| diff --git a/chrome/renderer/extensions/event_unittest.cc b/chrome/renderer/extensions/event_unittest.cc
|
| index 947d3e8ac0689c8b35de6d63d8ebe6195a21be0b..4b0619f9b29880875bfb1483d302ec774456ec2c 100644
|
| --- a/chrome/renderer/extensions/event_unittest.cc
|
| +++ b/chrome/renderer/extensions/event_unittest.cc
|
| @@ -22,13 +22,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 = {};"
|
| @@ -62,6 +90,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",
|
| @@ -92,4 +153,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
|
|
|