| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index b1e82aae224c7d7b08864d7dd61e3acea72e181f..192f114ff623ba00d1f567330518745a6b8ff9fd 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -8257,11 +8257,19 @@ static bool IndexedAccessBlocker(Local<v8::Object> global,
|
| }
|
|
|
|
|
| -static int g_echo_value = -1;
|
| +static int g_echo_value_1 = -1;
|
| +static int g_echo_value_2 = -1;
|
| +
|
| +
|
| static void EchoGetter(
|
| Local<String> name,
|
| const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - info.GetReturnValue().Set(v8_num(g_echo_value));
|
| + info.GetReturnValue().Set(v8_num(g_echo_value_1));
|
| +}
|
| +
|
| +
|
| +static void EchoGetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
|
| + info.GetReturnValue().Set(v8_num(g_echo_value_2));
|
| }
|
|
|
|
|
| @@ -8269,7 +8277,14 @@ static void EchoSetter(Local<String> name,
|
| Local<Value> value,
|
| const v8::PropertyCallbackInfo<void>&) {
|
| if (value->IsNumber())
|
| - g_echo_value = value->Int32Value();
|
| + g_echo_value_1 = value->Int32Value();
|
| +}
|
| +
|
| +
|
| +static void EchoSetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
|
| + v8::Handle<v8::Value> value = info[0];
|
| + if (value->IsNumber())
|
| + g_echo_value_2 = value->Int32Value();
|
| }
|
|
|
|
|
| @@ -8287,6 +8302,12 @@ static void UnreachableSetter(Local<String>,
|
| }
|
|
|
|
|
| +static void UnreachableFunction(
|
| + const v8::FunctionCallbackInfo<v8::Value>& info) {
|
| + CHECK(false); // This function should not be called..
|
| +}
|
| +
|
| +
|
| TEST(AccessControl) {
|
| v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
| v8::HandleScope handle_scope(isolate);
|
| @@ -8302,12 +8323,27 @@ TEST(AccessControl) {
|
| v8::Handle<Value>(),
|
| v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
|
|
|
| +
|
| + global_template->SetAccessorProperty(
|
| + v8_str("accessible_js_prop"),
|
| + v8::FunctionTemplate::New(EchoGetter),
|
| + v8::FunctionTemplate::New(EchoSetter),
|
| + v8::None,
|
| + v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
|
| +
|
| // Add an accessor that is not accessible by cross-domain JS code.
|
| global_template->SetAccessor(v8_str("blocked_prop"),
|
| UnreachableGetter, UnreachableSetter,
|
| v8::Handle<Value>(),
|
| v8::DEFAULT);
|
|
|
| + global_template->SetAccessorProperty(
|
| + v8_str("blocked_js_prop"),
|
| + v8::FunctionTemplate::New(UnreachableFunction),
|
| + v8::FunctionTemplate::New(UnreachableFunction),
|
| + v8::None,
|
| + v8::DEFAULT);
|
| +
|
| // Create an environment
|
| v8::Local<Context> context0 = Context::New(isolate, NULL, global_template);
|
| context0->Enter();
|
| @@ -8500,26 +8536,47 @@ TEST(AccessControl) {
|
| value = CompileRun("other.accessible_prop = 3");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(3, value->Int32Value());
|
| - CHECK_EQ(3, g_echo_value);
|
| + CHECK_EQ(3, g_echo_value_1);
|
| +
|
| + // Access accessible js property
|
| + value = CompileRun("other.accessible_js_prop = 3");
|
| + CHECK(value->IsNumber());
|
| + CHECK_EQ(3, value->Int32Value());
|
| + CHECK_EQ(3, g_echo_value_2);
|
|
|
| value = CompileRun("other.accessible_prop");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(3, value->Int32Value());
|
|
|
| + value = CompileRun("other.accessible_js_prop");
|
| + CHECK(value->IsNumber());
|
| + CHECK_EQ(3, value->Int32Value());
|
| +
|
| value = CompileRun(
|
| "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(3, value->Int32Value());
|
|
|
| + value = CompileRun(
|
| + "Object.getOwnPropertyDescriptor(other, 'accessible_js_prop').get()");
|
| + CHECK(value->IsNumber());
|
| + CHECK_EQ(3, value->Int32Value());
|
| +
|
| value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')");
|
| CHECK(value->IsTrue());
|
|
|
| + value = CompileRun("propertyIsEnumerable.call(other, 'accessible_js_prop')");
|
| + CHECK(value->IsTrue());
|
| +
|
| // Enumeration doesn't enumerate accessors from inaccessible objects in
|
| // the prototype chain even if the accessors are in themselves accessible.
|
| value =
|
| CompileRun("(function(){var obj = {'__proto__':other};"
|
| "for (var p in obj)"
|
| - " if (p == 'accessible_prop' || p == 'blocked_prop') {"
|
| + " if (p == 'accessible_prop' ||"
|
| + " p == 'accessible_js_prop' ||"
|
| + " p == 'blocked_js_prop' ||"
|
| + " p == 'blocked_js_prop') {"
|
| " return false;"
|
| " }"
|
| "return true;})()");
|
| @@ -8591,7 +8648,7 @@ TEST(AccessControlES5) {
|
| // Make sure that we can set the accessible accessors value using normal
|
| // assignment.
|
| CompileRun("other.accessible_prop = 42");
|
| - CHECK_EQ(42, g_echo_value);
|
| + CHECK_EQ(42, g_echo_value_1);
|
|
|
| v8::Handle<Value> value;
|
| // We follow Safari in ignoring assignments to host object accessors.
|
|
|