15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/module_system_test.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/renderer_resources.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EventUnittest : public ModuleSystemTest { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystemTest::SetUp(); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RegisterModule("event_bindings", IDR_EVENT_BINDINGS_JS); 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RegisterModule("json_schema", IDR_JSON_SCHEMA_JS); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("schemaUtils", IDR_SCHEMA_UTILS_JS); 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) RegisterModule("unload_event", IDR_UNLOAD_EVENT_JS); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("utils", IDR_UTILS_JS); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mock out the native handler for event_bindings. These mocks will fail if 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any invariants maintained by the real event_bindings are broken. 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OverrideNativeHandler("event_natives", 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var attachedListeners = exports.attachedListeners = {};" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var attachedFilteredListeners = " 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " exports.attachedFilteredListeners = {};" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var nextId = 0;" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var idToName = {};" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exports.AttachEvent = function(eventName) {" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " assert.AssertFalse(!!attachedListeners[eventName]);" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " attachedListeners[eventName] = 1;" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exports.DetachEvent = function(eventName) {" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " assert.AssertTrue(!!attachedListeners[eventName]);" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " delete attachedListeners[eventName];" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exports.IsEventAttached = function(eventName) {" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return !!attachedListeners[eventName];" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exports.AttachFilteredEvent = function(name, filters) {" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var id = nextId++;" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " idToName[id] = name;" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " attachedFilteredListeners[name] =" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " attachedFilteredListeners[name] || [];" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " attachedFilteredListeners[name][id] = filters;" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return id;" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exports.DetachFilteredEvent = function(id, manual) {" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " var i = attachedFilteredListeners[idToName[id]].indexOf(id);" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " attachedFilteredListeners[idToName[id]].splice(i, 1);" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exports.HasFilteredListener = function(name) {" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return attachedFilteredListeners[name].length;" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};"); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OverrideNativeHandler("sendRequest", 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exports.sendRequest = function() {};"); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OverrideNativeHandler("apiDefinitions", 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) "exports.GetExtensionAPIDefinitionsForTest = function() {};"); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OverrideNativeHandler("logging", 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "exports.DCHECK = function() {};"); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverrideNativeHandler("schema_registry", 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "exports.GetSchema = function() {};"); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, TestNothing) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNoAssertionsMade(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, AddRemoveTwoListeners) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var eventNatives = requireNative('event_natives');" 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var myEvent = new Event('named-event');" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb1 = function() {};" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb2 = function() {};" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "myEvent.addListener(cb1);" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "myEvent.addListener(cb2);" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "myEvent.removeListener(cb1);" 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "assert.AssertTrue(!!eventNatives.attachedListeners['named-event']);" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "myEvent.removeListener(cb2);" 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, OnUnloadDetachesAllListeners) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var eventNatives = requireNative('event_natives');" 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var myEvent = new Event('named-event');" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb1 = function() {};" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb2 = function() {};" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "myEvent.addListener(cb1);" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "myEvent.addListener(cb2);" 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "require('unload_event').dispatch();" 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, OnUnloadDetachesAllListenersEvenDupes) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var eventNatives = requireNative('event_natives');" 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var myEvent = new Event('named-event');" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb1 = function() {};" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "myEvent.addListener(cb1);" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "myEvent.addListener(cb1);" 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "require('unload_event').dispatch();" 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "assert.AssertFalse(!!eventNatives.attachedListeners['named-event']);"); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, EventsThatSupportRulesMustHaveAName) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var eventOpts = {supportsRules: true};" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var caught = false;" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "try {" 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " var myEvent = new Event(undefined, undefined, eventOpts);" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} catch (e) {" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " caught = true;" 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}" 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(caught);"); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, NamedEventDispatch) { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var dispatchEvent = require('event_bindings').dispatchEvent;" 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var e = new Event('myevent');" 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var called = false;" 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.addListener(function() { called = true; });" 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "dispatchEvent('myevent', []);" 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(called);"); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, AddListenerWithFiltersThrowsErrorByDefault) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var e = new Event('myevent');" 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var filter = [{" 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " url: {hostSuffix: 'google.com'}," 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}];" 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var caught = false;" 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "try {" 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " e.addListener(function() {}, filter);" 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} catch (e) {" 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " caught = true;" 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}" 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(caught);"); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, FilteredEventsAttachment) { 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var bindings = requireNative('event_natives');" 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var eventOpts = {supportsListeners: true, supportsFilters: true};" 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var e = new Event('myevent', undefined, eventOpts);" 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb = function() {};" 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var filters = {url: [{hostSuffix: 'google.com'}]};" 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.addListener(cb, filters);" 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.removeListener(cb);" 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, DetachFilteredEvent) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var bindings = requireNative('event_natives');" 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var eventOpts = {supportsListeners: true, supportsFilters: true};" 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var e = new Event('myevent', undefined, eventOpts);" 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb1 = function() {};" 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb2 = function() {};" 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var filters = {url: [{hostSuffix: 'google.com'}]};" 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.addListener(cb1, filters);" 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.addListener(cb2, filters);" 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.detach_();" 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, AttachAndRemoveSameFilteredEventListener) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var bindings = requireNative('event_natives');" 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var eventOpts = {supportsListeners: true, supportsFilters: true};" 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var e = new Event('myevent', undefined, eventOpts);" 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb = function() {};" 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var filters = {url: [{hostSuffix: 'google.com'}]};" 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.addListener(cb, filters);" 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.addListener(cb, filters);" 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.removeListener(cb);" 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(bindings.HasFilteredListener('myevent'));" 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "e.removeListener(cb);" 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertFalse(bindings.HasFilteredListener('myevent'));"); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, AddingFilterWithUrlFieldNotAListThrowsException) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var eventOpts = {supportsListeners: true, supportsFilters: true};" 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var e = new Event('myevent', undefined, eventOpts);" 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb = function() {};" 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var filters = {url: {hostSuffix: 'google.com'}};" 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var caught = false;" 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "try {" 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " e.addListener(cb, filters);" 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} catch (e) {" 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " caught = true;" 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}" 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(caught);"); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(EventUnittest, MaxListeners) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope(module_system_.get()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegisterModule("test", 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "var Event = require('event_bindings').Event;" 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var assert = requireNative('assert');" 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var eventOpts = {supportsListeners: true, maxListeners: 1};" 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "var e = new Event('myevent', undefined, eventOpts);" 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var cb = function() {};" 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "var caught = false;" 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "try {" 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " e.addListener(cb);" 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} catch (e) {" 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " caught = true;" 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}" 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(!caught);" 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "try {" 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " e.addListener(cb);" 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} catch (e) {" 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " caught = true;" 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}" 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "assert.AssertTrue(caught);"); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_system_->Require("test"); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 276