| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index 309040c7cd1160edddd1404b9aa64e6ffe4550f3..90dbb28e67aded3f5033428ce006b084a2efc7e8 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -8252,34 +8252,6 @@ THREADED_TEST(TypeSwitch) {
|
| }
|
|
|
|
|
| -// 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) {
|
| - // 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) {
|
| - // Always allow read access.
|
| - if (type == v8::ACCESS_GET)
|
| - return true;
|
| -
|
| - // Sometimes allow other access.
|
| - return g_security_callback_result;
|
| -}
|
| -
|
| -
|
| static int trouble_nesting = 0;
|
| static void TroubleCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
|
| ApiTestFuzzer::Fuzz();
|
| @@ -8406,6 +8378,36 @@ TEST(TryCatchFinallyUsingTryCatchHandler) {
|
| }
|
|
|
|
|
| +// 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) {
|
| + 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;
|
| +}
|
| +
|
| +
|
| // SecurityHandler can't be run twice
|
| TEST(SecurityHandler) {
|
| v8::Isolate* isolate = CcTest::isolate();
|
| @@ -8577,6 +8579,61 @@ 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 IndexedSecurityTestCallbackWithGC(Local<v8::Object> global,
|
| + uint32_t key,
|
| + v8::AccessType type,
|
| + Local<Value> data) {
|
| + CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
|
| + indexed_security_check_with_gc_called = true;
|
| + return true;
|
| +}
|
| +
|
| +
|
| +TEST(SecurityTestGCAllowed) {
|
| + v8::Isolate* isolate = CcTest::isolate();
|
| + v8::HandleScope handle_scope(isolate);
|
| + v8::Handle<v8::ObjectTemplate> object_template =
|
| + v8::ObjectTemplate::New(isolate);
|
| + object_template->SetAccessCheckCallbacks(NamedSecurityCallbackWithGC,
|
| + IndexedSecurityTestCallbackWithGC);
|
| +
|
| + 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;
|
| + 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()->Equals(v8_str("1001")));
|
| + CHECK(named_security_check_with_gc_called);
|
| +
|
| + indexed_security_check_with_gc_called = false;
|
| + CHECK(CompileRun("obj[0]")->ToString()->Equals(v8_str("1002")));
|
| + CHECK(indexed_security_check_with_gc_called);
|
| +}
|
| +
|
| +
|
| THREADED_TEST(CrossDomainDelete) {
|
| LocalContext env1;
|
| v8::HandleScope handle_scope(env1->GetIsolate());
|
|
|