blob: 59694623dcaad5e590c028b756b67ff57dc4ec87 [file] [log] [blame]
[email protected]582f6e92014-07-16 23:39:151// Copyright 2014 The Chromium Authors. All rights reserved.
[email protected]11844fa2012-05-10 00:35:592// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]a0ed2682013-09-06 08:41:075#include "extensions/common/extension_urls.h"
[email protected]582f6e92014-07-16 23:39:156#include "extensions/renderer/module_system_test.h"
[email protected]8f857ef82014-06-04 23:46:167#include "grit/extensions_renderer_resources.h"
[email protected]11844fa2012-05-10 00:35:598
[email protected]8fe74bf2012-08-07 21:08:429namespace extensions {
[email protected]11844fa2012-05-10 00:35:5910namespace {
11
12class EventUnittest : public ModuleSystemTest {
dchengf9afb372014-10-27 21:43:1413 void SetUp() override {
[email protected]11844fa2012-05-10 00:35:5914 ModuleSystemTest::SetUp();
[email protected]11844fa2012-05-10 00:35:5915
[email protected]d9f51dad2014-07-09 05:39:3816 env()->RegisterModule(kEventBindings, IDR_EVENT_BINDINGS_JS);
17 env()->RegisterModule("json_schema", IDR_JSON_SCHEMA_JS);
18 env()->RegisterModule(kSchemaUtils, IDR_SCHEMA_UTILS_JS);
19 env()->RegisterModule("uncaught_exception_handler",
20 IDR_UNCAUGHT_EXCEPTION_HANDLER_JS);
[email protected]d9f51dad2014-07-09 05:39:3821 env()->RegisterModule("utils", IDR_UTILS_JS);
[email protected]11844fa2012-05-10 00:35:5922
23 // Mock out the native handler for event_bindings. These mocks will fail if
24 // any invariants maintained by the real event_bindings are broken.
[email protected]d9f51dad2014-07-09 05:39:3825 env()->OverrideNativeHandler(
26 "event_natives",
[email protected]11844fa2012-05-10 00:35:5927 "var assert = requireNative('assert');"
rdevlin.cronin83a4b3a2015-10-28 21:43:5828 "exports.$set('attachedListeners', {});"
29 "var attachedListeners = exports.attachedListeners;"
30 "exports.$set('attachedFilteredListeners', {});"
31 "var attachedFilteredListeners = exports.attachedFilteredListeners;"
[email protected]d9e559d2012-07-05 01:04:5732 "var nextId = 0;"
33 "var idToName = {};"
rdevlin.cronin83a4b3a2015-10-28 21:43:5834 "exports.$set('AttachEvent', function(eventName) {"
[email protected]11844fa2012-05-10 00:35:5935 " assert.AssertFalse(!!attachedListeners[eventName]);"
36 " attachedListeners[eventName] = 1;"
rdevlin.cronin83a4b3a2015-10-28 21:43:5837 "});"
38 "exports.$set('DetachEvent', function(eventName) {"
[email protected]11844fa2012-05-10 00:35:5939 " assert.AssertTrue(!!attachedListeners[eventName]);"
40 " delete attachedListeners[eventName];"
rdevlin.cronin83a4b3a2015-10-28 21:43:5841 "});"
42 "exports.$set('IsEventAttached', function(eventName) {"
[email protected]d9e559d2012-07-05 01:04:5743 " return !!attachedListeners[eventName];"
rdevlin.cronin83a4b3a2015-10-28 21:43:5844 "});"
45 "exports.$set('AttachFilteredEvent', function(name, filters) {"
[email protected]d9e559d2012-07-05 01:04:5746 " var id = nextId++;"
47 " idToName[id] = name;"
48 " attachedFilteredListeners[name] ="
49 " attachedFilteredListeners[name] || [];"
50 " attachedFilteredListeners[name][id] = filters;"
51 " return id;"
rdevlin.cronin83a4b3a2015-10-28 21:43:5852 "});"
53 "exports.$set('DetachFilteredEvent', function(id, manual) {"
[email protected]d9e559d2012-07-05 01:04:5754 " var i = attachedFilteredListeners[idToName[id]].indexOf(id);"
55 " attachedFilteredListeners[idToName[id]].splice(i, 1);"
rdevlin.cronin83a4b3a2015-10-28 21:43:5856 "});"
57 "exports.$set('HasFilteredListener', function(name) {"
[email protected]d9e559d2012-07-05 01:04:5758 " return attachedFilteredListeners[name].length;"
rdevlin.cronin83a4b3a2015-10-28 21:43:5859 "});");
[email protected]d9f51dad2014-07-09 05:39:3860 env()->OverrideNativeHandler("sendRequest",
rdevlin.cronin83a4b3a2015-10-28 21:43:5861 "exports.$set('sendRequest', function() {});");
[email protected]d9f51dad2014-07-09 05:39:3862 env()->OverrideNativeHandler(
63 "apiDefinitions",
rdevlin.cronin83a4b3a2015-10-28 21:43:5864 "exports.$set('GetExtensionAPIDefinitionsForTest', function() {});");
65 env()->OverrideNativeHandler("logging",
66 "exports.$set('DCHECK', function() {});");
[email protected]d9f51dad2014-07-09 05:39:3867 env()->OverrideNativeHandler("schema_registry",
rdevlin.cronin83a4b3a2015-10-28 21:43:5868 "exports.$set('GetSchema', function() {});");
[email protected]11844fa2012-05-10 00:35:5969 }
70};
71
72TEST_F(EventUnittest, TestNothing) {
73 ExpectNoAssertionsMade();
74}
75
76TEST_F(EventUnittest, AddRemoveTwoListeners) {
[email protected]2a356872014-02-21 23:18:5277 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:3878 env()->module_system());
79 env()->RegisterModule(
80 "test",
[email protected]11844fa2012-05-10 00:35:5981 "var assert = requireNative('assert');"
[email protected]f8d87d32013-06-06 02:51:2982 "var Event = require('event_bindings').Event;"
83 "var eventNatives = requireNative('event_natives');"
[email protected]4f1633f2013-03-09 14:26:2484 "var myEvent = new Event('named-event');"
[email protected]11844fa2012-05-10 00:35:5985 "var cb1 = function() {};"
86 "var cb2 = function() {};"
87 "myEvent.addListener(cb1);"
88 "myEvent.addListener(cb2);"
89 "myEvent.removeListener(cb1);"
[email protected]f8d87d32013-06-06 02:51:2990 "assert.AssertTrue(!!eventNatives.attachedListeners['named-event']);"
[email protected]11844fa2012-05-10 00:35:5991 "myEvent.removeListener(cb2);"
[email protected]f8d87d32013-06-06 02:51:2992 "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);");
[email protected]d9f51dad2014-07-09 05:39:3893 env()->module_system()->Require("test");
[email protected]11844fa2012-05-10 00:35:5994}
95
[email protected]11844fa2012-05-10 00:35:5996TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) {
[email protected]2a356872014-02-21 23:18:5297 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:3898 env()->module_system());
99 env()->RegisterModule(
100 "test",
[email protected]f8d87d32013-06-06 02:51:29101 "var Event = require('event_bindings').Event;"
[email protected]11844fa2012-05-10 00:35:59102 "var eventOpts = {supportsRules: true};"
103 "var assert = requireNative('assert');"
104 "var caught = false;"
105 "try {"
[email protected]4f1633f2013-03-09 14:26:24106 " var myEvent = new Event(undefined, undefined, eventOpts);"
[email protected]11844fa2012-05-10 00:35:59107 "} catch (e) {"
108 " caught = true;"
109 "}"
110 "assert.AssertTrue(caught);");
[email protected]d9f51dad2014-07-09 05:39:38111 env()->module_system()->Require("test");
[email protected]11844fa2012-05-10 00:35:59112}
113
114TEST_F(EventUnittest, NamedEventDispatch) {
[email protected]2a356872014-02-21 23:18:52115 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:38116 env()->module_system());
117 env()->RegisterModule(
118 "test",
[email protected]f8d87d32013-06-06 02:51:29119 "var Event = require('event_bindings').Event;"
120 "var dispatchEvent = require('event_bindings').dispatchEvent;"
[email protected]11844fa2012-05-10 00:35:59121 "var assert = requireNative('assert');"
[email protected]4f1633f2013-03-09 14:26:24122 "var e = new Event('myevent');"
[email protected]11844fa2012-05-10 00:35:59123 "var called = false;"
124 "e.addListener(function() { called = true; });"
[email protected]f8d87d32013-06-06 02:51:29125 "dispatchEvent('myevent', []);"
[email protected]11844fa2012-05-10 00:35:59126 "assert.AssertTrue(called);");
[email protected]d9f51dad2014-07-09 05:39:38127 env()->module_system()->Require("test");
[email protected]11844fa2012-05-10 00:35:59128}
129
[email protected]d9e559d2012-07-05 01:04:57130TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) {
[email protected]2a356872014-02-21 23:18:52131 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:38132 env()->module_system());
133 env()->RegisterModule("test",
134 "var Event = require('event_bindings').Event;"
135 "var assert = requireNative('assert');"
136 "var e = new Event('myevent');"
137 "var filter = [{"
138 " url: {hostSuffix: 'google.com'},"
139 "}];"
140 "var caught = false;"
141 "try {"
142 " e.addListener(function() {}, filter);"
143 "} catch (e) {"
144 " caught = true;"
145 "}"
146 "assert.AssertTrue(caught);");
147 env()->module_system()->Require("test");
[email protected]d9e559d2012-07-05 01:04:57148}
149
150TEST_F(EventUnittest, FilteredEventsAttachment) {
[email protected]2a356872014-02-21 23:18:52151 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:38152 env()->module_system());
153 env()->RegisterModule(
154 "test",
[email protected]f8d87d32013-06-06 02:51:29155 "var Event = require('event_bindings').Event;"
[email protected]d9e559d2012-07-05 01:04:57156 "var assert = requireNative('assert');"
[email protected]f8d87d32013-06-06 02:51:29157 "var bindings = requireNative('event_natives');"
[email protected]d9e559d2012-07-05 01:04:57158 "var eventOpts = {supportsListeners: true, supportsFilters: true};"
[email protected]4f1633f2013-03-09 14:26:24159 "var e = new Event('myevent', undefined, eventOpts);"
[email protected]d9e559d2012-07-05 01:04:57160 "var cb = function() {};"
161 "var filters = {url: [{hostSuffix: 'google.com'}]};"
162 "e.addListener(cb, filters);"
163 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
164 "e.removeListener(cb);"
165 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
[email protected]d9f51dad2014-07-09 05:39:38166 env()->module_system()->Require("test");
[email protected]d9e559d2012-07-05 01:04:57167}
168
169TEST_F(EventUnittest, DetachFilteredEvent) {
[email protected]2a356872014-02-21 23:18:52170 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:38171 env()->module_system());
172 env()->RegisterModule(
173 "test",
[email protected]f8d87d32013-06-06 02:51:29174 "var Event = require('event_bindings').Event;"
[email protected]d9e559d2012-07-05 01:04:57175 "var assert = requireNative('assert');"
[email protected]f8d87d32013-06-06 02:51:29176 "var bindings = requireNative('event_natives');"
[email protected]d9e559d2012-07-05 01:04:57177 "var eventOpts = {supportsListeners: true, supportsFilters: true};"
[email protected]4f1633f2013-03-09 14:26:24178 "var e = new Event('myevent', undefined, eventOpts);"
[email protected]d9e559d2012-07-05 01:04:57179 "var cb1 = function() {};"
180 "var cb2 = function() {};"
181 "var filters = {url: [{hostSuffix: 'google.com'}]};"
182 "e.addListener(cb1, filters);"
183 "e.addListener(cb2, filters);"
[email protected]fe35d54c2014-01-29 01:54:54184 "privates(e).impl.detach_();"
[email protected]d9e559d2012-07-05 01:04:57185 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
[email protected]d9f51dad2014-07-09 05:39:38186 env()->module_system()->Require("test");
[email protected]d9e559d2012-07-05 01:04:57187}
188
189TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) {
[email protected]2a356872014-02-21 23:18:52190 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:38191 env()->module_system());
192 env()->RegisterModule(
193 "test",
[email protected]f8d87d32013-06-06 02:51:29194 "var Event = require('event_bindings').Event;"
[email protected]d9e559d2012-07-05 01:04:57195 "var assert = requireNative('assert');"
[email protected]f8d87d32013-06-06 02:51:29196 "var bindings = requireNative('event_natives');"
[email protected]d9e559d2012-07-05 01:04:57197 "var eventOpts = {supportsListeners: true, supportsFilters: true};"
[email protected]4f1633f2013-03-09 14:26:24198 "var e = new Event('myevent', undefined, eventOpts);"
[email protected]d9e559d2012-07-05 01:04:57199 "var cb = function() {};"
200 "var filters = {url: [{hostSuffix: 'google.com'}]};"
201 "e.addListener(cb, filters);"
202 "e.addListener(cb, filters);"
203 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
204 "e.removeListener(cb);"
205 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
206 "e.removeListener(cb);"
207 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
[email protected]d9f51dad2014-07-09 05:39:38208 env()->module_system()->Require("test");
[email protected]d9e559d2012-07-05 01:04:57209}
210
211TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) {
[email protected]2a356872014-02-21 23:18:52212 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:38213 env()->module_system());
214 env()->RegisterModule(
215 "test",
[email protected]f8d87d32013-06-06 02:51:29216 "var Event = require('event_bindings').Event;"
[email protected]d9e559d2012-07-05 01:04:57217 "var assert = requireNative('assert');"
218 "var eventOpts = {supportsListeners: true, supportsFilters: true};"
[email protected]4f1633f2013-03-09 14:26:24219 "var e = new Event('myevent', undefined, eventOpts);"
[email protected]d9e559d2012-07-05 01:04:57220 "var cb = function() {};"
221 "var filters = {url: {hostSuffix: 'google.com'}};"
222 "var caught = false;"
223 "try {"
224 " e.addListener(cb, filters);"
225 "} catch (e) {"
226 " caught = true;"
227 "}"
228 "assert.AssertTrue(caught);");
[email protected]d9f51dad2014-07-09 05:39:38229 env()->module_system()->Require("test");
[email protected]d9e559d2012-07-05 01:04:57230}
231
[email protected]452b36f2012-07-12 05:27:54232TEST_F(EventUnittest, MaxListeners) {
[email protected]2a356872014-02-21 23:18:52233 ModuleSystem::NativesEnabledScope natives_enabled_scope(
[email protected]d9f51dad2014-07-09 05:39:38234 env()->module_system());
235 env()->RegisterModule(
236 "test",
[email protected]f8d87d32013-06-06 02:51:29237 "var Event = require('event_bindings').Event;"
[email protected]452b36f2012-07-12 05:27:54238 "var assert = requireNative('assert');"
239 "var eventOpts = {supportsListeners: true, maxListeners: 1};"
[email protected]4f1633f2013-03-09 14:26:24240 "var e = new Event('myevent', undefined, eventOpts);"
[email protected]452b36f2012-07-12 05:27:54241 "var cb = function() {};"
242 "var caught = false;"
243 "try {"
244 " e.addListener(cb);"
245 "} catch (e) {"
246 " caught = true;"
247 "}"
248 "assert.AssertTrue(!caught);"
249 "try {"
250 " e.addListener(cb);"
251 "} catch (e) {"
252 " caught = true;"
253 "}"
254 "assert.AssertTrue(caught);");
[email protected]d9f51dad2014-07-09 05:39:38255 env()->module_system()->Require("test");
[email protected]452b36f2012-07-12 05:27:54256}
257
[email protected]11844fa2012-05-10 00:35:59258} // namespace
[email protected]8fe74bf2012-08-07 21:08:42259} // namespace extensions