Chromium Code Reviews| Index: test/cctest/test-api.cc |
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
| index 5c7bac6d7ef3d4db2dd9cd3b3d402e44c9b45e1a..53e9a948915065467e8a1ff42bd54e431782d263 100644 |
| --- a/test/cctest/test-api.cc |
| +++ b/test/cctest/test-api.cc |
| @@ -21429,6 +21429,86 @@ TEST(SealHandleScopeNested) { |
| } |
| +static bool access_was_called = false; |
| + |
| + |
| +static bool AccessAlwaysAllowed(Local<v8::Object> global, Local<Value> name, |
| + v8::AccessType type, Local<Value> data) { |
| + access_was_called = true; |
| + return true; |
| +} |
| + |
| + |
| +TEST(StrongModeAccessChecks) { |
|
rossberg
2015/06/30 12:38:03
Can we also have a test where the access check for
conradw
2015/06/30 15:12:56
Done.
|
| + i::FLAG_strong_mode = true; |
| + v8::Isolate* isolate = CcTest::isolate(); |
| + v8::HandleScope handle_scope(isolate); |
| + v8::Handle<Value> value; |
| + access_was_called = false; |
| + |
| + v8::Handle<v8::ObjectTemplate> obj_template = |
| + v8::ObjectTemplate::New(isolate); |
| + |
| + obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); |
| + obj_template->SetAccessCheckCallbacks(AccessAlwaysAllowed, NULL); |
| + |
| + // Create an environment |
| + v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); |
| + context0->Enter(); |
| + v8::Handle<v8::Object> global0 = context0->Global(); |
| + global0->Set(v8_str("object"), obj_template->NewInstance()); |
| + { |
| + v8::TryCatch try_catch(isolate); |
| + value = CompileRun("'use strong'; object.x"); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(!access_was_called); |
| + CHECK_EQ(42, value->Int32Value()); |
| + } |
| + { |
| + v8::TryCatch try_catch(isolate); |
| + value = CompileRun("'use strong'; object.foo"); |
| + CHECK(try_catch.HasCaught()); |
| + CHECK(!access_was_called); |
| + } |
| + { |
| + v8::TryCatch try_catch(isolate); |
| + value = CompileRun("'use strong'; object[10]"); |
| + CHECK(try_catch.HasCaught()); |
| + CHECK(!access_was_called); |
| + } |
| + |
| + // Create an environment |
| + v8::Local<Context> context1 = Context::New(isolate); |
| + context1->Enter(); |
| + v8::Handle<v8::Object> global1 = context1->Global(); |
| + global1->Set(v8_str("object"), obj_template->NewInstance()); |
| + { |
| + v8::TryCatch try_catch(isolate); |
| + value = CompileRun("'use strong'; object.x"); |
| + CHECK(!try_catch.HasCaught()); |
| + CHECK(access_was_called); |
| + CHECK_EQ(42, value->Int32Value()); |
| + } |
| + access_was_called = false; |
| + { |
| + v8::TryCatch try_catch(isolate); |
| + value = CompileRun("'use strong'; object.foo"); |
| + CHECK(try_catch.HasCaught()); |
| + CHECK(access_was_called); |
| + } |
| + access_was_called = false; |
| + { |
| + v8::TryCatch try_catch(isolate); |
| + value = CompileRun("'use strong'; object[10]"); |
| + CHECK(try_catch.HasCaught()); |
| + CHECK(access_was_called); |
| + } |
| + |
| + context1->Exit(); |
| + context0->Exit(); |
| +} |
| + |
| + |
| TEST(StrongModeArityCallFromApi) { |
| i::FLAG_strong_mode = true; |
| LocalContext env; |