forked from mirrors/gecko-dev
		
	Differential Revision: https://phabricator.services.mozilla.com/D5914 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			125 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* globals Services */
 | 
						|
"use strict";
 | 
						|
 | 
						|
/* istanbul ignore if */
 | 
						|
if (typeof ChromeUtils !== "undefined") {
 | 
						|
  ChromeUtils.import("resource://gre/modules/Services.jsm");
 | 
						|
}
 | 
						|
 | 
						|
let usablePerfObj;
 | 
						|
 | 
						|
/* istanbul ignore if */
 | 
						|
/* istanbul ignore else */
 | 
						|
if (typeof Services !== "undefined") {
 | 
						|
  // Borrow the high-resolution timer from the hidden window....
 | 
						|
  usablePerfObj = Services.appShell.hiddenDOMWindow.performance;
 | 
						|
} else if (typeof performance !== "undefined") {
 | 
						|
  // we must be running in content space
 | 
						|
  // eslint-disable-next-line no-undef
 | 
						|
  usablePerfObj = performance;
 | 
						|
} else {
 | 
						|
  // This is a dummy object so this file doesn't crash in the node prerendering
 | 
						|
  // task.
 | 
						|
  usablePerfObj = {
 | 
						|
    now() {},
 | 
						|
    mark() {},
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
function _PerfService(options) {
 | 
						|
  // For testing, so that we can use a fake Window.performance object with
 | 
						|
  // known state.
 | 
						|
  if (options && options.performanceObj) {
 | 
						|
    this._perf = options.performanceObj;
 | 
						|
  } else {
 | 
						|
    this._perf = usablePerfObj;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
_PerfService.prototype = {
 | 
						|
  /**
 | 
						|
   * Calls the underlying mark() method on the appropriate Window.performance
 | 
						|
   * object to add a mark with the given name to the appropriate performance
 | 
						|
   * timeline.
 | 
						|
   *
 | 
						|
   * @param  {String} name  the name to give the current mark
 | 
						|
   * @return {void}
 | 
						|
   */
 | 
						|
  mark: function mark(str) {
 | 
						|
    this._perf.mark(str);
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * Calls the underlying getEntriesByName on the appropriate Window.performance
 | 
						|
   * object.
 | 
						|
   *
 | 
						|
   * @param  {String} name
 | 
						|
   * @param  {String} type eg "mark"
 | 
						|
   * @return {Array}       Performance* objects
 | 
						|
   */
 | 
						|
  getEntriesByName: function getEntriesByName(name, type) {
 | 
						|
    return this._perf.getEntriesByName(name, type);
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * The timeOrigin property from the appropriate performance object.
 | 
						|
   * Used to ensure that timestamps from the add-on code and the content code
 | 
						|
   * are comparable.
 | 
						|
   *
 | 
						|
   * @note If this is called from a context without a window
 | 
						|
   * (eg a JSM in chrome), it will return the timeOrigin of the XUL hidden
 | 
						|
   * window, which appears to be the first created window (and thus
 | 
						|
   * timeOrigin) in the browser.  Note also, however, there is also a private
 | 
						|
   * hidden window, presumably for private browsing, which appears to be
 | 
						|
   * created dynamically later.  Exactly how/when that shows up needs to be
 | 
						|
   * investigated.
 | 
						|
   *
 | 
						|
   * @return {Number} A double of milliseconds with a precision of 0.5us.
 | 
						|
   */
 | 
						|
  get timeOrigin() {
 | 
						|
    return this._perf.timeOrigin;
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * Returns the "absolute" version of performance.now(), i.e. one that
 | 
						|
   * should ([bug 1401406](https://bugzilla.mozilla.org/show_bug.cgi?id=1401406)
 | 
						|
   * be comparable across both chrome and content.
 | 
						|
   *
 | 
						|
   * @return {Number}
 | 
						|
   */
 | 
						|
  absNow: function absNow() {
 | 
						|
    return this.timeOrigin + this._perf.now();
 | 
						|
  },
 | 
						|
 | 
						|
  /**
 | 
						|
   * This returns the absolute startTime from the most recent performance.mark()
 | 
						|
   * with the given name.
 | 
						|
   *
 | 
						|
   * @param  {String} name  the name to lookup the start time for
 | 
						|
   *
 | 
						|
   * @return {Number}       the returned start time, as a DOMHighResTimeStamp
 | 
						|
   *
 | 
						|
   * @throws {Error}        "No Marks with the name ..." if none are available
 | 
						|
   *
 | 
						|
   * @note Always surround calls to this by try/catch.  Otherwise your code
 | 
						|
   * may fail when the `privacy.resistFingerprinting` pref is true.  When
 | 
						|
   * this pref is set, all attempts to get marks will likely fail, which will
 | 
						|
   * cause this method to throw.
 | 
						|
   *
 | 
						|
   * See [bug 1369303](https://bugzilla.mozilla.org/show_bug.cgi?id=1369303)
 | 
						|
   * for more info.
 | 
						|
   */
 | 
						|
  getMostRecentAbsMarkStartByName(name) {
 | 
						|
    let entries = this.getEntriesByName(name, "mark");
 | 
						|
 | 
						|
    if (!entries.length) {
 | 
						|
      throw new Error(`No marks with the name ${name}`);
 | 
						|
    }
 | 
						|
 | 
						|
    let mostRecentEntry = entries[entries.length - 1];
 | 
						|
    return this._perf.timeOrigin + mostRecentEntry.startTime;
 | 
						|
  },
 | 
						|
};
 | 
						|
 | 
						|
this.perfService = new _PerfService();
 | 
						|
const EXPORTED_SYMBOLS = ["_PerfService", "perfService"];
 |