jerryscript/tests/jerry/proxy-evil-recursion.js
Szilagyi Adam 4924f9fd31
Remove ES_NEXT macro (#4915)
- remove all '#JERRY_ESNEXT' macro
- remove 5.1 build profile, update test runner accordingly (Note: all builtins are turn on by default)
- move tests from tests/jerry/esnext into tests/jerry, concatenate files with same names
- add skiplist to some snapshot tests that were supported only in 5.1
- fix doxygen issues that were hidden before (bc. of es.next macro)

Co-authored-by: Martin Negyokru negyokru@inf.u-szeged.hu
JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu
2022-01-31 16:46:00 +01:00

163 lines
5.9 KiB
JavaScript

// Copyright JS Foundation and other contributors, http://js.foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/* Stack limit check must be enabled to run this test correctly! */
function expect_error(error_type, method) {
try {
method();
assert(false);
} catch (ex) {
assert (ex instanceof error_type);
}
}
/**
* Create a proxy with recursion via prototype
*/
var proxy_one = new Proxy({length:2}, {});
Reflect.setPrototypeOf(proxy_one, proxy_one); /* [[SetPrototypeOf]] does not trigger recursion */
// aka. proxy_one.__proto__ = proxy_one; /* [[SetPrototypeOf]] */
function test_proxy_internals_using_proto(proxy_obj) {
/* These methods can be recursive calls via prototype */
expect_error(RangeError, function() { proxy_obj[1]; /* [[Get]] */ });
expect_error(RangeError, function() { proxy_obj[1] = 2; /* [[Set]] */ });
expect_error(RangeError, function() { 3 in proxy_obj; /* [[Has]] */ });
expect_error(RangeError, function() { Reflect.has(proxy_obj, 3); /* [[Has]] */ });
}
test_proxy_internals_using_proto(proxy_one);
function test_proxy_internals_not_using_proto(proxy_obj) {
/* The methods below should not trigger recursion via __proto__ */
delete proxy_obj.none; /* [[Delete]] */
delete proxy_obj["other"]; /* [[Delete]] */
Object.getPrototypeOf(proxy_obj); /* [[GetPrototypeOf]] */
Reflect.isExtensible(proxy_obj); /* [[IsExtensible]] */
Object.preventExtensions(proxy_obj); /* [[PreventExtensions]] */
Reflect.getOwnPropertyDescriptor(proxy_obj, "key"); /* [[GetOwnProperty]] */
Reflect.defineProperty(proxy_obj, "key2", { value: 4}); /* [[DefineOwnProperty]] */
Reflect.ownKeys(proxy_obj); /* [[OwnPropertyKeys]] */
}
test_proxy_internals_not_using_proto(proxy_one);
expect_error(TypeError, function() { proxy_one(3, 4); /* [[Call]] */ });
expect_error(TypeError, function() { new proxy_one(4); /* [[Construct]] */ });
/* Special handler to trigger proxy recursion, WARNING DO NOT use in production code! */
var handler = {
is_handler: true,
proxy_target: false,
counts: {
get: 0,
set: 0,
has: 0,
deleteProperty: 0,
getPrototypeOf: 0,
setPrototypeOf: 0,
isExtensible: 0,
preventExtensions: 0,
getOwnPropertyDescriptor: 0,
defineProperty: 0,
ownKeys: 0,
},
get: function(target, key) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.get++;
return this.proxy_target.key;
},
set: function(target, key, value) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.set++;
return this.proxy_target.key = value;
},
has: function(target, key) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.has++;
return Reflect.has(this.proxy_target, key);
},
deleteProperty: function(target, key) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.deleteProperty++;
return Reflect.deleteProperty(this.proxy_target, key);
},
getPrototypeOf: function(target) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.getPrototypeOf++;
return Reflect.getPrototypeOf(this.proxy_target);
},
setPrototypeOf: function(target, newproto) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.setPrototypeOf++;
return Reflect.setPrototypeOf(this.proxy_target, newproto);
},
isExtensible: function(target) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.isExtensible++;
return Reflect.isExtensible(this.proxy_target);
},
preventExtensions: function(target) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.preventExtensions++;
return Reflect.preventExtensions(this.proxy_target);
},
getOwnPropertyDescriptor: function(target, key) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.getOwnPropertyDescriptor++;
return Reflect.getOwnPropertyDescriptor(this.proxy_target, key);
},
defineProperty: function(target, key, attrs) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.defineProperty++;
return Reflect.defineProperty(this.proxy_target, key, attrs);
},
ownKeys: function(target) {
assert(this.is_handler);
assert(this.proxy_target !== false);
this.counts.ownKeys++;
return Reflect.ownKeys(this.proxy_target);
}
};
var proxy_two = new Proxy({length:2}, handler);
handler.proxy_target = proxy_two;
test_proxy_internals_using_proto(proxy_two);
expect_error(RangeError, function() { delete proxy_two.none; /* [[Delete]] */ });
expect_error(RangeError, function() { delete proxy_two["other"]; /* [[Delete]] */ });
expect_error(RangeError, function() { Object.getPrototypeOf(proxy_two); /* [[GetPrototypeOf]] */ });
expect_error(RangeError, function() { Object.setPrototypeOf(proxy_two, {}); /* [[GetPrototypeOf]] */ });
expect_error(RangeError, function() { Reflect.isExtensible(proxy_two); /* [[IsExtensible]] */ });
expect_error(RangeError, function() { Object.preventExtensions(proxy_two); /* [[PreventExtensions]] */ });
expect_error(RangeError, function() { Reflect.getOwnPropertyDescriptor(proxy_two, "key"); /* [[GetOwnProperty]] */ });
expect_error(RangeError, function() { Reflect.defineProperty(proxy_two, "key2", { value: 4}); /* [[DefineOwnProperty]] */ });
expect_error(RangeError, function() { Reflect.ownKeys(proxy_two); /* [[OwnPropertyKeys]] */ });