Index: test/mjsunit/cross-realm-filtering.js |
diff --git a/test/mjsunit/cross-realm-filtering.js b/test/mjsunit/cross-realm-filtering.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9523e8cc1a2d09978bc12864ed70ee873b483c93 |
--- /dev/null |
+++ b/test/mjsunit/cross-realm-filtering.js |
@@ -0,0 +1,72 @@ |
+// 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); |