| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index 5c844cb797fc390f064b1e0560e937398b9fb841..49ee96988d4f55d7477e55878d0e8cbc046baac8 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -21349,6 +21349,164 @@ TEST(SealHandleScopeNested) {
|
| }
|
|
|
|
|
| +static bool access_was_called = false;
|
| +
|
| +
|
| +static bool AccessAlwaysAllowedWithFlag(Local<v8::Object> global,
|
| + Local<Value> name, v8::AccessType type,
|
| + Local<Value> data) {
|
| + access_was_called = true;
|
| + return true;
|
| +}
|
| +
|
| +
|
| +static bool AccessAlwaysBlockedWithFlag(Local<v8::Object> global,
|
| + Local<Value> name, v8::AccessType type,
|
| + Local<Value> data) {
|
| + access_was_called = true;
|
| + return false;
|
| +}
|
| +
|
| +
|
| +TEST(StrongModeAccessCheckAllowed) {
|
| + 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(AccessAlwaysAllowedWithFlag, 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(StrongModeAccessCheckBlocked) {
|
| + 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(AccessAlwaysBlockedWithFlag, 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);
|
| + }
|
| + 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;
|
|
|