| Index: test/cctest/test-api.cc
|
| ===================================================================
|
| --- test/cctest/test-api.cc (revision 3767)
|
| +++ test/cctest/test-api.cc (working copy)
|
| @@ -4124,6 +4124,65 @@
|
| }
|
|
|
|
|
| +static bool GetOwnPropertyNamesNamedBlocker(Local<v8::Object> global,
|
| + Local<Value> name,
|
| + v8::AccessType type,
|
| + Local<Value> data) {
|
| + return false;
|
| +}
|
| +
|
| +
|
| +static bool GetOwnPropertyNamesIndexedBlocker(Local<v8::Object> global,
|
| + uint32_t key,
|
| + v8::AccessType type,
|
| + Local<Value> data) {
|
| + return false;
|
| +}
|
| +
|
| +
|
| +THREADED_TEST(AccessControlGetOwnPropertyNames) {
|
| + v8::HandleScope handle_scope;
|
| + v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New();
|
| +
|
| + obj_template->Set(v8_str("x"), v8::Integer::New(42));
|
| + obj_template->SetAccessCheckCallbacks(GetOwnPropertyNamesNamedBlocker,
|
| + GetOwnPropertyNamesIndexedBlocker);
|
| +
|
| + // Create an environment
|
| + v8::Persistent<Context> context0 = Context::New(NULL, obj_template);
|
| + context0->Enter();
|
| +
|
| + v8::Handle<v8::Object> global0 = context0->Global();
|
| +
|
| + v8::HandleScope scope1;
|
| +
|
| + v8::Persistent<Context> context1 = Context::New();
|
| + context1->Enter();
|
| +
|
| + v8::Handle<v8::Object> global1 = context1->Global();
|
| + global1->Set(v8_str("other"), global0);
|
| + global1->Set(v8_str("object"), obj_template->NewInstance());
|
| +
|
| + v8::Handle<Value> value;
|
| +
|
| + // Attempt to get the property names of the other global object and
|
| + // of an object that requires access checks. Accessing the other
|
| + // global object should be blocked by access checks on the global
|
| + // proxy object. Accessing the object that requires access checks
|
| + // is blocked by the access checks on the object itself.
|
| + value = CompileRun("Object.getOwnPropertyNames(other).length == 0");
|
| + CHECK(value->IsTrue());
|
| +
|
| + value = CompileRun("Object.getOwnPropertyNames(object).length == 0");
|
| + CHECK(value->IsTrue());
|
| +
|
| + context1->Exit();
|
| + context0->Exit();
|
| + context1.Dispose();
|
| + context0.Dispose();
|
| +}
|
| +
|
| +
|
| static v8::Handle<Value> ConstTenGetter(Local<String> name,
|
| const AccessorInfo& info) {
|
| return v8_num(10);
|
|
|