| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index ab44af7f934aae2a2dde02dcdc2f7545d5ca5d26..70605dfcd9a655ad7c9b12a5425036a533dd2f02 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -21863,3 +21863,40 @@ TEST(EstimatedContextSize) {
|
| LocalContext env;
|
| CHECK(50000 < env->EstimatedSize());
|
| }
|
| +
|
| +
|
| +TEST(AccessCheckedIsConcatSpreadable) {
|
| + i::FLAG_harmony_concat_spreadable = true;
|
| + v8::Isolate* isolate = CcTest::isolate();
|
| + HandleScope scope(isolate);
|
| + LocalContext env;
|
| +
|
| + // Object with access check
|
| + Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate);
|
| + spreadable_template->SetAccessCheckCallbacks(AccessBlocker, nullptr);
|
| + spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate),
|
| + v8::Boolean::New(isolate, true));
|
| + Local<Object> object = spreadable_template->NewInstance();
|
| +
|
| + allowed_access = true;
|
| + env->Global()->Set(v8_str("object"), object);
|
| + object->Set(v8_str("length"), v8_num(2));
|
| + object->Set(0U, v8_str("a"));
|
| + object->Set(1U, v8_str("b"));
|
| +
|
| + // Access check is allowed, and the object is spread
|
| + CompileRun("var result = [].concat(object)");
|
| + ExpectTrue("Array.isArray(result)");
|
| + ExpectString("result[0]", "a");
|
| + ExpectString("result[1]", "b");
|
| + ExpectTrue("result.length === 2");
|
| + ExpectTrue("object[Symbol.isConcatSpreadable] === true");
|
| +
|
| + // If access check fails, the value of @@isConcatSpreadable is ignored
|
| + allowed_access = false;
|
| + CompileRun("var result = [].concat(object)");
|
| + ExpectTrue("Array.isArray(result)");
|
| + ExpectTrue("result[0] === object");
|
| + ExpectTrue("result.length === 1");
|
| + ExpectTrue("object[Symbol.isConcatSpreadable] === undefined");
|
| +}
|
|
|