d3e0e771a9e7be434529ca59acbb2a8e52761c46
[WebKit-https.git] / LayoutTests / js / script-tests / non-strict-function-properties.js
1 description('Test caller and arguments properties in function in non strict mode');
2
3 function foo() {
4     return 1;
5 }
6
7 shouldBe('Object.getOwnPropertyNames(function () {}).length','5');
8
9 shouldBeTrue('Object.getOwnPropertyNames(function () {}).includes("caller")');
10 shouldBeTrue('Object.getOwnPropertyNames(function () {}).includes("arguments")');
11
12 shouldBeTrue('(function(){}).hasOwnProperty("caller")');
13 shouldBeTrue('(function(){}).__proto__.hasOwnProperty("caller")');
14
15 shouldBeTrue('(function(){}).hasOwnProperty("arguments")');
16 shouldBeTrue('(function(){}).__proto__.hasOwnProperty("arguments")');
17
18 shouldBe('typeof Object.getOwnPropertyDescriptor(foo, "arguments")', '"object"');
19 shouldBe('typeof Object.getOwnPropertyDescriptor(foo, "caller")', '"object"');
20
21 shouldBe('foo.caller', 'null');
22 shouldBe('foo.arguments', 'null');
23
24 foo.caller = 10;
25 foo.arguments = 10;
26
27 shouldBe('foo.caller', 'null');
28 shouldBe('foo.arguments', 'null');
29
30 var boo = function () { return boo.arguments; };
31
32 shouldBe('boo("abc")[0]','"abc"');
33
34 boo.arguments = 'not-expected-value';
35 shouldBe('boo("expected-value")[0]','"expected-value"');
36
37 var f = function () { return f.caller;  };
38 var g = function (cb) { return cb(); };
39
40 shouldBe('g(f)','g');
41
42 var doSetCaller = function (value, doDelete) {
43         var f = function () {};
44         if (doDelete)
45                 delete f.__proto__.caller;
46         f.__proto__.caller = value;
47         return f;
48 };
49
50 var value = "property-value";
51
52 shouldThrow("doSetCaller(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in strict mode.'");
53 shouldBe("doSetCaller(value, true).__proto__.caller", "value");
54
55
56 var doSetArguments = function (value, doDelete) {
57         var f = function () {};
58         if (doDelete)
59                 delete f.__proto__.arguments;
60         f.__proto__.arguments = value;
61         return f;
62 };
63
64 shouldThrow("doSetArguments(value, false)", "'TypeError: \\'arguments\\', \\'callee\\', and \\'caller\\' cannot be accessed in strict mode.'");
65 shouldBe("doSetArguments(value, true).__proto__.arguments", "value");