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 2916 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2927 Object::Cast(*data)->GetAlignedPointerFromInternalField(0)); | 2927 Object::Cast(*data)->GetAlignedPointerFromInternalField(0)); |
2928 } | 2928 } |
2929 | 2929 |
2930 | 2930 |
2931 struct AccessCheckData { | 2931 struct AccessCheckData { |
2932 int count; | 2932 int count; |
2933 bool result; | 2933 bool result; |
2934 }; | 2934 }; |
2935 | 2935 |
2936 | 2936 |
2937 bool SimpleNamedAccessChecker(Local<v8::Object> global, Local<Value> name, | 2937 bool SimpleAccessChecker(Local<v8::Object> global, Local<Value> name, |
2938 v8::AccessType type, Local<Value> data) { | 2938 v8::AccessType type, Local<Value> data) { |
2939 auto access_check_data = GetWrappedObject<AccessCheckData>(data); | 2939 auto access_check_data = GetWrappedObject<AccessCheckData>(data); |
2940 access_check_data->count++; | 2940 access_check_data->count++; |
2941 return access_check_data->result; | 2941 return access_check_data->result; |
2942 } | |
2943 | |
2944 | |
2945 bool SimpleIndexedAccessChecker(Local<v8::Object> global, uint32_t index, | |
2946 v8::AccessType type, Local<Value> data) { | |
2947 auto access_check_data = GetWrappedObject<AccessCheckData>(data); | |
2948 access_check_data->count++; | |
2949 return access_check_data->result; | |
2950 } | 2942 } |
2951 | 2943 |
2952 | 2944 |
2953 struct ShouldInterceptData { | 2945 struct ShouldInterceptData { |
2954 int value; | 2946 int value; |
2955 bool should_intercept; | 2947 bool should_intercept; |
2956 }; | 2948 }; |
2957 | 2949 |
2958 | 2950 |
2959 void ShouldNamedInterceptor(Local<Name> name, | 2951 void ShouldNamedInterceptor(Local<Name> name, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3008 { | 3000 { |
3009 v8::NamedPropertyHandlerConfiguration conf(ShouldNamedInterceptor); | 3001 v8::NamedPropertyHandlerConfiguration conf(ShouldNamedInterceptor); |
3010 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; | 3002 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; |
3011 conf.data = | 3003 conf.data = |
3012 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); | 3004 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); |
3013 intercepted_1->SetHandler(conf); | 3005 intercepted_1->SetHandler(conf); |
3014 } | 3006 } |
3015 | 3007 |
3016 auto checked = v8::ObjectTemplate::New(isolate); | 3008 auto checked = v8::ObjectTemplate::New(isolate); |
3017 checked->SetAccessCheckCallbacks( | 3009 checked->SetAccessCheckCallbacks( |
3018 SimpleNamedAccessChecker, nullptr, | 3010 SimpleAccessChecker, nullptr, |
3019 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data), false); | 3011 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data), false); |
3020 | 3012 |
3021 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); | 3013 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); |
3022 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); | 3014 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); |
3023 auto checked_instance = checked->NewInstance(); | 3015 auto checked_instance = checked->NewInstance(); |
3024 checked_instance->Set(v8_str("whatever"), v8_num(17)); | 3016 checked_instance->Set(v8_str("whatever"), v8_num(17)); |
3025 context->Global()->Set(v8_str("checked"), checked_instance); | 3017 context->Global()->Set(v8_str("checked"), checked_instance); |
3026 CompileRun( | 3018 CompileRun( |
3027 "checked.__proto__ = intercepted_1;" | 3019 "checked.__proto__ = intercepted_1;" |
3028 "intercepted_1.__proto__ = intercepted_0;"); | 3020 "intercepted_1.__proto__ = intercepted_0;"); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3074 { | 3066 { |
3075 v8::IndexedPropertyHandlerConfiguration conf(ShouldIndexedInterceptor); | 3067 v8::IndexedPropertyHandlerConfiguration conf(ShouldIndexedInterceptor); |
3076 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; | 3068 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; |
3077 conf.data = | 3069 conf.data = |
3078 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); | 3070 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); |
3079 intercepted_1->SetHandler(conf); | 3071 intercepted_1->SetHandler(conf); |
3080 } | 3072 } |
3081 | 3073 |
3082 auto checked = v8::ObjectTemplate::New(isolate); | 3074 auto checked = v8::ObjectTemplate::New(isolate); |
3083 checked->SetAccessCheckCallbacks( | 3075 checked->SetAccessCheckCallbacks( |
3084 nullptr, SimpleIndexedAccessChecker, | 3076 SimpleAccessChecker, nullptr, |
3085 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data), false); | 3077 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data), false); |
3086 | 3078 |
3087 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); | 3079 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); |
3088 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); | 3080 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); |
3089 auto checked_instance = checked->NewInstance(); | 3081 auto checked_instance = checked->NewInstance(); |
3090 context->Global()->Set(v8_str("checked"), checked_instance); | 3082 context->Global()->Set(v8_str("checked"), checked_instance); |
3091 checked_instance->Set(15, v8_num(17)); | 3083 checked_instance->Set(15, v8_num(17)); |
3092 CompileRun( | 3084 CompileRun( |
3093 "checked.__proto__ = intercepted_1;" | 3085 "checked.__proto__ = intercepted_1;" |
3094 "intercepted_1.__proto__ = intercepted_0;"); | 3086 "intercepted_1.__proto__ = intercepted_0;"); |
3095 | 3087 |
3096 checked_instance->TurnOnAccessCheck(); | 3088 checked_instance->TurnOnAccessCheck(); |
3097 CHECK_EQ(0, access_check_data.count); | 3089 CHECK_EQ(0, access_check_data.count); |
3098 | 3090 |
3099 access_check_data.result = true; | 3091 access_check_data.result = true; |
3100 ExpectInt32("checked[15]", 17); | 3092 ExpectInt32("checked[15]", 17); |
3101 CHECK_EQ(1, access_check_data.count); | 3093 CHECK_EQ(1, access_check_data.count); |
3102 | 3094 |
3103 access_check_data.result = false; | 3095 access_check_data.result = false; |
3104 ExpectInt32("checked[15]", intercept_data_0.value); | 3096 ExpectInt32("checked[15]", intercept_data_0.value); |
3105 CHECK_EQ(2, access_check_data.count); | 3097 CHECK_EQ(2, access_check_data.count); |
3106 | 3098 |
3107 intercept_data_1.should_intercept = true; | 3099 intercept_data_1.should_intercept = true; |
3108 ExpectInt32("checked[15]", intercept_data_1.value); | 3100 ExpectInt32("checked[15]", intercept_data_1.value); |
3109 CHECK_EQ(3, access_check_data.count); | 3101 CHECK_EQ(3, access_check_data.count); |
3110 } | 3102 } |
OLD | NEW |