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

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: split out event_filter changes Created 8 years, 6 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("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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698