summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Array/from_realms.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262/Array/from_realms.js')
-rw-r--r--js/src/tests/non262/Array/from_realms.js37
1 files changed, 37 insertions, 0 deletions
diff --git a/js/src/tests/non262/Array/from_realms.js b/js/src/tests/non262/Array/from_realms.js
new file mode 100644
index 0000000000..e3a8636063
--- /dev/null
+++ b/js/src/tests/non262/Array/from_realms.js
@@ -0,0 +1,37 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+if (typeof newGlobal === 'function') {
+ // G.Array.from, where G is any global, produces an array whose prototype
+ // is G.Array.prototype.
+ var g = newGlobal();
+ var ga = g.Array.from([1, 2, 3]);
+ assertEq(ga instanceof g.Array, true);
+
+ // Even if G.Array is not passed in as the 'this' value to the call.
+ var from = g.Array.from
+ var ga2 = from([1, 2, 3]);
+ assertEq(ga2 instanceof g.Array, true);
+
+ // Array.from can be applied to a constructor from another realm.
+ var p = Array.from.call(g.Array, [1, 2, 3]);
+ assertEq(p instanceof g.Array, true);
+ var q = g.Array.from.call(Array, [3, 4, 5]);
+ assertEq(q instanceof Array, true);
+
+ // The default 'this' value received by a non-strict mapping function is
+ // that function's global, not Array.from's global or the caller's global.
+ var h = newGlobal(), result = undefined;
+ h.mainGlobal = this;
+ h.eval("function f() { mainGlobal.result = this; }");
+ g.Array.from.call(Array, [5, 6, 7], h.f);
+ // (Give each global in the test a name, for better error messages. But use
+ // globalName, because window.name is complicated.)
+ this.globalName = "main";
+ g.globalName = "g";
+ h.globalName = "h";
+ assertEq(result.globalName, "h");
+}
+
+if (typeof reportCompare === 'function')
+ reportCompare(0, 0);