| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index adc7c0921693934bd42eab414a7a18fa655b1835..f46b7de6947b52fea37e8bbd418ca547a79fbcc2 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -7673,30 +7673,9 @@ TEST(TryCatchFinallyStoresMessageUsingTryCatchHandler) {
|
|
|
| // For use within the TestSecurityHandler() test.
|
| static bool g_security_callback_result = false;
|
| -static bool NamedSecurityTestCallback(Local<v8::Object> global,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| +static bool SecurityTestCallback(Local<v8::Object> global, Local<Value> name,
|
| + v8::AccessType type, Local<Value> data) {
|
| printf("a\n");
|
| - // Always allow read access.
|
| - if (type == v8::ACCESS_GET)
|
| - return true;
|
| -
|
| - // Sometimes allow other access.
|
| - return g_security_callback_result;
|
| -}
|
| -
|
| -
|
| -static bool IndexedSecurityTestCallback(Local<v8::Object> global,
|
| - uint32_t key,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - printf("b\n");
|
| - // Always allow read access.
|
| - if (type == v8::ACCESS_GET)
|
| - return true;
|
| -
|
| - // Sometimes allow other access.
|
| return g_security_callback_result;
|
| }
|
|
|
| @@ -7707,8 +7686,7 @@ TEST(SecurityHandler) {
|
| v8::HandleScope scope0(isolate);
|
| v8::Handle<v8::ObjectTemplate> global_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - global_template->SetAccessCheckCallbacks(NamedSecurityTestCallback,
|
| - IndexedSecurityTestCallback);
|
| + global_template->SetAccessCheckCallbacks(SecurityTestCallback, NULL);
|
| // Create an environment
|
| v8::Handle<Context> context0 = Context::New(isolate, NULL, global_template);
|
| context0->Enter();
|
| @@ -7735,6 +7713,7 @@ TEST(SecurityHandler) {
|
| v8::Handle<Script> script1 =
|
| v8_compile("othercontext.foo = 222; othercontext[0] = 888;");
|
| script1->Run();
|
| + g_security_callback_result = true;
|
| // This read will pass the security check.
|
| v8::Handle<Value> foo1 = global0->Get(v8_str("foo"));
|
| CHECK_EQ(111, foo1->Int32Value());
|
| @@ -7743,7 +7722,7 @@ TEST(SecurityHandler) {
|
| CHECK_EQ(999, z1->Int32Value());
|
|
|
| // Create another environment, should pass security checks.
|
| - { g_security_callback_result = true; // allow security handler to pass.
|
| + {
|
| v8::HandleScope scope2(isolate);
|
| LocalContext context2;
|
| v8::Handle<v8::Object> global2 = context2->Global();
|
| @@ -7866,26 +7845,13 @@ THREADED_TEST(SecurityChecksForPrototypeChain) {
|
| }
|
|
|
|
|
| -static bool named_security_check_with_gc_called;
|
| -
|
| -static bool NamedSecurityCallbackWithGC(Local<v8::Object> global,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
|
| - named_security_check_with_gc_called = true;
|
| - return true;
|
| -}
|
| -
|
| -
|
| -static bool indexed_security_check_with_gc_called;
|
| +static bool security_check_with_gc_called;
|
|
|
| -static bool IndexedSecurityTestCallbackWithGC(Local<v8::Object> global,
|
| - uint32_t key,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| +static bool SecurityTestCallbackWithGC(Local<v8::Object> global,
|
| + Local<v8::Value> name,
|
| + v8::AccessType type, Local<Value> data) {
|
| CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
|
| - indexed_security_check_with_gc_called = true;
|
| + security_check_with_gc_called = true;
|
| return true;
|
| }
|
|
|
| @@ -7895,29 +7861,20 @@ TEST(SecurityTestGCAllowed) {
|
| v8::HandleScope handle_scope(isolate);
|
| v8::Handle<v8::ObjectTemplate> object_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - object_template->SetAccessCheckCallbacks(NamedSecurityCallbackWithGC,
|
| - IndexedSecurityTestCallbackWithGC);
|
| + object_template->SetAccessCheckCallbacks(SecurityTestCallbackWithGC, NULL);
|
|
|
| v8::Handle<Context> context = Context::New(isolate);
|
| v8::Context::Scope context_scope(context);
|
|
|
| context->Global()->Set(v8_str("obj"), object_template->NewInstance());
|
|
|
| - named_security_check_with_gc_called = false;
|
| - CompileRun("obj.foo = new String(1001);");
|
| - CHECK(named_security_check_with_gc_called);
|
| -
|
| - indexed_security_check_with_gc_called = false;
|
| + security_check_with_gc_called = false;
|
| CompileRun("obj[0] = new String(1002);");
|
| - CHECK(indexed_security_check_with_gc_called);
|
| -
|
| - named_security_check_with_gc_called = false;
|
| - CHECK(CompileRun("obj.foo")->ToString(isolate)->Equals(v8_str("1001")));
|
| - CHECK(named_security_check_with_gc_called);
|
| + CHECK(security_check_with_gc_called);
|
|
|
| - indexed_security_check_with_gc_called = false;
|
| + security_check_with_gc_called = false;
|
| CHECK(CompileRun("obj[0]")->ToString(isolate)->Equals(v8_str("1002")));
|
| - CHECK(indexed_security_check_with_gc_called);
|
| + CHECK(security_check_with_gc_called);
|
| }
|
|
|
|
|
| @@ -8275,22 +8232,11 @@ TEST(DetachedAccesses) {
|
| }
|
|
|
|
|
| -static bool allowed_access_type[v8::ACCESS_KEYS + 1] = { false };
|
| -static bool NamedAccessBlocker(Local<v8::Object> global,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| +static bool allowed_access = false;
|
| +static bool AccessBlocker(Local<v8::Object> global, Local<Value> name,
|
| + v8::AccessType type, Local<Value> data) {
|
| return CcTest::isolate()->GetCurrentContext()->Global()->Equals(global) ||
|
| - allowed_access_type[type];
|
| -}
|
| -
|
| -
|
| -static bool IndexedAccessBlocker(Local<v8::Object> global,
|
| - uint32_t key,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - return CcTest::isolate()->GetCurrentContext()->Global()->Equals(global) ||
|
| - allowed_access_type[type];
|
| + allowed_access;
|
| }
|
|
|
|
|
| @@ -8338,8 +8284,7 @@ TEST(AccessControl) {
|
| v8::Handle<v8::ObjectTemplate> global_template =
|
| v8::ObjectTemplate::New(isolate);
|
|
|
| - global_template->SetAccessCheckCallbacks(NamedAccessBlocker,
|
| - IndexedAccessBlocker);
|
| + global_template->SetAccessCheckCallbacks(AccessBlocker, NULL);
|
|
|
| // Add an accessor accessible by cross-domain JS code.
|
| global_template->SetAccessor(
|
| @@ -8413,15 +8358,10 @@ TEST(AccessControl) {
|
| CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239')").IsEmpty());
|
| CHECK(CompileRun("propertyIsEnumerable.call(other, '239')").IsEmpty());
|
|
|
| - // Enable ACCESS_HAS
|
| - allowed_access_type[v8::ACCESS_HAS] = true;
|
| - CHECK(CompileRun("other[239]").IsEmpty());
|
| - // ... and now we can get the descriptor...
|
| - CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239').value")
|
| - .IsEmpty());
|
| - // ... and enumerate the property.
|
| + allowed_access = true;
|
| + // Now we can enumerate the property.
|
| ExpectTrue("propertyIsEnumerable.call(other, '239')");
|
| - allowed_access_type[v8::ACCESS_HAS] = false;
|
| + allowed_access = false;
|
|
|
| // Access a property with JS accessor.
|
| CHECK(CompileRun("other.js_accessor_p = 2").IsEmpty());
|
| @@ -8430,9 +8370,7 @@ TEST(AccessControl) {
|
| CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'js_accessor_p')")
|
| .IsEmpty());
|
|
|
| - // Enable both ACCESS_HAS and ACCESS_GET.
|
| - allowed_access_type[v8::ACCESS_HAS] = true;
|
| - allowed_access_type[v8::ACCESS_GET] = true;
|
| + allowed_access = true;
|
|
|
| ExpectString("other.js_accessor_p", "getter");
|
| ExpectObject(
|
| @@ -8442,8 +8380,7 @@ TEST(AccessControl) {
|
| ExpectUndefined(
|
| "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value");
|
|
|
| - allowed_access_type[v8::ACCESS_HAS] = false;
|
| - allowed_access_type[v8::ACCESS_GET] = false;
|
| + allowed_access = false;
|
|
|
| // Access an element with JS accessor.
|
| CHECK(CompileRun("other[42] = 2").IsEmpty());
|
| @@ -8451,17 +8388,14 @@ TEST(AccessControl) {
|
| CHECK(CompileRun("other[42]").IsEmpty());
|
| CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '42')").IsEmpty());
|
|
|
| - // Enable both ACCESS_HAS and ACCESS_GET.
|
| - allowed_access_type[v8::ACCESS_HAS] = true;
|
| - allowed_access_type[v8::ACCESS_GET] = true;
|
| + allowed_access = 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_HAS] = false;
|
| - allowed_access_type[v8::ACCESS_GET] = false;
|
| + allowed_access = false;
|
|
|
| v8::Handle<Value> value;
|
|
|
| @@ -8514,8 +8448,7 @@ TEST(AccessControlES5) {
|
| v8::Handle<v8::ObjectTemplate> global_template =
|
| v8::ObjectTemplate::New(isolate);
|
|
|
| - global_template->SetAccessCheckCallbacks(NamedAccessBlocker,
|
| - IndexedAccessBlocker);
|
| + global_template->SetAccessCheckCallbacks(AccessBlocker, NULL);
|
|
|
| // Add accessible accessor.
|
| global_template->SetAccessor(
|
| @@ -8578,14 +8511,9 @@ TEST(AccessControlES5) {
|
| }
|
|
|
|
|
| -static bool BlockEverythingNamed(Local<v8::Object> object, Local<Value> name,
|
| - v8::AccessType type, Local<Value> data) {
|
| - return false;
|
| -}
|
| -
|
| -
|
| -static bool BlockEverythingIndexed(Local<v8::Object> object, uint32_t key,
|
| - v8::AccessType type, Local<Value> data) {
|
| +static bool AccessAlwaysBlocked(Local<v8::Object> global, Local<Value> name,
|
| + v8::AccessType type, Local<Value> data) {
|
| + i::PrintF("Access blocked.\n");
|
| return false;
|
| }
|
|
|
| @@ -8597,8 +8525,7 @@ THREADED_TEST(AccessControlGetOwnPropertyNames) {
|
| v8::ObjectTemplate::New(isolate);
|
|
|
| obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
|
| - obj_template->SetAccessCheckCallbacks(BlockEverythingNamed,
|
| - BlockEverythingIndexed);
|
| + obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
|
|
|
| // Create an environment
|
| v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
|
| @@ -8641,8 +8568,7 @@ TEST(SuperAccessControl) {
|
| v8::HandleScope handle_scope(isolate);
|
| v8::Handle<v8::ObjectTemplate> obj_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - obj_template->SetAccessCheckCallbacks(BlockEverythingNamed,
|
| - BlockEverythingIndexed);
|
| + obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
|
| LocalContext env;
|
| env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance());
|
|
|
| @@ -8749,31 +8675,18 @@ THREADED_TEST(CrossDomainAccessors) {
|
| }
|
|
|
|
|
| -static int named_access_count = 0;
|
| -static int indexed_access_count = 0;
|
| +static int access_count = 0;
|
|
|
| -static bool NamedAccessCounter(Local<v8::Object> global,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - named_access_count++;
|
| - return true;
|
| -}
|
| -
|
| -
|
| -static bool IndexedAccessCounter(Local<v8::Object> global,
|
| - uint32_t key,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - indexed_access_count++;
|
| +static bool AccessCounter(Local<v8::Object> global, Local<Value> name,
|
| + v8::AccessType type, Local<Value> data) {
|
| + access_count++;
|
| return true;
|
| }
|
|
|
|
|
| // This one is too easily disturbed by other tests.
|
| TEST(AccessControlIC) {
|
| - named_access_count = 0;
|
| - indexed_access_count = 0;
|
| + access_count = 0;
|
|
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope handle_scope(isolate);
|
| @@ -8786,8 +8699,7 @@ TEST(AccessControlIC) {
|
| // called for cross-domain access.
|
| v8::Handle<v8::ObjectTemplate> object_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - object_template->SetAccessCheckCallbacks(NamedAccessCounter,
|
| - IndexedAccessCounter);
|
| + object_template->SetAccessCheckCallbacks(AccessCounter, NULL);
|
| Local<v8::Object> object = object_template->NewInstance();
|
|
|
| v8::HandleScope scope1(isolate);
|
| @@ -8811,7 +8723,7 @@ TEST(AccessControlIC) {
|
| value = CompileRun("testProp(obj)");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(1, value->Int32Value());
|
| - CHECK_EQ(21, named_access_count);
|
| + CHECK_EQ(21, access_count);
|
|
|
| // Check that the named access-control function is called every time.
|
| CompileRun("var p = 'prop';"
|
| @@ -8825,16 +8737,18 @@ TEST(AccessControlIC) {
|
| value = CompileRun("testKeyed(obj)");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(1, value->Int32Value());
|
| - CHECK_EQ(42, named_access_count);
|
| + CHECK_EQ(42, access_count);
|
| // Force the inline caches into generic state and try again.
|
| CompileRun("testKeyed({ a: 0 })");
|
| CompileRun("testKeyed({ b: 0 })");
|
| value = CompileRun("testKeyed(obj)");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(1, value->Int32Value());
|
| - CHECK_EQ(63, named_access_count);
|
| + CHECK_EQ(63, access_count);
|
|
|
| // Check that the indexed access-control function is called every time.
|
| + access_count = 0;
|
| +
|
| CompileRun("function testIndexed(obj) {"
|
| " for (var i = 0; i < 10; i++) obj[0] = 1;"
|
| " for (var j = 0; j < 10; j++) obj[0];"
|
| @@ -8843,15 +8757,16 @@ TEST(AccessControlIC) {
|
| value = CompileRun("testIndexed(obj)");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(1, value->Int32Value());
|
| - CHECK_EQ(21, indexed_access_count);
|
| + CHECK_EQ(21, access_count);
|
| // Force the inline caches into generic state.
|
| CompileRun("testIndexed(new Array(1))");
|
| // Test that the indexed access check is called.
|
| value = CompileRun("testIndexed(obj)");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(1, value->Int32Value());
|
| - CHECK_EQ(42, indexed_access_count);
|
| + CHECK_EQ(42, access_count);
|
|
|
| + access_count = 0;
|
| // Check that the named access check is called when invoking
|
| // functions on an object that requires access checks.
|
| CompileRun("obj.f = function() {}");
|
| @@ -8859,7 +8774,8 @@ TEST(AccessControlIC) {
|
| " for (var i = 0; i < 10; i++) obj.f();"
|
| "}");
|
| CompileRun("testCallNormal(obj)");
|
| - CHECK_EQ(74, named_access_count);
|
| + printf("%i\n", access_count);
|
| + CHECK_EQ(11, access_count);
|
|
|
| // Force obj into slow case.
|
| value = CompileRun("delete obj.prop");
|
| @@ -8870,89 +8786,14 @@ TEST(AccessControlIC) {
|
| value = CompileRun("testProp(obj);");
|
| CHECK(value->IsNumber());
|
| CHECK_EQ(1, value->Int32Value());
|
| - CHECK_EQ(96, named_access_count);
|
| + CHECK_EQ(33, access_count);
|
|
|
| // Force the call inline cache into dictionary probing mode.
|
| CompileRun("o.f = function() {}; testCallNormal(o)");
|
| // Test that the named access check is still called for each
|
| // invocation of the function.
|
| value = CompileRun("testCallNormal(obj)");
|
| - CHECK_EQ(106, named_access_count);
|
| -
|
| - context1->Exit();
|
| - context0->Exit();
|
| -}
|
| -
|
| -
|
| -static bool NamedAccessFlatten(Local<v8::Object> global,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - char buf[100];
|
| - int len;
|
| -
|
| - CHECK(name->IsString());
|
| -
|
| - memset(buf, 0x1, sizeof(buf));
|
| - len = name.As<String>()->WriteOneByte(reinterpret_cast<uint8_t*>(buf));
|
| - CHECK_EQ(4, len);
|
| -
|
| - uint16_t buf2[100];
|
| -
|
| - memset(buf, 0x1, sizeof(buf));
|
| - len = name.As<String>()->Write(buf2);
|
| - CHECK_EQ(4, len);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -
|
| -static bool IndexedAccessFlatten(Local<v8::Object> global,
|
| - uint32_t key,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - return true;
|
| -}
|
| -
|
| -
|
| -// Regression test. In access checks, operations that may cause
|
| -// garbage collection are not allowed. It used to be the case that
|
| -// using the Write operation on a string could cause a garbage
|
| -// collection due to flattening of the string. This is no longer the
|
| -// case.
|
| -THREADED_TEST(AccessControlFlatten) {
|
| - named_access_count = 0;
|
| - indexed_access_count = 0;
|
| -
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - v8::HandleScope handle_scope(isolate);
|
| -
|
| - // Create an environment.
|
| - v8::Local<Context> context0 = Context::New(isolate);
|
| - context0->Enter();
|
| -
|
| - // Create an object that requires access-check functions to be
|
| - // called for cross-domain access.
|
| - v8::Handle<v8::ObjectTemplate> object_template =
|
| - v8::ObjectTemplate::New(isolate);
|
| - object_template->SetAccessCheckCallbacks(NamedAccessFlatten,
|
| - IndexedAccessFlatten);
|
| - Local<v8::Object> object = object_template->NewInstance();
|
| -
|
| - v8::HandleScope scope1(isolate);
|
| -
|
| - // Create another environment.
|
| - v8::Local<Context> context1 = Context::New(isolate);
|
| - context1->Enter();
|
| -
|
| - // Make easy access to the object from the other environment.
|
| - v8::Handle<v8::Object> global1 = context1->Global();
|
| - global1->Set(v8_str("obj"), object);
|
| -
|
| - v8::Handle<Value> value;
|
| -
|
| - value = v8_compile("var p = 'as' + 'df';")->Run();
|
| - value = v8_compile("obj[p];")->Run();
|
| + CHECK_EQ(43, access_count);
|
|
|
| context1->Exit();
|
| context0->Exit();
|
| @@ -12676,61 +12517,13 @@ THREADED_TEST(PropertyEnumeration2) {
|
| }
|
| }
|
|
|
| -static bool NamedSetAccessBlocker(Local<v8::Object> obj,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - return type != v8::ACCESS_SET;
|
| -}
|
| -
|
| -
|
| -static bool IndexedSetAccessBlocker(Local<v8::Object> obj,
|
| - uint32_t key,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - return type != v8::ACCESS_SET;
|
| -}
|
| -
|
| -
|
| -THREADED_TEST(DisableAccessChecksWhileConfiguring) {
|
| - LocalContext context;
|
| - v8::Isolate* isolate = context->GetIsolate();
|
| - v8::HandleScope scope(isolate);
|
| - Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
|
| - templ->SetAccessCheckCallbacks(NamedSetAccessBlocker,
|
| - IndexedSetAccessBlocker);
|
| - templ->Set(v8_str("x"), v8::True(isolate));
|
| - Local<v8::Object> instance = templ->NewInstance();
|
| - context->Global()->Set(v8_str("obj"), instance);
|
| - Local<Value> value = CompileRun("obj.x");
|
| - CHECK(value->BooleanValue());
|
| -}
|
| -
|
| -
|
| -static bool NamedGetAccessBlocker(Local<v8::Object> obj,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - return false;
|
| -}
|
| -
|
| -
|
| -static bool IndexedGetAccessBlocker(Local<v8::Object> obj,
|
| - uint32_t key,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - return false;
|
| -}
|
| -
|
| -
|
|
|
| THREADED_TEST(AccessChecksReenabledCorrectly) {
|
| LocalContext context;
|
| v8::Isolate* isolate = context->GetIsolate();
|
| v8::HandleScope scope(isolate);
|
| Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
|
| - templ->SetAccessCheckCallbacks(NamedGetAccessBlocker,
|
| - IndexedGetAccessBlocker);
|
| + templ->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
|
| templ->Set(v8_str("a"), v8_str("a"));
|
| // Add more than 8 (see kMaxFastProperties) properties
|
| // so that the constructor will force copying map.
|
| @@ -12762,27 +12555,6 @@ THREADED_TEST(AccessChecksReenabledCorrectly) {
|
| }
|
|
|
|
|
| -// This tests that access check information remains on the global
|
| -// object template when creating contexts.
|
| -THREADED_TEST(AccessControlRepeatedContextCreation) {
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - v8::HandleScope handle_scope(isolate);
|
| - v8::Handle<v8::ObjectTemplate> global_template =
|
| - v8::ObjectTemplate::New(isolate);
|
| - global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker,
|
| - IndexedSetAccessBlocker);
|
| - i::Handle<i::ObjectTemplateInfo> internal_template =
|
| - v8::Utils::OpenHandle(*global_template);
|
| - CHECK(!internal_template->constructor()->IsUndefined());
|
| - i::Handle<i::FunctionTemplateInfo> constructor(
|
| - i::FunctionTemplateInfo::cast(internal_template->constructor()));
|
| - CHECK(!constructor->access_check_info()->IsUndefined());
|
| - v8::Local<Context> context0(Context::New(isolate, NULL, global_template));
|
| - CHECK(!context0.IsEmpty());
|
| - CHECK(!constructor->access_check_info()->IsUndefined());
|
| -}
|
| -
|
| -
|
| THREADED_TEST(TurnOnAccessCheck) {
|
| v8::Isolate* isolate = CcTest::isolate();
|
| v8::HandleScope handle_scope(isolate);
|
| @@ -12791,10 +12563,8 @@ THREADED_TEST(TurnOnAccessCheck) {
|
| // default.
|
| v8::Handle<v8::ObjectTemplate> global_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker,
|
| - IndexedGetAccessBlocker,
|
| - v8::Handle<v8::Value>(),
|
| - false);
|
| + global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL,
|
| + v8::Handle<v8::Value>(), false);
|
| v8::Local<Context> context = Context::New(isolate, NULL, global_template);
|
| Context::Scope context_scope(context);
|
|
|
| @@ -12850,109 +12620,6 @@ THREADED_TEST(TurnOnAccessCheck) {
|
| }
|
|
|
|
|
| -static const char* kPropertyA = "a";
|
| -static const char* kPropertyH = "h";
|
| -
|
| -static bool NamedGetAccessBlockAandH(Local<v8::Object> obj,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - if (!name->IsString()) return false;
|
| - i::Handle<i::String> name_handle =
|
| - v8::Utils::OpenHandle(String::Cast(*name));
|
| - return !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyA))
|
| - && !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyH));
|
| -}
|
| -
|
| -
|
| -THREADED_TEST(TurnOnAccessCheckAndRecompile) {
|
| - v8::Isolate* isolate = CcTest::isolate();
|
| - v8::HandleScope handle_scope(isolate);
|
| -
|
| - // Create an environment with access check to the global object disabled by
|
| - // default. When the registered access checker will block access to properties
|
| - // a and h.
|
| - v8::Handle<v8::ObjectTemplate> global_template =
|
| - v8::ObjectTemplate::New(isolate);
|
| - global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH,
|
| - IndexedGetAccessBlocker,
|
| - v8::Handle<v8::Value>(),
|
| - false);
|
| - v8::Local<Context> context = Context::New(isolate, NULL, global_template);
|
| - Context::Scope context_scope(context);
|
| -
|
| - // Set up a property and a number of functions.
|
| - context->Global()->Set(v8_str("a"), v8_num(1));
|
| - static const char* source = "function f1() {return a;}"
|
| - "function f2() {return a;}"
|
| - "function g1() {return h();}"
|
| - "function g2() {return h();}"
|
| - "function h() {return 1;}";
|
| -
|
| - CompileRun(source);
|
| - Local<Function> f1;
|
| - Local<Function> f2;
|
| - Local<Function> g1;
|
| - Local<Function> g2;
|
| - Local<Function> h;
|
| - f1 = Local<Function>::Cast(context->Global()->Get(v8_str("f1")));
|
| - f2 = Local<Function>::Cast(context->Global()->Get(v8_str("f2")));
|
| - g1 = Local<Function>::Cast(context->Global()->Get(v8_str("g1")));
|
| - g2 = Local<Function>::Cast(context->Global()->Get(v8_str("g2")));
|
| - h = Local<Function>::Cast(context->Global()->Get(v8_str("h")));
|
| -
|
| - // Get the global object.
|
| - v8::Handle<v8::Object> global = context->Global();
|
| -
|
| - // Call f1 one time and f2 a number of times. This will ensure that f1 still
|
| - // uses the runtime system to retreive property a whereas f2 uses global load
|
| - // inline cache.
|
| - CHECK(f1->Call(global, 0, NULL)->Equals(v8_num(1)));
|
| - for (int i = 0; i < 4; i++) {
|
| - CHECK(f2->Call(global, 0, NULL)->Equals(v8_num(1)));
|
| - }
|
| -
|
| - // Same for g1 and g2.
|
| - CHECK(g1->Call(global, 0, NULL)->Equals(v8_num(1)));
|
| - for (int i = 0; i < 4; i++) {
|
| - CHECK(g2->Call(global, 0, NULL)->Equals(v8_num(1)));
|
| - }
|
| -
|
| - // Detach the global and turn on access check now blocking access to property
|
| - // a and function h.
|
| - Local<Object> hidden_global = Local<Object>::Cast(
|
| - context->Global()->GetPrototype());
|
| - context->DetachGlobal();
|
| - hidden_global->TurnOnAccessCheck();
|
| -
|
| - // Failing access check results in exception.
|
| - CHECK(f1->Call(global, 0, NULL).IsEmpty());
|
| - CHECK(f2->Call(global, 0, NULL).IsEmpty());
|
| - CHECK(g1->Call(global, 0, NULL).IsEmpty());
|
| - CHECK(g2->Call(global, 0, NULL).IsEmpty());
|
| -
|
| - // No failing access check when just returning a constant.
|
| - CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1)));
|
| -
|
| - // Now compile the source again. And get the newly compiled functions, except
|
| - // for h for which access is blocked.
|
| - CompileRun(source);
|
| - f1 = Local<Function>::Cast(hidden_global->Get(v8_str("f1")));
|
| - f2 = Local<Function>::Cast(hidden_global->Get(v8_str("f2")));
|
| - g1 = Local<Function>::Cast(hidden_global->Get(v8_str("g1")));
|
| - g2 = Local<Function>::Cast(hidden_global->Get(v8_str("g2")));
|
| - CHECK(hidden_global->Get(v8_str("h")).IsEmpty());
|
| -
|
| - // Failing access check results in exception.
|
| - v8::Local<v8::Value> result = f1->Call(global, 0, NULL);
|
| - CHECK(result.IsEmpty());
|
| - CHECK(f1->Call(global, 0, NULL).IsEmpty());
|
| - CHECK(f2->Call(global, 0, NULL).IsEmpty());
|
| - CHECK(g1->Call(global, 0, NULL).IsEmpty());
|
| - CHECK(g2->Call(global, 0, NULL).IsEmpty());
|
| -}
|
| -
|
| -
|
| // Tests that ScriptData can be serialized and deserialized.
|
| TEST(PreCompileSerialization) {
|
| v8::V8::Initialize();
|
| @@ -17457,10 +17124,8 @@ TEST(GCInFailedAccessCheckCallback) {
|
| // check callbacks that will block access.
|
| v8::Handle<v8::ObjectTemplate> global_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker,
|
| - IndexedGetAccessBlocker,
|
| - v8::Handle<v8::Value>(),
|
| - false);
|
| + global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL,
|
| + v8::Handle<v8::Value>(), false);
|
|
|
| // Create a context and set an x property on it's global object.
|
| LocalContext context0(NULL, global_template);
|
| @@ -18596,33 +18261,13 @@ THREADED_TEST(Regress1516) {
|
| }
|
|
|
|
|
| -static bool BlockProtoNamedSecurityTestCallback(Local<v8::Object> global,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - // Only block read access to __proto__.
|
| - if (type == v8::ACCESS_GET && name->IsString() &&
|
| - name.As<v8::String>()->Length() == 9 &&
|
| - name.As<v8::String>()->Utf8Length() == 9) {
|
| - char buffer[10];
|
| - CHECK_EQ(10, name.As<v8::String>()->WriteUtf8(buffer));
|
| - return strncmp(buffer, "__proto__", 9) != 0;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -
|
| THREADED_TEST(Regress93759) {
|
| v8::Isolate* isolate = CcTest::isolate();
|
| HandleScope scope(isolate);
|
|
|
| // Template for object with security check.
|
| Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(isolate);
|
| - // We don't do indexing, so any callback can be used for that.
|
| - no_proto_template->SetAccessCheckCallbacks(
|
| - BlockProtoNamedSecurityTestCallback,
|
| - IndexedSecurityTestCallback);
|
| + no_proto_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
|
|
|
| // Templates for objects with hidden prototypes and possibly security check.
|
| Local<FunctionTemplate> hidden_proto_template =
|
| @@ -18632,8 +18277,7 @@ THREADED_TEST(Regress93759) {
|
| Local<FunctionTemplate> protected_hidden_proto_template =
|
| v8::FunctionTemplate::New(isolate);
|
| protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallbacks(
|
| - BlockProtoNamedSecurityTestCallback,
|
| - IndexedSecurityTestCallback);
|
| + AccessAlwaysBlocked, NULL);
|
| protected_hidden_proto_template->SetHiddenPrototype(true);
|
|
|
| // Context for "foreign" objects used in test.
|
| @@ -18644,12 +18288,10 @@ THREADED_TEST(Regress93759) {
|
| Local<Object> simple_object = Object::New(isolate);
|
|
|
| // Object with explicit security check.
|
| - Local<Object> protected_object =
|
| - no_proto_template->NewInstance();
|
| + Local<Object> protected_object = no_proto_template->NewInstance();
|
|
|
| // JSGlobalProxy object, always have security check.
|
| - Local<Object> proxy_object =
|
| - context->Global();
|
| + Local<Object> proxy_object = context->Global();
|
|
|
| // Global object, the prototype of proxy_object. No security checks.
|
| Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate);
|
| @@ -19815,24 +19457,6 @@ THREADED_TEST(SemaphoreInterruption) {
|
| #endif // V8_OS_POSIX
|
|
|
|
|
| -static bool NamedAccessAlwaysBlocked(Local<v8::Object> global,
|
| - Local<Value> name,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - i::PrintF("Named access blocked.\n");
|
| - return false;
|
| -}
|
| -
|
| -
|
| -static bool IndexAccessAlwaysBlocked(Local<v8::Object> global,
|
| - uint32_t key,
|
| - v8::AccessType type,
|
| - Local<Value> data) {
|
| - i::PrintF("Indexed access blocked.\n");
|
| - return false;
|
| -}
|
| -
|
| -
|
| void UnreachableCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| CHECK(false);
|
| }
|
| @@ -19847,8 +19471,7 @@ TEST(JSONStringifyAccessCheck) {
|
| // check callbacks that will block access.
|
| v8::Handle<v8::ObjectTemplate> global_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked,
|
| - IndexAccessAlwaysBlocked);
|
| + global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
|
|
|
| // Create a context and set an x property on it's global object.
|
| LocalContext context0(NULL, global_template);
|
| @@ -19946,8 +19569,7 @@ TEST(AccessCheckThrows) {
|
| // check callbacks that will block access.
|
| v8::Handle<v8::ObjectTemplate> global_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked,
|
| - IndexAccessAlwaysBlocked);
|
| + global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
|
|
|
| // Create a context and set an x property on it's global object.
|
| LocalContext context0(NULL, global_template);
|
| @@ -21002,42 +20624,42 @@ TEST(Regress354123) {
|
| v8::HandleScope scope(isolate);
|
|
|
| v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
|
| - templ->SetAccessCheckCallbacks(NamedAccessCounter, IndexedAccessCounter);
|
| + templ->SetAccessCheckCallbacks(AccessCounter, NULL);
|
| current->Global()->Set(v8_str("friend"), templ->NewInstance());
|
|
|
| // Test access using __proto__ from the prototype chain.
|
| - named_access_count = 0;
|
| + access_count = 0;
|
| CompileRun("friend.__proto__ = {};");
|
| - CHECK_EQ(2, named_access_count);
|
| + CHECK_EQ(2, access_count);
|
| CompileRun("friend.__proto__;");
|
| - CHECK_EQ(4, named_access_count);
|
| + CHECK_EQ(4, access_count);
|
|
|
| // Test access using __proto__ as a hijacked function (A).
|
| - named_access_count = 0;
|
| + access_count = 0;
|
| CompileRun("var p = Object.prototype;"
|
| "var f = Object.getOwnPropertyDescriptor(p, '__proto__').set;"
|
| "f.call(friend, {});");
|
| - CHECK_EQ(1, named_access_count);
|
| + CHECK_EQ(1, access_count);
|
| CompileRun("var p = Object.prototype;"
|
| "var f = Object.getOwnPropertyDescriptor(p, '__proto__').get;"
|
| "f.call(friend);");
|
| - CHECK_EQ(2, named_access_count);
|
| + CHECK_EQ(2, access_count);
|
|
|
| // Test access using __proto__ as a hijacked function (B).
|
| - named_access_count = 0;
|
| + access_count = 0;
|
| CompileRun("var f = Object.prototype.__lookupSetter__('__proto__');"
|
| "f.call(friend, {});");
|
| - CHECK_EQ(1, named_access_count);
|
| + CHECK_EQ(1, access_count);
|
| CompileRun("var f = Object.prototype.__lookupGetter__('__proto__');"
|
| "f.call(friend);");
|
| - CHECK_EQ(2, named_access_count);
|
| + CHECK_EQ(2, access_count);
|
|
|
| // Test access using Object.setPrototypeOf reflective method.
|
| - named_access_count = 0;
|
| + access_count = 0;
|
| CompileRun("Object.setPrototypeOf(friend, {});");
|
| - CHECK_EQ(1, named_access_count);
|
| + CHECK_EQ(1, access_count);
|
| CompileRun("Object.getPrototypeOf(friend);");
|
| - CHECK_EQ(2, named_access_count);
|
| + CHECK_EQ(2, access_count);
|
| }
|
|
|
|
|
| @@ -21192,8 +20814,7 @@ TEST(Regress411877) {
|
| v8::HandleScope handle_scope(isolate);
|
| v8::Handle<v8::ObjectTemplate> object_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - object_template->SetAccessCheckCallbacks(NamedAccessCounter,
|
| - IndexedAccessCounter);
|
| + object_template->SetAccessCheckCallbacks(AccessCounter, NULL);
|
|
|
| v8::Handle<Context> context = Context::New(isolate);
|
| v8::Context::Scope context_scope(context);
|
| @@ -21208,8 +20829,7 @@ TEST(GetHiddenPropertyTableAfterAccessCheck) {
|
| v8::HandleScope handle_scope(isolate);
|
| v8::Handle<v8::ObjectTemplate> object_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - object_template->SetAccessCheckCallbacks(NamedAccessCounter,
|
| - IndexedAccessCounter);
|
| + object_template->SetAccessCheckCallbacks(AccessCounter, NULL);
|
|
|
| v8::Handle<Context> context = Context::New(isolate);
|
| v8::Context::Scope context_scope(context);
|
| @@ -21227,8 +20847,7 @@ TEST(Regress411793) {
|
| v8::HandleScope handle_scope(isolate);
|
| v8::Handle<v8::ObjectTemplate> object_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - object_template->SetAccessCheckCallbacks(NamedAccessCounter,
|
| - IndexedAccessCounter);
|
| + object_template->SetAccessCheckCallbacks(AccessCounter, NULL);
|
|
|
| v8::Handle<Context> context = Context::New(isolate);
|
| v8::Context::Scope context_scope(context);
|
| @@ -21833,8 +21452,7 @@ TEST(GetPrototypeAccessControl) {
|
|
|
| v8::Handle<v8::ObjectTemplate> obj_template =
|
| v8::ObjectTemplate::New(isolate);
|
| - obj_template->SetAccessCheckCallbacks(BlockEverythingNamed,
|
| - BlockEverythingIndexed);
|
| + obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
|
|
|
| env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance());
|
|
|
|
|