services/cloudsync/CloudSyncEventSource.jsm
author Marina Samuel <msamuel@mozilla.com>
Fri, 05 Jun 2015 02:48:38 -0700
changeset 278200 8ed8f05c29c08eca537035f3f565957c64923a65
parent 224244 2df073cb512c562a9b74d40858db73bef0ff511f
child 295257 380817d573cdfbfc4a4b4a4647cf1a53bb52c3b9
permissions -rw-r--r--
Bug 1164594 - Part 2b New Tab menu shouldn't use text-transform: uppercase [r=Mardak]

/* 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/. */

this.EXPORTED_SYMBOLS = ["EventSource"];

Components.utils.import("resource://services-common/utils.js");

let EventSource = function (types, suspendFunc, resumeFunc) {
  this.listeners = new Map();
  for each (let type in types) {
    this.listeners.set(type, new Set());
  }

  this.suspend = suspendFunc || function () {};
  this.resume = resumeFunc || function () {};

  this.addEventListener = this.addEventListener.bind(this);
  this.removeEventListener = this.removeEventListener.bind(this);
};

EventSource.prototype = {
  addEventListener: function (type, listener) {
    if (!this.listeners.has(type)) {
      return;
    }
    this.listeners.get(type).add(listener);
    this.resume();
  },

  removeEventListener: function (type, listener) {
    if (!this.listeners.has(type)) {
      return;
    }
    this.listeners.get(type).delete(listener);
    if (!this.hasListeners()) {
      this.suspend();
    }
  },

  hasListeners: function () {
    for (let l of this.listeners.values()) {
      if (l.size > 0) {
        return true;
      }
    }
    return false;
  },

  emit: function (type, arg) {
    if (!this.listeners.has(type)) {
      return;
    }
    CommonUtils.nextTick(
      function () {
        for (let listener of this.listeners.get(type)) {
          listener.call(undefined, arg);
        }
      },
      this
    );
  },
};

this.EventSource = EventSource;