Source code

Revision control

Copy as Markdown

Other Tools

// Use newGlobal({transplantWindowProxy: wp}) to test different code paths in
// JS_TransplantObject.
// JS_TransplantObject case A: same compartment WindowProxy objects.
function testSameCompartment() {
let g1 = newGlobal({newCompartment: true});
g1.evaluate("var id = 1;");
let g2 = newGlobal({sameCompartmentAs: g1, transplantWindowProxy: g1});
assertEq(g1, g2);
assertEq(g1.id, undefined);
g2.evaluate("var id = 2");
assertEq(g2.id, 2);
}
testSameCompartment();
// JS_TransplantObject case C: different compartment, no pre-existing CCW.
function testDifferentCompartment() {
let g1 = newGlobal({newCompartment: true});
g1.evaluate("var id = 1;");
let g2 = newGlobal({newCompartment: true, transplantWindowProxy: g1});
assertEq(g1, g2);
assertEq(g1.id, undefined);
g2.evaluate("var id = 2;");
assertEq(g1.id, 2);
}
testDifferentCompartment();
// JS_TransplantObject case B: different compartment with pre-existing CCW.
function testDifferentCompartmentWithCCW() {
let g1 = newGlobal({newCompartment: true});
g1.evaluate("var id = 1;");
// Pre-create the destination compartment and put a CCW for g1 into its
// wrapper map.
let dest = newGlobal({newCompartment: true});
dest.evaluate("var id = 2;");
dest.preExistingRef = g1;
// Create a new global in dest's compartment (where the pre-existing CCW
// lives) and transplant.
let g2 = newGlobal({sameCompartmentAs: dest, transplantWindowProxy: g1});
assertEq(g1, g2);
assertEq(g1.id, undefined);
g2.evaluate("var id = 3;");
assertEq(g1.id, 3);
assertEq(dest.id, 2);
assertEq(dest.evaluate("preExistingRef.id"), 3);
}
testDifferentCompartmentWithCCW();