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 | 17 |
18 // Mock out the native handler for event_bindings. These mocks will fail if | 18 // Mock out the native handler for event_bindings. These mocks will fail if |
19 // any invariants maintained by the real event_bindings are broken. | 19 // any invariants maintained by the real event_bindings are broken. |
20 OverrideNativeHandler("event_bindings", | 20 OverrideNativeHandler("event_bindings", |
21 "var assert = requireNative('assert');" | 21 "var assert = requireNative('assert');" |
22 "var attachedListeners = exports.attachedListeners = {};" | 22 "var attachedListeners = exports.attachedListeners = {};" |
23 "var attachedFilteredListeners = " | |
24 " exports.attachedFilteredListeners = {};" | |
25 "var nextId = 0;" | |
26 "var idToName = {};" | |
27 | |
23 "exports.AttachEvent = function(eventName) {" | 28 "exports.AttachEvent = function(eventName) {" |
24 " assert.AssertFalse(!!attachedListeners[eventName]);" | 29 " assert.AssertFalse(!!attachedListeners[eventName]);" |
25 " attachedListeners[eventName] = 1;" | 30 " attachedListeners[eventName] = 1;" |
26 "};" | 31 "};" |
32 | |
27 "exports.DetachEvent = function(eventName) {" | 33 "exports.DetachEvent = function(eventName) {" |
28 " assert.AssertTrue(!!attachedListeners[eventName]);" | 34 " assert.AssertTrue(!!attachedListeners[eventName]);" |
29 " delete attachedListeners[eventName];" | 35 " delete attachedListeners[eventName];" |
36 "};" | |
37 | |
38 "exports.IsEventAttached = function(eventName) {" | |
39 " return !!attachedListeners[eventName];" | |
40 "};" | |
41 | |
42 "exports.AttachFilteredEvent = function(name, filter) {" | |
43 " var id = nextId++;" | |
44 " idToName[id] = name;" | |
45 " attachedFilteredListeners[name] =" | |
46 " attachedFilteredListeners[name] || [];" | |
47 " attachedFilteredListeners[name][id] = filter;" | |
48 " return id;" | |
49 "};" | |
50 | |
51 "exports.DetachFilteredEvent = function(id, manual) {" | |
52 " var i = attachedFilteredListeners[idToName[id]].indexOf(id);" | |
53 " attachedFilteredListeners[idToName[id]].splice(i, 1);" | |
54 "};" | |
55 | |
56 "exports.HasFilteredListener = function(name) {" | |
57 " return attachedFilteredListeners[name].length;" | |
30 "};"); | 58 "};"); |
31 OverrideNativeHandler("chrome_hidden", | 59 OverrideNativeHandler("chrome_hidden", |
32 "var chromeHidden = {};" | 60 "var chromeHidden = {};" |
33 "exports.GetChromeHidden = function() { return chromeHidden; };"); | 61 "exports.GetChromeHidden = function() { return chromeHidden; };"); |
34 } | 62 } |
35 }; | 63 }; |
36 | 64 |
37 TEST_F(EventUnittest, TestNothing) { | 65 TEST_F(EventUnittest, TestNothing) { |
38 ExpectNoAssertionsMade(); | 66 ExpectNoAssertionsMade(); |
39 } | 67 } |
40 | 68 |
41 TEST_F(EventUnittest, AddRemoveTwoListeners) { | 69 TEST_F(EventUnittest, AddRemoveTwoListeners) { |
42 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 70 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
43 RegisterModule("test", | 71 RegisterModule("test", |
44 "var assert = requireNative('assert');" | 72 "var assert = requireNative('assert');" |
45 "var event = require('event');" | 73 "var event = require('event');" |
46 "var eventBindings = requireNative('event_bindings');" | 74 "var eventBindings = requireNative('event_bindings');" |
47 "var myEvent = new event.Event('named-event');" | 75 "var myEvent = new event.Event('named-event');" |
48 "var cb1 = function() {};" | 76 "var cb1 = function() {};" |
49 "var cb2 = function() {};" | 77 "var cb2 = function() {};" |
50 "myEvent.addListener(cb1);" | 78 "myEvent.addListener(cb1);" |
51 "myEvent.addListener(cb2);" | 79 "myEvent.addListener(cb2);" |
52 "myEvent.removeListener(cb1);" | 80 "myEvent.removeListener(cb1);" |
53 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);" | 81 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);" |
54 "myEvent.removeListener(cb2);" | 82 "myEvent.removeListener(cb2);" |
55 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | 83 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); |
56 module_system_->Require("test"); | 84 module_system_->Require("test"); |
57 } | 85 } |
58 | 86 |
87 TEST_F(EventUnittest, OnUnloadDetachesAllListeners) { | |
88 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
89 RegisterModule("test", | |
90 "var assert = requireNative('assert');" | |
91 "var event = require('event');" | |
92 "var eventBindings = requireNative('event_bindings');" | |
93 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | |
94 "var myEvent = new event.Event('named-event');" | |
95 "var cb1 = function() {};" | |
96 "var cb2 = function() {};" | |
97 "myEvent.addListener(cb1);" | |
98 "myEvent.addListener(cb2);" | |
99 "chromeHidden.dispatchOnUnload();" | |
100 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | |
101 module_system_->Require("test"); | |
102 } | |
103 | |
104 TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) { | |
105 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
106 RegisterModule("test", | |
107 "var assert = requireNative('assert');" | |
108 "var event = require('event');" | |
109 "var eventBindings = requireNative('event_bindings');" | |
110 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | |
111 "var myEvent = new event.Event('named-event');" | |
112 "var cb1 = function() {};" | |
113 "myEvent.addListener(cb1);" | |
114 "myEvent.addListener(cb1);" | |
115 "chromeHidden.dispatchOnUnload();" | |
116 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); | |
117 module_system_->Require("test"); | |
118 } | |
119 | |
59 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { | 120 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { |
60 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | 121 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); |
61 RegisterModule("test", | 122 RegisterModule("test", |
62 "var event = require('event');" | 123 "var event = require('event');" |
63 "var eventOpts = {supportsRules: true};" | 124 "var eventOpts = {supportsRules: true};" |
64 "var assert = requireNative('assert');" | 125 "var assert = requireNative('assert');" |
65 "var caught = false;" | 126 "var caught = false;" |
66 "try {" | 127 "try {" |
67 " var myEvent = new event.Event(undefined, undefined, eventOpts);" | 128 " var myEvent = new event.Event(undefined, undefined, eventOpts);" |
68 "} catch (e) {" | 129 "} catch (e) {" |
(...skipping 10 matching lines...) Expand all Loading... | |
79 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" | 140 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" |
80 "var assert = requireNative('assert');" | 141 "var assert = requireNative('assert');" |
81 "var e = new event.Event('myevent');" | 142 "var e = new event.Event('myevent');" |
82 "var called = false;" | 143 "var called = false;" |
83 "e.addListener(function() { called = true; });" | 144 "e.addListener(function() { called = true; });" |
84 "chromeHidden.Event.dispatch('myevent', []);" | 145 "chromeHidden.Event.dispatch('myevent', []);" |
85 "assert.AssertTrue(called);"); | 146 "assert.AssertTrue(called);"); |
86 module_system_->Require("test"); | 147 module_system_->Require("test"); |
87 } | 148 } |
88 | 149 |
150 TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) { | |
151 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
152 RegisterModule("test", | |
153 "var event = require('event');" | |
154 "var assert = requireNative('assert');" | |
155 "var e = new event.Event('myevent');" | |
156 "var filter = {" | |
157 " 'hostSuffix': 'google.com'," | |
Matt Perry
2012/05/15 19:28:27
this filter should be url: {etc}
koz (OOO until 15th September)
2012/05/16 01:26:12
Fixed here and elsewhere where the 'url' field was
| |
158 "};" | |
159 "var caught = false;" | |
160 "try {" | |
161 " e.addListener(function() {}, filter);" | |
162 "} catch (e) {" | |
163 " caught = true;" | |
164 "}" | |
165 "assert.AssertTrue(caught);"); | |
166 module_system_->Require("test"); | |
167 } | |
168 | |
169 TEST_F(EventUnittest, FilteredEventsAttachment) { | |
170 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
171 RegisterModule("test", | |
172 "var event = require('event');" | |
173 "var assert = requireNative('assert');" | |
174 "var bindings = requireNative('event_bindings');" | |
175 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
176 "var e = new event.Event('myevent', undefined, eventOpts);" | |
177 "var cb = function() {};" | |
178 "var filters = {url: {hostSuffix: 'google.com'}};" | |
179 "e.addListener(cb, filters);" | |
180 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
181 "e.removeListener(cb);" | |
182 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
183 module_system_->Require("test"); | |
184 } | |
185 | |
186 TEST_F(EventUnittest, DetachFilteredEvent) { | |
187 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
188 RegisterModule("test", | |
189 "var event = require('event');" | |
190 "var assert = requireNative('assert');" | |
191 "var bindings = requireNative('event_bindings');" | |
192 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
193 "var e = new event.Event('myevent', undefined, eventOpts);" | |
194 "var cb1 = function() {};" | |
195 "var cb2 = function() {};" | |
196 "var filters = {url: {hostSuffix: 'google.com'}};" | |
197 "e.addListener(cb1, filters);" | |
198 "e.addListener(cb2, filters);" | |
199 "e.detach();" | |
200 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
201 module_system_->Require("test"); | |
202 } | |
203 | |
204 TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) { | |
205 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); | |
206 RegisterModule("test", | |
207 "var event = require('event');" | |
208 "var assert = requireNative('assert');" | |
209 "var bindings = requireNative('event_bindings');" | |
210 "var eventOpts = {supportsListeners: true, supportsFilters: true};" | |
211 "var e = new event.Event('myevent', undefined, eventOpts);" | |
212 "var cb = function() {};" | |
213 "var filters = {url: {hostSuffix: 'google.com'}};" | |
214 "e.addListener(cb, filters);" | |
215 "e.addListener(cb, filters);" | |
216 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
217 "e.removeListener(cb);" | |
218 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" | |
219 "e.removeListener(cb);" | |
220 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); | |
221 module_system_->Require("test"); | |
222 } | |
223 | |
89 } // namespace | 224 } // namespace |
OLD | NEW |