123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- 'use strict';
- const { LoaderWithHookedConsole } = require("sdk/test/loader");
- // Exposing private methods as public in order to test
- const EventEmitter = require('sdk/deprecated/events').EventEmitter.compose({
- listeners: function(type) this._listeners(type),
- emit: function() this._emit.apply(this, arguments),
- emitOnObject: function() this._emitOnObject.apply(this, arguments),
- removeAllListeners: function(type) this._removeAllListeners(type)
- });
- exports['test:add listeners'] = function(assert) {
- let e = new EventEmitter();
- let events_new_listener_emited = [];
- let times_hello_emited = 0;
- e.on("newListener", function (event, listener) {
- events_new_listener_emited.push(event)
- })
- e.on("hello", function (a, b) {
- times_hello_emited += 1
- assert.equal("a", a)
- assert.equal("b", b)
- assert.equal(this, e, '`this` pseudo-variable is bound to instance');
- })
- e.emit("hello", "a", "b")
- };
- exports['test:removeListener'] = function(assert) {
- let count = 0;
- function listener1 () {
- count++;
- }
- function listener2 () {
- count++;
- }
- // test adding and removing listener
- let e1 = new EventEmitter();
- assert.equal(0, e1.listeners('hello').length);
- e1.on("hello", listener1);
- assert.equal(1, e1.listeners('hello').length);
- assert.equal(listener1, e1.listeners('hello')[0]);
- e1.removeListener("hello", listener1);
- assert.equal(0, e1.listeners('hello').length);
- e1.emit("hello", "");
- assert.equal(0, count);
- // test adding one listener and removing another which was not added
- let e2 = new EventEmitter();
- assert.equal(0, e2.listeners('hello').length);
- e2.on("hello", listener1);
- assert.equal(1, e2.listeners('hello').length);
- e2.removeListener("hello", listener2);
- assert.equal(1, e2.listeners('hello').length);
- assert.equal(listener1, e2.listeners('hello')[0]);
- e2.emit("hello", "");
- assert.equal(1, count);
- // test adding 2 listeners, and removing one
- let e3 = new EventEmitter();
- assert.equal(0, e3.listeners('hello').length);
- e3.on("hello", listener1);
- assert.equal(1, e3.listeners('hello').length);
- e3.on("hello", listener2);
- assert.equal(2, e3.listeners('hello').length);
- e3.removeListener("hello", listener1);
- assert.equal(1, e3.listeners('hello').length);
- assert.equal(listener2, e3.listeners('hello')[0]);
- e3.emit("hello", "");
- assert.equal(2, count);
- };
- exports['test:removeAllListeners'] = function(assert) {
- let count = 0;
- function listener1 () {
- count++;
- }
- function listener2 () {
- count++;
- }
- // test adding a listener and removing all of that type
- let e1 = new EventEmitter();
- e1.on("hello", listener1);
- assert.equal(1, e1.listeners('hello').length);
- e1.removeAllListeners("hello");
- assert.equal(0, e1.listeners('hello').length);
- e1.emit("hello", "");
- assert.equal(0, count);
- // test adding a listener and removing all of another type
- let e2 = new EventEmitter();
- e2.on("hello", listener1);
- assert.equal(1, e2.listeners('hello').length);
- e2.removeAllListeners('goodbye');
- assert.equal(1, e2.listeners('hello').length);
- e2.emit("hello", "");
- assert.equal(1, count);
- // test adding 1+ listeners and removing all of that type
- let e3 = new EventEmitter();
- e3.on("hello", listener1);
- assert.equal(1, e3.listeners('hello').length);
- e3.on("hello", listener2);
- assert.equal(2, e3.listeners('hello').length);
- e3.removeAllListeners("hello");
- assert.equal(0, e3.listeners('hello').length);
- e3.emit("hello", "");
- assert.equal(1, count);
- // test adding 2 listeners for 2 types and removing all listeners
- let e4 = new EventEmitter();
- e4.on("hello", listener1);
- assert.equal(1, e4.listeners('hello').length);
- e4.on('goodbye', listener2);
- assert.equal(1, e4.listeners('goodbye').length);
- e4.emit("goodbye", "");
- e4.removeAllListeners();
- assert.equal(0, e4.listeners('hello').length);
- assert.equal(0, e4.listeners('goodbye').length);
- e4.emit("hello", "");
- e4.emit("goodbye", "");
- assert.equal(2, count);
- };
- exports['test: modify in emit'] = function(assert) {
- let callbacks_called = [ ];
- let e = new EventEmitter();
- function callback1() {
- callbacks_called.push("callback1");
- e.on("foo", callback2);
- e.on("foo", callback3);
- e.removeListener("foo", callback1);
- }
- function callback2() {
- callbacks_called.push("callback2");
- e.removeListener("foo", callback2);
- }
- function callback3() {
- callbacks_called.push("callback3");
- e.removeListener("foo", callback3);
- }
- e.on("foo", callback1);
- assert.equal(1, e.listeners("foo").length);
- e.emit("foo");
- assert.equal(2, e.listeners("foo").length);
- assert.equal(1, callbacks_called.length);
- assert.equal('callback1', callbacks_called[0]);
- e.emit("foo");
- assert.equal(0, e.listeners("foo").length);
- assert.equal(3, callbacks_called.length);
- assert.equal('callback1', callbacks_called[0]);
- assert.equal('callback2', callbacks_called[1]);
- assert.equal('callback3', callbacks_called[2]);
- e.emit("foo");
- assert.equal(0, e.listeners("foo").length);
- assert.equal(3, callbacks_called.length);
- assert.equal('callback1', callbacks_called[0]);
- assert.equal('callback2', callbacks_called[1]);
- assert.equal('callback3', callbacks_called[2]);
- e.on("foo", callback1);
- e.on("foo", callback2);
- assert.equal(2, e.listeners("foo").length);
- e.removeAllListeners("foo");
- assert.equal(0, e.listeners("foo").length);
- // Verify that removing callbacks while in emit allows emits to propagate to
- // all listeners
- callbacks_called = [ ];
- e.on("foo", callback2);
- e.on("foo", callback3);
- assert.equal(2, e.listeners("foo").length);
- e.emit("foo");
- assert.equal(2, callbacks_called.length);
- assert.equal('callback2', callbacks_called[0]);
- assert.equal('callback3', callbacks_called[1]);
- assert.equal(0, e.listeners("foo").length);
- };
- exports['test:adding same listener'] = function(assert) {
- function foo() {}
- let e = new EventEmitter();
- e.on("foo", foo);
- e.on("foo", foo);
- assert.equal(
- 1,
- e.listeners("foo").length,
- "listener reregistration is ignored"
- );
- }
- exports['test:errors are reported if listener throws'] = function(assert) {
- let e = new EventEmitter(),
- reported = false;
- e.on('error', function(e) reported = true)
- e.on('boom', function() { throw new Error('Boom!') });
- e.emit('boom', 3);
- assert.ok(reported, 'error should be reported through event');
- };
- exports['test:emitOnObject'] = function(assert) {
- let e = new EventEmitter();
- e.on("foo", function() {
- assert.equal(this, e, "`this` should be emitter");
- });
- e.emitOnObject(e, "foo");
- e.on("bar", function() {
- assert.equal(this, obj, "`this` should be other object");
- });
- let obj = {};
- e.emitOnObject(obj, "bar");
- };
- exports['test:once'] = function(assert) {
- let e = new EventEmitter();
- let called = false;
- e.once('foo', function(value) {
- assert.ok(!called, "listener called only once");
- assert.equal(value, "bar", "correct argument was passed");
- });
- e.emit('foo', 'bar');
- e.emit('foo', 'baz');
- };
- exports["test:removing once"] = function(assert) {
- let e = require("sdk/deprecated/events").EventEmitterTrait.create();
- e.once("foo", function() { assert.pass("listener was called"); });
- e.once("error", function() { assert.fail("error event was emitted"); });
- e._emit("foo", "bug-656684");
- };
- // Bug 726967: Ensure that `emit` doesn't do an infinite loop when `error`
- // listener throws an exception
- exports['test:emitLoop'] = function(assert) {
- // Override the console for this test so it doesn't log the exception to the
- // test output
- let { loader } = LoaderWithHookedConsole(module);
- let EventEmitter = loader.require('sdk/deprecated/events').EventEmitter.compose({
- listeners: function(type) this._listeners(type),
- emit: function() this._emit.apply(this, arguments),
- emitOnObject: function() this._emitOnObject.apply(this, arguments),
- removeAllListeners: function(type) this._removeAllListeners(type)
- });
- let e = new EventEmitter();
- e.on("foo", function() {
- throw new Error("foo");
- });
- e.on("error", function() {
- throw new Error("error");
- });
- e.emit("foo");
- assert.pass("emit didn't looped");
- };
- require('sdk/test').run(exports);
|