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