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 extensions { | 9 namespace extensions { |
10 namespace { | 10 namespace { |
11 | 11 |
12 class EventUnittest : public ModuleSystemTest { | 12 class EventUnittest : public ModuleSystemTest { |
13 virtual void SetUp() OVERRIDE { | 13 virtual void SetUp() OVERRIDE { |
14 ModuleSystemTest::SetUp(); | 14 ModuleSystemTest::SetUp(); |
15 module_system_->RunString("chrome = {};", "setup-chrome"); | 15 module_system_->RunString("chrome = {};", "setup-chrome"); |
16 | 16 |
17 RegisterModule("event", IDR_EVENT_BINDINGS_JS); | 17 RegisterModule("event_bindings", IDR_EVENT_BINDINGS_JS); |
18 RegisterModule("schemaUtils", IDR_SCHEMA_UTILS_JS); | 18 RegisterModule("schemaUtils", IDR_SCHEMA_UTILS_JS); |
19 RegisterModule("utils", IDR_UTILS_JS); | 19 RegisterModule("utils", IDR_UTILS_JS); |
20 RegisterModule("json_schema", IDR_JSON_SCHEMA_JS); | 20 RegisterModule("json_schema", IDR_JSON_SCHEMA_JS); |
| 21 RegisterModule("on_unload", IDR_ON_UNLOAD_JS); |
21 | 22 |
22 // Mock out the native handler for event_bindings. These mocks will fail if | 23 // Mock out the native handler for event_bindings. These mocks will fail if |
23 // any invariants maintained by the real event_bindings are broken. | 24 // any invariants maintained by the real event_bindings are broken. |
24 OverrideNativeHandler("event_bindings", | 25 OverrideNativeHandler("event_natives", |
25 "var assert = requireNative('assert');" | 26 "var assert = requireNative('assert');" |
26 "var attachedListeners = exports.attachedListeners = {};" | 27 "var attachedListeners = exports.attachedListeners = {};" |
27 "var attachedFilteredListeners = " | 28 "var attachedFilteredListeners = " |
28 " exports.attachedFilteredListeners = {};" | 29 " exports.attachedFilteredListeners = {};" |
29 "var nextId = 0;" | 30 "var nextId = 0;" |
30 "var idToName = {};" | 31 "var idToName = {};" |
31 | 32 |
32 "exports.AttachEvent = function(eventName) {" | 33 "exports.AttachEvent = function(eventName) {" |
33 " assert.AssertFalse(!!attachedListeners[eventName]);" | 34 " assert.AssertFalse(!!attachedListeners[eventName]);" |
34 " attachedListeners[eventName] = 1;" | 35 " attachedListeners[eventName] = 1;" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 }; | 79 }; |
79 | 80 |
80 TEST_F(EventUnittest, TestNothing) { | 81 TEST_F(EventUnittest, TestNothing) { |
81 ExpectNoAssertionsMade(); | 82 ExpectNoAssertionsMade(); |
82 } | 83 } |
83 | 84 |
84 TEST_F(EventUnittest, AddRemoveTwoListeners) { | 85 TEST_F(EventUnittest, AddRemoveTwoListeners) { |
85 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 86 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
86 RegisterModule("test", | 87 RegisterModule("test", |
87 "var assert = requireNative('assert');" | 88 "var assert = requireNative('assert');" |
88 "require('event');" | 89 "var Event = require('event_bindings').Event;" |
89 "var Event = requireNative('chrome').GetChrome().Event;" | 90 "var eventNatives = requireNative('event_natives');" |
90 "var eventBindings = requireNative('event_bindings');" | |
91 "var myEvent = new Event('named-event');" | 91 "var myEvent = new Event('named-event');" |
92 "var cb1 = function() {};" | 92 "var cb1 = function() {};" |
93 "var cb2 = function() {};" | 93 "var cb2 = function() {};" |
94 "myEvent.addListener(cb1);" | 94 "myEvent.addListener(cb1);" |
95 "myEvent.addListener(cb2);" | 95 "myEvent.addListener(cb2);" |
96 "myEvent.removeListener(cb1);" | 96 "myEvent.removeListener(cb1);" |
97 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);" | 97 "assert.AssertTrue(!!eventNatives.attachedListeners['named-event']);" |
98 "myEvent.removeListener(cb2);" | 98 "myEvent.removeListener(cb2);" |
99 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | 99 "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); |
100 module_system_->Require("test"); | 100 module_system_->Require("test"); |
101 } | 101 } |
102 | 102 |
103 TEST_F(EventUnittest, OnUnloadDetachesAllListeners) { | 103 TEST_F(EventUnittest, OnUnloadDetachesAllListeners) { |
104 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 104 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
105 RegisterModule("test", | 105 RegisterModule("test", |
106 "var assert = requireNative('assert');" | 106 "var assert = requireNative('assert');" |
107 "require('event');" | 107 "var Event = require('event_bindings').Event;" |
108 "var Event = requireNative('chrome').GetChrome().Event;" | 108 "var eventNatives = requireNative('event_natives');" |
109 "var eventBindings = requireNative('event_bindings');" | 109 "var onUnload = require('on_unload');" |
110 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | |
111 "var myEvent = new Event('named-event');" | 110 "var myEvent = new Event('named-event');" |
112 "var cb1 = function() {};" | 111 "var cb1 = function() {};" |
113 "var cb2 = function() {};" | 112 "var cb2 = function() {};" |
114 "myEvent.addListener(cb1);" | 113 "myEvent.addListener(cb1);" |
115 "myEvent.addListener(cb2);" | 114 "myEvent.addListener(cb2);" |
116 "chromeHidden.dispatchOnUnload();" | 115 "onUnload.dispatch();" |
117 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | 116 "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); |
118 module_system_->Require("test"); | 117 module_system_->Require("test"); |
119 } | 118 } |
120 | 119 |
121 TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) { | 120 TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) { |
122 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 121 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
123 RegisterModule("test", | 122 RegisterModule("test", |
124 "var assert = requireNative('assert');" | 123 "var assert = requireNative('assert');" |
125 "require('event');" | 124 "var Event = require('event_bindings').Event;" |
126 "var Event = requireNative('chrome').GetChrome().Event;" | 125 "var eventNatives = requireNative('event_natives');" |
127 "var eventBindings = requireNative('event_bindings');" | 126 "var onUnload = require('on_unload');" |
128 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | |
129 "var myEvent = new Event('named-event');" | 127 "var myEvent = new Event('named-event');" |
130 "var cb1 = function() {};" | 128 "var cb1 = function() {};" |
131 "myEvent.addListener(cb1);" | 129 "myEvent.addListener(cb1);" |
132 "myEvent.addListener(cb1);" | 130 "myEvent.addListener(cb1);" |
133 "chromeHidden.dispatchOnUnload();" | 131 "onUnload.dispatch();" |
134 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | 132 "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); |
135 module_system_->Require("test"); | 133 module_system_->Require("test"); |
136 } | 134 } |
137 | 135 |
138 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { | 136 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { |
139 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 137 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
140 RegisterModule("test", | 138 RegisterModule("test", |
141 "require('event');" | 139 "var Event = require('event_bindings').Event;" |
142 "var Event = requireNative('chrome').GetChrome().Event;" | |
143 "var eventOpts = {supportsRules: true};" | 140 "var eventOpts = {supportsRules: true};" |
144 "var assert = requireNative('assert');" | 141 "var assert = requireNative('assert');" |
145 "var caught = false;" | 142 "var caught = false;" |
146 "try {" | 143 "try {" |
147 " var myEvent = new Event(undefined, undefined, eventOpts);" | 144 " var myEvent = new Event(undefined, undefined, eventOpts);" |
148 "} catch (e) {" | 145 "} catch (e) {" |
149 " caught = true;" | 146 " caught = true;" |
150 "}" | 147 "}" |
151 "assert.AssertTrue(caught);"); | 148 "assert.AssertTrue(caught);"); |
152 module_system_->Require("test"); | 149 module_system_->Require("test"); |
153 } | 150 } |
154 | 151 |
155 TEST_F(EventUnittest, NamedEventDispatch) { | 152 TEST_F(EventUnittest, NamedEventDispatch) { |
156 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 153 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
157 RegisterModule("test", | 154 RegisterModule("test", |
158 "require('event');" | 155 "var Event = require('event_bindings').Event;" |
159 "var Event = requireNative('chrome').GetChrome().Event;" | 156 "var dispatchEvent = require('event_bindings').dispatchEvent;" |
160 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | |
161 "var assert = requireNative('assert');" | 157 "var assert = requireNative('assert');" |
162 "var e = new Event('myevent');" | 158 "var e = new Event('myevent');" |
163 "var called = false;" | 159 "var called = false;" |
164 "e.addListener(function() { called = true; });" | 160 "e.addListener(function() { called = true; });" |
165 "chromeHidden.Event.dispatchEvent('myevent', []);" | 161 "dispatchEvent('myevent', []);" |
166 "assert.AssertTrue(called);"); | 162 "assert.AssertTrue(called);"); |
167 module_system_->Require("test"); | 163 module_system_->Require("test"); |
168 } | 164 } |
169 | 165 |
170 TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) { | 166 TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) { |
171 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 167 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
172 RegisterModule("test", | 168 RegisterModule("test", |
173 "require('event');" | 169 "var Event = require('event_bindings').Event;" |
174 "var Event = requireNative('chrome').GetChrome().Event;" | |
175 "var assert = requireNative('assert');" | 170 "var assert = requireNative('assert');" |
176 "var e = new Event('myevent');" | 171 "var e = new Event('myevent');" |
177 "var filter = [{" | 172 "var filter = [{" |
178 " url: {hostSuffix: 'google.com'}," | 173 " url: {hostSuffix: 'google.com'}," |
179 "}];" | 174 "}];" |
180 "var caught = false;" | 175 "var caught = false;" |
181 "try {" | 176 "try {" |
182 " e.addListener(function() {}, filter);" | 177 " e.addListener(function() {}, filter);" |
183 "} catch (e) {" | 178 "} catch (e) {" |
184 " caught = true;" | 179 " caught = true;" |
185 "}" | 180 "}" |
186 "assert.AssertTrue(caught);"); | 181 "assert.AssertTrue(caught);"); |
187 module_system_->Require("test"); | 182 module_system_->Require("test"); |
188 } | 183 } |
189 | 184 |
190 TEST_F(EventUnittest, FilteredEventsAttachment) { | 185 TEST_F(EventUnittest, FilteredEventsAttachment) { |
191 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 186 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
192 RegisterModule("test", | 187 RegisterModule("test", |
193 "require('event');" | 188 "var Event = require('event_bindings').Event;" |
194 "var Event = requireNative('chrome').GetChrome().Event;" | |
195 "var assert = requireNative('assert');" | 189 "var assert = requireNative('assert');" |
196 "var bindings = requireNative('event_bindings');" | 190 "var bindings = requireNative('event_natives');" |
197 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | 191 "var eventOpts = {supportsListeners: true, supportsFilters: true};" |
198 "var e = new Event('myevent', undefined, eventOpts);" | 192 "var e = new Event('myevent', undefined, eventOpts);" |
199 "var cb = function() {};" | 193 "var cb = function() {};" |
200 "var filters = {url: [{hostSuffix: 'google.com'}]};" | 194 "var filters = {url: [{hostSuffix: 'google.com'}]};" |
201 "e.addListener(cb, filters);" | 195 "e.addListener(cb, filters);" |
202 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | 196 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" |
203 "e.removeListener(cb);" | 197 "e.removeListener(cb);" |
204 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | 198 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); |
205 module_system_->Require("test"); | 199 module_system_->Require("test"); |
206 } | 200 } |
207 | 201 |
208 TEST_F(EventUnittest, DetachFilteredEvent) { | 202 TEST_F(EventUnittest, DetachFilteredEvent) { |
209 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 203 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
210 RegisterModule("test", | 204 RegisterModule("test", |
211 "require('event');" | 205 "var Event = require('event_bindings').Event;" |
212 "var Event = requireNative('chrome').GetChrome().Event;" | |
213 "var assert = requireNative('assert');" | 206 "var assert = requireNative('assert');" |
214 "var bindings = requireNative('event_bindings');" | 207 "var bindings = requireNative('event_natives');" |
215 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | 208 "var eventOpts = {supportsListeners: true, supportsFilters: true};" |
216 "var e = new Event('myevent', undefined, eventOpts);" | 209 "var e = new Event('myevent', undefined, eventOpts);" |
217 "var cb1 = function() {};" | 210 "var cb1 = function() {};" |
218 "var cb2 = function() {};" | 211 "var cb2 = function() {};" |
219 "var filters = {url: [{hostSuffix: 'google.com'}]};" | 212 "var filters = {url: [{hostSuffix: 'google.com'}]};" |
220 "e.addListener(cb1, filters);" | 213 "e.addListener(cb1, filters);" |
221 "e.addListener(cb2, filters);" | 214 "e.addListener(cb2, filters);" |
222 "e.detach_();" | 215 "e.detach_();" |
223 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | 216 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); |
224 module_system_->Require("test"); | 217 module_system_->Require("test"); |
225 } | 218 } |
226 | 219 |
227 TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) { | 220 TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) { |
228 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 221 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
229 RegisterModule("test", | 222 RegisterModule("test", |
230 "require('event');" | 223 "var Event = require('event_bindings').Event;" |
231 "var Event = requireNative('chrome').GetChrome().Event;" | |
232 "var assert = requireNative('assert');" | 224 "var assert = requireNative('assert');" |
233 "var bindings = requireNative('event_bindings');" | 225 "var bindings = requireNative('event_natives');" |
234 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | 226 "var eventOpts = {supportsListeners: true, supportsFilters: true};" |
235 "var e = new Event('myevent', undefined, eventOpts);" | 227 "var e = new Event('myevent', undefined, eventOpts);" |
236 "var cb = function() {};" | 228 "var cb = function() {};" |
237 "var filters = {url: [{hostSuffix: 'google.com'}]};" | 229 "var filters = {url: [{hostSuffix: 'google.com'}]};" |
238 "e.addListener(cb, filters);" | 230 "e.addListener(cb, filters);" |
239 "e.addListener(cb, filters);" | 231 "e.addListener(cb, filters);" |
240 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | 232 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" |
241 "e.removeListener(cb);" | 233 "e.removeListener(cb);" |
242 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | 234 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" |
243 "e.removeListener(cb);" | 235 "e.removeListener(cb);" |
244 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | 236 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); |
245 module_system_->Require("test"); | 237 module_system_->Require("test"); |
246 } | 238 } |
247 | 239 |
248 TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) { | 240 TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) { |
249 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 241 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
250 RegisterModule("test", | 242 RegisterModule("test", |
251 "require('event');" | 243 "var Event = require('event_bindings').Event;" |
252 "var Event = requireNative('chrome').GetChrome().Event;" | |
253 "var assert = requireNative('assert');" | 244 "var assert = requireNative('assert');" |
254 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | 245 "var eventOpts = {supportsListeners: true, supportsFilters: true};" |
255 "var e = new Event('myevent', undefined, eventOpts);" | 246 "var e = new Event('myevent', undefined, eventOpts);" |
256 "var cb = function() {};" | 247 "var cb = function() {};" |
257 "var filters = {url: {hostSuffix: 'google.com'}};" | 248 "var filters = {url: {hostSuffix: 'google.com'}};" |
258 "var caught = false;" | 249 "var caught = false;" |
259 "try {" | 250 "try {" |
260 " e.addListener(cb, filters);" | 251 " e.addListener(cb, filters);" |
261 "} catch (e) {" | 252 "} catch (e) {" |
262 " caught = true;" | 253 " caught = true;" |
263 "}" | 254 "}" |
264 "assert.AssertTrue(caught);"); | 255 "assert.AssertTrue(caught);"); |
265 module_system_->Require("test"); | 256 module_system_->Require("test"); |
266 } | 257 } |
267 | 258 |
268 TEST_F(EventUnittest, MaxListeners) { | 259 TEST_F(EventUnittest, MaxListeners) { |
269 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 260 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
270 RegisterModule("test", | 261 RegisterModule("test", |
271 "require('event');" | 262 "var Event = require('event_bindings').Event;" |
272 "var Event = requireNative('chrome').GetChrome().Event;" | |
273 "var assert = requireNative('assert');" | 263 "var assert = requireNative('assert');" |
274 "var eventOpts = {supportsListeners: true, maxListeners: 1};" | 264 "var eventOpts = {supportsListeners: true, maxListeners: 1};" |
275 "var e = new Event('myevent', undefined, eventOpts);" | 265 "var e = new Event('myevent', undefined, eventOpts);" |
276 "var cb = function() {};" | 266 "var cb = function() {};" |
277 "var caught = false;" | 267 "var caught = false;" |
278 "try {" | 268 "try {" |
279 " e.addListener(cb);" | 269 " e.addListener(cb);" |
280 "} catch (e) {" | 270 "} catch (e) {" |
281 " caught = true;" | 271 " caught = true;" |
282 "}" | 272 "}" |
283 "assert.AssertTrue(!caught);" | 273 "assert.AssertTrue(!caught);" |
284 "try {" | 274 "try {" |
285 " e.addListener(cb);" | 275 " e.addListener(cb);" |
286 "} catch (e) {" | 276 "} catch (e) {" |
287 " caught = true;" | 277 " caught = true;" |
288 "}" | 278 "}" |
289 "assert.AssertTrue(caught);"); | 279 "assert.AssertTrue(caught);"); |
290 module_system_->Require("test"); | 280 module_system_->Require("test"); |
291 } | 281 } |
292 | 282 |
293 } // namespace | 283 } // namespace |
294 } // namespace extensions | 284 } // namespace extensions |
OLD | NEW |