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 |
25 "exports.AttachEvent = function(eventName) {" | 30 "exports.AttachEvent = function(eventName) {" |
26 " assert.AssertFalse(!!attachedListeners[eventName]);" | 31 " assert.AssertFalse(!!attachedListeners[eventName]);" |
27 " attachedListeners[eventName] = 1;" | 32 " attachedListeners[eventName] = 1;" |
28 "};" | 33 "};" |
| 34 |
29 "exports.DetachEvent = function(eventName) {" | 35 "exports.DetachEvent = function(eventName) {" |
30 " assert.AssertTrue(!!attachedListeners[eventName]);" | 36 " assert.AssertTrue(!!attachedListeners[eventName]);" |
31 " delete attachedListeners[eventName];" | 37 " 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;" |
32 "};"); | 60 "};"); |
33 OverrideNativeHandler("chrome_hidden", | 61 OverrideNativeHandler("chrome_hidden", |
34 "var chromeHidden = {};" | 62 "var chromeHidden = {};" |
35 "exports.GetChromeHidden = function() { return chromeHidden; };"); | 63 "exports.GetChromeHidden = function() { return chromeHidden; };"); |
36 OverrideNativeHandler("sendRequest", | 64 OverrideNativeHandler("sendRequest", |
37 "exports.sendRequest = function() {};"); | 65 "exports.sendRequest = function() {};"); |
38 OverrideNativeHandler("apiDefinitions", | 66 OverrideNativeHandler("apiDefinitions", |
39 "exports.GetExtensionAPIDefinition = function() {};"); | 67 "exports.GetExtensionAPIDefinition = function() {};"); |
40 } | 68 } |
41 }; | 69 }; |
(...skipping 13 matching lines...) Expand all Loading... |
55 "var cb2 = function() {};" | 83 "var cb2 = function() {};" |
56 "myEvent.addListener(cb1);" | 84 "myEvent.addListener(cb1);" |
57 "myEvent.addListener(cb2);" | 85 "myEvent.addListener(cb2);" |
58 "myEvent.removeListener(cb1);" | 86 "myEvent.removeListener(cb1);" |
59 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);" | 87 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);" |
60 "myEvent.removeListener(cb2);" | 88 "myEvent.removeListener(cb2);" |
61 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | 89 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); |
62 module_system_->Require("test"); | 90 module_system_->Require("test"); |
63 } | 91 } |
64 | 92 |
| 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 |
65 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { | 126 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { |
66 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 127 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
67 RegisterModule("test", | 128 RegisterModule("test", |
68 "var event = require('event');" | 129 "var event = require('event');" |
69 "var eventOpts = {supportsRules: true};" | 130 "var eventOpts = {supportsRules: true};" |
70 "var assert = requireNative('assert');" | 131 "var assert = requireNative('assert');" |
71 "var caught = false;" | 132 "var caught = false;" |
72 "try {" | 133 "try {" |
73 " var myEvent = new event.Event(undefined, undefined, eventOpts);" | 134 " var myEvent = new event.Event(undefined, undefined, eventOpts);" |
74 "} catch (e) {" | 135 "} catch (e) {" |
(...skipping 10 matching lines...) Expand all Loading... |
85 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | 146 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" |
86 "var assert = requireNative('assert');" | 147 "var assert = requireNative('assert');" |
87 "var e = new event.Event('myevent');" | 148 "var e = new event.Event('myevent');" |
88 "var called = false;" | 149 "var called = false;" |
89 "e.addListener(function() { called = true; });" | 150 "e.addListener(function() { called = true; });" |
90 "chromeHidden.Event.dispatch('myevent', []);" | 151 "chromeHidden.Event.dispatch('myevent', []);" |
91 "assert.AssertTrue(called);"); | 152 "assert.AssertTrue(called);"); |
92 module_system_->Require("test"); | 153 module_system_->Require("test"); |
93 } | 154 } |
94 | 155 |
| 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 |
95 } // namespace | 249 } // namespace |
OLD | NEW |