blob: 47c0d192299ec00159da9a554ce47059efcea7e9 [file] [log] [blame]
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var realms = [Realm.current(), Realm.create()];
// Check stack trace filtering across security contexts.
var thrower_script =
"(function () { Realm.eval(Realm.current(), 'throw Error()') })";
Realm.shared = {
thrower_0: Realm.eval(realms[0], thrower_script),
thrower_1: Realm.eval(realms[1], thrower_script),
};
var script = " \
Error.prepareStackTrace = function(a, b) { return b; }; \
try { \
Realm.shared.thrower_0(); \
} catch (e) { \
Realm.shared.error_0 = e.stack; \
} \
try { \
Realm.shared.thrower_1(); \
} catch (e) { \
Realm.shared.error_1 = e.stack; \
} \
";
function assertNotIn(thrower, error) {
for (var i = 0; i < error.length; i++) {
assertFalse(false === error[i].getFunction());
}
}
Realm.eval(realms[1], script);
assertSame(3, Realm.shared.error_0.length);
assertSame(4, Realm.shared.error_1.length);
assertTrue(Realm.shared.thrower_1 === Realm.shared.error_1[2].getFunction());
assertNotIn(Realm.shared.thrower_0, Realm.shared.error_0);
assertNotIn(Realm.shared.thrower_0, Realm.shared.error_1);
Realm.eval(realms[0], script);
assertSame(5, Realm.shared.error_0.length);
assertSame(4, Realm.shared.error_1.length);
assertTrue(Realm.shared.thrower_0 === Realm.shared.error_0[2].getFunction());
assertNotIn(Realm.shared.thrower_1, Realm.shared.error_0);
assertNotIn(Realm.shared.thrower_1, Realm.shared.error_1);
// Check .caller filtering across security contexts.
var caller_script = "(function (f) { f(); })";
Realm.shared = {
caller_0 : Realm.eval(realms[0], caller_script),
caller_1 : Realm.eval(realms[1], caller_script),
}
script = " \
function f_0() { Realm.shared.result_0 = arguments.callee.caller; }; \
function f_1() { Realm.shared.result_1 = arguments.callee.caller; }; \
Realm.shared.caller_0(f_0); \
Realm.shared.caller_1(f_1); \
";
Realm.eval(realms[1], script);
assertSame(null, Realm.shared.result_0);
assertSame(Realm.shared.caller_1, Realm.shared.result_1);
Realm.eval(realms[0], script);
assertSame(Realm.shared.caller_0, Realm.shared.result_0);
assertSame(null, Realm.shared.result_1);
// test that do not pollute / leak a function prototype v8/4217
var realmIndex = Realm.create();
var otherObject = Realm.eval(realmIndex, "Object");
var f = Realm.eval(realmIndex, "function f(){}; f");
f.prototype = null;
var o = new f();
var proto = Object.getPrototypeOf(o);
assertFalse(proto === Object.prototype);
assertTrue(proto === otherObject.prototype);
o = Realm.eval(realmIndex, "new f()");
proto = Object.getPrototypeOf(o);
assertFalse(proto === Object.prototype);
assertTrue(proto === otherObject.prototype);