| 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 |