browser/devtools/shared/Browser.jsm
author Kyle Huey <khuey@kylehuey.com>
Tue, 30 Oct 2012 12:28:11 -0700
changeset 120435 67cb43bb8865ecbcb79c2ea04a0494fd223cc69d
parent 120431 ad1d720d82b7f84d3c7e50f4b02b7c3201662ddb
child 120523 5bf3abe91210f94d5d92ba95e114181e366d82ea
permissions -rw-r--r--
Bug 798491: Add an option to stick all chrome JSMs/JS components in the same compartment. r=mrbkap,philikon

/* 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";

/**
 * Define various constants to match the globals provided by the browser.
 * This module helps cases where code is shared between the web and Firefox.
 * See also Console.jsm for an implementation of the Firefox console that
 * forwards to dump();
 */

this.EXPORTED_SYMBOLS = [ "Node", "HTMLElement", "setTimeout", "clearTimeout" ];

/**
 * Expose Node/HTMLElement objects. This allows us to use the Node constants
 * without resorting to hardcoded numbers
 */
this.Node = Components.interfaces.nsIDOMNode;
this.HTMLElement = Components.interfaces.nsIDOMHTMLElement;

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

/**
 * The next value to be returned by setTimeout
 */
let nextID = 1;

/**
 * The map of outstanding timeouts
 */
const timers = {};

/**
 * Object to be passed to Timer.initWithCallback()
 */
function TimerCallback(callback) {
  this._callback = callback;
  const interfaces = [ Components.interfaces.nsITimerCallback ];
  this.QueryInterface = XPCOMUtils.generateQI(interfaces);
}

TimerCallback.prototype.notify = function(timer) {
  try {
    for (let timerID in timers) {
      if (timers[timerID] === timer) {
        delete timers[timerID];
        break;
      }
    }
    this._callback.apply(null, []);
  }
  catch (ex) {
    dump(ex +  '\n');
  }
};

/**
 * Executes a code snippet or a function after specified delay.
 * This is designed to have the same interface contract as the browser
 * function.
 * @param callback is the function you want to execute after the delay.
 * @param delay is the number of milliseconds that the function call should
 * be delayed by. Note that the actual delay may be longer, see Notes below.
 * @return the ID of the timeout, which can be used later with
 * window.clearTimeout.
 */
this.setTimeout = function setTimeout(callback, delay) {
  const timer = Components.classes["@mozilla.org/timer;1"]
                        .createInstance(Components.interfaces.nsITimer);

  let timerID = nextID++;
  timers[timerID] = timer;

  timer.initWithCallback(new TimerCallback(callback), delay, timer.TYPE_ONE_SHOT);
  return timerID;
};

/**
 * Clears the delay set by window.setTimeout() and prevents the callback from
 * being executed (if it hasn't been executed already)
 * @param timerID the ID of the timeout you wish to clear, as returned by
 * window.setTimeout().
 */
this.clearTimeout = function clearTimeout(timerID) {
  let timer = timers[timerID];
  if (timer) {
    timer.cancel();
    delete timers[timerID];
  }
};