OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/test/base/module_system_test.h" | |
6 | |
7 #include "extensions/common/extension_urls.h" | |
8 #include "grit/extensions_renderer_resources.h" | |
9 | |
10 namespace extensions { | |
11 namespace { | |
12 | |
13 class EventUnittest : public ModuleSystemTest { | |
14 virtual void SetUp() OVERRIDE { | |
15 ModuleSystemTest::SetUp(); | |
16 | |
17 env()->RegisterModule(kEventBindings, IDR_EVENT_BINDINGS_JS); | |
18 env()->RegisterModule("json_schema", IDR_JSON_SCHEMA_JS); | |
19 env()->RegisterModule(kSchemaUtils, IDR_SCHEMA_UTILS_JS); | |
20 env()->RegisterModule("uncaught_exception_handler", | |
21 IDR_UNCAUGHT_EXCEPTION_HANDLER_JS); | |
22 env()->RegisterModule("unload_event", IDR_UNLOAD_EVENT_JS); | |
23 env()->RegisterModule("utils", IDR_UTILS_JS); | |
24 | |
25 // Mock out the native handler for event_bindings. These mocks will fail if | |
26 // any invariants maintained by the real event_bindings are broken. | |
27 env()->OverrideNativeHandler( | |
28 "event_natives", | |
29 "var assert = requireNative('assert');" | |
30 "var attachedListeners = exports.attachedListeners = {};" | |
31 "var attachedFilteredListeners = " | |
32 " exports.attachedFilteredListeners = {};" | |
33 "var nextId = 0;" | |
34 "var idToName = {};" | |
35 "exports.AttachEvent = function(eventName) {" | |
36 " assert.AssertFalse(!!attachedListeners[eventName]);" | |
37 " attachedListeners[eventName] = 1;" | |
38 "};" | |
39 "exports.DetachEvent = function(eventName) {" | |
40 " assert.AssertTrue(!!attachedListeners[eventName]);" | |
41 " delete attachedListeners[eventName];" | |
42 "};" | |
43 "exports.IsEventAttached = function(eventName) {" | |
44 " return !!attachedListeners[eventName];" | |
45 "};" | |
46 "exports.AttachFilteredEvent = function(name, filters) {" | |
47 " var id = nextId++;" | |
48 " idToName[id] = name;" | |
49 " attachedFilteredListeners[name] =" | |
50 " attachedFilteredListeners[name] || [];" | |
51 " attachedFilteredListeners[name][id] = filters;" | |
52 " return id;" | |
53 "};" | |
54 "exports.DetachFilteredEvent = function(id, manual) {" | |
55 " var i = attachedFilteredListeners[idToName[id]].indexOf(id);" | |
56 " attachedFilteredListeners[idToName[id]].splice(i, 1);" | |
57 "};" | |
58 "exports.HasFilteredListener = function(name) {" | |
59 " return attachedFilteredListeners[name].length;" | |
60 "};"); | |
61 env()->OverrideNativeHandler("sendRequest", | |
62 "exports.sendRequest = function() {};"); | |
63 env()->OverrideNativeHandler( | |
64 "apiDefinitions", | |
65 "exports.GetExtensionAPIDefinitionsForTest = function() {};"); | |
66 env()->OverrideNativeHandler("logging", "exports.DCHECK = function() {};"); | |
67 env()->OverrideNativeHandler("schema_registry", | |
68 "exports.GetSchema = function() {};"); | |
69 } | |
70 }; | |
71 | |
72 TEST_F(EventUnittest, TestNothing) { | |
73 ExpectNoAssertionsMade(); | |
74 } | |
75 | |
76 TEST_F(EventUnittest, AddRemoveTwoListeners) { | |
77 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
78 env()->module_system()); | |
79 env()->RegisterModule( | |
80 "test", | |
81 "var assert = requireNative('assert');" | |
82 "var Event = require('event_bindings').Event;" | |
83 "var eventNatives = requireNative('event_natives');" | |
84 "var myEvent = new Event('named-event');" | |
85 "var cb1 = function() {};" | |
86 "var cb2 = function() {};" | |
87 "myEvent.addListener(cb1);" | |
88 "myEvent.addListener(cb2);" | |
89 "myEvent.removeListener(cb1);" | |
90 "assert.AssertTrue(!!eventNatives.attachedListeners['named-event']);" | |
91 "myEvent.removeListener(cb2);" | |
92 "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); | |
93 env()->module_system()->Require("test"); | |
94 } | |
95 | |
96 TEST_F(EventUnittest, OnUnloadDetachesAllListeners) { | |
97 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
98 env()->module_system()); | |
99 env()->RegisterModule( | |
100 "test", | |
101 "var assert = requireNative('assert');" | |
102 "var Event = require('event_bindings').Event;" | |
103 "var eventNatives = requireNative('event_natives');" | |
104 "var myEvent = new Event('named-event');" | |
105 "var cb1 = function() {};" | |
106 "var cb2 = function() {};" | |
107 "myEvent.addListener(cb1);" | |
108 "myEvent.addListener(cb2);" | |
109 "require('unload_event').dispatch();" | |
110 "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); | |
111 env()->module_system()->Require("test"); | |
112 } | |
113 | |
114 TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) { | |
115 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
116 env()->module_system()); | |
117 env()->RegisterModule( | |
118 "test", | |
119 "var assert = requireNative('assert');" | |
120 "var Event = require('event_bindings').Event;" | |
121 "var eventNatives = requireNative('event_natives');" | |
122 "var myEvent = new Event('named-event');" | |
123 "var cb1 = function() {};" | |
124 "myEvent.addListener(cb1);" | |
125 "myEvent.addListener(cb1);" | |
126 "require('unload_event').dispatch();" | |
127 "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); | |
128 env()->module_system()->Require("test"); | |
129 } | |
130 | |
131 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { | |
132 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
133 env()->module_system()); | |
134 env()->RegisterModule( | |
135 "test", | |
136 "var Event = require('event_bindings').Event;" | |
137 "var eventOpts = {supportsRules: true};" | |
138 "var assert = requireNative('assert');" | |
139 "var caught = false;" | |
140 "try {" | |
141 " var myEvent = new Event(undefined, undefined, eventOpts);" | |
142 "} catch (e) {" | |
143 " caught = true;" | |
144 "}" | |
145 "assert.AssertTrue(caught);"); | |
146 env()->module_system()->Require("test"); | |
147 } | |
148 | |
149 TEST_F(EventUnittest, NamedEventDispatch) { | |
150 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
151 env()->module_system()); | |
152 env()->RegisterModule( | |
153 "test", | |
154 "var Event = require('event_bindings').Event;" | |
155 "var dispatchEvent = require('event_bindings').dispatchEvent;" | |
156 "var assert = requireNative('assert');" | |
157 "var e = new Event('myevent');" | |
158 "var called = false;" | |
159 "e.addListener(function() { called = true; });" | |
160 "dispatchEvent('myevent', []);" | |
161 "assert.AssertTrue(called);"); | |
162 env()->module_system()->Require("test"); | |
163 } | |
164 | |
165 TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) { | |
166 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
167 env()->module_system()); | |
168 env()->RegisterModule("test", | |
169 "var Event = require('event_bindings').Event;" | |
170 "var assert = requireNative('assert');" | |
171 "var e = new Event('myevent');" | |
172 "var filter = [{" | |
173 " url: {hostSuffix: 'google.com'}," | |
174 "}];" | |
175 "var caught = false;" | |
176 "try {" | |
177 " e.addListener(function() {}, filter);" | |
178 "} catch (e) {" | |
179 " caught = true;" | |
180 "}" | |
181 "assert.AssertTrue(caught);"); | |
182 env()->module_system()->Require("test"); | |
183 } | |
184 | |
185 TEST_F(EventUnittest, FilteredEventsAttachment) { | |
186 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
187 env()->module_system()); | |
188 env()->RegisterModule( | |
189 "test", | |
190 "var Event = require('event_bindings').Event;" | |
191 "var assert = requireNative('assert');" | |
192 "var bindings = requireNative('event_natives');" | |
193 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
194 "var e = new Event('myevent', undefined, eventOpts);" | |
195 "var cb = function() {};" | |
196 "var filters = {url: [{hostSuffix: 'google.com'}]};" | |
197 "e.addListener(cb, filters);" | |
198 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
199 "e.removeListener(cb);" | |
200 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
201 env()->module_system()->Require("test"); | |
202 } | |
203 | |
204 TEST_F(EventUnittest, DetachFilteredEvent) { | |
205 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
206 env()->module_system()); | |
207 env()->RegisterModule( | |
208 "test", | |
209 "var Event = require('event_bindings').Event;" | |
210 "var assert = requireNative('assert');" | |
211 "var bindings = requireNative('event_natives');" | |
212 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
213 "var e = new Event('myevent', undefined, eventOpts);" | |
214 "var cb1 = function() {};" | |
215 "var cb2 = function() {};" | |
216 "var filters = {url: [{hostSuffix: 'google.com'}]};" | |
217 "e.addListener(cb1, filters);" | |
218 "e.addListener(cb2, filters);" | |
219 "privates(e).impl.detach_();" | |
220 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
221 env()->module_system()->Require("test"); | |
222 } | |
223 | |
224 TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) { | |
225 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
226 env()->module_system()); | |
227 env()->RegisterModule( | |
228 "test", | |
229 "var Event = require('event_bindings').Event;" | |
230 "var assert = requireNative('assert');" | |
231 "var bindings = requireNative('event_natives');" | |
232 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
233 "var e = new Event('myevent', undefined, eventOpts);" | |
234 "var cb = function() {};" | |
235 "var filters = {url: [{hostSuffix: 'google.com'}]};" | |
236 "e.addListener(cb, filters);" | |
237 "e.addListener(cb, filters);" | |
238 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
239 "e.removeListener(cb);" | |
240 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
241 "e.removeListener(cb);" | |
242 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
243 env()->module_system()->Require("test"); | |
244 } | |
245 | |
246 TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) { | |
247 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
248 env()->module_system()); | |
249 env()->RegisterModule( | |
250 "test", | |
251 "var Event = require('event_bindings').Event;" | |
252 "var assert = requireNative('assert');" | |
253 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
254 "var e = new Event('myevent', undefined, eventOpts);" | |
255 "var cb = function() {};" | |
256 "var filters = {url: {hostSuffix: 'google.com'}};" | |
257 "var caught = false;" | |
258 "try {" | |
259 " e.addListener(cb, filters);" | |
260 "} catch (e) {" | |
261 " caught = true;" | |
262 "}" | |
263 "assert.AssertTrue(caught);"); | |
264 env()->module_system()->Require("test"); | |
265 } | |
266 | |
267 TEST_F(EventUnittest, MaxListeners) { | |
268 ModuleSystem::NativesEnabledScope natives_enabled_scope( | |
269 env()->module_system()); | |
270 env()->RegisterModule( | |
271 "test", | |
272 "var Event = require('event_bindings').Event;" | |
273 "var assert = requireNative('assert');" | |
274 "var eventOpts = {supportsListeners: true, maxListeners: 1};" | |
275 "var e = new Event('myevent', undefined, eventOpts);" | |
276 "var cb = function() {};" | |
277 "var caught = false;" | |
278 "try {" | |
279 " e.addListener(cb);" | |
280 "} catch (e) {" | |
281 " caught = true;" | |
282 "}" | |
283 "assert.AssertTrue(!caught);" | |
284 "try {" | |
285 " e.addListener(cb);" | |
286 "} catch (e) {" | |
287 " caught = true;" | |
288 "}" | |
289 "assert.AssertTrue(caught);"); | |
290 env()->module_system()->Require("test"); | |
291 } | |
292 | |
293 } // namespace | |
294 } // namespace extensions | |
OLD | NEW |