| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 | 6 |
| 7 #include "test/cctest/test-api.h" | 7 #include "test/cctest/test-api.h" |
| 8 | 8 |
| 9 #include "include/v8-util.h" | 9 #include "include/v8-util.h" |
| 10 #include "src/api.h" | 10 #include "src/api.h" |
| (...skipping 1642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1653 " if (v != 0) throw 'Wrong value ' + v + ' at iteration ' + i;" | 1653 " if (v != 0) throw 'Wrong value ' + v + ' at iteration ' + i;" |
| 1654 " }" | 1654 " }" |
| 1655 " 'PASSED'" | 1655 " 'PASSED'" |
| 1656 "} catch(e) {" | 1656 "} catch(e) {" |
| 1657 " e" | 1657 " e" |
| 1658 "}"; | 1658 "}"; |
| 1659 ExpectString(code, "PASSED"); | 1659 ExpectString(code, "PASSED"); |
| 1660 } | 1660 } |
| 1661 | 1661 |
| 1662 | 1662 |
| 1663 static bool AccessAlwaysBlocked(Local<v8::Object> global, Local<Value> name, | 1663 static bool AccessAlwaysBlocked(Local<v8::Context> accessing_context, |
| 1664 v8::AccessType type, Local<Value> data) { | 1664 Local<v8::Object> accessed_object) { |
| 1665 return false; | 1665 return false; |
| 1666 } | 1666 } |
| 1667 | 1667 |
| 1668 | 1668 |
| 1669 THREADED_TEST(IndexedInterceptorWithAccessorCheck) { | 1669 THREADED_TEST(IndexedInterceptorWithAccessorCheck) { |
| 1670 v8::Isolate* isolate = CcTest::isolate(); | 1670 v8::Isolate* isolate = CcTest::isolate(); |
| 1671 v8::HandleScope scope(isolate); | 1671 v8::HandleScope scope(isolate); |
| 1672 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 1672 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 1673 templ->SetHandler( | 1673 templ->SetHandler( |
| 1674 v8::IndexedPropertyHandlerConfiguration(IdentityIndexedPropertyGetter)); | 1674 v8::IndexedPropertyHandlerConfiguration(IdentityIndexedPropertyGetter)); |
| 1675 | 1675 |
| 1676 templ->SetAccessCheckCallbacks(AccessAlwaysBlocked, nullptr); | 1676 templ->SetAccessCheckCallback(AccessAlwaysBlocked); |
| 1677 | 1677 |
| 1678 LocalContext context; | 1678 LocalContext context; |
| 1679 Local<v8::Object> obj = templ->NewInstance(); | 1679 Local<v8::Object> obj = templ->NewInstance(); |
| 1680 context->Global()->Set(v8_str("obj"), obj); | 1680 context->Global()->Set(v8_str("obj"), obj); |
| 1681 | 1681 |
| 1682 const char* code = | 1682 const char* code = |
| 1683 "var result = 'PASSED';" | 1683 "var result = 'PASSED';" |
| 1684 "for (var i = 0; i < 100; i++) {" | 1684 "for (var i = 0; i < 100; i++) {" |
| 1685 " try {" | 1685 " try {" |
| 1686 " var v = obj[0];" | 1686 " var v = obj[0];" |
| (...skipping 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2900 return reinterpret_cast<T*>( | 2900 return reinterpret_cast<T*>( |
| 2901 Object::Cast(*data)->GetAlignedPointerFromInternalField(0)); | 2901 Object::Cast(*data)->GetAlignedPointerFromInternalField(0)); |
| 2902 } | 2902 } |
| 2903 | 2903 |
| 2904 | 2904 |
| 2905 struct AccessCheckData { | 2905 struct AccessCheckData { |
| 2906 int count; | 2906 int count; |
| 2907 bool result; | 2907 bool result; |
| 2908 }; | 2908 }; |
| 2909 | 2909 |
| 2910 AccessCheckData* g_access_check_data = nullptr; |
| 2910 | 2911 |
| 2911 bool SimpleAccessChecker(Local<v8::Object> global, Local<Value> name, | 2912 |
| 2912 v8::AccessType type, Local<Value> data) { | 2913 bool SimpleAccessChecker(Local<v8::Context> accessing_context, |
| 2913 auto access_check_data = GetWrappedObject<AccessCheckData>(data); | 2914 Local<v8::Object> access_object) { |
| 2914 access_check_data->count++; | 2915 g_access_check_data->count++; |
| 2915 return access_check_data->result; | 2916 return g_access_check_data->result; |
| 2916 } | 2917 } |
| 2917 | 2918 |
| 2918 | 2919 |
| 2919 struct ShouldInterceptData { | 2920 struct ShouldInterceptData { |
| 2920 int value; | 2921 int value; |
| 2921 bool should_intercept; | 2922 bool should_intercept; |
| 2922 }; | 2923 }; |
| 2923 | 2924 |
| 2924 | 2925 |
| 2925 void ShouldNamedInterceptor(Local<Name> name, | 2926 void ShouldNamedInterceptor(Local<Name> name, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2937 ApiTestFuzzer::Fuzz(); | 2938 ApiTestFuzzer::Fuzz(); |
| 2938 CheckReturnValue(info, FUNCTION_ADDR(ShouldIndexedInterceptor)); | 2939 CheckReturnValue(info, FUNCTION_ADDR(ShouldIndexedInterceptor)); |
| 2939 auto data = GetWrappedObject<ShouldInterceptData>(info.Data()); | 2940 auto data = GetWrappedObject<ShouldInterceptData>(info.Data()); |
| 2940 if (!data->should_intercept) return; | 2941 if (!data->should_intercept) return; |
| 2941 info.GetReturnValue().Set(v8_num(data->value)); | 2942 info.GetReturnValue().Set(v8_num(data->value)); |
| 2942 } | 2943 } |
| 2943 | 2944 |
| 2944 } // namespace | 2945 } // namespace |
| 2945 | 2946 |
| 2946 | 2947 |
| 2947 THREADED_TEST(NamedAllCanReadInterceptor) { | 2948 TEST(NamedAllCanReadInterceptor) { |
| 2948 auto isolate = CcTest::isolate(); | 2949 auto isolate = CcTest::isolate(); |
| 2949 v8::HandleScope handle_scope(isolate); | 2950 v8::HandleScope handle_scope(isolate); |
| 2950 LocalContext context; | 2951 LocalContext context; |
| 2951 | 2952 |
| 2952 AccessCheckData access_check_data; | 2953 AccessCheckData access_check_data; |
| 2953 access_check_data.result = true; | 2954 access_check_data.result = true; |
| 2954 access_check_data.count = 0; | 2955 access_check_data.count = 0; |
| 2955 | 2956 |
| 2957 g_access_check_data = &access_check_data; |
| 2958 |
| 2956 ShouldInterceptData intercept_data_0; | 2959 ShouldInterceptData intercept_data_0; |
| 2957 intercept_data_0.value = 239; | 2960 intercept_data_0.value = 239; |
| 2958 intercept_data_0.should_intercept = true; | 2961 intercept_data_0.should_intercept = true; |
| 2959 | 2962 |
| 2960 ShouldInterceptData intercept_data_1; | 2963 ShouldInterceptData intercept_data_1; |
| 2961 intercept_data_1.value = 165; | 2964 intercept_data_1.value = 165; |
| 2962 intercept_data_1.should_intercept = false; | 2965 intercept_data_1.should_intercept = false; |
| 2963 | 2966 |
| 2964 auto intercepted_0 = v8::ObjectTemplate::New(isolate); | 2967 auto intercepted_0 = v8::ObjectTemplate::New(isolate); |
| 2965 { | 2968 { |
| 2966 v8::NamedPropertyHandlerConfiguration conf(ShouldNamedInterceptor); | 2969 v8::NamedPropertyHandlerConfiguration conf(ShouldNamedInterceptor); |
| 2967 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; | 2970 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; |
| 2968 conf.data = | 2971 conf.data = |
| 2969 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_0); | 2972 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_0); |
| 2970 intercepted_0->SetHandler(conf); | 2973 intercepted_0->SetHandler(conf); |
| 2971 } | 2974 } |
| 2972 | 2975 |
| 2973 auto intercepted_1 = v8::ObjectTemplate::New(isolate); | 2976 auto intercepted_1 = v8::ObjectTemplate::New(isolate); |
| 2974 { | 2977 { |
| 2975 v8::NamedPropertyHandlerConfiguration conf(ShouldNamedInterceptor); | 2978 v8::NamedPropertyHandlerConfiguration conf(ShouldNamedInterceptor); |
| 2976 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; | 2979 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; |
| 2977 conf.data = | 2980 conf.data = |
| 2978 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); | 2981 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); |
| 2979 intercepted_1->SetHandler(conf); | 2982 intercepted_1->SetHandler(conf); |
| 2980 } | 2983 } |
| 2981 | 2984 |
| 2982 auto checked = v8::ObjectTemplate::New(isolate); | 2985 auto checked = v8::ObjectTemplate::New(isolate); |
| 2983 checked->SetAccessCheckCallbacks( | 2986 checked->SetAccessCheckCallback(SimpleAccessChecker); |
| 2984 SimpleAccessChecker, nullptr, | |
| 2985 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data)); | |
| 2986 | 2987 |
| 2987 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); | 2988 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); |
| 2988 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); | 2989 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); |
| 2989 auto checked_instance = checked->NewInstance(); | 2990 auto checked_instance = checked->NewInstance(); |
| 2990 checked_instance->Set(v8_str("whatever"), v8_num(17)); | 2991 checked_instance->Set(v8_str("whatever"), v8_num(17)); |
| 2991 context->Global()->Set(v8_str("checked"), checked_instance); | 2992 context->Global()->Set(v8_str("checked"), checked_instance); |
| 2992 CompileRun( | 2993 CompileRun( |
| 2993 "checked.__proto__ = intercepted_1;" | 2994 "checked.__proto__ = intercepted_1;" |
| 2994 "intercepted_1.__proto__ = intercepted_0;"); | 2995 "intercepted_1.__proto__ = intercepted_0;"); |
| 2995 | 2996 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3010 CHECK_EQ(7, access_check_data.count); | 3011 CHECK_EQ(7, access_check_data.count); |
| 3011 | 3012 |
| 3012 intercept_data_1.should_intercept = true; | 3013 intercept_data_1.should_intercept = true; |
| 3013 ExpectInt32("checked.whatever", intercept_data_1.value); | 3014 ExpectInt32("checked.whatever", intercept_data_1.value); |
| 3014 { | 3015 { |
| 3015 v8::TryCatch try_catch(isolate); | 3016 v8::TryCatch try_catch(isolate); |
| 3016 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); | 3017 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); |
| 3017 CHECK(try_catch.HasCaught()); | 3018 CHECK(try_catch.HasCaught()); |
| 3018 } | 3019 } |
| 3019 CHECK_EQ(9, access_check_data.count); | 3020 CHECK_EQ(9, access_check_data.count); |
| 3021 g_access_check_data = nullptr; |
| 3020 } | 3022 } |
| 3021 | 3023 |
| 3022 | 3024 |
| 3023 THREADED_TEST(IndexedAllCanReadInterceptor) { | 3025 TEST(IndexedAllCanReadInterceptor) { |
| 3024 auto isolate = CcTest::isolate(); | 3026 auto isolate = CcTest::isolate(); |
| 3025 v8::HandleScope handle_scope(isolate); | 3027 v8::HandleScope handle_scope(isolate); |
| 3026 LocalContext context; | 3028 LocalContext context; |
| 3027 | 3029 |
| 3028 AccessCheckData access_check_data; | 3030 AccessCheckData access_check_data; |
| 3029 access_check_data.result = true; | 3031 access_check_data.result = true; |
| 3030 access_check_data.count = 0; | 3032 access_check_data.count = 0; |
| 3031 | 3033 |
| 3034 g_access_check_data = &access_check_data; |
| 3035 |
| 3032 ShouldInterceptData intercept_data_0; | 3036 ShouldInterceptData intercept_data_0; |
| 3033 intercept_data_0.value = 239; | 3037 intercept_data_0.value = 239; |
| 3034 intercept_data_0.should_intercept = true; | 3038 intercept_data_0.should_intercept = true; |
| 3035 | 3039 |
| 3036 ShouldInterceptData intercept_data_1; | 3040 ShouldInterceptData intercept_data_1; |
| 3037 intercept_data_1.value = 165; | 3041 intercept_data_1.value = 165; |
| 3038 intercept_data_1.should_intercept = false; | 3042 intercept_data_1.should_intercept = false; |
| 3039 | 3043 |
| 3040 auto intercepted_0 = v8::ObjectTemplate::New(isolate); | 3044 auto intercepted_0 = v8::ObjectTemplate::New(isolate); |
| 3041 { | 3045 { |
| 3042 v8::IndexedPropertyHandlerConfiguration conf(ShouldIndexedInterceptor); | 3046 v8::IndexedPropertyHandlerConfiguration conf(ShouldIndexedInterceptor); |
| 3043 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; | 3047 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; |
| 3044 conf.data = | 3048 conf.data = |
| 3045 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_0); | 3049 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_0); |
| 3046 intercepted_0->SetHandler(conf); | 3050 intercepted_0->SetHandler(conf); |
| 3047 } | 3051 } |
| 3048 | 3052 |
| 3049 auto intercepted_1 = v8::ObjectTemplate::New(isolate); | 3053 auto intercepted_1 = v8::ObjectTemplate::New(isolate); |
| 3050 { | 3054 { |
| 3051 v8::IndexedPropertyHandlerConfiguration conf(ShouldIndexedInterceptor); | 3055 v8::IndexedPropertyHandlerConfiguration conf(ShouldIndexedInterceptor); |
| 3052 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; | 3056 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; |
| 3053 conf.data = | 3057 conf.data = |
| 3054 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); | 3058 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); |
| 3055 intercepted_1->SetHandler(conf); | 3059 intercepted_1->SetHandler(conf); |
| 3056 } | 3060 } |
| 3057 | 3061 |
| 3058 auto checked = v8::ObjectTemplate::New(isolate); | 3062 auto checked = v8::ObjectTemplate::New(isolate); |
| 3059 checked->SetAccessCheckCallbacks( | 3063 checked->SetAccessCheckCallback(SimpleAccessChecker); |
| 3060 SimpleAccessChecker, nullptr, | |
| 3061 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data)); | |
| 3062 | 3064 |
| 3063 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); | 3065 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); |
| 3064 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); | 3066 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); |
| 3065 auto checked_instance = checked->NewInstance(); | 3067 auto checked_instance = checked->NewInstance(); |
| 3066 context->Global()->Set(v8_str("checked"), checked_instance); | 3068 context->Global()->Set(v8_str("checked"), checked_instance); |
| 3067 checked_instance->Set(15, v8_num(17)); | 3069 checked_instance->Set(15, v8_num(17)); |
| 3068 CompileRun( | 3070 CompileRun( |
| 3069 "checked.__proto__ = intercepted_1;" | 3071 "checked.__proto__ = intercepted_1;" |
| 3070 "intercepted_1.__proto__ = intercepted_0;"); | 3072 "intercepted_1.__proto__ = intercepted_0;"); |
| 3071 | 3073 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3087 CHECK_EQ(7, access_check_data.count); | 3089 CHECK_EQ(7, access_check_data.count); |
| 3088 | 3090 |
| 3089 intercept_data_1.should_intercept = true; | 3091 intercept_data_1.should_intercept = true; |
| 3090 ExpectInt32("checked[15]", intercept_data_1.value); | 3092 ExpectInt32("checked[15]", intercept_data_1.value); |
| 3091 { | 3093 { |
| 3092 v8::TryCatch try_catch(isolate); | 3094 v8::TryCatch try_catch(isolate); |
| 3093 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); | 3095 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); |
| 3094 CHECK(try_catch.HasCaught()); | 3096 CHECK(try_catch.HasCaught()); |
| 3095 } | 3097 } |
| 3096 CHECK_EQ(9, access_check_data.count); | 3098 CHECK_EQ(9, access_check_data.count); |
| 3099 |
| 3100 g_access_check_data = nullptr; |
| 3097 } | 3101 } |
| 3098 | 3102 |
| 3099 | 3103 |
| 3100 THREADED_TEST(NonMaskingInterceptorOwnProperty) { | 3104 THREADED_TEST(NonMaskingInterceptorOwnProperty) { |
| 3101 auto isolate = CcTest::isolate(); | 3105 auto isolate = CcTest::isolate(); |
| 3102 v8::HandleScope handle_scope(isolate); | 3106 v8::HandleScope handle_scope(isolate); |
| 3103 LocalContext context; | 3107 LocalContext context; |
| 3104 | 3108 |
| 3105 ShouldInterceptData intercept_data; | 3109 ShouldInterceptData intercept_data; |
| 3106 intercept_data.value = 239; | 3110 intercept_data.value = 239; |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3279 "var obj = intercepted_1;" | 3283 "var obj = intercepted_1;" |
| 3280 "obj.x = 4;" | 3284 "obj.x = 4;" |
| 3281 "eval('obj.x');" | 3285 "eval('obj.x');" |
| 3282 "eval('obj.x');" | 3286 "eval('obj.x');" |
| 3283 "eval('obj.x');" | 3287 "eval('obj.x');" |
| 3284 "obj = intercepted_2;" | 3288 "obj = intercepted_2;" |
| 3285 "obj.x = 9;" | 3289 "obj.x = 9;" |
| 3286 "eval('obj.x');", | 3290 "eval('obj.x');", |
| 3287 9); | 3291 9); |
| 3288 } | 3292 } |
| OLD | NEW |