| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/test/base/module_system_test.h" | 5 #include "chrome/test/base/module_system_test.h" |
| 6 | 6 |
| 7 #include "grit/renderer_resources.h" | 7 #include "grit/renderer_resources.h" |
| 8 | 8 |
| 9 namespace { | 9 namespace { |
| 10 | 10 |
| 11 class EventUnittest : public ModuleSystemTest { | 11 class EventUnittest : public ModuleSystemTest { |
| 12 virtual void SetUp() OVERRIDE { | 12 virtual void SetUp() OVERRIDE { |
| 13 ModuleSystemTest::SetUp(); | 13 ModuleSystemTest::SetUp(); |
| 14 module_system_->RunString("chrome = {};", "setup-chrome"); | 14 module_system_->RunString("chrome = {};", "setup-chrome"); |
| 15 | 15 |
| 16 RegisterModule("event", IDR_EVENT_BINDINGS_JS); | 16 RegisterModule("event", IDR_EVENT_BINDINGS_JS); |
| 17 RegisterModule("schemaUtils", IDR_SCHEMA_UTILS_JS); | 17 RegisterModule("schemaUtils", IDR_SCHEMA_UTILS_JS); |
| 18 RegisterModule("utils", IDR_UTILS_JS); | 18 RegisterModule("utils", IDR_UTILS_JS); |
| 19 | 19 |
| 20 // Mock out the native handler for event_bindings. These mocks will fail if | 20 // Mock out the native handler for event_bindings. These mocks will fail if |
| 21 // any invariants maintained by the real event_bindings are broken. | 21 // any invariants maintained by the real event_bindings are broken. |
| 22 OverrideNativeHandler("event_bindings", | 22 OverrideNativeHandler("event_bindings", |
| 23 "var assert = requireNative('assert');" | 23 "var assert = requireNative('assert');" |
| 24 "var attachedListeners = exports.attachedListeners = {};" | 24 "var attachedListeners = exports.attachedListeners = {};" |
| 25 "var attachedFilteredListeners = " | |
| 26 " exports.attachedFilteredListeners = {};" | |
| 27 "var nextId = 0;" | |
| 28 "var idToName = {};" | |
| 29 | |
| 30 "exports.AttachEvent = function(eventName) {" | 25 "exports.AttachEvent = function(eventName) {" |
| 31 " assert.AssertFalse(!!attachedListeners[eventName]);" | 26 " assert.AssertFalse(!!attachedListeners[eventName]);" |
| 32 " attachedListeners[eventName] = 1;" | 27 " attachedListeners[eventName] = 1;" |
| 33 "};" | 28 "};" |
| 34 | |
| 35 "exports.DetachEvent = function(eventName) {" | 29 "exports.DetachEvent = function(eventName) {" |
| 36 " assert.AssertTrue(!!attachedListeners[eventName]);" | 30 " assert.AssertTrue(!!attachedListeners[eventName]);" |
| 37 " delete attachedListeners[eventName];" | 31 " delete attachedListeners[eventName];" |
| 38 "};" | |
| 39 | |
| 40 "exports.IsEventAttached = function(eventName) {" | |
| 41 " return !!attachedListeners[eventName];" | |
| 42 "};" | |
| 43 | |
| 44 "exports.AttachFilteredEvent = function(name, filters) {" | |
| 45 " var id = nextId++;" | |
| 46 " idToName[id] = name;" | |
| 47 " attachedFilteredListeners[name] =" | |
| 48 " attachedFilteredListeners[name] || [];" | |
| 49 " attachedFilteredListeners[name][id] = filters;" | |
| 50 " return id;" | |
| 51 "};" | |
| 52 | |
| 53 "exports.DetachFilteredEvent = function(id, manual) {" | |
| 54 " var i = attachedFilteredListeners[idToName[id]].indexOf(id);" | |
| 55 " attachedFilteredListeners[idToName[id]].splice(i, 1);" | |
| 56 "};" | |
| 57 | |
| 58 "exports.HasFilteredListener = function(name) {" | |
| 59 " return attachedFilteredListeners[name].length;" | |
| 60 "};"); | 32 "};"); |
| 61 OverrideNativeHandler("chrome_hidden", | 33 OverrideNativeHandler("chrome_hidden", |
| 62 "var chromeHidden = {};" | 34 "var chromeHidden = {};" |
| 63 "exports.GetChromeHidden = function() { return chromeHidden; };"); | 35 "exports.GetChromeHidden = function() { return chromeHidden; };"); |
| 64 OverrideNativeHandler("sendRequest", | 36 OverrideNativeHandler("sendRequest", |
| 65 "exports.sendRequest = function() {};"); | 37 "exports.sendRequest = function() {};"); |
| 66 OverrideNativeHandler("apiDefinitions", | 38 OverrideNativeHandler("apiDefinitions", |
| 67 "exports.GetExtensionAPIDefinition = function() {};"); | 39 "exports.GetExtensionAPIDefinition = function() {};"); |
| 68 } | 40 } |
| 69 }; | 41 }; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 83 "var cb2 = function() {};" | 55 "var cb2 = function() {};" |
| 84 "myEvent.addListener(cb1);" | 56 "myEvent.addListener(cb1);" |
| 85 "myEvent.addListener(cb2);" | 57 "myEvent.addListener(cb2);" |
| 86 "myEvent.removeListener(cb1);" | 58 "myEvent.removeListener(cb1);" |
| 87 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);" | 59 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);" |
| 88 "myEvent.removeListener(cb2);" | 60 "myEvent.removeListener(cb2);" |
| 89 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | 61 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); |
| 90 module_system_->Require("test"); | 62 module_system_->Require("test"); |
| 91 } | 63 } |
| 92 | 64 |
| 93 TEST_F(EventUnittest, OnUnloadDetachesAllListeners) { | |
| 94 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
| 95 RegisterModule("test", | |
| 96 "var assert = requireNative('assert');" | |
| 97 "var event = require('event');" | |
| 98 "var eventBindings = requireNative('event_bindings');" | |
| 99 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | |
| 100 "var myEvent = new event.Event('named-event');" | |
| 101 "var cb1 = function() {};" | |
| 102 "var cb2 = function() {};" | |
| 103 "myEvent.addListener(cb1);" | |
| 104 "myEvent.addListener(cb2);" | |
| 105 "chromeHidden.dispatchOnUnload();" | |
| 106 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | |
| 107 module_system_->Require("test"); | |
| 108 } | |
| 109 | |
| 110 TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) { | |
| 111 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
| 112 RegisterModule("test", | |
| 113 "var assert = requireNative('assert');" | |
| 114 "var event = require('event');" | |
| 115 "var eventBindings = requireNative('event_bindings');" | |
| 116 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | |
| 117 "var myEvent = new event.Event('named-event');" | |
| 118 "var cb1 = function() {};" | |
| 119 "myEvent.addListener(cb1);" | |
| 120 "myEvent.addListener(cb1);" | |
| 121 "chromeHidden.dispatchOnUnload();" | |
| 122 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | |
| 123 module_system_->Require("test"); | |
| 124 } | |
| 125 | |
| 126 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { | 65 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { |
| 127 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 66 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
| 128 RegisterModule("test", | 67 RegisterModule("test", |
| 129 "var event = require('event');" | 68 "var event = require('event');" |
| 130 "var eventOpts = {supportsRules: true};" | 69 "var eventOpts = {supportsRules: true};" |
| 131 "var assert = requireNative('assert');" | 70 "var assert = requireNative('assert');" |
| 132 "var caught = false;" | 71 "var caught = false;" |
| 133 "try {" | 72 "try {" |
| 134 " var myEvent = new event.Event(undefined, undefined, eventOpts);" | 73 " var myEvent = new event.Event(undefined, undefined, eventOpts);" |
| 135 "} catch (e) {" | 74 "} catch (e) {" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 146 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | 85 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" |
| 147 "var assert = requireNative('assert');" | 86 "var assert = requireNative('assert');" |
| 148 "var e = new event.Event('myevent');" | 87 "var e = new event.Event('myevent');" |
| 149 "var called = false;" | 88 "var called = false;" |
| 150 "e.addListener(function() { called = true; });" | 89 "e.addListener(function() { called = true; });" |
| 151 "chromeHidden.Event.dispatch('myevent', []);" | 90 "chromeHidden.Event.dispatch('myevent', []);" |
| 152 "assert.AssertTrue(called);"); | 91 "assert.AssertTrue(called);"); |
| 153 module_system_->Require("test"); | 92 module_system_->Require("test"); |
| 154 } | 93 } |
| 155 | 94 |
| 156 TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) { | |
| 157 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
| 158 RegisterModule("test", | |
| 159 "var event = require('event');" | |
| 160 "var assert = requireNative('assert');" | |
| 161 "var e = new event.Event('myevent');" | |
| 162 "var filter = [{" | |
| 163 " url: {hostSuffix: 'google.com'}," | |
| 164 "}];" | |
| 165 "var caught = false;" | |
| 166 "try {" | |
| 167 " e.addListener(function() {}, filter);" | |
| 168 "} catch (e) {" | |
| 169 " caught = true;" | |
| 170 "}" | |
| 171 "assert.AssertTrue(caught);"); | |
| 172 module_system_->Require("test"); | |
| 173 } | |
| 174 | |
| 175 TEST_F(EventUnittest, FilteredEventsAttachment) { | |
| 176 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
| 177 RegisterModule("test", | |
| 178 "var event = require('event');" | |
| 179 "var assert = requireNative('assert');" | |
| 180 "var bindings = requireNative('event_bindings');" | |
| 181 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
| 182 "var e = new event.Event('myevent', undefined, eventOpts);" | |
| 183 "var cb = function() {};" | |
| 184 "var filters = {url: [{hostSuffix: 'google.com'}]};" | |
| 185 "e.addListener(cb, filters);" | |
| 186 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
| 187 "e.removeListener(cb);" | |
| 188 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
| 189 module_system_->Require("test"); | |
| 190 } | |
| 191 | |
| 192 TEST_F(EventUnittest, DetachFilteredEvent) { | |
| 193 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
| 194 RegisterModule("test", | |
| 195 "var event = require('event');" | |
| 196 "var assert = requireNative('assert');" | |
| 197 "var bindings = requireNative('event_bindings');" | |
| 198 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
| 199 "var e = new event.Event('myevent', undefined, eventOpts);" | |
| 200 "var cb1 = function() {};" | |
| 201 "var cb2 = function() {};" | |
| 202 "var filters = {url: [{hostSuffix: 'google.com'}]};" | |
| 203 "e.addListener(cb1, filters);" | |
| 204 "e.addListener(cb2, filters);" | |
| 205 "e.detach_();" | |
| 206 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
| 207 module_system_->Require("test"); | |
| 208 } | |
| 209 | |
| 210 TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) { | |
| 211 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
| 212 RegisterModule("test", | |
| 213 "var event = require('event');" | |
| 214 "var assert = requireNative('assert');" | |
| 215 "var bindings = requireNative('event_bindings');" | |
| 216 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
| 217 "var e = new event.Event('myevent', undefined, eventOpts);" | |
| 218 "var cb = function() {};" | |
| 219 "var filters = {url: [{hostSuffix: 'google.com'}]};" | |
| 220 "e.addListener(cb, filters);" | |
| 221 "e.addListener(cb, filters);" | |
| 222 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
| 223 "e.removeListener(cb);" | |
| 224 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
| 225 "e.removeListener(cb);" | |
| 226 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
| 227 module_system_->Require("test"); | |
| 228 } | |
| 229 | |
| 230 TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) { | |
| 231 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
| 232 RegisterModule("test", | |
| 233 "var event = require('event');" | |
| 234 "var assert = requireNative('assert');" | |
| 235 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
| 236 "var e = new event.Event('myevent', undefined, eventOpts);" | |
| 237 "var cb = function() {};" | |
| 238 "var filters = {url: {hostSuffix: 'google.com'}};" | |
| 239 "var caught = false;" | |
| 240 "try {" | |
| 241 " e.addListener(cb, filters);" | |
| 242 "} catch (e) {" | |
| 243 " caught = true;" | |
| 244 "}" | |
| 245 "assert.AssertTrue(caught);"); | |
| 246 module_system_->Require("test"); | |
| 247 } | |
| 248 | |
| 249 } // namespace | 95 } // namespace |
| OLD | NEW |