| Index: test/cctest/test-api.cc
 | 
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
 | 
| index b04420ed9ba6264b5be4dcfe30f4a01361b010f5..da5b0ef71e220e2ab6e4fd7c7717cb1ba8a8d411 100644
 | 
| --- a/test/cctest/test-api.cc
 | 
| +++ b/test/cctest/test-api.cc
 | 
| @@ -5323,7 +5323,8 @@ static bool IndexedAccessBlocker(Local<v8::Object> global,
 | 
|                                   uint32_t key,
 | 
|                                   v8::AccessType type,
 | 
|                                   Local<Value> data) {
 | 
| -  return Context::GetCurrent()->Global()->Equals(global);
 | 
| +  return Context::GetCurrent()->Global()->Equals(global) ||
 | 
| +      allowed_access_type[type];
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -5390,6 +5391,18 @@ TEST(AccessControl) {
 | 
|    Local<Value> getter = global0->Get(v8_str("getter"));
 | 
|    Local<Value> setter = global0->Get(v8_str("setter"));
 | 
|  
 | 
| +  // And define normal element.
 | 
| +  global0->Set(239, v8_str("239"));
 | 
| +
 | 
| +  // Define an element with JS getter and setter.
 | 
| +  CompileRun(
 | 
| +      "function el_getter() { return 'el_getter'; };\n"
 | 
| +      "function el_setter() { return 'el_setter'; };\n"
 | 
| +      "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});");
 | 
| +
 | 
| +  Local<Value> el_getter = global0->Get(v8_str("el_getter"));
 | 
| +  Local<Value> el_setter = global0->Get(v8_str("el_setter"));
 | 
| +
 | 
|    v8::HandleScope scope1;
 | 
|  
 | 
|    v8::Persistent<Context> context1 = Context::New();
 | 
| @@ -5398,7 +5411,7 @@ TEST(AccessControl) {
 | 
|    v8::Handle<v8::Object> global1 = context1->Global();
 | 
|    global1->Set(v8_str("other"), global0);
 | 
|  
 | 
| -  // Access blocked property
 | 
| +  // Access blocked property.
 | 
|    CompileRun("other.blocked_prop = 1");
 | 
|  
 | 
|    ExpectUndefined("other.blocked_prop");
 | 
| @@ -5416,6 +5429,23 @@ TEST(AccessControl) {
 | 
|    ExpectTrue("propertyIsEnumerable.call(other, 'blocked_prop')");
 | 
|    allowed_access_type[v8::ACCESS_HAS] = false;
 | 
|  
 | 
| +  // Access blocked element.
 | 
| +  CompileRun("other[239] = 1");
 | 
| +
 | 
| +  ExpectUndefined("other[239]");
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239')");
 | 
| +  ExpectFalse("propertyIsEnumerable.call(other, '239')");
 | 
| +
 | 
| +  // Enable ACCESS_HAS
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = true;
 | 
| +  ExpectUndefined("other[239]");
 | 
| +  // ... and now we can get the descriptor...
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239').value");
 | 
| +  // ... and enumerate the property.
 | 
| +  ExpectTrue("propertyIsEnumerable.call(other, '239')");
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = false;
 | 
| +
 | 
| +  // Access a property with JS accessor.
 | 
|    CompileRun("other.js_accessor_p = 2");
 | 
|  
 | 
|    ExpectUndefined("other.js_accessor_p");
 | 
| @@ -5480,6 +5510,58 @@ TEST(AccessControl) {
 | 
|    allowed_access_type[v8::ACCESS_GET] = false;
 | 
|    allowed_access_type[v8::ACCESS_HAS] = false;
 | 
|  
 | 
| +  // Access an element with JS accessor.
 | 
| +  CompileRun("other[42] = 2");
 | 
| +
 | 
| +  ExpectUndefined("other[42]");
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42')");
 | 
| +
 | 
| +  // Enable ACCESS_HAS.
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = true;
 | 
| +  ExpectUndefined("other[42]");
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').get");
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').set");
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value");
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = false;
 | 
| +
 | 
| +  // Enable both ACCESS_HAS and ACCESS_GET.
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = true;
 | 
| +  allowed_access_type[v8::ACCESS_GET] = true;
 | 
| +
 | 
| +  ExpectString("other[42]", "el_getter");
 | 
| +  ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter);
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').set");
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value");
 | 
| +
 | 
| +  allowed_access_type[v8::ACCESS_GET] = false;
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = false;
 | 
| +
 | 
| +  // Enable both ACCESS_HAS and ACCESS_SET.
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = true;
 | 
| +  allowed_access_type[v8::ACCESS_SET] = true;
 | 
| +
 | 
| +  ExpectUndefined("other[42]");
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').get");
 | 
| +  ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter);
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value");
 | 
| +
 | 
| +  allowed_access_type[v8::ACCESS_SET] = false;
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = false;
 | 
| +
 | 
| +  // Enable both ACCESS_HAS, ACCESS_GET and ACCESS_SET.
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = true;
 | 
| +  allowed_access_type[v8::ACCESS_GET] = true;
 | 
| +  allowed_access_type[v8::ACCESS_SET] = true;
 | 
| +
 | 
| +  ExpectString("other[42]", "el_getter");
 | 
| +  ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter);
 | 
| +  ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter);
 | 
| +  ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value");
 | 
| +
 | 
| +  allowed_access_type[v8::ACCESS_SET] = false;
 | 
| +  allowed_access_type[v8::ACCESS_GET] = false;
 | 
| +  allowed_access_type[v8::ACCESS_HAS] = false;
 | 
| +
 | 
|    v8::Handle<Value> value;
 | 
|  
 | 
|    // Access accessible property
 | 
| 
 |