Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: devtools/server/tests/xpcshell/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
"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 () {
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 () {
pausedTwo = true;
onResumed = resume(threadFront);
});
Cu.evalInSandbox("init()", debuggee2, "1.8", "test.js", 1);
await onResumed;
Assert.equal(pausedTwo, true);
},
{ doNotRunWorker: true }
)
);