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

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

Issue 10381143: Add filtered event support to event.js. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: respond to comments Created 8 years, 7 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 17
18 // Mock out the native handler for event_bindings. These mocks will fail if 18 // Mock out the native handler for event_bindings. These mocks will fail if
19 // any invariants maintained by the real event_bindings are broken. 19 // any invariants maintained by the real event_bindings are broken.
20 OverrideNativeHandler("event_bindings", 20 OverrideNativeHandler("event_bindings",
21 "var assert = requireNative('assert');" 21 "var assert = requireNative('assert');"
22 "var attachedListeners = exports.attachedListeners = {};" 22 "var attachedListeners = exports.attachedListeners = {};"
23 "var attachedFilteredListeners = "
24 " exports.attachedFilteredListeners = {};"
25 "var nextId = 0;"
26 "var idToName = {};"
27
23 "exports.AttachEvent = function(eventName) {" 28 "exports.AttachEvent = function(eventName) {"
24 " assert.AssertFalse(!!attachedListeners[eventName]);" 29 " assert.AssertFalse(!!attachedListeners[eventName]);"
25 " attachedListeners[eventName] = 1;" 30 " attachedListeners[eventName] = 1;"
26 "};" 31 "};"
32
27 "exports.DetachEvent = function(eventName) {" 33 "exports.DetachEvent = function(eventName) {"
28 " assert.AssertTrue(!!attachedListeners[eventName]);" 34 " assert.AssertTrue(!!attachedListeners[eventName]);"
29 " delete attachedListeners[eventName];" 35 " delete attachedListeners[eventName];"
36 "};"
37
38 "exports.IsEventAttached = function(eventName) {"
39 " return !!attachedListeners[eventName];"
40 "};"
41
42 "exports.AttachFilteredEvent = function(name, filter) {"
43 " var id = nextId++;"
44 " idToName[id] = name;"
45 " attachedFilteredListeners[name] ="
46 " attachedFilteredListeners[name] || [];"
47 " attachedFilteredListeners[name][id] = filter;"
48 " return id;"
49 "};"
50
51 "exports.DetachFilteredEvent = function(id, manual) {"
52 " var i = attachedFilteredListeners[idToName[id]].indexOf(id);"
53 " attachedFilteredListeners[idToName[id]].splice(i, 1);"
54 "};"
55
56 "exports.HasFilteredListener = function(name) {"
57 " return attachedFilteredListeners[name].length;"
30 "};"); 58 "};");
31 OverrideNativeHandler("chrome_hidden", 59 OverrideNativeHandler("chrome_hidden",
32 "var chromeHidden = {};" 60 "var chromeHidden = {};"
33 "exports.GetChromeHidden = function() { return chromeHidden; };"); 61 "exports.GetChromeHidden = function() { return chromeHidden; };");
34 } 62 }
35 }; 63 };
36 64
37 TEST_F(EventUnittest, TestNothing) { 65 TEST_F(EventUnittest, TestNothing) {
38 ExpectNoAssertionsMade(); 66 ExpectNoAssertionsMade();
39 } 67 }
40 68
41 TEST_F(EventUnittest, AddRemoveTwoListeners) { 69 TEST_F(EventUnittest, AddRemoveTwoListeners) {
42 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 70 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
43 RegisterModule("test", 71 RegisterModule("test",
44 "var assert = requireNative('assert');" 72 "var assert = requireNative('assert');"
45 "var event = require('event');" 73 "var event = require('event');"
46 "var eventBindings = requireNative('event_bindings');" 74 "var eventBindings = requireNative('event_bindings');"
47 "var myEvent = new event.Event('named-event');" 75 "var myEvent = new event.Event('named-event');"
48 "var cb1 = function() {};" 76 "var cb1 = function() {};"
49 "var cb2 = function() {};" 77 "var cb2 = function() {};"
50 "myEvent.addListener(cb1);" 78 "myEvent.addListener(cb1);"
51 "myEvent.addListener(cb2);" 79 "myEvent.addListener(cb2);"
52 "myEvent.removeListener(cb1);" 80 "myEvent.removeListener(cb1);"
53 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);" 81 "assert.AssertTrue(!!eventBindings.attachedListeners['named-event']);"
54 "myEvent.removeListener(cb2);" 82 "myEvent.removeListener(cb2);"
55 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);"); 83 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
56 module_system_->Require("test"); 84 module_system_->Require("test");
57 } 85 }
58 86
87 TEST_F(EventUnittest, OnUnloadDetachesAllListeners) {
88 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
89 RegisterModule("test",
90 "var assert = requireNative('assert');"
91 "var event = require('event');"
92 "var eventBindings = requireNative('event_bindings');"
93 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
94 "var myEvent = new event.Event('named-event');"
95 "var cb1 = function() {};"
96 "var cb2 = function() {};"
97 "myEvent.addListener(cb1);"
98 "myEvent.addListener(cb2);"
99 "chromeHidden.dispatchOnUnload();"
100 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
101 module_system_->Require("test");
102 }
103
104 TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) {
105 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
106 RegisterModule("test",
107 "var assert = requireNative('assert');"
108 "var event = require('event');"
109 "var eventBindings = requireNative('event_bindings');"
110 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
111 "var myEvent = new event.Event('named-event');"
112 "var cb1 = function() {};"
113 "myEvent.addListener(cb1);"
114 "myEvent.addListener(cb1);"
115 "chromeHidden.dispatchOnUnload();"
116 "assert.AssertFalse(!!eventBindings.attachedListeners['named-event']);");
117 module_system_->Require("test");
118 }
119
59 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { 120 TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) {
60 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 121 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
61 RegisterModule("test", 122 RegisterModule("test",
62 "var event = require('event');" 123 "var event = require('event');"
63 "var eventOpts = {supportsRules: true};" 124 "var eventOpts = {supportsRules: true};"
64 "var assert = requireNative('assert');" 125 "var assert = requireNative('assert');"
65 "var caught = false;" 126 "var caught = false;"
66 "try {" 127 "try {"
67 " var myEvent = new event.Event(undefined, undefined, eventOpts);" 128 " var myEvent = new event.Event(undefined, undefined, eventOpts);"
68 "} catch (e) {" 129 "} catch (e) {"
(...skipping 10 matching lines...) Expand all
79 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();" 140 "var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();"
80 "var assert = requireNative('assert');" 141 "var assert = requireNative('assert');"
81 "var e = new event.Event('myevent');" 142 "var e = new event.Event('myevent');"
82 "var called = false;" 143 "var called = false;"
83 "e.addListener(function() { called = true; });" 144 "e.addListener(function() { called = true; });"
84 "chromeHidden.Event.dispatch('myevent', []);" 145 "chromeHidden.Event.dispatch('myevent', []);"
85 "assert.AssertTrue(called);"); 146 "assert.AssertTrue(called);");
86 module_system_->Require("test"); 147 module_system_->Require("test");
87 } 148 }
88 149
150 TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) {
151 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
152 RegisterModule("test",
153 "var event = require('event');"
154 "var assert = requireNative('assert');"
155 "var e = new event.Event('myevent');"
156 "var filter = {"
157 " url: [{hostSuffix: 'google.com'}],"
Matt Perry 2012/05/16 20:45:00 url should not be an array, it should be a single
koz (OOO until 15th September) 2012/05/18 04:50:07 Done.
koz (OOO until 15th September) 2012/05/21 01:27:50 Thinking about this a bit I wonder if this is real
Matt Perry 2012/05/22 19:20:52 That's a good point. I was just trying to make it
battre 2012/05/22 20:19:45 What do you think of providing 'url' and 'urls'.
Matt Perry 2012/05/22 20:43:59 That sounds like a good compromise to me.
158 "};"
159 "var caught = false;"
160 "try {"
161 " e.addListener(function() {}, filter);"
162 "} catch (e) {"
163 " caught = true;"
164 "}"
165 "assert.AssertTrue(caught);");
166 module_system_->Require("test");
167 }
168
169 TEST_F(EventUnittest, FilteredEventsAttachment) {
170 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
171 RegisterModule("test",
172 "var event = require('event');"
173 "var assert = requireNative('assert');"
174 "var bindings = requireNative('event_bindings');"
175 "var eventOpts = {supportsListeners: true, supportsFilters: true};"
176 "var e = new event.Event('myevent', undefined, eventOpts);"
177 "var cb = function() {};"
178 "var filters = {url: [{hostSuffix: 'google.com'}]};"
179 "e.addListener(cb, filters);"
180 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
181 "e.removeListener(cb);"
182 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
183 module_system_->Require("test");
184 }
185
186 TEST_F(EventUnittest, DetachFilteredEvent) {
187 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
188 RegisterModule("test",
189 "var event = require('event');"
190 "var assert = requireNative('assert');"
191 "var bindings = requireNative('event_bindings');"
192 "var eventOpts = {supportsListeners: true, supportsFilters: true};"
193 "var e = new event.Event('myevent', undefined, eventOpts);"
194 "var cb1 = function() {};"
195 "var cb2 = function() {};"
196 "var filters = {url: [{hostSuffix: 'google.com'}]};"
197 "e.addListener(cb1, filters);"
198 "e.addListener(cb2, filters);"
199 "e.detach();"
200 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
201 module_system_->Require("test");
202 }
203
204 TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) {
205 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
206 RegisterModule("test",
207 "var event = require('event');"
208 "var assert = requireNative('assert');"
209 "var bindings = requireNative('event_bindings');"
210 "var eventOpts = {supportsListeners: true, supportsFilters: true};"
211 "var e = new event.Event('myevent', undefined, eventOpts);"
212 "var cb = function() {};"
213 "var filters = {url: [{hostSuffix: 'google.com'}]};"
214 "e.addListener(cb, filters);"
215 "e.addListener(cb, filters);"
216 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
217 "e.removeListener(cb);"
218 "assert.AssertTrue(bindings.HasFilteredListener('myevent'));"
219 "e.removeListener(cb);"
220 "assert.AssertFalse(bindings.HasFilteredListener('myevent'));");
221 module_system_->Require("test");
222 }
223
224 TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) {
225 ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get());
226 RegisterModule("test",
227 "var event = require('event');"
228 "var assert = requireNative('assert');"
229 "var eventOpts = {supportsListeners: true, supportsFilters: true};"
230 "var e = new event.Event('myevent', undefined, eventOpts);"
231 "var cb = function() {};"
232 "var filters = {url: {hostSuffix: 'google.com'}};"
233 "var caught = false;"
234 "try {"
235 " e.addListener(cb, filters);"
236 "} catch (e) {"
237 " caught = true;"
238 "}"
239 "assert.AssertTrue(caught);");
240 module_system_->Require("test");
241 }
242
89 } // namespace 243 } // namespace
OLDNEW
« no previous file with comments | « no previous file | chrome/renderer/resources/extensions/event.js » ('j') | chrome/renderer/resources/extensions/event.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698