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

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

Issue 1410883006: Plumb accessing context through to access control callbacks (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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 | « test/cctest/test-accessors.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 7841 matching lines...) Expand 10 before | Expand all | Expand 10 after
7852 "}"); 7852 "}");
7853 CHECK(try_catch.HasCaught()); 7853 CHECK(try_catch.HasCaught());
7854 CHECK(!try_catch.Message().IsEmpty()); 7854 CHECK(!try_catch.Message().IsEmpty());
7855 String::Utf8Value finally_exception_value(try_catch.Exception()); 7855 String::Utf8Value finally_exception_value(try_catch.Exception());
7856 CHECK_EQ(0, strcmp(*finally_exception_value, "2")); 7856 CHECK_EQ(0, strcmp(*finally_exception_value, "2"));
7857 } 7857 }
7858 7858
7859 7859
7860 // For use within the TestSecurityHandler() test. 7860 // For use within the TestSecurityHandler() test.
7861 static bool g_security_callback_result = false; 7861 static bool g_security_callback_result = false;
7862 static bool SecurityTestCallback(Local<v8::Object> global, Local<Value> name, 7862 static bool SecurityTestCallback(Local<v8::Context> accessing_context,
7863 v8::AccessType type, Local<Value> data) { 7863 Local<v8::Object> accessed_object) {
7864 printf("a\n"); 7864 printf("a\n");
7865 return g_security_callback_result; 7865 return g_security_callback_result;
7866 } 7866 }
7867 7867
7868 7868
7869 // SecurityHandler can't be run twice 7869 // SecurityHandler can't be run twice
7870 TEST(SecurityHandler) { 7870 TEST(SecurityHandler) {
7871 v8::Isolate* isolate = CcTest::isolate(); 7871 v8::Isolate* isolate = CcTest::isolate();
7872 v8::HandleScope scope0(isolate); 7872 v8::HandleScope scope0(isolate);
7873 v8::Handle<v8::ObjectTemplate> global_template = 7873 v8::Handle<v8::ObjectTemplate> global_template =
7874 v8::ObjectTemplate::New(isolate); 7874 v8::ObjectTemplate::New(isolate);
7875 global_template->SetAccessCheckCallbacks(SecurityTestCallback, NULL); 7875 global_template->SetAccessCheckCallback(SecurityTestCallback);
7876 // Create an environment 7876 // Create an environment
7877 v8::Handle<Context> context0 = Context::New(isolate, NULL, global_template); 7877 v8::Handle<Context> context0 = Context::New(isolate, NULL, global_template);
7878 context0->Enter(); 7878 context0->Enter();
7879 7879
7880 v8::Handle<v8::Object> global0 = context0->Global(); 7880 v8::Handle<v8::Object> global0 = context0->Global();
7881 v8::Handle<Script> script0 = v8_compile("foo = 111"); 7881 v8::Handle<Script> script0 = v8_compile("foo = 111");
7882 script0->Run(); 7882 script0->Run();
7883 global0->Set(v8_str("0"), v8_num(999)); 7883 global0->Set(v8_str("0"), v8_num(999));
7884 v8::Handle<Value> foo0 = global0->Get(v8_str("foo")); 7884 v8::Handle<Value> foo0 = global0->Get(v8_str("foo"));
7885 CHECK_EQ(111, foo0->Int32Value()); 7885 CHECK_EQ(111, foo0->Int32Value());
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
8026 Local<Script> access_f3 = v8_compile("f[99]"); 8026 Local<Script> access_f3 = v8_compile("f[99]");
8027 for (int k = 0; k < 5; k++) { 8027 for (int k = 0; k < 5; k++) {
8028 CHECK(access_f2->Run().IsEmpty()); 8028 CHECK(access_f2->Run().IsEmpty());
8029 CHECK(access_f3->Run().IsEmpty()); 8029 CHECK(access_f3->Run().IsEmpty());
8030 } 8030 }
8031 } 8031 }
8032 8032
8033 8033
8034 static bool security_check_with_gc_called; 8034 static bool security_check_with_gc_called;
8035 8035
8036 static bool SecurityTestCallbackWithGC(Local<v8::Object> global, 8036 static bool SecurityTestCallbackWithGC(Local<v8::Context> accessing_context,
8037 Local<v8::Value> name, 8037 Local<v8::Object> accessed_object) {
8038 v8::AccessType type, Local<Value> data) {
8039 CcTest::heap()->CollectAllGarbage(); 8038 CcTest::heap()->CollectAllGarbage();
8040 security_check_with_gc_called = true; 8039 security_check_with_gc_called = true;
8041 return true; 8040 return true;
8042 } 8041 }
8043 8042
8044 8043
8045 TEST(SecurityTestGCAllowed) { 8044 TEST(SecurityTestGCAllowed) {
8046 v8::Isolate* isolate = CcTest::isolate(); 8045 v8::Isolate* isolate = CcTest::isolate();
8047 v8::HandleScope handle_scope(isolate); 8046 v8::HandleScope handle_scope(isolate);
8048 v8::Handle<v8::ObjectTemplate> object_template = 8047 v8::Handle<v8::ObjectTemplate> object_template =
8049 v8::ObjectTemplate::New(isolate); 8048 v8::ObjectTemplate::New(isolate);
8050 object_template->SetAccessCheckCallbacks(SecurityTestCallbackWithGC, NULL); 8049 object_template->SetAccessCheckCallback(SecurityTestCallbackWithGC);
8051 8050
8052 v8::Handle<Context> context = Context::New(isolate); 8051 v8::Handle<Context> context = Context::New(isolate);
8053 v8::Context::Scope context_scope(context); 8052 v8::Context::Scope context_scope(context);
8054 8053
8055 context->Global()->Set(v8_str("obj"), object_template->NewInstance()); 8054 context->Global()->Set(v8_str("obj"), object_template->NewInstance());
8056 8055
8057 security_check_with_gc_called = false; 8056 security_check_with_gc_called = false;
8058 CompileRun("obj[0] = new String(1002);"); 8057 CompileRun("obj[0] = new String(1002);");
8059 CHECK(security_check_with_gc_called); 8058 CHECK(security_check_with_gc_called);
8060 8059
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
8449 for (int i = 0; i < 16; i += 4) { 8448 for (int i = 0; i < 16; i += 4) {
8450 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0))); 8449 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0)));
8451 CHECK(v8_str("env1_x")->Equals(results->Get(i + 1))); 8450 CHECK(v8_str("env1_x")->Equals(results->Get(i + 1)));
8452 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2))); 8451 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2)));
8453 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3))); 8452 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3)));
8454 } 8453 }
8455 } 8454 }
8456 8455
8457 8456
8458 static bool allowed_access = false; 8457 static bool allowed_access = false;
8459 static bool AccessBlocker(Local<v8::Object> global, Local<Value> name, 8458 static bool AccessBlocker(Local<v8::Context> accessing_context,
8460 v8::AccessType type, Local<Value> data) { 8459 Local<v8::Object> accessed_object) {
8461 return CcTest::isolate()->GetCurrentContext()->Global()->Equals(global) || 8460 return CcTest::isolate()->GetCurrentContext()->Global()->Equals(
8461 accessed_object) ||
8462 allowed_access; 8462 allowed_access;
8463 } 8463 }
8464 8464
8465 8465
8466 static int g_echo_value = -1; 8466 static int g_echo_value = -1;
8467 8467
8468 8468
8469 static void EchoGetter( 8469 static void EchoGetter(
8470 Local<String> name, 8470 Local<String> name,
8471 const v8::PropertyCallbackInfo<v8::Value>& info) { 8471 const v8::PropertyCallbackInfo<v8::Value>& info) {
(...skipping 28 matching lines...) Expand all
8500 CHECK(false); // This function should not be called.. 8500 CHECK(false); // This function should not be called..
8501 } 8501 }
8502 8502
8503 8503
8504 TEST(AccessControl) { 8504 TEST(AccessControl) {
8505 v8::Isolate* isolate = CcTest::isolate(); 8505 v8::Isolate* isolate = CcTest::isolate();
8506 v8::HandleScope handle_scope(isolate); 8506 v8::HandleScope handle_scope(isolate);
8507 v8::Handle<v8::ObjectTemplate> global_template = 8507 v8::Handle<v8::ObjectTemplate> global_template =
8508 v8::ObjectTemplate::New(isolate); 8508 v8::ObjectTemplate::New(isolate);
8509 8509
8510 global_template->SetAccessCheckCallbacks(AccessBlocker, NULL); 8510 global_template->SetAccessCheckCallback(AccessBlocker);
8511 8511
8512 // Add an accessor accessible by cross-domain JS code. 8512 // Add an accessor accessible by cross-domain JS code.
8513 global_template->SetAccessor( 8513 global_template->SetAccessor(
8514 v8_str("accessible_prop"), 8514 v8_str("accessible_prop"),
8515 EchoGetter, EchoSetter, 8515 EchoGetter, EchoSetter,
8516 v8::Handle<Value>(), 8516 v8::Handle<Value>(),
8517 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); 8517 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
8518 8518
8519 8519
8520 // Add an accessor that is not accessible by cross-domain JS code. 8520 // Add an accessor that is not accessible by cross-domain JS code.
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
8664 context0->Exit(); 8664 context0->Exit();
8665 } 8665 }
8666 8666
8667 8667
8668 TEST(AccessControlES5) { 8668 TEST(AccessControlES5) {
8669 v8::Isolate* isolate = CcTest::isolate(); 8669 v8::Isolate* isolate = CcTest::isolate();
8670 v8::HandleScope handle_scope(isolate); 8670 v8::HandleScope handle_scope(isolate);
8671 v8::Handle<v8::ObjectTemplate> global_template = 8671 v8::Handle<v8::ObjectTemplate> global_template =
8672 v8::ObjectTemplate::New(isolate); 8672 v8::ObjectTemplate::New(isolate);
8673 8673
8674 global_template->SetAccessCheckCallbacks(AccessBlocker, NULL); 8674 global_template->SetAccessCheckCallback(AccessBlocker);
8675 8675
8676 // Add accessible accessor. 8676 // Add accessible accessor.
8677 global_template->SetAccessor( 8677 global_template->SetAccessor(
8678 v8_str("accessible_prop"), 8678 v8_str("accessible_prop"),
8679 EchoGetter, EchoSetter, 8679 EchoGetter, EchoSetter,
8680 v8::Handle<Value>(), 8680 v8::Handle<Value>(),
8681 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); 8681 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
8682 8682
8683 8683
8684 // Add an accessor that is not accessible by cross-domain JS code. 8684 // Add an accessor that is not accessible by cross-domain JS code.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
8729 8729
8730 // [[DefineOwnProperty]] always throws for access-checked objects. 8730 // [[DefineOwnProperty]] always throws for access-checked objects.
8731 CHECK( 8731 CHECK(
8732 CompileRun("Object.defineProperty(other, 'accessible_prop', {value: 43})") 8732 CompileRun("Object.defineProperty(other, 'accessible_prop', {value: 43})")
8733 .IsEmpty()); 8733 .IsEmpty());
8734 CHECK(CompileRun("other.accessible_prop == 42")->IsTrue()); 8734 CHECK(CompileRun("other.accessible_prop == 42")->IsTrue());
8735 CHECK_EQ(42, g_echo_value); // Make sure we didn't call the setter. 8735 CHECK_EQ(42, g_echo_value); // Make sure we didn't call the setter.
8736 } 8736 }
8737 8737
8738 8738
8739 static bool AccessAlwaysBlocked(Local<v8::Object> global, Local<Value> name, 8739 static bool AccessAlwaysBlocked(Local<v8::Context> accessing_context,
8740 v8::AccessType type, Local<Value> data) { 8740 Local<v8::Object> global) {
8741 i::PrintF("Access blocked.\n"); 8741 i::PrintF("Access blocked.\n");
8742 return false; 8742 return false;
8743 } 8743 }
8744 8744
8745 8745
8746 THREADED_TEST(AccessControlGetOwnPropertyNames) { 8746 THREADED_TEST(AccessControlGetOwnPropertyNames) {
8747 v8::Isolate* isolate = CcTest::isolate(); 8747 v8::Isolate* isolate = CcTest::isolate();
8748 v8::HandleScope handle_scope(isolate); 8748 v8::HandleScope handle_scope(isolate);
8749 v8::Handle<v8::ObjectTemplate> obj_template = 8749 v8::Handle<v8::ObjectTemplate> obj_template =
8750 v8::ObjectTemplate::New(isolate); 8750 v8::ObjectTemplate::New(isolate);
8751 8751
8752 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 8752 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
8753 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 8753 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked);
8754 8754
8755 // Add an accessor accessible by cross-domain JS code. 8755 // Add an accessor accessible by cross-domain JS code.
8756 obj_template->SetAccessor( 8756 obj_template->SetAccessor(
8757 v8_str("accessible_prop"), EchoGetter, EchoSetter, v8::Handle<Value>(), 8757 v8_str("accessible_prop"), EchoGetter, EchoSetter, v8::Handle<Value>(),
8758 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); 8758 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
8759 8759
8760 // Create an environment 8760 // Create an environment
8761 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 8761 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
8762 context0->Enter(); 8762 context0->Enter();
8763 8763
(...skipping 28 matching lines...) Expand all
8792 context1->Exit(); 8792 context1->Exit();
8793 context0->Exit(); 8793 context0->Exit();
8794 } 8794 }
8795 8795
8796 8796
8797 TEST(Regress470113) { 8797 TEST(Regress470113) {
8798 v8::Isolate* isolate = CcTest::isolate(); 8798 v8::Isolate* isolate = CcTest::isolate();
8799 v8::HandleScope handle_scope(isolate); 8799 v8::HandleScope handle_scope(isolate);
8800 v8::Handle<v8::ObjectTemplate> obj_template = 8800 v8::Handle<v8::ObjectTemplate> obj_template =
8801 v8::ObjectTemplate::New(isolate); 8801 v8::ObjectTemplate::New(isolate);
8802 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 8802 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked);
8803 LocalContext env; 8803 LocalContext env;
8804 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance()); 8804 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance());
8805 8805
8806 { 8806 {
8807 v8::TryCatch try_catch(isolate); 8807 v8::TryCatch try_catch(isolate);
8808 CompileRun( 8808 CompileRun(
8809 "'use strict';\n" 8809 "'use strict';\n"
8810 "class C extends Object {\n" 8810 "class C extends Object {\n"
8811 " m() { super.powned = 'Powned!'; }\n" 8811 " m() { super.powned = 'Powned!'; }\n"
8812 "}\n" 8812 "}\n"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
8872 value = v8_compile("other.unreachable")->Run(); 8872 value = v8_compile("other.unreachable")->Run();
8873 CHECK(value.IsEmpty()); 8873 CHECK(value.IsEmpty());
8874 8874
8875 context1->Exit(); 8875 context1->Exit();
8876 context0->Exit(); 8876 context0->Exit();
8877 } 8877 }
8878 8878
8879 8879
8880 static int access_count = 0; 8880 static int access_count = 0;
8881 8881
8882 static bool AccessCounter(Local<v8::Object> global, Local<Value> name, 8882 static bool AccessCounter(Local<v8::Context> accessing_context,
8883 v8::AccessType type, Local<Value> data) { 8883 Local<v8::Object> accessed_object) {
8884 access_count++; 8884 access_count++;
8885 return true; 8885 return true;
8886 } 8886 }
8887 8887
8888 8888
8889 // This one is too easily disturbed by other tests. 8889 // This one is too easily disturbed by other tests.
8890 TEST(AccessControlIC) { 8890 TEST(AccessControlIC) {
8891 access_count = 0; 8891 access_count = 0;
8892 8892
8893 v8::Isolate* isolate = CcTest::isolate(); 8893 v8::Isolate* isolate = CcTest::isolate();
8894 v8::HandleScope handle_scope(isolate); 8894 v8::HandleScope handle_scope(isolate);
8895 8895
8896 // Create an environment. 8896 // Create an environment.
8897 v8::Local<Context> context0 = Context::New(isolate); 8897 v8::Local<Context> context0 = Context::New(isolate);
8898 context0->Enter(); 8898 context0->Enter();
8899 8899
8900 // Create an object that requires access-check functions to be 8900 // Create an object that requires access-check functions to be
8901 // called for cross-domain access. 8901 // called for cross-domain access.
8902 v8::Handle<v8::ObjectTemplate> object_template = 8902 v8::Handle<v8::ObjectTemplate> object_template =
8903 v8::ObjectTemplate::New(isolate); 8903 v8::ObjectTemplate::New(isolate);
8904 object_template->SetAccessCheckCallbacks(AccessCounter, NULL); 8904 object_template->SetAccessCheckCallback(AccessCounter);
8905 Local<v8::Object> object = object_template->NewInstance(); 8905 Local<v8::Object> object = object_template->NewInstance();
8906 8906
8907 v8::HandleScope scope1(isolate); 8907 v8::HandleScope scope1(isolate);
8908 8908
8909 // Create another environment. 8909 // Create another environment.
8910 v8::Local<Context> context1 = Context::New(isolate); 8910 v8::Local<Context> context1 = Context::New(isolate);
8911 context1->Enter(); 8911 context1->Enter();
8912 8912
8913 // Make easy access to the object from the other environment. 8913 // Make easy access to the object from the other environment.
8914 v8::Handle<v8::Object> global1 = context1->Global(); 8914 v8::Handle<v8::Object> global1 = context1->Global();
(...skipping 3875 matching lines...) Expand 10 before | Expand all | Expand 10 after
12790 printf("p[%u]\n", i); 12790 printf("p[%u]\n", i);
12791 } 12791 }
12792 } 12792 }
12793 12793
12794 12794
12795 THREADED_TEST(AccessChecksReenabledCorrectly) { 12795 THREADED_TEST(AccessChecksReenabledCorrectly) {
12796 LocalContext context; 12796 LocalContext context;
12797 v8::Isolate* isolate = context->GetIsolate(); 12797 v8::Isolate* isolate = context->GetIsolate();
12798 v8::HandleScope scope(isolate); 12798 v8::HandleScope scope(isolate);
12799 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 12799 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
12800 templ->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 12800 templ->SetAccessCheckCallback(AccessAlwaysBlocked);
12801 templ->Set(v8_str("a"), v8_str("a")); 12801 templ->Set(v8_str("a"), v8_str("a"));
12802 // Add more than 8 (see kMaxFastProperties) properties 12802 // Add more than 8 (see kMaxFastProperties) properties
12803 // so that the constructor will force copying map. 12803 // so that the constructor will force copying map.
12804 // Cannot sprintf, gcc complains unsafety. 12804 // Cannot sprintf, gcc complains unsafety.
12805 char buf[4]; 12805 char buf[4];
12806 for (char i = '0'; i <= '9' ; i++) { 12806 for (char i = '0'; i <= '9' ; i++) {
12807 buf[0] = i; 12807 buf[0] = i;
12808 for (char j = '0'; j <= '9'; j++) { 12808 for (char j = '0'; j <= '9'; j++) {
12809 buf[1] = j; 12809 buf[1] = j;
12810 for (char k = '0'; k <= '9'; k++) { 12810 for (char k = '0'; k <= '9'; k++) {
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after
13411 CompileRun("Object.freeze(a);"); 13411 CompileRun("Object.freeze(a);");
13412 { 13412 {
13413 // Can't change non-extensible objects. 13413 // Can't change non-extensible objects.
13414 v8::TryCatch try_catch(isolate); 13414 v8::TryCatch try_catch(isolate);
13415 CHECK(!obj->CreateDataProperty(env.local(), v8_str("baz"), 13415 CHECK(!obj->CreateDataProperty(env.local(), v8_str("baz"),
13416 v8::Integer::New(isolate, 42)).FromJust()); 13416 v8::Integer::New(isolate, 42)).FromJust());
13417 CHECK(!try_catch.HasCaught()); 13417 CHECK(!try_catch.HasCaught());
13418 } 13418 }
13419 13419
13420 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 13420 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
13421 templ->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 13421 templ->SetAccessCheckCallback(AccessAlwaysBlocked);
13422 v8::Local<v8::Object> access_checked = 13422 v8::Local<v8::Object> access_checked =
13423 templ->NewInstance(env.local()).ToLocalChecked(); 13423 templ->NewInstance(env.local()).ToLocalChecked();
13424 { 13424 {
13425 v8::TryCatch try_catch(isolate); 13425 v8::TryCatch try_catch(isolate);
13426 CHECK(access_checked->CreateDataProperty(env.local(), v8_str("foo"), 13426 CHECK(access_checked->CreateDataProperty(env.local(), v8_str("foo"),
13427 v8::Integer::New(isolate, 42)) 13427 v8::Integer::New(isolate, 42))
13428 .IsNothing()); 13428 .IsNothing());
13429 CHECK(try_catch.HasCaught()); 13429 CHECK(try_catch.HasCaught());
13430 } 13430 }
13431 } 13431 }
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
13530 CompileRun("Object.freeze(a);"); 13530 CompileRun("Object.freeze(a);");
13531 { 13531 {
13532 // Can't change non-extensible objects. 13532 // Can't change non-extensible objects.
13533 v8::TryCatch try_catch(isolate); 13533 v8::TryCatch try_catch(isolate);
13534 CHECK(!obj->DefineOwnProperty(env.local(), v8_str("baz"), 13534 CHECK(!obj->DefineOwnProperty(env.local(), v8_str("baz"),
13535 v8::Integer::New(isolate, 42)).FromJust()); 13535 v8::Integer::New(isolate, 42)).FromJust());
13536 CHECK(!try_catch.HasCaught()); 13536 CHECK(!try_catch.HasCaught());
13537 } 13537 }
13538 13538
13539 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 13539 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
13540 templ->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 13540 templ->SetAccessCheckCallback(AccessAlwaysBlocked);
13541 v8::Local<v8::Object> access_checked = 13541 v8::Local<v8::Object> access_checked =
13542 templ->NewInstance(env.local()).ToLocalChecked(); 13542 templ->NewInstance(env.local()).ToLocalChecked();
13543 { 13543 {
13544 v8::TryCatch try_catch(isolate); 13544 v8::TryCatch try_catch(isolate);
13545 CHECK(access_checked->DefineOwnProperty(env.local(), v8_str("foo"), 13545 CHECK(access_checked->DefineOwnProperty(env.local(), v8_str("foo"),
13546 v8::Integer::New(isolate, 42)) 13546 v8::Integer::New(isolate, 42))
13547 .IsNothing()); 13547 .IsNothing());
13548 CHECK(try_catch.HasCaught()); 13548 CHECK(try_catch.HasCaught());
13549 } 13549 }
13550 } 13550 }
(...skipping 3163 matching lines...) Expand 10 before | Expand all | Expand 10 after
16714 v8::V8::Initialize(); 16714 v8::V8::Initialize();
16715 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); 16715 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC);
16716 16716
16717 v8::Isolate* isolate = CcTest::isolate(); 16717 v8::Isolate* isolate = CcTest::isolate();
16718 v8::HandleScope scope(isolate); 16718 v8::HandleScope scope(isolate);
16719 16719
16720 // Create an ObjectTemplate for global objects and install access 16720 // Create an ObjectTemplate for global objects and install access
16721 // check callbacks that will block access. 16721 // check callbacks that will block access.
16722 v8::Handle<v8::ObjectTemplate> global_template = 16722 v8::Handle<v8::ObjectTemplate> global_template =
16723 v8::ObjectTemplate::New(isolate); 16723 v8::ObjectTemplate::New(isolate);
16724 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL, 16724 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
16725 v8::Handle<v8::Value>());
16726 16725
16727 // Create a context and set an x property on it's global object. 16726 // Create a context and set an x property on it's global object.
16728 LocalContext context0(NULL, global_template); 16727 LocalContext context0(NULL, global_template);
16729 context0->Global()->Set(v8_str("x"), v8_num(42)); 16728 context0->Global()->Set(v8_str("x"), v8_num(42));
16730 v8::Handle<v8::Object> global0 = context0->Global(); 16729 v8::Handle<v8::Object> global0 = context0->Global();
16731 16730
16732 // Create a context with a different security token so that the 16731 // Create a context with a different security token so that the
16733 // failed access check callback will be called on each access. 16732 // failed access check callback will be called on each access.
16734 LocalContext context1(NULL, global_template); 16733 LocalContext context1(NULL, global_template);
16735 context1->Global()->Set(v8_str("other"), global0); 16734 context1->Global()->Set(v8_str("other"), global0);
(...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after
17948 CHECK_GT(elements, CountLiveMapsInMapCache(CcTest::i_isolate()->context())); 17947 CHECK_GT(elements, CountLiveMapsInMapCache(CcTest::i_isolate()->context()));
17949 } 17948 }
17950 17949
17951 17950
17952 THREADED_TEST(Regress93759) { 17951 THREADED_TEST(Regress93759) {
17953 v8::Isolate* isolate = CcTest::isolate(); 17952 v8::Isolate* isolate = CcTest::isolate();
17954 HandleScope scope(isolate); 17953 HandleScope scope(isolate);
17955 17954
17956 // Template for object with security check. 17955 // Template for object with security check.
17957 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(isolate); 17956 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(isolate);
17958 no_proto_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 17957 no_proto_template->SetAccessCheckCallback(AccessAlwaysBlocked);
17959 17958
17960 // Templates for objects with hidden prototypes and possibly security check. 17959 // Templates for objects with hidden prototypes and possibly security check.
17961 Local<FunctionTemplate> hidden_proto_template = 17960 Local<FunctionTemplate> hidden_proto_template =
17962 v8::FunctionTemplate::New(isolate); 17961 v8::FunctionTemplate::New(isolate);
17963 hidden_proto_template->SetHiddenPrototype(true); 17962 hidden_proto_template->SetHiddenPrototype(true);
17964 17963
17965 Local<FunctionTemplate> protected_hidden_proto_template = 17964 Local<FunctionTemplate> protected_hidden_proto_template =
17966 v8::FunctionTemplate::New(isolate); 17965 v8::FunctionTemplate::New(isolate);
17967 protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallbacks( 17966 protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallback(
17968 AccessAlwaysBlocked, NULL); 17967 AccessAlwaysBlocked);
17969 protected_hidden_proto_template->SetHiddenPrototype(true); 17968 protected_hidden_proto_template->SetHiddenPrototype(true);
17970 17969
17971 // Context for "foreign" objects used in test. 17970 // Context for "foreign" objects used in test.
17972 Local<Context> context = v8::Context::New(isolate); 17971 Local<Context> context = v8::Context::New(isolate);
17973 context->Enter(); 17972 context->Enter();
17974 17973
17975 // Plain object, no security check. 17974 // Plain object, no security check.
17976 Local<Object> simple_object = Object::New(isolate); 17975 Local<Object> simple_object = Object::New(isolate);
17977 17976
17978 // Object with explicit security check. 17977 // Object with explicit security check.
(...skipping 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after
19126 19125
19127 TEST(JSONStringifyAccessCheck) { 19126 TEST(JSONStringifyAccessCheck) {
19128 v8::V8::Initialize(); 19127 v8::V8::Initialize();
19129 v8::Isolate* isolate = CcTest::isolate(); 19128 v8::Isolate* isolate = CcTest::isolate();
19130 v8::HandleScope scope(isolate); 19129 v8::HandleScope scope(isolate);
19131 19130
19132 // Create an ObjectTemplate for global objects and install access 19131 // Create an ObjectTemplate for global objects and install access
19133 // check callbacks that will block access. 19132 // check callbacks that will block access.
19134 v8::Handle<v8::ObjectTemplate> global_template = 19133 v8::Handle<v8::ObjectTemplate> global_template =
19135 v8::ObjectTemplate::New(isolate); 19134 v8::ObjectTemplate::New(isolate);
19136 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 19135 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
19137 19136
19138 // Create a context and set an x property on it's global object. 19137 // Create a context and set an x property on it's global object.
19139 LocalContext context0(NULL, global_template); 19138 LocalContext context0(NULL, global_template);
19140 v8::Handle<v8::Object> global0 = context0->Global(); 19139 v8::Handle<v8::Object> global0 = context0->Global();
19141 global0->Set(v8_str("x"), v8_num(42)); 19140 global0->Set(v8_str("x"), v8_num(42));
19142 ExpectString("JSON.stringify(this)", "{\"x\":42}"); 19141 ExpectString("JSON.stringify(this)", "{\"x\":42}");
19143 19142
19144 for (int i = 0; i < 2; i++) { 19143 for (int i = 0; i < 2; i++) {
19145 if (i == 1) { 19144 if (i == 1) {
19146 // Install a toJSON function on the second run. 19145 // Install a toJSON function on the second run.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
19214 i::FLAG_allow_natives_syntax = true; 19213 i::FLAG_allow_natives_syntax = true;
19215 v8::V8::Initialize(); 19214 v8::V8::Initialize();
19216 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows); 19215 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows);
19217 v8::Isolate* isolate = CcTest::isolate(); 19216 v8::Isolate* isolate = CcTest::isolate();
19218 v8::HandleScope scope(isolate); 19217 v8::HandleScope scope(isolate);
19219 19218
19220 // Create an ObjectTemplate for global objects and install access 19219 // Create an ObjectTemplate for global objects and install access
19221 // check callbacks that will block access. 19220 // check callbacks that will block access.
19222 v8::Handle<v8::ObjectTemplate> global_template = 19221 v8::Handle<v8::ObjectTemplate> global_template =
19223 v8::ObjectTemplate::New(isolate); 19222 v8::ObjectTemplate::New(isolate);
19224 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 19223 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
19225 19224
19226 // Create a context and set an x property on it's global object. 19225 // Create a context and set an x property on it's global object.
19227 LocalContext context0(NULL, global_template); 19226 LocalContext context0(NULL, global_template);
19228 v8::Handle<v8::Object> global0 = context0->Global(); 19227 v8::Handle<v8::Object> global0 = context0->Global();
19229 19228
19230 // Create a context with a different security token so that the 19229 // Create a context with a different security token so that the
19231 // failed access check callback will be called on each access. 19230 // failed access check callback will be called on each access.
19232 LocalContext context1(NULL, global_template); 19231 LocalContext context1(NULL, global_template);
19233 context1->Global()->Set(v8_str("other"), global0); 19232 context1->Global()->Set(v8_str("other"), global0);
19234 19233
(...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after
20289 CHECK(try_catch.HasCaught()); 20288 CHECK(try_catch.HasCaught());
20290 } 20289 }
20291 20290
20292 20291
20293 TEST(Regress354123) { 20292 TEST(Regress354123) {
20294 LocalContext current; 20293 LocalContext current;
20295 v8::Isolate* isolate = current->GetIsolate(); 20294 v8::Isolate* isolate = current->GetIsolate();
20296 v8::HandleScope scope(isolate); 20295 v8::HandleScope scope(isolate);
20297 20296
20298 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 20297 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
20299 templ->SetAccessCheckCallbacks(AccessCounter, NULL); 20298 templ->SetAccessCheckCallback(AccessCounter);
20300 current->Global()->Set(v8_str("friend"), templ->NewInstance()); 20299 current->Global()->Set(v8_str("friend"), templ->NewInstance());
20301 20300
20302 // Test access using __proto__ from the prototype chain. 20301 // Test access using __proto__ from the prototype chain.
20303 access_count = 0; 20302 access_count = 0;
20304 CompileRun("friend.__proto__ = {};"); 20303 CompileRun("friend.__proto__ = {};");
20305 CHECK_EQ(2, access_count); 20304 CHECK_EQ(2, access_count);
20306 CompileRun("friend.__proto__;"); 20305 CompileRun("friend.__proto__;");
20307 CHECK_EQ(4, access_count); 20306 CHECK_EQ(4, access_count);
20308 20307
20309 // Test access using __proto__ as a hijacked function (A). 20308 // Test access using __proto__ as a hijacked function (A).
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
20479 set->Call(x, 1, args); 20478 set->Call(x, 1, args);
20480 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL))); 20479 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL)));
20481 } 20480 }
20482 20481
20483 20482
20484 TEST(Regress411877) { 20483 TEST(Regress411877) {
20485 v8::Isolate* isolate = CcTest::isolate(); 20484 v8::Isolate* isolate = CcTest::isolate();
20486 v8::HandleScope handle_scope(isolate); 20485 v8::HandleScope handle_scope(isolate);
20487 v8::Handle<v8::ObjectTemplate> object_template = 20486 v8::Handle<v8::ObjectTemplate> object_template =
20488 v8::ObjectTemplate::New(isolate); 20487 v8::ObjectTemplate::New(isolate);
20489 object_template->SetAccessCheckCallbacks(AccessCounter, NULL); 20488 object_template->SetAccessCheckCallback(AccessCounter);
20490 20489
20491 v8::Handle<Context> context = Context::New(isolate); 20490 v8::Handle<Context> context = Context::New(isolate);
20492 v8::Context::Scope context_scope(context); 20491 v8::Context::Scope context_scope(context);
20493 20492
20494 context->Global()->Set(v8_str("o"), object_template->NewInstance()); 20493 context->Global()->Set(v8_str("o"), object_template->NewInstance());
20495 CompileRun("Object.getOwnPropertyNames(o)"); 20494 CompileRun("Object.getOwnPropertyNames(o)");
20496 } 20495 }
20497 20496
20498 20497
20499 TEST(GetHiddenPropertyTableAfterAccessCheck) { 20498 TEST(GetHiddenPropertyTableAfterAccessCheck) {
20500 v8::Isolate* isolate = CcTest::isolate(); 20499 v8::Isolate* isolate = CcTest::isolate();
20501 v8::HandleScope handle_scope(isolate); 20500 v8::HandleScope handle_scope(isolate);
20502 v8::Handle<v8::ObjectTemplate> object_template = 20501 v8::Handle<v8::ObjectTemplate> object_template =
20503 v8::ObjectTemplate::New(isolate); 20502 v8::ObjectTemplate::New(isolate);
20504 object_template->SetAccessCheckCallbacks(AccessCounter, NULL); 20503 object_template->SetAccessCheckCallback(AccessCounter);
20505 20504
20506 v8::Handle<Context> context = Context::New(isolate); 20505 v8::Handle<Context> context = Context::New(isolate);
20507 v8::Context::Scope context_scope(context); 20506 v8::Context::Scope context_scope(context);
20508 20507
20509 v8::Handle<v8::Object> obj = object_template->NewInstance(); 20508 v8::Handle<v8::Object> obj = object_template->NewInstance();
20510 obj->Set(v8_str("key"), v8_str("value")); 20509 obj->Set(v8_str("key"), v8_str("value"));
20511 obj->Delete(v8_str("key")); 20510 obj->Delete(v8_str("key"));
20512 20511
20513 obj->SetHiddenValue(v8_str("hidden key 2"), v8_str("hidden value 2")); 20512 obj->SetHiddenValue(v8_str("hidden key 2"), v8_str("hidden value 2"));
20514 } 20513 }
20515 20514
20516 20515
20517 TEST(Regress411793) { 20516 TEST(Regress411793) {
20518 v8::Isolate* isolate = CcTest::isolate(); 20517 v8::Isolate* isolate = CcTest::isolate();
20519 v8::HandleScope handle_scope(isolate); 20518 v8::HandleScope handle_scope(isolate);
20520 v8::Handle<v8::ObjectTemplate> object_template = 20519 v8::Handle<v8::ObjectTemplate> object_template =
20521 v8::ObjectTemplate::New(isolate); 20520 v8::ObjectTemplate::New(isolate);
20522 object_template->SetAccessCheckCallbacks(AccessCounter, NULL); 20521 object_template->SetAccessCheckCallback(AccessCounter);
20523 20522
20524 v8::Handle<Context> context = Context::New(isolate); 20523 v8::Handle<Context> context = Context::New(isolate);
20525 v8::Context::Scope context_scope(context); 20524 v8::Context::Scope context_scope(context);
20526 20525
20527 context->Global()->Set(v8_str("o"), object_template->NewInstance()); 20526 context->Global()->Set(v8_str("o"), object_template->NewInstance());
20528 CompileRun( 20527 CompileRun(
20529 "Object.defineProperty(o, 'key', " 20528 "Object.defineProperty(o, 'key', "
20530 " { get: function() {}, set: function() {} });"); 20529 " { get: function() {}, set: function() {} });");
20531 } 20530 }
20532 20531
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
21176 21175
21177 21176
21178 TEST(GetPrototypeAccessControl) { 21177 TEST(GetPrototypeAccessControl) {
21179 i::FLAG_allow_natives_syntax = true; 21178 i::FLAG_allow_natives_syntax = true;
21180 v8::Isolate* isolate = CcTest::isolate(); 21179 v8::Isolate* isolate = CcTest::isolate();
21181 v8::HandleScope handle_scope(isolate); 21180 v8::HandleScope handle_scope(isolate);
21182 LocalContext env; 21181 LocalContext env;
21183 21182
21184 v8::Handle<v8::ObjectTemplate> obj_template = 21183 v8::Handle<v8::ObjectTemplate> obj_template =
21185 v8::ObjectTemplate::New(isolate); 21184 v8::ObjectTemplate::New(isolate);
21186 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); 21185 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked);
21187 21186
21188 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance()); 21187 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance());
21189 21188
21190 CHECK(CompileRun( 21189 CHECK(CompileRun(
21191 "function f() { return %_GetPrototype(prohibited); }" 21190 "function f() { return %_GetPrototype(prohibited); }"
21192 "%OptimizeFunctionOnNextCall(f);" 21191 "%OptimizeFunctionOnNextCall(f);"
21193 "f();")->IsNull()); 21192 "f();")->IsNull());
21194 } 21193 }
21195 21194
21196 21195
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
21319 v8::Local<v8::Object> obj = v8::Object::New(isolate); 21318 v8::Local<v8::Object> obj = v8::Object::New(isolate);
21320 21319
21321 USE(obj); 21320 USE(obj);
21322 } 21321 }
21323 } 21322 }
21324 21323
21325 21324
21326 static bool access_was_called = false; 21325 static bool access_was_called = false;
21327 21326
21328 21327
21329 static bool AccessAlwaysAllowedWithFlag(Local<v8::Object> global, 21328 static bool AccessAlwaysAllowedWithFlag(Local<v8::Context> accessing_context,
21330 Local<Value> name, v8::AccessType type, 21329 Local<v8::Object> accessed_object) {
21331 Local<Value> data) {
21332 access_was_called = true; 21330 access_was_called = true;
21333 return true; 21331 return true;
21334 } 21332 }
21335 21333
21336 21334
21337 static bool AccessAlwaysBlockedWithFlag(Local<v8::Object> global, 21335 static bool AccessAlwaysBlockedWithFlag(Local<v8::Context> accessing_context,
21338 Local<Value> name, v8::AccessType type, 21336 Local<v8::Object> accessed_object) {
21339 Local<Value> data) {
21340 access_was_called = true; 21337 access_was_called = true;
21341 return false; 21338 return false;
21342 } 21339 }
21343 21340
21344 21341
21345 TEST(StrongModeAccessCheckAllowed) { 21342 TEST(StrongModeAccessCheckAllowed) {
21346 i::FLAG_strong_mode = true; 21343 i::FLAG_strong_mode = true;
21347 v8::Isolate* isolate = CcTest::isolate(); 21344 v8::Isolate* isolate = CcTest::isolate();
21348 v8::HandleScope handle_scope(isolate); 21345 v8::HandleScope handle_scope(isolate);
21349 v8::Handle<Value> value; 21346 v8::Handle<Value> value;
21350 access_was_called = false; 21347 access_was_called = false;
21351 21348
21352 v8::Handle<v8::ObjectTemplate> obj_template = 21349 v8::Handle<v8::ObjectTemplate> obj_template =
21353 v8::ObjectTemplate::New(isolate); 21350 v8::ObjectTemplate::New(isolate);
21354 21351
21355 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 21352 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
21356 obj_template->SetAccessCheckCallbacks(AccessAlwaysAllowedWithFlag, NULL); 21353 obj_template->SetAccessCheckCallback(AccessAlwaysAllowedWithFlag);
21357 21354
21358 // Create an environment 21355 // Create an environment
21359 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 21356 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
21360 context0->Enter(); 21357 context0->Enter();
21361 v8::Handle<v8::Object> global0 = context0->Global(); 21358 v8::Handle<v8::Object> global0 = context0->Global();
21362 global0->Set(v8_str("object"), obj_template->NewInstance()); 21359 global0->Set(v8_str("object"), obj_template->NewInstance());
21363 { 21360 {
21364 v8::TryCatch try_catch(isolate); 21361 v8::TryCatch try_catch(isolate);
21365 value = CompileRun("'use strong'; object.x"); 21362 value = CompileRun("'use strong'; object.x");
21366 CHECK(!try_catch.HasCaught()); 21363 CHECK(!try_catch.HasCaught());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
21416 i::FLAG_strong_mode = true; 21413 i::FLAG_strong_mode = true;
21417 v8::Isolate* isolate = CcTest::isolate(); 21414 v8::Isolate* isolate = CcTest::isolate();
21418 v8::HandleScope handle_scope(isolate); 21415 v8::HandleScope handle_scope(isolate);
21419 v8::Handle<Value> value; 21416 v8::Handle<Value> value;
21420 access_was_called = false; 21417 access_was_called = false;
21421 21418
21422 v8::Handle<v8::ObjectTemplate> obj_template = 21419 v8::Handle<v8::ObjectTemplate> obj_template =
21423 v8::ObjectTemplate::New(isolate); 21420 v8::ObjectTemplate::New(isolate);
21424 21421
21425 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 21422 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
21426 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlockedWithFlag, NULL); 21423 obj_template->SetAccessCheckCallback(AccessAlwaysBlockedWithFlag);
21427 21424
21428 // Create an environment 21425 // Create an environment
21429 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 21426 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
21430 context0->Enter(); 21427 context0->Enter();
21431 v8::Handle<v8::Object> global0 = context0->Global(); 21428 v8::Handle<v8::Object> global0 = context0->Global();
21432 global0->Set(v8_str("object"), obj_template->NewInstance()); 21429 global0->Set(v8_str("object"), obj_template->NewInstance());
21433 { 21430 {
21434 v8::TryCatch try_catch(isolate); 21431 v8::TryCatch try_catch(isolate);
21435 value = CompileRun("'use strong'; object.x"); 21432 value = CompileRun("'use strong'; object.x");
21436 CHECK(!try_catch.HasCaught()); 21433 CHECK(!try_catch.HasCaught());
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
21889 21886
21890 21887
21891 TEST(AccessCheckedIsConcatSpreadable) { 21888 TEST(AccessCheckedIsConcatSpreadable) {
21892 i::FLAG_harmony_concat_spreadable = true; 21889 i::FLAG_harmony_concat_spreadable = true;
21893 v8::Isolate* isolate = CcTest::isolate(); 21890 v8::Isolate* isolate = CcTest::isolate();
21894 HandleScope scope(isolate); 21891 HandleScope scope(isolate);
21895 LocalContext env; 21892 LocalContext env;
21896 21893
21897 // Object with access check 21894 // Object with access check
21898 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate); 21895 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate);
21899 spreadable_template->SetAccessCheckCallbacks(AccessBlocker, nullptr); 21896 spreadable_template->SetAccessCheckCallback(AccessBlocker);
21900 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate), 21897 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate),
21901 v8::Boolean::New(isolate, true)); 21898 v8::Boolean::New(isolate, true));
21902 Local<Object> object = spreadable_template->NewInstance(); 21899 Local<Object> object = spreadable_template->NewInstance();
21903 21900
21904 allowed_access = true; 21901 allowed_access = true;
21905 env->Global()->Set(v8_str("object"), object); 21902 env->Global()->Set(v8_str("object"), object);
21906 object->Set(v8_str("length"), v8_num(2)); 21903 object->Set(v8_str("length"), v8_num(2));
21907 object->Set(0U, v8_str("a")); 21904 object->Set(0U, v8_str("a"));
21908 object->Set(1U, v8_str("b")); 21905 object->Set(1U, v8_str("b"));
21909 21906
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
21949 env2->Global()->Set(v8_str("obj2"), object2); 21946 env2->Global()->Set(v8_str("obj2"), object2);
21950 ExpectString("typeof obj2.values", "function"); 21947 ExpectString("typeof obj2.values", "function");
21951 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); 21948 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values")));
21952 21949
21953 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); 21950 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values")));
21954 auto fn2 = v8::Utils::OpenHandle(*values2); 21951 auto fn2 = v8::Utils::OpenHandle(*values2);
21955 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); 21952 auto ctx2 = v8::Utils::OpenHandle(*env2.local());
21956 CHECK_EQ(fn2->GetCreationContext(), *ctx2); 21953 CHECK_EQ(fn2->GetCreationContext(), *ctx2);
21957 } 21954 }
21958 } 21955 }
OLDNEW
« no previous file with comments | « test/cctest/test-accessors.cc ('k') | test/cctest/test-api-interceptors.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698