66 lines
2.0 KiB
JavaScript
66 lines
2.0 KiB
JavaScript
description('Test caller and arguments properties in function in non strict mode');
|
|
|
|
function foo() {
|
|
return 1;
|
|
}
|
|
|
|
shouldBe('Object.getOwnPropertyNames(function () {}).length', '3');
|
|
|
|
shouldBeFalse('Object.getOwnPropertyNames(function () {}).includes("caller")');
|
|
shouldBeFalse('Object.getOwnPropertyNames(function () {}).includes("arguments")');
|
|
|
|
shouldBeFalse('(function(){}).hasOwnProperty("caller")');
|
|
shouldBeTrue('(function(){}).__proto__.hasOwnProperty("caller")');
|
|
|
|
shouldBeFalse('(function(){}).hasOwnProperty("arguments")');
|
|
shouldBeTrue('(function(){}).__proto__.hasOwnProperty("arguments")');
|
|
|
|
shouldBe('typeof Object.getOwnPropertyDescriptor(foo, "arguments")', '"undefined"');
|
|
shouldBe('typeof Object.getOwnPropertyDescriptor(foo, "caller")', '"undefined"');
|
|
|
|
shouldBe('foo.caller', 'null');
|
|
shouldBe('foo.arguments', 'null');
|
|
|
|
foo.caller = 10;
|
|
foo.arguments = 10;
|
|
|
|
shouldBe('foo.caller', 'null');
|
|
shouldBe('foo.arguments', 'null');
|
|
|
|
var boo = function () { return boo.arguments; };
|
|
|
|
shouldBe('boo("abc")[0]','"abc"');
|
|
|
|
boo.arguments = 'not-expected-value';
|
|
shouldBe('boo("expected-value")[0]','"expected-value"');
|
|
|
|
var f = function () { return f.caller; };
|
|
var g = function (cb) { return cb(); };
|
|
|
|
shouldBe('g(f)','g');
|
|
|
|
var doSetCaller = function (value, doDelete) {
|
|
var f = function () {};
|
|
if (doDelete)
|
|
delete f.__proto__.caller;
|
|
f.__proto__.caller = value;
|
|
return f;
|
|
};
|
|
|
|
var value = "property-value";
|
|
|
|
shouldThrow("doSetCaller(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in this context.'");
|
|
shouldBe("doSetCaller(value, true).__proto__.caller", "value");
|
|
|
|
|
|
var doSetArguments = function (value, doDelete) {
|
|
var f = function () {};
|
|
if (doDelete)
|
|
delete f.__proto__.arguments;
|
|
f.__proto__.arguments = value;
|
|
return f;
|
|
};
|
|
|
|
shouldThrow("doSetArguments(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in this context.'");
|
|
shouldBe("doSetArguments(value, true).__proto__.arguments", "value");
|