Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(151)

Side by Side Diff: chrome/renderer/extensions/event_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698