Index: test/cctest/test-api.cc |
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
index ab44af7f934aae2a2dde02dcdc2f7545d5ca5d26..b56c46ecc3c144ec7c8b15a376078a7e017d8dde 100644 |
--- a/test/cctest/test-api.cc |
+++ b/test/cctest/test-api.cc |
@@ -21863,3 +21863,38 @@ 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"); |
+ |
+ // 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"); |
+} |