Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: test/cctest/test-api.cc

Issue 942963004: Remove internal use of v8::AccessType, always pass v8::ACCESS_HAS instead. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove the distinction between named/indexed access checks, always pass "undefined" as "name" Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/runtime/runtime-object.cc ('k') | test/cctest/test-api-interceptors.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 7655 matching lines...) Expand 10 before | Expand all | Expand 10 after
7666 "}"); 7666 "}");
7667 CHECK(try_catch.HasCaught()); 7667 CHECK(try_catch.HasCaught());
7668 CHECK(!try_catch.Message().IsEmpty()); 7668 CHECK(!try_catch.Message().IsEmpty());
7669 String::Utf8Value finally_exception_value(try_catch.Exception()); 7669 String::Utf8Value finally_exception_value(try_catch.Exception());
7670 CHECK_EQ(0, strcmp(*finally_exception_value, "2")); 7670 CHECK_EQ(0, strcmp(*finally_exception_value, "2"));
7671 } 7671 }
7672 7672
7673 7673
7674 // For use within the TestSecurityHandler() test. 7674 // For use within the TestSecurityHandler() test.
7675 static bool g_security_callback_result = false; 7675 static bool g_security_callback_result = false;
7676 static bool NamedSecurityTestCallback(Local<v8::Object> global, 7676 static bool SecurityTestCallback(Local<v8::Object> global, Local<Value> name,
7677 Local<Value> name, 7677 v8::AccessType type, Local<Value> data) {
7678 v8::AccessType type,
7679 Local<Value> data) {
7680 printf("a\n"); 7678 printf("a\n");
7681 // Always allow read access.
7682 if (type == v8::ACCESS_GET)
7683 return true;
7684
7685 // Sometimes allow other access.
7686 return g_security_callback_result; 7679 return g_security_callback_result;
7687 } 7680 }
7688 7681
7689
7690 static bool IndexedSecurityTestCallback(Local<v8::Object> global,
7691 uint32_t key,
7692 v8::AccessType type,
7693 Local<Value> data) {
7694 printf("b\n");
7695 // Always allow read access.
7696 if (type == v8::ACCESS_GET)
7697 return true;
7698
7699 // Sometimes allow other access.
7700 return g_security_callback_result;
7701 }
7702
7703 7682
7704 // SecurityHandler can't be run twice 7683 // SecurityHandler can't be run twice
7705 TEST(SecurityHandler) { 7684 TEST(SecurityHandler) {
7706 v8::Isolate* isolate = CcTest::isolate(); 7685 v8::Isolate* isolate = CcTest::isolate();
7707 v8::HandleScope scope0(isolate); 7686 v8::HandleScope scope0(isolate);
7708 v8::Handle<v8::ObjectTemplate> global_template = 7687 v8::Handle<v8::ObjectTemplate> global_template =
7709 v8::ObjectTemplate::New(isolate); 7688 v8::ObjectTemplate::New(isolate);
7710 global_template->SetAccessCheckCallbacks(NamedSecurityTestCallback, 7689 global_template->SetAccessCheckCallbacks(SecurityTestCallback, NULL);
7711 IndexedSecurityTestCallback);
7712 // Create an environment 7690 // Create an environment
7713 v8::Handle<Context> context0 = Context::New(isolate, NULL, global_template); 7691 v8::Handle<Context> context0 = Context::New(isolate, NULL, global_template);
7714 context0->Enter(); 7692 context0->Enter();
7715 7693
7716 v8::Handle<v8::Object> global0 = context0->Global(); 7694 v8::Handle<v8::Object> global0 = context0->Global();
7717 v8::Handle<Script> script0 = v8_compile("foo = 111"); 7695 v8::Handle<Script> script0 = v8_compile("foo = 111");
7718 script0->Run(); 7696 script0->Run();
7719 global0->Set(v8_str("0"), v8_num(999)); 7697 global0->Set(v8_str("0"), v8_num(999));
7720 v8::Handle<Value> foo0 = global0->Get(v8_str("foo")); 7698 v8::Handle<Value> foo0 = global0->Get(v8_str("foo"));
7721 CHECK_EQ(111, foo0->Int32Value()); 7699 CHECK_EQ(111, foo0->Int32Value());
7722 v8::Handle<Value> z0 = global0->Get(v8_str("0")); 7700 v8::Handle<Value> z0 = global0->Get(v8_str("0"));
7723 CHECK_EQ(999, z0->Int32Value()); 7701 CHECK_EQ(999, z0->Int32Value());
7724 7702
7725 // Create another environment, should fail security checks. 7703 // Create another environment, should fail security checks.
7726 v8::HandleScope scope1(isolate); 7704 v8::HandleScope scope1(isolate);
7727 7705
7728 v8::Handle<Context> context1 = 7706 v8::Handle<Context> context1 =
7729 Context::New(isolate, NULL, global_template); 7707 Context::New(isolate, NULL, global_template);
7730 context1->Enter(); 7708 context1->Enter();
7731 7709
7732 v8::Handle<v8::Object> global1 = context1->Global(); 7710 v8::Handle<v8::Object> global1 = context1->Global();
7733 global1->Set(v8_str("othercontext"), global0); 7711 global1->Set(v8_str("othercontext"), global0);
7734 // This set will fail the security check. 7712 // This set will fail the security check.
7735 v8::Handle<Script> script1 = 7713 v8::Handle<Script> script1 =
7736 v8_compile("othercontext.foo = 222; othercontext[0] = 888;"); 7714 v8_compile("othercontext.foo = 222; othercontext[0] = 888;");
7737 script1->Run(); 7715 script1->Run();
7716 g_security_callback_result = true;
7738 // This read will pass the security check. 7717 // This read will pass the security check.
7739 v8::Handle<Value> foo1 = global0->Get(v8_str("foo")); 7718 v8::Handle<Value> foo1 = global0->Get(v8_str("foo"));
7740 CHECK_EQ(111, foo1->Int32Value()); 7719 CHECK_EQ(111, foo1->Int32Value());
7741 // This read will pass the security check. 7720 // This read will pass the security check.
7742 v8::Handle<Value> z1 = global0->Get(v8_str("0")); 7721 v8::Handle<Value> z1 = global0->Get(v8_str("0"));
7743 CHECK_EQ(999, z1->Int32Value()); 7722 CHECK_EQ(999, z1->Int32Value());
7744 7723
7745 // Create another environment, should pass security checks. 7724 // Create another environment, should pass security checks.
7746 { g_security_callback_result = true; // allow security handler to pass. 7725 {
7747 v8::HandleScope scope2(isolate); 7726 v8::HandleScope scope2(isolate);
7748 LocalContext context2; 7727 LocalContext context2;
7749 v8::Handle<v8::Object> global2 = context2->Global(); 7728 v8::Handle<v8::Object> global2 = context2->Global();
7750 global2->Set(v8_str("othercontext"), global0); 7729 global2->Set(v8_str("othercontext"), global0);
7751 v8::Handle<Script> script2 = 7730 v8::Handle<Script> script2 =
7752 v8_compile("othercontext.foo = 333; othercontext[0] = 888;"); 7731 v8_compile("othercontext.foo = 333; othercontext[0] = 888;");
7753 script2->Run(); 7732 script2->Run();
7754 v8::Handle<Value> foo2 = global0->Get(v8_str("foo")); 7733 v8::Handle<Value> foo2 = global0->Get(v8_str("foo"));
7755 CHECK_EQ(333, foo2->Int32Value()); 7734 CHECK_EQ(333, foo2->Int32Value());
7756 v8::Handle<Value> z2 = global0->Get(v8_str("0")); 7735 v8::Handle<Value> z2 = global0->Get(v8_str("0"));
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
7859 // gets stopped by the security checks on the other global object. 7838 // gets stopped by the security checks on the other global object.
7860 Local<Script> access_f2 = v8_compile("f.foo"); 7839 Local<Script> access_f2 = v8_compile("f.foo");
7861 Local<Script> access_f3 = v8_compile("f[99]"); 7840 Local<Script> access_f3 = v8_compile("f[99]");
7862 for (int k = 0; k < 5; k++) { 7841 for (int k = 0; k < 5; k++) {
7863 CHECK(access_f2->Run().IsEmpty()); 7842 CHECK(access_f2->Run().IsEmpty());
7864 CHECK(access_f3->Run().IsEmpty()); 7843 CHECK(access_f3->Run().IsEmpty());
7865 } 7844 }
7866 } 7845 }
7867 7846
7868 7847
7869 static bool named_security_check_with_gc_called; 7848 static bool security_check_with_gc_called;
7870 7849
7871 static bool NamedSecurityCallbackWithGC(Local<v8::Object> global, 7850 static bool SecurityTestCallbackWithGC(Local<v8::Object> global,
7872 Local<Value> name, 7851 Local<v8::Value> name,
7873 v8::AccessType type, 7852 v8::AccessType type, Local<Value> data) {
7874 Local<Value> data) {
7875 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 7853 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
7876 named_security_check_with_gc_called = true; 7854 security_check_with_gc_called = true;
7877 return true; 7855 return true;
7878 } 7856 }
7879 7857
7880
7881 static bool indexed_security_check_with_gc_called;
7882
7883 static bool IndexedSecurityTestCallbackWithGC(Local<v8::Object> global,
7884 uint32_t key,
7885 v8::AccessType type,
7886 Local<Value> data) {
7887 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
7888 indexed_security_check_with_gc_called = true;
7889 return true;
7890 }
7891
7892 7858
7893 TEST(SecurityTestGCAllowed) { 7859 TEST(SecurityTestGCAllowed) {
7894 v8::Isolate* isolate = CcTest::isolate(); 7860 v8::Isolate* isolate = CcTest::isolate();
7895 v8::HandleScope handle_scope(isolate); 7861 v8::HandleScope handle_scope(isolate);
7896 v8::Handle<v8::ObjectTemplate> object_template = 7862 v8::Handle<v8::ObjectTemplate> object_template =
7897 v8::ObjectTemplate::New(isolate); 7863 v8::ObjectTemplate::New(isolate);
7898 object_template->SetAccessCheckCallbacks(NamedSecurityCallbackWithGC, 7864 object_template->SetAccessCheckCallbacks(SecurityTestCallbackWithGC, NULL);
7899 IndexedSecurityTestCallbackWithGC);
7900 7865
7901 v8::Handle<Context> context = Context::New(isolate); 7866 v8::Handle<Context> context = Context::New(isolate);
7902 v8::Context::Scope context_scope(context); 7867 v8::Context::Scope context_scope(context);
7903 7868
7904 context->Global()->Set(v8_str("obj"), object_template->NewInstance()); 7869 context->Global()->Set(v8_str("obj"), object_template->NewInstance());
7905 7870
7906 named_security_check_with_gc_called = false; 7871 security_check_with_gc_called = false;
7907 CompileRun("obj.foo = new String(1001);"); 7872 CompileRun("obj[0] = new String(1002);");
7908 CHECK(named_security_check_with_gc_called); 7873 CHECK(security_check_with_gc_called);
7909 7874
7910 indexed_security_check_with_gc_called = false; 7875 security_check_with_gc_called = false;
7911 CompileRun("obj[0] = new String(1002);");
7912 CHECK(indexed_security_check_with_gc_called);
7913
7914 named_security_check_with_gc_called = false;
7915 CHECK(CompileRun("obj.foo")->ToString(isolate)->Equals(v8_str("1001")));
7916 CHECK(named_security_check_with_gc_called);
7917
7918 indexed_security_check_with_gc_called = false;
7919 CHECK(CompileRun("obj[0]")->ToString(isolate)->Equals(v8_str("1002"))); 7876 CHECK(CompileRun("obj[0]")->ToString(isolate)->Equals(v8_str("1002")));
7920 CHECK(indexed_security_check_with_gc_called); 7877 CHECK(security_check_with_gc_called);
7921 } 7878 }
7922 7879
7923 7880
7924 THREADED_TEST(CrossDomainDelete) { 7881 THREADED_TEST(CrossDomainDelete) {
7925 LocalContext env1; 7882 LocalContext env1;
7926 v8::HandleScope handle_scope(env1->GetIsolate()); 7883 v8::HandleScope handle_scope(env1->GetIsolate());
7927 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); 7884 v8::Handle<Context> env2 = Context::New(env1->GetIsolate());
7928 7885
7929 Local<Value> foo = v8_str("foo"); 7886 Local<Value> foo = v8_str("foo");
7930 Local<Value> bar = v8_str("bar"); 7887 Local<Value> bar = v8_str("bar");
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
8268 CHECK_EQ(16u, results->Length()); 8225 CHECK_EQ(16u, results->Length());
8269 for (int i = 0; i < 16; i += 4) { 8226 for (int i = 0; i < 16; i += 4) {
8270 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0))); 8227 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0)));
8271 CHECK(v8_str("env1_x")->Equals(results->Get(i + 1))); 8228 CHECK(v8_str("env1_x")->Equals(results->Get(i + 1)));
8272 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2))); 8229 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2)));
8273 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3))); 8230 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3)));
8274 } 8231 }
8275 } 8232 }
8276 8233
8277 8234
8278 static bool allowed_access_type[v8::ACCESS_KEYS + 1] = { false }; 8235 static bool allowed_access = false;
8279 static bool NamedAccessBlocker(Local<v8::Object> global, 8236 static bool AccessBlocker(Local<v8::Object> global, Local<Value> name,
8280 Local<Value> name, 8237 v8::AccessType type, Local<Value> data) {
8281 v8::AccessType type,
8282 Local<Value> data) {
8283 return CcTest::isolate()->GetCurrentContext()->Global()->Equals(global) || 8238 return CcTest::isolate()->GetCurrentContext()->Global()->Equals(global) ||
8284 allowed_access_type[type]; 8239 allowed_access;
8285 } 8240 }
8286 8241
8287 8242
8288 static bool IndexedAccessBlocker(Local<v8::Object> global,
8289 uint32_t key,
8290 v8::AccessType type,
8291 Local<Value> data) {
8292 return CcTest::isolate()->GetCurrentContext()->Global()->Equals(global) ||
8293 allowed_access_type[type];
8294 }
8295
8296
8297 static int g_echo_value = -1; 8243 static int g_echo_value = -1;
8298 8244
8299 8245
8300 static void EchoGetter( 8246 static void EchoGetter(
8301 Local<String> name, 8247 Local<String> name,
8302 const v8::PropertyCallbackInfo<v8::Value>& info) { 8248 const v8::PropertyCallbackInfo<v8::Value>& info) {
8303 info.GetReturnValue().Set(v8_num(g_echo_value)); 8249 info.GetReturnValue().Set(v8_num(g_echo_value));
8304 } 8250 }
8305 8251
8306 8252
(...skipping 24 matching lines...) Expand all
8331 CHECK(false); // This function should not be called.. 8277 CHECK(false); // This function should not be called..
8332 } 8278 }
8333 8279
8334 8280
8335 TEST(AccessControl) { 8281 TEST(AccessControl) {
8336 v8::Isolate* isolate = CcTest::isolate(); 8282 v8::Isolate* isolate = CcTest::isolate();
8337 v8::HandleScope handle_scope(isolate); 8283 v8::HandleScope handle_scope(isolate);
8338 v8::Handle<v8::ObjectTemplate> global_template = 8284 v8::Handle<v8::ObjectTemplate> global_template =
8339 v8::ObjectTemplate::New(isolate); 8285 v8::ObjectTemplate::New(isolate);
8340 8286
8341 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, 8287 global_template->SetAccessCheckCallbacks(AccessBlocker, NULL);
8342 IndexedAccessBlocker);
8343 8288
8344 // Add an accessor accessible by cross-domain JS code. 8289 // Add an accessor accessible by cross-domain JS code.
8345 global_template->SetAccessor( 8290 global_template->SetAccessor(
8346 v8_str("accessible_prop"), 8291 v8_str("accessible_prop"),
8347 EchoGetter, EchoSetter, 8292 EchoGetter, EchoSetter,
8348 v8::Handle<Value>(), 8293 v8::Handle<Value>(),
8349 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); 8294 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
8350 8295
8351 8296
8352 // Add an accessor that is not accessible by cross-domain JS code. 8297 // Add an accessor that is not accessible by cross-domain JS code.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
8406 CHECK( 8351 CHECK(
8407 CompileRun("propertyIsEnumerable.call(other, 'blocked_prop')").IsEmpty()); 8352 CompileRun("propertyIsEnumerable.call(other, 'blocked_prop')").IsEmpty());
8408 8353
8409 // Access blocked element. 8354 // Access blocked element.
8410 CHECK(CompileRun("other[239] = 1").IsEmpty()); 8355 CHECK(CompileRun("other[239] = 1").IsEmpty());
8411 8356
8412 CHECK(CompileRun("other[239]").IsEmpty()); 8357 CHECK(CompileRun("other[239]").IsEmpty());
8413 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239')").IsEmpty()); 8358 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239')").IsEmpty());
8414 CHECK(CompileRun("propertyIsEnumerable.call(other, '239')").IsEmpty()); 8359 CHECK(CompileRun("propertyIsEnumerable.call(other, '239')").IsEmpty());
8415 8360
8416 // Enable ACCESS_HAS 8361 allowed_access = true;
8417 allowed_access_type[v8::ACCESS_HAS] = true; 8362 // Now we can enumerate the property.
8418 CHECK(CompileRun("other[239]").IsEmpty());
8419 // ... and now we can get the descriptor...
8420 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239').value")
8421 .IsEmpty());
8422 // ... and enumerate the property.
8423 ExpectTrue("propertyIsEnumerable.call(other, '239')"); 8363 ExpectTrue("propertyIsEnumerable.call(other, '239')");
8424 allowed_access_type[v8::ACCESS_HAS] = false; 8364 allowed_access = false;
8425 8365
8426 // Access a property with JS accessor. 8366 // Access a property with JS accessor.
8427 CHECK(CompileRun("other.js_accessor_p = 2").IsEmpty()); 8367 CHECK(CompileRun("other.js_accessor_p = 2").IsEmpty());
8428 8368
8429 CHECK(CompileRun("other.js_accessor_p").IsEmpty()); 8369 CHECK(CompileRun("other.js_accessor_p").IsEmpty());
8430 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'js_accessor_p')") 8370 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'js_accessor_p')")
8431 .IsEmpty()); 8371 .IsEmpty());
8432 8372
8433 // Enable both ACCESS_HAS and ACCESS_GET. 8373 allowed_access = true;
8434 allowed_access_type[v8::ACCESS_HAS] = true;
8435 allowed_access_type[v8::ACCESS_GET] = true;
8436 8374
8437 ExpectString("other.js_accessor_p", "getter"); 8375 ExpectString("other.js_accessor_p", "getter");
8438 ExpectObject( 8376 ExpectObject(
8439 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get", getter); 8377 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get", getter);
8440 ExpectObject( 8378 ExpectObject(
8441 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set", setter); 8379 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set", setter);
8442 ExpectUndefined( 8380 ExpectUndefined(
8443 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); 8381 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value");
8444 8382
8445 allowed_access_type[v8::ACCESS_HAS] = false; 8383 allowed_access = false;
8446 allowed_access_type[v8::ACCESS_GET] = false;
8447 8384
8448 // Access an element with JS accessor. 8385 // Access an element with JS accessor.
8449 CHECK(CompileRun("other[42] = 2").IsEmpty()); 8386 CHECK(CompileRun("other[42] = 2").IsEmpty());
8450 8387
8451 CHECK(CompileRun("other[42]").IsEmpty()); 8388 CHECK(CompileRun("other[42]").IsEmpty());
8452 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '42')").IsEmpty()); 8389 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '42')").IsEmpty());
8453 8390
8454 // Enable both ACCESS_HAS and ACCESS_GET. 8391 allowed_access = true;
8455 allowed_access_type[v8::ACCESS_HAS] = true;
8456 allowed_access_type[v8::ACCESS_GET] = true;
8457 8392
8458 ExpectString("other[42]", "el_getter"); 8393 ExpectString("other[42]", "el_getter");
8459 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); 8394 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter);
8460 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); 8395 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter);
8461 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); 8396 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value");
8462 8397
8463 allowed_access_type[v8::ACCESS_HAS] = false; 8398 allowed_access = false;
8464 allowed_access_type[v8::ACCESS_GET] = false;
8465 8399
8466 v8::Handle<Value> value; 8400 v8::Handle<Value> value;
8467 8401
8468 // Access accessible property 8402 // Access accessible property
8469 value = CompileRun("other.accessible_prop = 3"); 8403 value = CompileRun("other.accessible_prop = 3");
8470 CHECK(value->IsNumber()); 8404 CHECK(value->IsNumber());
8471 CHECK_EQ(3, value->Int32Value()); 8405 CHECK_EQ(3, value->Int32Value());
8472 CHECK_EQ(3, g_echo_value); 8406 CHECK_EQ(3, g_echo_value);
8473 8407
8474 value = CompileRun("other.accessible_prop"); 8408 value = CompileRun("other.accessible_prop");
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
8507 context0->Exit(); 8441 context0->Exit();
8508 } 8442 }
8509 8443
8510 8444
8511 TEST(AccessControlES5) { 8445 TEST(AccessControlES5) {
8512 v8::Isolate* isolate = CcTest::isolate(); 8446 v8::Isolate* isolate = CcTest::isolate();
8513 v8::HandleScope handle_scope(isolate); 8447 v8::HandleScope handle_scope(isolate);
8514 v8::Handle<v8::ObjectTemplate> global_template = 8448 v8::Handle<v8::ObjectTemplate> global_template =
8515 v8::ObjectTemplate::New(isolate); 8449 v8::ObjectTemplate::New(isolate);
8516 8450
8517 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, 8451 global_template->SetAccessCheckCallbacks(AccessBlocker, NULL);
8518 IndexedAccessBlocker);
8519 8452
8520 // Add accessible accessor. 8453 // Add accessible accessor.
8521 global_template->SetAccessor( 8454 global_template->SetAccessor(
8522 v8_str("accessible_prop"), 8455 v8_str("accessible_prop"),
8523 EchoGetter, EchoSetter, 8456 EchoGetter, EchoSetter,
8524 v8::Handle<Value>(), 8457 v8::Handle<Value>(),
8525 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); 8458 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
8526 8459
8527 8460
8528 // Add an accessor that is not accessible by cross-domain JS code. 8461 // Add an accessor that is not accessible by cross-domain JS code.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
8571 CompileRun("other.accessible_prop = 42"); 8504 CompileRun("other.accessible_prop = 42");
8572 CHECK_EQ(42, g_echo_value); 8505 CHECK_EQ(42, g_echo_value);
8573 8506
8574 v8::Handle<Value> value; 8507 v8::Handle<Value> value;
8575 CompileRun("Object.defineProperty(other, 'accessible_prop', {value: -1})"); 8508 CompileRun("Object.defineProperty(other, 'accessible_prop', {value: -1})");
8576 value = CompileRun("other.accessible_prop == 42"); 8509 value = CompileRun("other.accessible_prop == 42");
8577 CHECK(value->IsTrue()); 8510 CHECK(value->IsTrue());
8578 } 8511 }
8579 8512
8580 8513
8581 static bool BlockEverythingNamed(Local<v8::Object> object, Local<Value> name, 8514 static bool AccessAlwaysBlocked(Local<v8::Object> global, Local<Value> name,
8582 v8::AccessType type, Local<Value> data) { 8515 v8::AccessType type, Local<Value> data) {
8516 i::PrintF("Access blocked.\n");
8583 return false; 8517 return false;
8584 } 8518 }
8585 8519
8586
8587 static bool BlockEverythingIndexed(Local<v8::Object> object, uint32_t key,
8588 v8::AccessType type, Local<Value> data) {
8589 return false;
8590 }
8591
8592 8520
8593 THREADED_TEST(AccessControlGetOwnPropertyNames) { 8521 THREADED_TEST(AccessControlGetOwnPropertyNames) {
8594 v8::Isolate* isolate = CcTest::isolate(); 8522 v8::Isolate* isolate = CcTest::isolate();
8595 v8::HandleScope handle_scope(isolate); 8523 v8::HandleScope handle_scope(isolate);
8596 v8::Handle<v8::ObjectTemplate> obj_template = 8524 v8::Handle<v8::ObjectTemplate> obj_template =
8597 v8::ObjectTemplate::New(isolate); 8525 v8::ObjectTemplate::New(isolate);
8598 8526
8599 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 8527 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
8600 obj_template->SetAccessCheckCallbacks(BlockEverythingNamed, 8528 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
8601 BlockEverythingIndexed);
8602 8529
8603 // Create an environment 8530 // Create an environment
8604 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 8531 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
8605 context0->Enter(); 8532 context0->Enter();
8606 8533
8607 v8::Handle<v8::Object> global0 = context0->Global(); 8534 v8::Handle<v8::Object> global0 = context0->Global();
8608 8535
8609 v8::HandleScope scope1(CcTest::isolate()); 8536 v8::HandleScope scope1(CcTest::isolate());
8610 8537
8611 v8::Local<Context> context1 = Context::New(isolate); 8538 v8::Local<Context> context1 = Context::New(isolate);
(...skipping 22 matching lines...) Expand all
8634 8561
8635 8562
8636 TEST(SuperAccessControl) { 8563 TEST(SuperAccessControl) {
8637 i::FLAG_allow_natives_syntax = true; 8564 i::FLAG_allow_natives_syntax = true;
8638 i::FLAG_harmony_classes = true; 8565 i::FLAG_harmony_classes = true;
8639 i::FLAG_harmony_object_literals = true; 8566 i::FLAG_harmony_object_literals = true;
8640 v8::Isolate* isolate = CcTest::isolate(); 8567 v8::Isolate* isolate = CcTest::isolate();
8641 v8::HandleScope handle_scope(isolate); 8568 v8::HandleScope handle_scope(isolate);
8642 v8::Handle<v8::ObjectTemplate> obj_template = 8569 v8::Handle<v8::ObjectTemplate> obj_template =
8643 v8::ObjectTemplate::New(isolate); 8570 v8::ObjectTemplate::New(isolate);
8644 obj_template->SetAccessCheckCallbacks(BlockEverythingNamed, 8571 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
8645 BlockEverythingIndexed);
8646 LocalContext env; 8572 LocalContext env;
8647 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance()); 8573 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance());
8648 8574
8649 { 8575 {
8650 v8::TryCatch try_catch; 8576 v8::TryCatch try_catch;
8651 CompileRun( 8577 CompileRun(
8652 "var f = { m() { return super.hasOwnProperty; } }.m;" 8578 "var f = { m() { return super.hasOwnProperty; } }.m;"
8653 "var m = %ToMethod(f, prohibited);" 8579 "var m = %ToMethod(f, prohibited);"
8654 "m();"); 8580 "m();");
8655 CHECK(try_catch.HasCaught()); 8581 CHECK(try_catch.HasCaught());
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
8742 CHECK_EQ(10, value->Int32Value()); 8668 CHECK_EQ(10, value->Int32Value());
8743 8669
8744 value = v8_compile("other.unreachable")->Run(); 8670 value = v8_compile("other.unreachable")->Run();
8745 CHECK(value.IsEmpty()); 8671 CHECK(value.IsEmpty());
8746 8672
8747 context1->Exit(); 8673 context1->Exit();
8748 context0->Exit(); 8674 context0->Exit();
8749 } 8675 }
8750 8676
8751 8677
8752 static int named_access_count = 0; 8678 static int access_count = 0;
8753 static int indexed_access_count = 0;
8754 8679
8755 static bool NamedAccessCounter(Local<v8::Object> global, 8680 static bool AccessCounter(Local<v8::Object> global, Local<Value> name,
8756 Local<Value> name, 8681 v8::AccessType type, Local<Value> data) {
8757 v8::AccessType type, 8682 access_count++;
8758 Local<Value> data) {
8759 named_access_count++;
8760 return true;
8761 }
8762
8763
8764 static bool IndexedAccessCounter(Local<v8::Object> global,
8765 uint32_t key,
8766 v8::AccessType type,
8767 Local<Value> data) {
8768 indexed_access_count++;
8769 return true; 8683 return true;
8770 } 8684 }
8771 8685
8772 8686
8773 // This one is too easily disturbed by other tests. 8687 // This one is too easily disturbed by other tests.
8774 TEST(AccessControlIC) { 8688 TEST(AccessControlIC) {
8775 named_access_count = 0; 8689 access_count = 0;
8776 indexed_access_count = 0;
8777 8690
8778 v8::Isolate* isolate = CcTest::isolate(); 8691 v8::Isolate* isolate = CcTest::isolate();
8779 v8::HandleScope handle_scope(isolate); 8692 v8::HandleScope handle_scope(isolate);
8780 8693
8781 // Create an environment. 8694 // Create an environment.
8782 v8::Local<Context> context0 = Context::New(isolate); 8695 v8::Local<Context> context0 = Context::New(isolate);
8783 context0->Enter(); 8696 context0->Enter();
8784 8697
8785 // Create an object that requires access-check functions to be 8698 // Create an object that requires access-check functions to be
8786 // called for cross-domain access. 8699 // called for cross-domain access.
8787 v8::Handle<v8::ObjectTemplate> object_template = 8700 v8::Handle<v8::ObjectTemplate> object_template =
8788 v8::ObjectTemplate::New(isolate); 8701 v8::ObjectTemplate::New(isolate);
8789 object_template->SetAccessCheckCallbacks(NamedAccessCounter, 8702 object_template->SetAccessCheckCallbacks(AccessCounter, NULL);
8790 IndexedAccessCounter);
8791 Local<v8::Object> object = object_template->NewInstance(); 8703 Local<v8::Object> object = object_template->NewInstance();
8792 8704
8793 v8::HandleScope scope1(isolate); 8705 v8::HandleScope scope1(isolate);
8794 8706
8795 // Create another environment. 8707 // Create another environment.
8796 v8::Local<Context> context1 = Context::New(isolate); 8708 v8::Local<Context> context1 = Context::New(isolate);
8797 context1->Enter(); 8709 context1->Enter();
8798 8710
8799 // Make easy access to the object from the other environment. 8711 // Make easy access to the object from the other environment.
8800 v8::Handle<v8::Object> global1 = context1->Global(); 8712 v8::Handle<v8::Object> global1 = context1->Global();
8801 global1->Set(v8_str("obj"), object); 8713 global1->Set(v8_str("obj"), object);
8802 8714
8803 v8::Handle<Value> value; 8715 v8::Handle<Value> value;
8804 8716
8805 // Check that the named access-control function is called every time. 8717 // Check that the named access-control function is called every time.
8806 CompileRun("function testProp(obj) {" 8718 CompileRun("function testProp(obj) {"
8807 " for (var i = 0; i < 10; i++) obj.prop = 1;" 8719 " for (var i = 0; i < 10; i++) obj.prop = 1;"
8808 " for (var j = 0; j < 10; j++) obj.prop;" 8720 " for (var j = 0; j < 10; j++) obj.prop;"
8809 " return obj.prop" 8721 " return obj.prop"
8810 "}"); 8722 "}");
8811 value = CompileRun("testProp(obj)"); 8723 value = CompileRun("testProp(obj)");
8812 CHECK(value->IsNumber()); 8724 CHECK(value->IsNumber());
8813 CHECK_EQ(1, value->Int32Value()); 8725 CHECK_EQ(1, value->Int32Value());
8814 CHECK_EQ(21, named_access_count); 8726 CHECK_EQ(21, access_count);
8815 8727
8816 // Check that the named access-control function is called every time. 8728 // Check that the named access-control function is called every time.
8817 CompileRun("var p = 'prop';" 8729 CompileRun("var p = 'prop';"
8818 "function testKeyed(obj) {" 8730 "function testKeyed(obj) {"
8819 " for (var i = 0; i < 10; i++) obj[p] = 1;" 8731 " for (var i = 0; i < 10; i++) obj[p] = 1;"
8820 " for (var j = 0; j < 10; j++) obj[p];" 8732 " for (var j = 0; j < 10; j++) obj[p];"
8821 " return obj[p];" 8733 " return obj[p];"
8822 "}"); 8734 "}");
8823 // Use obj which requires access checks. No inline caching is used 8735 // Use obj which requires access checks. No inline caching is used
8824 // in that case. 8736 // in that case.
8825 value = CompileRun("testKeyed(obj)"); 8737 value = CompileRun("testKeyed(obj)");
8826 CHECK(value->IsNumber()); 8738 CHECK(value->IsNumber());
8827 CHECK_EQ(1, value->Int32Value()); 8739 CHECK_EQ(1, value->Int32Value());
8828 CHECK_EQ(42, named_access_count); 8740 CHECK_EQ(42, access_count);
8829 // Force the inline caches into generic state and try again. 8741 // Force the inline caches into generic state and try again.
8830 CompileRun("testKeyed({ a: 0 })"); 8742 CompileRun("testKeyed({ a: 0 })");
8831 CompileRun("testKeyed({ b: 0 })"); 8743 CompileRun("testKeyed({ b: 0 })");
8832 value = CompileRun("testKeyed(obj)"); 8744 value = CompileRun("testKeyed(obj)");
8833 CHECK(value->IsNumber()); 8745 CHECK(value->IsNumber());
8834 CHECK_EQ(1, value->Int32Value()); 8746 CHECK_EQ(1, value->Int32Value());
8835 CHECK_EQ(63, named_access_count); 8747 CHECK_EQ(63, access_count);
8836 8748
8837 // Check that the indexed access-control function is called every time. 8749 // Check that the indexed access-control function is called every time.
8750 access_count = 0;
8751
8838 CompileRun("function testIndexed(obj) {" 8752 CompileRun("function testIndexed(obj) {"
8839 " for (var i = 0; i < 10; i++) obj[0] = 1;" 8753 " for (var i = 0; i < 10; i++) obj[0] = 1;"
8840 " for (var j = 0; j < 10; j++) obj[0];" 8754 " for (var j = 0; j < 10; j++) obj[0];"
8841 " return obj[0]" 8755 " return obj[0]"
8842 "}"); 8756 "}");
8843 value = CompileRun("testIndexed(obj)"); 8757 value = CompileRun("testIndexed(obj)");
8844 CHECK(value->IsNumber()); 8758 CHECK(value->IsNumber());
8845 CHECK_EQ(1, value->Int32Value()); 8759 CHECK_EQ(1, value->Int32Value());
8846 CHECK_EQ(21, indexed_access_count); 8760 CHECK_EQ(21, access_count);
8847 // Force the inline caches into generic state. 8761 // Force the inline caches into generic state.
8848 CompileRun("testIndexed(new Array(1))"); 8762 CompileRun("testIndexed(new Array(1))");
8849 // Test that the indexed access check is called. 8763 // Test that the indexed access check is called.
8850 value = CompileRun("testIndexed(obj)"); 8764 value = CompileRun("testIndexed(obj)");
8851 CHECK(value->IsNumber()); 8765 CHECK(value->IsNumber());
8852 CHECK_EQ(1, value->Int32Value()); 8766 CHECK_EQ(1, value->Int32Value());
8853 CHECK_EQ(42, indexed_access_count); 8767 CHECK_EQ(42, access_count);
8854 8768
8769 access_count = 0;
8855 // Check that the named access check is called when invoking 8770 // Check that the named access check is called when invoking
8856 // functions on an object that requires access checks. 8771 // functions on an object that requires access checks.
8857 CompileRun("obj.f = function() {}"); 8772 CompileRun("obj.f = function() {}");
8858 CompileRun("function testCallNormal(obj) {" 8773 CompileRun("function testCallNormal(obj) {"
8859 " for (var i = 0; i < 10; i++) obj.f();" 8774 " for (var i = 0; i < 10; i++) obj.f();"
8860 "}"); 8775 "}");
8861 CompileRun("testCallNormal(obj)"); 8776 CompileRun("testCallNormal(obj)");
8862 CHECK_EQ(74, named_access_count); 8777 printf("%i\n", access_count);
8778 CHECK_EQ(11, access_count);
8863 8779
8864 // Force obj into slow case. 8780 // Force obj into slow case.
8865 value = CompileRun("delete obj.prop"); 8781 value = CompileRun("delete obj.prop");
8866 CHECK(value->BooleanValue()); 8782 CHECK(value->BooleanValue());
8867 // Force inline caches into dictionary probing mode. 8783 // Force inline caches into dictionary probing mode.
8868 CompileRun("var o = { x: 0 }; delete o.x; testProp(o);"); 8784 CompileRun("var o = { x: 0 }; delete o.x; testProp(o);");
8869 // Test that the named access check is called. 8785 // Test that the named access check is called.
8870 value = CompileRun("testProp(obj);"); 8786 value = CompileRun("testProp(obj);");
8871 CHECK(value->IsNumber()); 8787 CHECK(value->IsNumber());
8872 CHECK_EQ(1, value->Int32Value()); 8788 CHECK_EQ(1, value->Int32Value());
8873 CHECK_EQ(96, named_access_count); 8789 CHECK_EQ(33, access_count);
8874 8790
8875 // Force the call inline cache into dictionary probing mode. 8791 // Force the call inline cache into dictionary probing mode.
8876 CompileRun("o.f = function() {}; testCallNormal(o)"); 8792 CompileRun("o.f = function() {}; testCallNormal(o)");
8877 // Test that the named access check is still called for each 8793 // Test that the named access check is still called for each
8878 // invocation of the function. 8794 // invocation of the function.
8879 value = CompileRun("testCallNormal(obj)"); 8795 value = CompileRun("testCallNormal(obj)");
8880 CHECK_EQ(106, named_access_count); 8796 CHECK_EQ(43, access_count);
8881 8797
8882 context1->Exit(); 8798 context1->Exit();
8883 context0->Exit(); 8799 context0->Exit();
8884 }
8885
8886
8887 static bool NamedAccessFlatten(Local<v8::Object> global,
8888 Local<Value> name,
8889 v8::AccessType type,
8890 Local<Value> data) {
8891 char buf[100];
8892 int len;
8893
8894 CHECK(name->IsString());
8895
8896 memset(buf, 0x1, sizeof(buf));
8897 len = name.As<String>()->WriteOneByte(reinterpret_cast<uint8_t*>(buf));
8898 CHECK_EQ(4, len);
8899
8900 uint16_t buf2[100];
8901
8902 memset(buf, 0x1, sizeof(buf));
8903 len = name.As<String>()->Write(buf2);
8904 CHECK_EQ(4, len);
8905
8906 return true;
8907 }
8908
8909
8910 static bool IndexedAccessFlatten(Local<v8::Object> global,
8911 uint32_t key,
8912 v8::AccessType type,
8913 Local<Value> data) {
8914 return true;
8915 }
8916
8917
8918 // Regression test. In access checks, operations that may cause
8919 // garbage collection are not allowed. It used to be the case that
8920 // using the Write operation on a string could cause a garbage
8921 // collection due to flattening of the string. This is no longer the
8922 // case.
8923 THREADED_TEST(AccessControlFlatten) {
8924 named_access_count = 0;
8925 indexed_access_count = 0;
8926
8927 v8::Isolate* isolate = CcTest::isolate();
8928 v8::HandleScope handle_scope(isolate);
8929
8930 // Create an environment.
8931 v8::Local<Context> context0 = Context::New(isolate);
8932 context0->Enter();
8933
8934 // Create an object that requires access-check functions to be
8935 // called for cross-domain access.
8936 v8::Handle<v8::ObjectTemplate> object_template =
8937 v8::ObjectTemplate::New(isolate);
8938 object_template->SetAccessCheckCallbacks(NamedAccessFlatten,
8939 IndexedAccessFlatten);
8940 Local<v8::Object> object = object_template->NewInstance();
8941
8942 v8::HandleScope scope1(isolate);
8943
8944 // Create another environment.
8945 v8::Local<Context> context1 = Context::New(isolate);
8946 context1->Enter();
8947
8948 // Make easy access to the object from the other environment.
8949 v8::Handle<v8::Object> global1 = context1->Global();
8950 global1->Set(v8_str("obj"), object);
8951
8952 v8::Handle<Value> value;
8953
8954 value = v8_compile("var p = 'as' + 'df';")->Run();
8955 value = v8_compile("obj[p];")->Run();
8956
8957 context1->Exit();
8958 context0->Exit();
8959 } 8800 }
8960 8801
8961 8802
8962 THREADED_TEST(Version) { v8::V8::GetVersion(); } 8803 THREADED_TEST(Version) { v8::V8::GetVersion(); }
8963 8804
8964 8805
8965 static void InstanceFunctionCallback( 8806 static void InstanceFunctionCallback(
8966 const v8::FunctionCallbackInfo<v8::Value>& args) { 8807 const v8::FunctionCallbackInfo<v8::Value>& args) {
8967 ApiTestFuzzer::Fuzz(); 8808 ApiTestFuzzer::Fuzz();
8968 args.GetReturnValue().Set(v8_num(12)); 8809 args.GetReturnValue().Set(v8_num(12));
(...skipping 3700 matching lines...) Expand 10 before | Expand all | Expand 10 after
12669 elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); 12510 elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0);
12670 12511
12671 v8::Handle<v8::Value> val = elms->Get(v8::Integer::New(isolate, 0)); 12512 v8::Handle<v8::Value> val = elms->Get(v8::Integer::New(isolate, 0));
12672 v8::Handle<v8::Array> props = val.As<v8::Object>()->GetPropertyNames(); 12513 v8::Handle<v8::Array> props = val.As<v8::Object>()->GetPropertyNames();
12673 CHECK_EQ(0u, props->Length()); 12514 CHECK_EQ(0u, props->Length());
12674 for (uint32_t i = 0; i < props->Length(); i++) { 12515 for (uint32_t i = 0; i < props->Length(); i++) {
12675 printf("p[%u]\n", i); 12516 printf("p[%u]\n", i);
12676 } 12517 }
12677 } 12518 }
12678 12519
12679 static bool NamedSetAccessBlocker(Local<v8::Object> obj,
12680 Local<Value> name,
12681 v8::AccessType type,
12682 Local<Value> data) {
12683 return type != v8::ACCESS_SET;
12684 }
12685
12686
12687 static bool IndexedSetAccessBlocker(Local<v8::Object> obj,
12688 uint32_t key,
12689 v8::AccessType type,
12690 Local<Value> data) {
12691 return type != v8::ACCESS_SET;
12692 }
12693
12694
12695 THREADED_TEST(DisableAccessChecksWhileConfiguring) {
12696 LocalContext context;
12697 v8::Isolate* isolate = context->GetIsolate();
12698 v8::HandleScope scope(isolate);
12699 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
12700 templ->SetAccessCheckCallbacks(NamedSetAccessBlocker,
12701 IndexedSetAccessBlocker);
12702 templ->Set(v8_str("x"), v8::True(isolate));
12703 Local<v8::Object> instance = templ->NewInstance();
12704 context->Global()->Set(v8_str("obj"), instance);
12705 Local<Value> value = CompileRun("obj.x");
12706 CHECK(value->BooleanValue());
12707 }
12708
12709
12710 static bool NamedGetAccessBlocker(Local<v8::Object> obj,
12711 Local<Value> name,
12712 v8::AccessType type,
12713 Local<Value> data) {
12714 return false;
12715 }
12716
12717
12718 static bool IndexedGetAccessBlocker(Local<v8::Object> obj,
12719 uint32_t key,
12720 v8::AccessType type,
12721 Local<Value> data) {
12722 return false;
12723 }
12724
12725
12726 12520
12727 THREADED_TEST(AccessChecksReenabledCorrectly) { 12521 THREADED_TEST(AccessChecksReenabledCorrectly) {
12728 LocalContext context; 12522 LocalContext context;
12729 v8::Isolate* isolate = context->GetIsolate(); 12523 v8::Isolate* isolate = context->GetIsolate();
12730 v8::HandleScope scope(isolate); 12524 v8::HandleScope scope(isolate);
12731 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 12525 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
12732 templ->SetAccessCheckCallbacks(NamedGetAccessBlocker, 12526 templ->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
12733 IndexedGetAccessBlocker);
12734 templ->Set(v8_str("a"), v8_str("a")); 12527 templ->Set(v8_str("a"), v8_str("a"));
12735 // Add more than 8 (see kMaxFastProperties) properties 12528 // Add more than 8 (see kMaxFastProperties) properties
12736 // so that the constructor will force copying map. 12529 // so that the constructor will force copying map.
12737 // Cannot sprintf, gcc complains unsafety. 12530 // Cannot sprintf, gcc complains unsafety.
12738 char buf[4]; 12531 char buf[4];
12739 for (char i = '0'; i <= '9' ; i++) { 12532 for (char i = '0'; i <= '9' ; i++) {
12740 buf[0] = i; 12533 buf[0] = i;
12741 for (char j = '0'; j <= '9'; j++) { 12534 for (char j = '0'; j <= '9'; j++) {
12742 buf[1] = j; 12535 buf[1] = j;
12743 for (char k = '0'; k <= '9'; k++) { 12536 for (char k = '0'; k <= '9'; k++) {
(...skipping 11 matching lines...) Expand all
12755 CHECK(value_1.IsEmpty()); 12548 CHECK(value_1.IsEmpty());
12756 12549
12757 Local<v8::Object> instance_2 = templ->NewInstance(); 12550 Local<v8::Object> instance_2 = templ->NewInstance();
12758 context->Global()->Set(v8_str("obj_2"), instance_2); 12551 context->Global()->Set(v8_str("obj_2"), instance_2);
12759 12552
12760 Local<Value> value_2 = CompileRun("obj_2.a"); 12553 Local<Value> value_2 = CompileRun("obj_2.a");
12761 CHECK(value_2.IsEmpty()); 12554 CHECK(value_2.IsEmpty());
12762 } 12555 }
12763 12556
12764 12557
12765 // This tests that access check information remains on the global
12766 // object template when creating contexts.
12767 THREADED_TEST(AccessControlRepeatedContextCreation) {
12768 v8::Isolate* isolate = CcTest::isolate();
12769 v8::HandleScope handle_scope(isolate);
12770 v8::Handle<v8::ObjectTemplate> global_template =
12771 v8::ObjectTemplate::New(isolate);
12772 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker,
12773 IndexedSetAccessBlocker);
12774 i::Handle<i::ObjectTemplateInfo> internal_template =
12775 v8::Utils::OpenHandle(*global_template);
12776 CHECK(!internal_template->constructor()->IsUndefined());
12777 i::Handle<i::FunctionTemplateInfo> constructor(
12778 i::FunctionTemplateInfo::cast(internal_template->constructor()));
12779 CHECK(!constructor->access_check_info()->IsUndefined());
12780 v8::Local<Context> context0(Context::New(isolate, NULL, global_template));
12781 CHECK(!context0.IsEmpty());
12782 CHECK(!constructor->access_check_info()->IsUndefined());
12783 }
12784
12785
12786 THREADED_TEST(TurnOnAccessCheck) { 12558 THREADED_TEST(TurnOnAccessCheck) {
12787 v8::Isolate* isolate = CcTest::isolate(); 12559 v8::Isolate* isolate = CcTest::isolate();
12788 v8::HandleScope handle_scope(isolate); 12560 v8::HandleScope handle_scope(isolate);
12789 12561
12790 // Create an environment with access check to the global object disabled by 12562 // Create an environment with access check to the global object disabled by
12791 // default. 12563 // default.
12792 v8::Handle<v8::ObjectTemplate> global_template = 12564 v8::Handle<v8::ObjectTemplate> global_template =
12793 v8::ObjectTemplate::New(isolate); 12565 v8::ObjectTemplate::New(isolate);
12794 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, 12566 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL,
12795 IndexedGetAccessBlocker, 12567 v8::Handle<v8::Value>(), false);
12796 v8::Handle<v8::Value>(),
12797 false);
12798 v8::Local<Context> context = Context::New(isolate, NULL, global_template); 12568 v8::Local<Context> context = Context::New(isolate, NULL, global_template);
12799 Context::Scope context_scope(context); 12569 Context::Scope context_scope(context);
12800 12570
12801 // Set up a property and a number of functions. 12571 // Set up a property and a number of functions.
12802 context->Global()->Set(v8_str("a"), v8_num(1)); 12572 context->Global()->Set(v8_str("a"), v8_num(1));
12803 CompileRun("function f1() {return a;}" 12573 CompileRun("function f1() {return a;}"
12804 "function f2() {return a;}" 12574 "function f2() {return a;}"
12805 "function g1() {return h();}" 12575 "function g1() {return h();}"
12806 "function g2() {return h();}" 12576 "function g2() {return h();}"
12807 "function h() {return 1;}"); 12577 "function h() {return 1;}");
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
12843 CHECK(f1->Call(global, 0, NULL).IsEmpty()); 12613 CHECK(f1->Call(global, 0, NULL).IsEmpty());
12844 CHECK(f2->Call(global, 0, NULL).IsEmpty()); 12614 CHECK(f2->Call(global, 0, NULL).IsEmpty());
12845 CHECK(g1->Call(global, 0, NULL).IsEmpty()); 12615 CHECK(g1->Call(global, 0, NULL).IsEmpty());
12846 CHECK(g2->Call(global, 0, NULL).IsEmpty()); 12616 CHECK(g2->Call(global, 0, NULL).IsEmpty());
12847 12617
12848 // No failing access check when just returning a constant. 12618 // No failing access check when just returning a constant.
12849 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1))); 12619 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1)));
12850 } 12620 }
12851 12621
12852 12622
12853 static const char* kPropertyA = "a";
12854 static const char* kPropertyH = "h";
12855
12856 static bool NamedGetAccessBlockAandH(Local<v8::Object> obj,
12857 Local<Value> name,
12858 v8::AccessType type,
12859 Local<Value> data) {
12860 if (!name->IsString()) return false;
12861 i::Handle<i::String> name_handle =
12862 v8::Utils::OpenHandle(String::Cast(*name));
12863 return !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyA))
12864 && !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyH));
12865 }
12866
12867
12868 THREADED_TEST(TurnOnAccessCheckAndRecompile) {
12869 v8::Isolate* isolate = CcTest::isolate();
12870 v8::HandleScope handle_scope(isolate);
12871
12872 // Create an environment with access check to the global object disabled by
12873 // default. When the registered access checker will block access to properties
12874 // a and h.
12875 v8::Handle<v8::ObjectTemplate> global_template =
12876 v8::ObjectTemplate::New(isolate);
12877 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH,
12878 IndexedGetAccessBlocker,
12879 v8::Handle<v8::Value>(),
12880 false);
12881 v8::Local<Context> context = Context::New(isolate, NULL, global_template);
12882 Context::Scope context_scope(context);
12883
12884 // Set up a property and a number of functions.
12885 context->Global()->Set(v8_str("a"), v8_num(1));
12886 static const char* source = "function f1() {return a;}"
12887 "function f2() {return a;}"
12888 "function g1() {return h();}"
12889 "function g2() {return h();}"
12890 "function h() {return 1;}";
12891
12892 CompileRun(source);
12893 Local<Function> f1;
12894 Local<Function> f2;
12895 Local<Function> g1;
12896 Local<Function> g2;
12897 Local<Function> h;
12898 f1 = Local<Function>::Cast(context->Global()->Get(v8_str("f1")));
12899 f2 = Local<Function>::Cast(context->Global()->Get(v8_str("f2")));
12900 g1 = Local<Function>::Cast(context->Global()->Get(v8_str("g1")));
12901 g2 = Local<Function>::Cast(context->Global()->Get(v8_str("g2")));
12902 h = Local<Function>::Cast(context->Global()->Get(v8_str("h")));
12903
12904 // Get the global object.
12905 v8::Handle<v8::Object> global = context->Global();
12906
12907 // Call f1 one time and f2 a number of times. This will ensure that f1 still
12908 // uses the runtime system to retreive property a whereas f2 uses global load
12909 // inline cache.
12910 CHECK(f1->Call(global, 0, NULL)->Equals(v8_num(1)));
12911 for (int i = 0; i < 4; i++) {
12912 CHECK(f2->Call(global, 0, NULL)->Equals(v8_num(1)));
12913 }
12914
12915 // Same for g1 and g2.
12916 CHECK(g1->Call(global, 0, NULL)->Equals(v8_num(1)));
12917 for (int i = 0; i < 4; i++) {
12918 CHECK(g2->Call(global, 0, NULL)->Equals(v8_num(1)));
12919 }
12920
12921 // Detach the global and turn on access check now blocking access to property
12922 // a and function h.
12923 Local<Object> hidden_global = Local<Object>::Cast(
12924 context->Global()->GetPrototype());
12925 context->DetachGlobal();
12926 hidden_global->TurnOnAccessCheck();
12927
12928 // Failing access check results in exception.
12929 CHECK(f1->Call(global, 0, NULL).IsEmpty());
12930 CHECK(f2->Call(global, 0, NULL).IsEmpty());
12931 CHECK(g1->Call(global, 0, NULL).IsEmpty());
12932 CHECK(g2->Call(global, 0, NULL).IsEmpty());
12933
12934 // No failing access check when just returning a constant.
12935 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1)));
12936
12937 // Now compile the source again. And get the newly compiled functions, except
12938 // for h for which access is blocked.
12939 CompileRun(source);
12940 f1 = Local<Function>::Cast(hidden_global->Get(v8_str("f1")));
12941 f2 = Local<Function>::Cast(hidden_global->Get(v8_str("f2")));
12942 g1 = Local<Function>::Cast(hidden_global->Get(v8_str("g1")));
12943 g2 = Local<Function>::Cast(hidden_global->Get(v8_str("g2")));
12944 CHECK(hidden_global->Get(v8_str("h")).IsEmpty());
12945
12946 // Failing access check results in exception.
12947 v8::Local<v8::Value> result = f1->Call(global, 0, NULL);
12948 CHECK(result.IsEmpty());
12949 CHECK(f1->Call(global, 0, NULL).IsEmpty());
12950 CHECK(f2->Call(global, 0, NULL).IsEmpty());
12951 CHECK(g1->Call(global, 0, NULL).IsEmpty());
12952 CHECK(g2->Call(global, 0, NULL).IsEmpty());
12953 }
12954
12955
12956 // Tests that ScriptData can be serialized and deserialized. 12623 // Tests that ScriptData can be serialized and deserialized.
12957 TEST(PreCompileSerialization) { 12624 TEST(PreCompileSerialization) {
12958 v8::V8::Initialize(); 12625 v8::V8::Initialize();
12959 LocalContext env; 12626 LocalContext env;
12960 v8::Isolate* isolate = env->GetIsolate(); 12627 v8::Isolate* isolate = env->GetIsolate();
12961 HandleScope handle_scope(isolate); 12628 HandleScope handle_scope(isolate);
12962 12629
12963 i::FLAG_min_preparse_length = 0; 12630 i::FLAG_min_preparse_length = 0;
12964 const char* script = "function foo(a) { return a+1; }"; 12631 const char* script = "function foo(a) { return a+1; }";
12965 v8::ScriptCompiler::Source source(v8_str(script)); 12632 v8::ScriptCompiler::Source source(v8_str(script));
(...skipping 4484 matching lines...) Expand 10 before | Expand all | Expand 10 after
17450 v8::V8::Initialize(); 17117 v8::V8::Initialize();
17451 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); 17118 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC);
17452 17119
17453 v8::Isolate* isolate = CcTest::isolate(); 17120 v8::Isolate* isolate = CcTest::isolate();
17454 v8::HandleScope scope(isolate); 17121 v8::HandleScope scope(isolate);
17455 17122
17456 // Create an ObjectTemplate for global objects and install access 17123 // Create an ObjectTemplate for global objects and install access
17457 // check callbacks that will block access. 17124 // check callbacks that will block access.
17458 v8::Handle<v8::ObjectTemplate> global_template = 17125 v8::Handle<v8::ObjectTemplate> global_template =
17459 v8::ObjectTemplate::New(isolate); 17126 v8::ObjectTemplate::New(isolate);
17460 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, 17127 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL,
17461 IndexedGetAccessBlocker, 17128 v8::Handle<v8::Value>(), false);
17462 v8::Handle<v8::Value>(),
17463 false);
17464 17129
17465 // Create a context and set an x property on it's global object. 17130 // Create a context and set an x property on it's global object.
17466 LocalContext context0(NULL, global_template); 17131 LocalContext context0(NULL, global_template);
17467 context0->Global()->Set(v8_str("x"), v8_num(42)); 17132 context0->Global()->Set(v8_str("x"), v8_num(42));
17468 v8::Handle<v8::Object> global0 = context0->Global(); 17133 v8::Handle<v8::Object> global0 = context0->Global();
17469 17134
17470 // Create a context with a different security token so that the 17135 // Create a context with a different security token so that the
17471 // failed access check callback will be called on each access. 17136 // failed access check callback will be called on each access.
17472 LocalContext context1(NULL, global_template); 17137 LocalContext context1(NULL, global_template);
17473 context1->Global()->Set(v8_str("other"), global0); 17138 context1->Global()->Set(v8_str("other"), global0);
(...skipping 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after
18589 18254
18590 int elements = CountLiveMapsInMapCache(CcTest::i_isolate()->context()); 18255 int elements = CountLiveMapsInMapCache(CcTest::i_isolate()->context());
18591 CHECK_LE(1, elements); 18256 CHECK_LE(1, elements);
18592 18257
18593 CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); 18258 CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
18594 18259
18595 CHECK_GT(elements, CountLiveMapsInMapCache(CcTest::i_isolate()->context())); 18260 CHECK_GT(elements, CountLiveMapsInMapCache(CcTest::i_isolate()->context()));
18596 } 18261 }
18597 18262
18598 18263
18599 static bool BlockProtoNamedSecurityTestCallback(Local<v8::Object> global,
18600 Local<Value> name,
18601 v8::AccessType type,
18602 Local<Value> data) {
18603 // Only block read access to __proto__.
18604 if (type == v8::ACCESS_GET && name->IsString() &&
18605 name.As<v8::String>()->Length() == 9 &&
18606 name.As<v8::String>()->Utf8Length() == 9) {
18607 char buffer[10];
18608 CHECK_EQ(10, name.As<v8::String>()->WriteUtf8(buffer));
18609 return strncmp(buffer, "__proto__", 9) != 0;
18610 }
18611
18612 return true;
18613 }
18614
18615
18616 THREADED_TEST(Regress93759) { 18264 THREADED_TEST(Regress93759) {
18617 v8::Isolate* isolate = CcTest::isolate(); 18265 v8::Isolate* isolate = CcTest::isolate();
18618 HandleScope scope(isolate); 18266 HandleScope scope(isolate);
18619 18267
18620 // Template for object with security check. 18268 // Template for object with security check.
18621 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(isolate); 18269 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(isolate);
18622 // We don't do indexing, so any callback can be used for that. 18270 no_proto_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
18623 no_proto_template->SetAccessCheckCallbacks(
18624 BlockProtoNamedSecurityTestCallback,
18625 IndexedSecurityTestCallback);
18626 18271
18627 // Templates for objects with hidden prototypes and possibly security check. 18272 // Templates for objects with hidden prototypes and possibly security check.
18628 Local<FunctionTemplate> hidden_proto_template = 18273 Local<FunctionTemplate> hidden_proto_template =
18629 v8::FunctionTemplate::New(isolate); 18274 v8::FunctionTemplate::New(isolate);
18630 hidden_proto_template->SetHiddenPrototype(true); 18275 hidden_proto_template->SetHiddenPrototype(true);
18631 18276
18632 Local<FunctionTemplate> protected_hidden_proto_template = 18277 Local<FunctionTemplate> protected_hidden_proto_template =
18633 v8::FunctionTemplate::New(isolate); 18278 v8::FunctionTemplate::New(isolate);
18634 protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallbacks( 18279 protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallbacks(
18635 BlockProtoNamedSecurityTestCallback, 18280 AccessAlwaysBlocked, NULL);
18636 IndexedSecurityTestCallback);
18637 protected_hidden_proto_template->SetHiddenPrototype(true); 18281 protected_hidden_proto_template->SetHiddenPrototype(true);
18638 18282
18639 // Context for "foreign" objects used in test. 18283 // Context for "foreign" objects used in test.
18640 Local<Context> context = v8::Context::New(isolate); 18284 Local<Context> context = v8::Context::New(isolate);
18641 context->Enter(); 18285 context->Enter();
18642 18286
18643 // Plain object, no security check. 18287 // Plain object, no security check.
18644 Local<Object> simple_object = Object::New(isolate); 18288 Local<Object> simple_object = Object::New(isolate);
18645 18289
18646 // Object with explicit security check. 18290 // Object with explicit security check.
18647 Local<Object> protected_object = 18291 Local<Object> protected_object = no_proto_template->NewInstance();
18648 no_proto_template->NewInstance();
18649 18292
18650 // JSGlobalProxy object, always have security check. 18293 // JSGlobalProxy object, always have security check.
18651 Local<Object> proxy_object = 18294 Local<Object> proxy_object = context->Global();
18652 context->Global();
18653 18295
18654 // Global object, the prototype of proxy_object. No security checks. 18296 // Global object, the prototype of proxy_object. No security checks.
18655 Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate); 18297 Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate);
18656 18298
18657 // Hidden prototype without security check. 18299 // Hidden prototype without security check.
18658 Local<Object> hidden_prototype = 18300 Local<Object> hidden_prototype =
18659 hidden_proto_template->GetFunction()->NewInstance(); 18301 hidden_proto_template->GetFunction()->NewInstance();
18660 Local<Object> object_with_hidden = 18302 Local<Object> object_with_hidden =
18661 Object::New(isolate); 18303 Object::New(isolate);
18662 object_with_hidden->SetPrototype(hidden_prototype); 18304 object_with_hidden->SetPrototype(hidden_prototype);
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after
19808 19450
19809 19451
19810 THREADED_TEST(SemaphoreInterruption) { 19452 THREADED_TEST(SemaphoreInterruption) {
19811 ThreadInterruptTest().RunTest(); 19453 ThreadInterruptTest().RunTest();
19812 } 19454 }
19813 19455
19814 19456
19815 #endif // V8_OS_POSIX 19457 #endif // V8_OS_POSIX
19816 19458
19817 19459
19818 static bool NamedAccessAlwaysBlocked(Local<v8::Object> global,
19819 Local<Value> name,
19820 v8::AccessType type,
19821 Local<Value> data) {
19822 i::PrintF("Named access blocked.\n");
19823 return false;
19824 }
19825
19826
19827 static bool IndexAccessAlwaysBlocked(Local<v8::Object> global,
19828 uint32_t key,
19829 v8::AccessType type,
19830 Local<Value> data) {
19831 i::PrintF("Indexed access blocked.\n");
19832 return false;
19833 }
19834
19835
19836 void UnreachableCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 19460 void UnreachableCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
19837 CHECK(false); 19461 CHECK(false);
19838 } 19462 }
19839 19463
19840 19464
19841 TEST(JSONStringifyAccessCheck) { 19465 TEST(JSONStringifyAccessCheck) {
19842 v8::V8::Initialize(); 19466 v8::V8::Initialize();
19843 v8::Isolate* isolate = CcTest::isolate(); 19467 v8::Isolate* isolate = CcTest::isolate();
19844 v8::HandleScope scope(isolate); 19468 v8::HandleScope scope(isolate);
19845 19469
19846 // Create an ObjectTemplate for global objects and install access 19470 // Create an ObjectTemplate for global objects and install access
19847 // check callbacks that will block access. 19471 // check callbacks that will block access.
19848 v8::Handle<v8::ObjectTemplate> global_template = 19472 v8::Handle<v8::ObjectTemplate> global_template =
19849 v8::ObjectTemplate::New(isolate); 19473 v8::ObjectTemplate::New(isolate);
19850 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked, 19474 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
19851 IndexAccessAlwaysBlocked);
19852 19475
19853 // Create a context and set an x property on it's global object. 19476 // Create a context and set an x property on it's global object.
19854 LocalContext context0(NULL, global_template); 19477 LocalContext context0(NULL, global_template);
19855 v8::Handle<v8::Object> global0 = context0->Global(); 19478 v8::Handle<v8::Object> global0 = context0->Global();
19856 global0->Set(v8_str("x"), v8_num(42)); 19479 global0->Set(v8_str("x"), v8_num(42));
19857 ExpectString("JSON.stringify(this)", "{\"x\":42}"); 19480 ExpectString("JSON.stringify(this)", "{\"x\":42}");
19858 19481
19859 for (int i = 0; i < 2; i++) { 19482 for (int i = 0; i < 2; i++) {
19860 if (i == 1) { 19483 if (i == 1) {
19861 // Install a toJSON function on the second run. 19484 // Install a toJSON function on the second run.
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
19939 i::FLAG_allow_natives_syntax = true; 19562 i::FLAG_allow_natives_syntax = true;
19940 v8::V8::Initialize(); 19563 v8::V8::Initialize();
19941 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows); 19564 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows);
19942 v8::Isolate* isolate = CcTest::isolate(); 19565 v8::Isolate* isolate = CcTest::isolate();
19943 v8::HandleScope scope(isolate); 19566 v8::HandleScope scope(isolate);
19944 19567
19945 // Create an ObjectTemplate for global objects and install access 19568 // Create an ObjectTemplate for global objects and install access
19946 // check callbacks that will block access. 19569 // check callbacks that will block access.
19947 v8::Handle<v8::ObjectTemplate> global_template = 19570 v8::Handle<v8::ObjectTemplate> global_template =
19948 v8::ObjectTemplate::New(isolate); 19571 v8::ObjectTemplate::New(isolate);
19949 global_template->SetAccessCheckCallbacks(NamedAccessAlwaysBlocked, 19572 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
19950 IndexAccessAlwaysBlocked);
19951 19573
19952 // Create a context and set an x property on it's global object. 19574 // Create a context and set an x property on it's global object.
19953 LocalContext context0(NULL, global_template); 19575 LocalContext context0(NULL, global_template);
19954 v8::Handle<v8::Object> global0 = context0->Global(); 19576 v8::Handle<v8::Object> global0 = context0->Global();
19955 19577
19956 // Create a context with a different security token so that the 19578 // Create a context with a different security token so that the
19957 // failed access check callback will be called on each access. 19579 // failed access check callback will be called on each access.
19958 LocalContext context1(NULL, global_template); 19580 LocalContext context1(NULL, global_template);
19959 context1->Global()->Set(v8_str("other"), global0); 19581 context1->Global()->Set(v8_str("other"), global0);
19960 19582
(...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after
20995 CHECK(try_catch.HasCaught()); 20617 CHECK(try_catch.HasCaught());
20996 } 20618 }
20997 20619
20998 20620
20999 TEST(Regress354123) { 20621 TEST(Regress354123) {
21000 LocalContext current; 20622 LocalContext current;
21001 v8::Isolate* isolate = current->GetIsolate(); 20623 v8::Isolate* isolate = current->GetIsolate();
21002 v8::HandleScope scope(isolate); 20624 v8::HandleScope scope(isolate);
21003 20625
21004 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 20626 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
21005 templ->SetAccessCheckCallbacks(NamedAccessCounter, IndexedAccessCounter); 20627 templ->SetAccessCheckCallbacks(AccessCounter, NULL);
21006 current->Global()->Set(v8_str("friend"), templ->NewInstance()); 20628 current->Global()->Set(v8_str("friend"), templ->NewInstance());
21007 20629
21008 // Test access using __proto__ from the prototype chain. 20630 // Test access using __proto__ from the prototype chain.
21009 named_access_count = 0; 20631 access_count = 0;
21010 CompileRun("friend.__proto__ = {};"); 20632 CompileRun("friend.__proto__ = {};");
21011 CHECK_EQ(2, named_access_count); 20633 CHECK_EQ(2, access_count);
21012 CompileRun("friend.__proto__;"); 20634 CompileRun("friend.__proto__;");
21013 CHECK_EQ(4, named_access_count); 20635 CHECK_EQ(4, access_count);
21014 20636
21015 // Test access using __proto__ as a hijacked function (A). 20637 // Test access using __proto__ as a hijacked function (A).
21016 named_access_count = 0; 20638 access_count = 0;
21017 CompileRun("var p = Object.prototype;" 20639 CompileRun("var p = Object.prototype;"
21018 "var f = Object.getOwnPropertyDescriptor(p, '__proto__').set;" 20640 "var f = Object.getOwnPropertyDescriptor(p, '__proto__').set;"
21019 "f.call(friend, {});"); 20641 "f.call(friend, {});");
21020 CHECK_EQ(1, named_access_count); 20642 CHECK_EQ(1, access_count);
21021 CompileRun("var p = Object.prototype;" 20643 CompileRun("var p = Object.prototype;"
21022 "var f = Object.getOwnPropertyDescriptor(p, '__proto__').get;" 20644 "var f = Object.getOwnPropertyDescriptor(p, '__proto__').get;"
21023 "f.call(friend);"); 20645 "f.call(friend);");
21024 CHECK_EQ(2, named_access_count); 20646 CHECK_EQ(2, access_count);
21025 20647
21026 // Test access using __proto__ as a hijacked function (B). 20648 // Test access using __proto__ as a hijacked function (B).
21027 named_access_count = 0; 20649 access_count = 0;
21028 CompileRun("var f = Object.prototype.__lookupSetter__('__proto__');" 20650 CompileRun("var f = Object.prototype.__lookupSetter__('__proto__');"
21029 "f.call(friend, {});"); 20651 "f.call(friend, {});");
21030 CHECK_EQ(1, named_access_count); 20652 CHECK_EQ(1, access_count);
21031 CompileRun("var f = Object.prototype.__lookupGetter__('__proto__');" 20653 CompileRun("var f = Object.prototype.__lookupGetter__('__proto__');"
21032 "f.call(friend);"); 20654 "f.call(friend);");
21033 CHECK_EQ(2, named_access_count); 20655 CHECK_EQ(2, access_count);
21034 20656
21035 // Test access using Object.setPrototypeOf reflective method. 20657 // Test access using Object.setPrototypeOf reflective method.
21036 named_access_count = 0; 20658 access_count = 0;
21037 CompileRun("Object.setPrototypeOf(friend, {});"); 20659 CompileRun("Object.setPrototypeOf(friend, {});");
21038 CHECK_EQ(1, named_access_count); 20660 CHECK_EQ(1, access_count);
21039 CompileRun("Object.getPrototypeOf(friend);"); 20661 CompileRun("Object.getPrototypeOf(friend);");
21040 CHECK_EQ(2, named_access_count); 20662 CHECK_EQ(2, access_count);
21041 } 20663 }
21042 20664
21043 20665
21044 TEST(CaptureStackTraceForStackOverflow) { 20666 TEST(CaptureStackTraceForStackOverflow) {
21045 v8::internal::FLAG_stack_size = 150; 20667 v8::internal::FLAG_stack_size = 150;
21046 LocalContext current; 20668 LocalContext current;
21047 v8::Isolate* isolate = current->GetIsolate(); 20669 v8::Isolate* isolate = current->GetIsolate();
21048 v8::HandleScope scope(isolate); 20670 v8::HandleScope scope(isolate);
21049 V8::SetCaptureStackTraceForUncaughtExceptions( 20671 V8::SetCaptureStackTraceForUncaughtExceptions(
21050 true, 10, v8::StackTrace::kDetailed); 20672 true, 10, v8::StackTrace::kDetailed);
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
21185 set->Call(x, 1, args); 20807 set->Call(x, 1, args);
21186 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL))); 20808 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL)));
21187 } 20809 }
21188 20810
21189 20811
21190 TEST(Regress411877) { 20812 TEST(Regress411877) {
21191 v8::Isolate* isolate = CcTest::isolate(); 20813 v8::Isolate* isolate = CcTest::isolate();
21192 v8::HandleScope handle_scope(isolate); 20814 v8::HandleScope handle_scope(isolate);
21193 v8::Handle<v8::ObjectTemplate> object_template = 20815 v8::Handle<v8::ObjectTemplate> object_template =
21194 v8::ObjectTemplate::New(isolate); 20816 v8::ObjectTemplate::New(isolate);
21195 object_template->SetAccessCheckCallbacks(NamedAccessCounter, 20817 object_template->SetAccessCheckCallbacks(AccessCounter, NULL);
21196 IndexedAccessCounter);
21197 20818
21198 v8::Handle<Context> context = Context::New(isolate); 20819 v8::Handle<Context> context = Context::New(isolate);
21199 v8::Context::Scope context_scope(context); 20820 v8::Context::Scope context_scope(context);
21200 20821
21201 context->Global()->Set(v8_str("o"), object_template->NewInstance()); 20822 context->Global()->Set(v8_str("o"), object_template->NewInstance());
21202 CompileRun("Object.getOwnPropertyNames(o)"); 20823 CompileRun("Object.getOwnPropertyNames(o)");
21203 } 20824 }
21204 20825
21205 20826
21206 TEST(GetHiddenPropertyTableAfterAccessCheck) { 20827 TEST(GetHiddenPropertyTableAfterAccessCheck) {
21207 v8::Isolate* isolate = CcTest::isolate(); 20828 v8::Isolate* isolate = CcTest::isolate();
21208 v8::HandleScope handle_scope(isolate); 20829 v8::HandleScope handle_scope(isolate);
21209 v8::Handle<v8::ObjectTemplate> object_template = 20830 v8::Handle<v8::ObjectTemplate> object_template =
21210 v8::ObjectTemplate::New(isolate); 20831 v8::ObjectTemplate::New(isolate);
21211 object_template->SetAccessCheckCallbacks(NamedAccessCounter, 20832 object_template->SetAccessCheckCallbacks(AccessCounter, NULL);
21212 IndexedAccessCounter);
21213 20833
21214 v8::Handle<Context> context = Context::New(isolate); 20834 v8::Handle<Context> context = Context::New(isolate);
21215 v8::Context::Scope context_scope(context); 20835 v8::Context::Scope context_scope(context);
21216 20836
21217 v8::Handle<v8::Object> obj = object_template->NewInstance(); 20837 v8::Handle<v8::Object> obj = object_template->NewInstance();
21218 obj->Set(v8_str("key"), v8_str("value")); 20838 obj->Set(v8_str("key"), v8_str("value"));
21219 obj->Delete(v8_str("key")); 20839 obj->Delete(v8_str("key"));
21220 20840
21221 obj->SetHiddenValue(v8_str("hidden key 2"), v8_str("hidden value 2")); 20841 obj->SetHiddenValue(v8_str("hidden key 2"), v8_str("hidden value 2"));
21222 } 20842 }
21223 20843
21224 20844
21225 TEST(Regress411793) { 20845 TEST(Regress411793) {
21226 v8::Isolate* isolate = CcTest::isolate(); 20846 v8::Isolate* isolate = CcTest::isolate();
21227 v8::HandleScope handle_scope(isolate); 20847 v8::HandleScope handle_scope(isolate);
21228 v8::Handle<v8::ObjectTemplate> object_template = 20848 v8::Handle<v8::ObjectTemplate> object_template =
21229 v8::ObjectTemplate::New(isolate); 20849 v8::ObjectTemplate::New(isolate);
21230 object_template->SetAccessCheckCallbacks(NamedAccessCounter, 20850 object_template->SetAccessCheckCallbacks(AccessCounter, NULL);
21231 IndexedAccessCounter);
21232 20851
21233 v8::Handle<Context> context = Context::New(isolate); 20852 v8::Handle<Context> context = Context::New(isolate);
21234 v8::Context::Scope context_scope(context); 20853 v8::Context::Scope context_scope(context);
21235 20854
21236 context->Global()->Set(v8_str("o"), object_template->NewInstance()); 20855 context->Global()->Set(v8_str("o"), object_template->NewInstance());
21237 CompileRun( 20856 CompileRun(
21238 "Object.defineProperty(o, 'key', " 20857 "Object.defineProperty(o, 'key', "
21239 " { get: function() {}, set: function() {} });"); 20858 " { get: function() {}, set: function() {} });");
21240 } 20859 }
21241 20860
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after
21826 21445
21827 21446
21828 TEST(GetPrototypeAccessControl) { 21447 TEST(GetPrototypeAccessControl) {
21829 i::FLAG_allow_natives_syntax = true; 21448 i::FLAG_allow_natives_syntax = true;
21830 v8::Isolate* isolate = CcTest::isolate(); 21449 v8::Isolate* isolate = CcTest::isolate();
21831 v8::HandleScope handle_scope(isolate); 21450 v8::HandleScope handle_scope(isolate);
21832 LocalContext env; 21451 LocalContext env;
21833 21452
21834 v8::Handle<v8::ObjectTemplate> obj_template = 21453 v8::Handle<v8::ObjectTemplate> obj_template =
21835 v8::ObjectTemplate::New(isolate); 21454 v8::ObjectTemplate::New(isolate);
21836 obj_template->SetAccessCheckCallbacks(BlockEverythingNamed, 21455 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL);
21837 BlockEverythingIndexed);
21838 21456
21839 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance()); 21457 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance());
21840 21458
21841 { 21459 {
21842 v8::TryCatch try_catch; 21460 v8::TryCatch try_catch;
21843 CompileRun( 21461 CompileRun(
21844 "function f() { %_GetPrototype(prohibited); }" 21462 "function f() { %_GetPrototype(prohibited); }"
21845 "%OptimizeFunctionOnNextCall(f);" 21463 "%OptimizeFunctionOnNextCall(f);"
21846 "f();"); 21464 "f();");
21847 CHECK(try_catch.HasCaught()); 21465 CHECK(try_catch.HasCaught());
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
21939 } 21557 }
21940 { 21558 {
21941 v8::TryCatch try_catch; 21559 v8::TryCatch try_catch;
21942 uint16_t* data = reinterpret_cast<uint16_t*>(buffer); 21560 uint16_t* data = reinterpret_cast<uint16_t*>(buffer);
21943 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::String::kNormalString, 21561 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::String::kNormalString,
21944 length).IsEmpty()); 21562 length).IsEmpty());
21945 CHECK(try_catch.HasCaught()); 21563 CHECK(try_catch.HasCaught());
21946 } 21564 }
21947 free(buffer); 21565 free(buffer);
21948 } 21566 }
OLDNEW
« no previous file with comments | « src/runtime/runtime-object.cc ('k') | test/cctest/test-api-interceptors.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698