fune/devtools/server/tests/xpcshell/test_source-03.js
Matthew Gaudet 1d2599166c Bug 1688790 - Convert startup cache to managing stencils not scripts r=kmag,tcampbell
Note: The stencil will hold pointers into the StartupCache buffer;
There is an assumption in this patch that the lifetime of the buffer
is long enough that we can compile the stencil without causing issues.

Note, we have to adjust the test_source-03 expectation. Since we no longer
cache *scripts*, and instead cache *stencils*, it's not guaranteed the scripts
will have identical ScriptSourceObjects.

Differential Revision: https://phabricator.services.mozilla.com/D113012
2021-09-18 01:29:44 +00:00

75 lines
2.8 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const SOURCE_URL = getFileUrl("source-03.js");
add_task(
threadFrontTest(
async ({ threadFront, server }) => {
const promise = waitForNewSource(threadFront, SOURCE_URL);
// Create a two globals in the default junk sandbox compartment so that
// both globals are part of the same compartment.
server.allowNewThreadGlobals();
const debuggee1 = Cu.Sandbox(systemPrincipal);
debuggee1.__name = "debuggee2.js";
const debuggee2 = Cu.Sandbox(systemPrincipal);
debuggee2.__name = "debuggee2.js";
server.disallowNewThreadGlobals();
// Load two copies of the source file. The first call to "loadSubScript" will
// create a ScriptSourceObject and a JSScript which references it.
// The second call will attempt to re-use JSScript objects because that is
// what loadSubScript does for instances of the same file that are loaded
// in the system principal in the same compartment.
//
// We explicitly want this because it is an edge case of the server. Most
// of the time a Debugger.Source will only have a single Debugger.Script
// associated with a given function, but in the context of explicitly
// cloned JSScripts, this is not the case, and we need to handle that.
loadSubScript(SOURCE_URL, debuggee1);
loadSubScript(SOURCE_URL, debuggee2);
await promise;
// We want to set a breakpoint and make sure that the breakpoint is properly
// set on _both_ files backed
await setBreakpoint(threadFront, {
sourceUrl: SOURCE_URL,
line: 4,
});
const { sources } = await getSources(threadFront);
// Note: Since we load the file twice, we end up with two copies of the
// source object, and so two sources here.
Assert.equal(sources.length, 2);
// Ensure that the breakpoint was properly applied to the JSScipt loaded
// in the first global.
let pausedOne = false;
let onResumed = null;
threadFront.once("paused", function(packet) {
pausedOne = true;
onResumed = resume(threadFront);
});
Cu.evalInSandbox("init()", debuggee1, "1.8", "test.js", 1);
await onResumed;
Assert.equal(pausedOne, true);
// Ensure that the breakpoint was properly applied to the JSScipt loaded
// in the second global.
let pausedTwo = false;
threadFront.once("paused", function(packet) {
pausedTwo = true;
onResumed = resume(threadFront);
});
Cu.evalInSandbox("init()", debuggee2, "1.8", "test.js", 1);
await onResumed;
Assert.equal(pausedTwo, true);
},
{ doNotRunWorker: true }
)
);