tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Stack.sys.mjs (2032B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 /**
      6 * An object that contains details of a stack frame.
      7 *
      8 * @typedef {object} StackFrame
      9 * @see nsIStackFrame
     10 *
     11 * @property {string=} asyncCause
     12 *     Type of asynchronous call by which this frame was invoked.
     13 * @property {number} columnNumber
     14 *     The column number for this stack frame.
     15 * @property {string} filename
     16 *     The source URL for this stack frame.
     17 * @property {string} function
     18 *     SpiderMonkey’s inferred name for this stack frame’s function, or null.
     19 * @property {number} lineNumber
     20 *     The line number for this stack frame (starts with 1).
     21 * @property {number} sourceId
     22 *     The process-unique internal integer ID of this source.
     23 */
     24 
     25 /**
     26 * Return a list of stack frames from the given stack.
     27 *
     28 * Convert stack objects to the JSON attributes expected by consumers.
     29 *
     30 * @param {object} stack
     31 *     The native stack object to process.
     32 *
     33 * @returns {Array<StackFrame>=}
     34 */
     35 export function getFramesFromStack(stack) {
     36  if (!stack || (Cu && Cu.isDeadWrapper(stack))) {
     37    // If the global from which this error came from has been nuked,
     38    // stack is going to be a dead wrapper.
     39    return null;
     40  }
     41 
     42  const frames = [];
     43  while (stack) {
     44    frames.push({
     45      asyncCause: stack.asyncCause,
     46      columnNumber: stack.column,
     47      filename: stack.source,
     48      functionName: stack.functionDisplayName || "",
     49      lineNumber: stack.line,
     50      sourceId: stack.sourceId,
     51    });
     52 
     53    stack = stack.parent || stack.asyncParent;
     54  }
     55 
     56  return frames;
     57 }
     58 
     59 /**
     60 * Check if a frame is from chrome scope.
     61 *
     62 * @param {object} frame
     63 *     The frame to check
     64 *
     65 * @returns {boolean}
     66 *     True, if frame is from chrome scope
     67 */
     68 export function isChromeFrame(frame) {
     69  return (
     70    frame.filename.startsWith("chrome://") ||
     71    frame.filename.startsWith("resource://")
     72  );
     73 }