DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (b6d82b1a6b02)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
/* 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 modules handles creating and provisioning Sandboxes for
 * executing cross-process code from SpecialPowers. This allows all such
 * sandboxes to have a similar environment, and in particular allows
 * them to run test assertions in the target process and propagate
 * results back to the caller.
 */

var EXPORTED_SYMBOLS = ["SpecialPowersSandbox"];

ChromeUtils.defineModuleGetter(
  this,
  "Assert",
  "resource://testing-common/Assert.jsm"
);

class SpecialPowersSandbox {
  constructor(name, reportCallback, opts = {}) {
    this.name = name;
    this.reportCallback = reportCallback;

    this._Assert = null;

    this.sandbox = Cu.Sandbox(
      Cu.getGlobalForObject({}),
      Object.assign(
        { wantGlobalProperties: ["ChromeUtils"] },
        opts.sandboxOptions
      )
    );

    for (let prop of ["assert", "Assert"]) {
      Object.defineProperty(this.sandbox, prop, {
        get: () => {
          return this.Assert;
        },
        enumerable: true,
        configurable: true,
      });
    }
  }

  static getCallerInfo(frame) {
    return {
      filename: frame.filename,
      lineNumber: frame.lineNumber,
    };
  }

  get Assert() {
    if (!this._Assert) {
      this._Assert = new Assert((err, message, stack) => {
        this.report(err, message, stack);
      });
    }
    return this._Assert;
  }

  report(err, name, stack) {
    let diag;
    if (err) {
      diag =
        `got ${uneval(err.actual)}, expected ${uneval(err.expected)} ` +
        `(operator ${err.operator})`;
    }

    this.reportCallback({
      name,
      diag,
      passed: !err,
      stack: stack && stack.formattedStack,
    });
  }

  execute(task, args, caller) {
    let func = Cu.evalInSandbox(
      `(${task})`,
      this.sandbox,
      undefined,
      caller.filename,
      caller.lineNumber
    );
    return func(...args);
  }
}