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