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 1640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1651 " if (v != 0) throw 'Wrong value ' + v + ' at iteration ' + i;" | 1651 " if (v != 0) throw 'Wrong value ' + v + ' at iteration ' + i;" |
1652 " }" | 1652 " }" |
1653 " 'PASSED'" | 1653 " 'PASSED'" |
1654 "} catch(e) {" | 1654 "} catch(e) {" |
1655 " e" | 1655 " e" |
1656 "}"; | 1656 "}"; |
1657 ExpectString(code, "PASSED"); | 1657 ExpectString(code, "PASSED"); |
1658 } | 1658 } |
1659 | 1659 |
1660 | 1660 |
| 1661 static bool AccessAlwaysBlocked(Local<v8::Object> global, Local<Value> name, |
| 1662 v8::AccessType type, Local<Value> data) { |
| 1663 return false; |
| 1664 } |
| 1665 |
| 1666 |
1661 THREADED_TEST(IndexedInterceptorWithAccessorCheck) { | 1667 THREADED_TEST(IndexedInterceptorWithAccessorCheck) { |
1662 v8::Isolate* isolate = CcTest::isolate(); | 1668 v8::Isolate* isolate = CcTest::isolate(); |
1663 v8::HandleScope scope(isolate); | 1669 v8::HandleScope scope(isolate); |
1664 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 1670 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
1665 templ->SetHandler( | 1671 templ->SetHandler( |
1666 v8::IndexedPropertyHandlerConfiguration(IdentityIndexedPropertyGetter)); | 1672 v8::IndexedPropertyHandlerConfiguration(IdentityIndexedPropertyGetter)); |
1667 | 1673 |
| 1674 templ->SetAccessCheckCallbacks(AccessAlwaysBlocked, nullptr); |
| 1675 |
1668 LocalContext context; | 1676 LocalContext context; |
1669 Local<v8::Object> obj = templ->NewInstance(); | 1677 Local<v8::Object> obj = templ->NewInstance(); |
1670 obj->TurnOnAccessCheck(); | |
1671 context->Global()->Set(v8_str("obj"), obj); | 1678 context->Global()->Set(v8_str("obj"), obj); |
1672 | 1679 |
1673 const char* code = | 1680 const char* code = |
1674 "var result = 'PASSED';" | 1681 "var result = 'PASSED';" |
1675 "for (var i = 0; i < 100; i++) {" | 1682 "for (var i = 0; i < 100; i++) {" |
1676 " try {" | 1683 " try {" |
1677 " var v = obj[0];" | 1684 " var v = obj[0];" |
1678 " result = 'Wrong value ' + v + ' at iteration ' + i;" | 1685 " result = 'Wrong value ' + v + ' at iteration ' + i;" |
1679 " break;" | 1686 " break;" |
1680 " } catch (e) {" | 1687 " } catch (e) {" |
1681 " /* pass */" | 1688 " /* pass */" |
1682 " }" | 1689 " }" |
1683 "}" | 1690 "}" |
1684 "result"; | 1691 "result"; |
1685 ExpectString(code, "PASSED"); | 1692 ExpectString(code, "PASSED"); |
1686 } | 1693 } |
1687 | 1694 |
1688 | 1695 |
1689 THREADED_TEST(IndexedInterceptorWithAccessorCheckSwitchedOn) { | |
1690 i::FLAG_allow_natives_syntax = true; | |
1691 v8::Isolate* isolate = CcTest::isolate(); | |
1692 v8::HandleScope scope(isolate); | |
1693 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | |
1694 templ->SetHandler( | |
1695 v8::IndexedPropertyHandlerConfiguration(IdentityIndexedPropertyGetter)); | |
1696 | |
1697 LocalContext context; | |
1698 Local<v8::Object> obj = templ->NewInstance(); | |
1699 context->Global()->Set(v8_str("obj"), obj); | |
1700 | |
1701 const char* code = | |
1702 "var result = 'PASSED';" | |
1703 "for (var i = 0; i < 100; i++) {" | |
1704 " var expected = i;" | |
1705 " if (i == 5) {" | |
1706 " %EnableAccessChecks(obj);" | |
1707 " }" | |
1708 " try {" | |
1709 " var v = obj[i];" | |
1710 " if (i == 5) {" | |
1711 " result = 'Should not have reached this!';" | |
1712 " break;" | |
1713 " } else if (v != expected) {" | |
1714 " result = 'Wrong value ' + v + ' at iteration ' + i;" | |
1715 " break;" | |
1716 " }" | |
1717 " } catch (e) {" | |
1718 " if (i != 5) {" | |
1719 " result = e;" | |
1720 " }" | |
1721 " }" | |
1722 " if (i == 5) %DisableAccessChecks(obj);" | |
1723 "}" | |
1724 "result"; | |
1725 ExpectString(code, "PASSED"); | |
1726 } | |
1727 | |
1728 | |
1729 THREADED_TEST(IndexedInterceptorWithDifferentIndices) { | 1696 THREADED_TEST(IndexedInterceptorWithDifferentIndices) { |
1730 v8::Isolate* isolate = CcTest::isolate(); | 1697 v8::Isolate* isolate = CcTest::isolate(); |
1731 v8::HandleScope scope(isolate); | 1698 v8::HandleScope scope(isolate); |
1732 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 1699 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
1733 templ->SetHandler( | 1700 templ->SetHandler( |
1734 v8::IndexedPropertyHandlerConfiguration(IdentityIndexedPropertyGetter)); | 1701 v8::IndexedPropertyHandlerConfiguration(IdentityIndexedPropertyGetter)); |
1735 | 1702 |
1736 LocalContext context; | 1703 LocalContext context; |
1737 Local<v8::Object> obj = templ->NewInstance(); | 1704 Local<v8::Object> obj = templ->NewInstance(); |
1738 context->Global()->Set(v8_str("obj"), obj); | 1705 context->Global()->Set(v8_str("obj"), obj); |
(...skipping 1229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2968 | 2935 |
2969 } // namespace | 2936 } // namespace |
2970 | 2937 |
2971 | 2938 |
2972 THREADED_TEST(NamedAllCanReadInterceptor) { | 2939 THREADED_TEST(NamedAllCanReadInterceptor) { |
2973 auto isolate = CcTest::isolate(); | 2940 auto isolate = CcTest::isolate(); |
2974 v8::HandleScope handle_scope(isolate); | 2941 v8::HandleScope handle_scope(isolate); |
2975 LocalContext context; | 2942 LocalContext context; |
2976 | 2943 |
2977 AccessCheckData access_check_data; | 2944 AccessCheckData access_check_data; |
2978 access_check_data.result = false; | 2945 access_check_data.result = true; |
2979 access_check_data.count = 0; | 2946 access_check_data.count = 0; |
2980 | 2947 |
2981 ShouldInterceptData intercept_data_0; | 2948 ShouldInterceptData intercept_data_0; |
2982 intercept_data_0.value = 239; | 2949 intercept_data_0.value = 239; |
2983 intercept_data_0.should_intercept = true; | 2950 intercept_data_0.should_intercept = true; |
2984 | 2951 |
2985 ShouldInterceptData intercept_data_1; | 2952 ShouldInterceptData intercept_data_1; |
2986 intercept_data_1.value = 165; | 2953 intercept_data_1.value = 165; |
2987 intercept_data_1.should_intercept = false; | 2954 intercept_data_1.should_intercept = false; |
2988 | 2955 |
(...skipping 11 matching lines...) Expand all Loading... |
3000 v8::NamedPropertyHandlerConfiguration conf(ShouldNamedInterceptor); | 2967 v8::NamedPropertyHandlerConfiguration conf(ShouldNamedInterceptor); |
3001 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; | 2968 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; |
3002 conf.data = | 2969 conf.data = |
3003 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); | 2970 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); |
3004 intercepted_1->SetHandler(conf); | 2971 intercepted_1->SetHandler(conf); |
3005 } | 2972 } |
3006 | 2973 |
3007 auto checked = v8::ObjectTemplate::New(isolate); | 2974 auto checked = v8::ObjectTemplate::New(isolate); |
3008 checked->SetAccessCheckCallbacks( | 2975 checked->SetAccessCheckCallbacks( |
3009 SimpleAccessChecker, nullptr, | 2976 SimpleAccessChecker, nullptr, |
3010 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data), false); | 2977 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data)); |
3011 | 2978 |
3012 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); | 2979 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); |
3013 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); | 2980 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); |
3014 auto checked_instance = checked->NewInstance(); | 2981 auto checked_instance = checked->NewInstance(); |
3015 checked_instance->Set(v8_str("whatever"), v8_num(17)); | 2982 checked_instance->Set(v8_str("whatever"), v8_num(17)); |
3016 context->Global()->Set(v8_str("checked"), checked_instance); | 2983 context->Global()->Set(v8_str("checked"), checked_instance); |
3017 CompileRun( | 2984 CompileRun( |
3018 "checked.__proto__ = intercepted_1;" | 2985 "checked.__proto__ = intercepted_1;" |
3019 "intercepted_1.__proto__ = intercepted_0;"); | 2986 "intercepted_1.__proto__ = intercepted_0;"); |
3020 | 2987 |
3021 checked_instance->TurnOnAccessCheck(); | 2988 CHECK_EQ(3, access_check_data.count); |
3022 CHECK_EQ(0, access_check_data.count); | |
3023 | 2989 |
3024 access_check_data.result = true; | |
3025 ExpectInt32("checked.whatever", 17); | 2990 ExpectInt32("checked.whatever", 17); |
3026 CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')") | 2991 CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')") |
3027 ->IsUndefined()); | 2992 ->IsUndefined()); |
3028 CHECK_EQ(2, access_check_data.count); | 2993 CHECK_EQ(5, access_check_data.count); |
3029 | 2994 |
3030 access_check_data.result = false; | 2995 access_check_data.result = false; |
3031 ExpectInt32("checked.whatever", intercept_data_0.value); | 2996 ExpectInt32("checked.whatever", intercept_data_0.value); |
3032 { | 2997 { |
3033 v8::TryCatch try_catch(isolate); | 2998 v8::TryCatch try_catch(isolate); |
3034 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); | 2999 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); |
3035 CHECK(try_catch.HasCaught()); | 3000 CHECK(try_catch.HasCaught()); |
3036 } | 3001 } |
3037 CHECK_EQ(4, access_check_data.count); | 3002 CHECK_EQ(7, access_check_data.count); |
3038 | 3003 |
3039 intercept_data_1.should_intercept = true; | 3004 intercept_data_1.should_intercept = true; |
3040 ExpectInt32("checked.whatever", intercept_data_1.value); | 3005 ExpectInt32("checked.whatever", intercept_data_1.value); |
3041 { | 3006 { |
3042 v8::TryCatch try_catch(isolate); | 3007 v8::TryCatch try_catch(isolate); |
3043 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); | 3008 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); |
3044 CHECK(try_catch.HasCaught()); | 3009 CHECK(try_catch.HasCaught()); |
3045 } | 3010 } |
3046 CHECK_EQ(6, access_check_data.count); | 3011 CHECK_EQ(9, access_check_data.count); |
3047 } | 3012 } |
3048 | 3013 |
3049 | 3014 |
3050 THREADED_TEST(IndexedAllCanReadInterceptor) { | 3015 THREADED_TEST(IndexedAllCanReadInterceptor) { |
3051 auto isolate = CcTest::isolate(); | 3016 auto isolate = CcTest::isolate(); |
3052 v8::HandleScope handle_scope(isolate); | 3017 v8::HandleScope handle_scope(isolate); |
3053 LocalContext context; | 3018 LocalContext context; |
3054 | 3019 |
3055 AccessCheckData access_check_data; | 3020 AccessCheckData access_check_data; |
3056 access_check_data.result = false; | 3021 access_check_data.result = true; |
3057 access_check_data.count = 0; | 3022 access_check_data.count = 0; |
3058 | 3023 |
3059 ShouldInterceptData intercept_data_0; | 3024 ShouldInterceptData intercept_data_0; |
3060 intercept_data_0.value = 239; | 3025 intercept_data_0.value = 239; |
3061 intercept_data_0.should_intercept = true; | 3026 intercept_data_0.should_intercept = true; |
3062 | 3027 |
3063 ShouldInterceptData intercept_data_1; | 3028 ShouldInterceptData intercept_data_1; |
3064 intercept_data_1.value = 165; | 3029 intercept_data_1.value = 165; |
3065 intercept_data_1.should_intercept = false; | 3030 intercept_data_1.should_intercept = false; |
3066 | 3031 |
(...skipping 11 matching lines...) Expand all Loading... |
3078 v8::IndexedPropertyHandlerConfiguration conf(ShouldIndexedInterceptor); | 3043 v8::IndexedPropertyHandlerConfiguration conf(ShouldIndexedInterceptor); |
3079 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; | 3044 conf.flags = v8::PropertyHandlerFlags::kAllCanRead; |
3080 conf.data = | 3045 conf.data = |
3081 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); | 3046 BuildWrappedObject<ShouldInterceptData>(isolate, &intercept_data_1); |
3082 intercepted_1->SetHandler(conf); | 3047 intercepted_1->SetHandler(conf); |
3083 } | 3048 } |
3084 | 3049 |
3085 auto checked = v8::ObjectTemplate::New(isolate); | 3050 auto checked = v8::ObjectTemplate::New(isolate); |
3086 checked->SetAccessCheckCallbacks( | 3051 checked->SetAccessCheckCallbacks( |
3087 SimpleAccessChecker, nullptr, | 3052 SimpleAccessChecker, nullptr, |
3088 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data), false); | 3053 BuildWrappedObject<AccessCheckData>(isolate, &access_check_data)); |
3089 | 3054 |
3090 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); | 3055 context->Global()->Set(v8_str("intercepted_0"), intercepted_0->NewInstance()); |
3091 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); | 3056 context->Global()->Set(v8_str("intercepted_1"), intercepted_1->NewInstance()); |
3092 auto checked_instance = checked->NewInstance(); | 3057 auto checked_instance = checked->NewInstance(); |
3093 context->Global()->Set(v8_str("checked"), checked_instance); | 3058 context->Global()->Set(v8_str("checked"), checked_instance); |
3094 checked_instance->Set(15, v8_num(17)); | 3059 checked_instance->Set(15, v8_num(17)); |
3095 CompileRun( | 3060 CompileRun( |
3096 "checked.__proto__ = intercepted_1;" | 3061 "checked.__proto__ = intercepted_1;" |
3097 "intercepted_1.__proto__ = intercepted_0;"); | 3062 "intercepted_1.__proto__ = intercepted_0;"); |
3098 | 3063 |
3099 checked_instance->TurnOnAccessCheck(); | 3064 CHECK_EQ(3, access_check_data.count); |
3100 CHECK_EQ(0, access_check_data.count); | |
3101 | 3065 |
3102 access_check_data.result = true; | 3066 access_check_data.result = true; |
3103 ExpectInt32("checked[15]", 17); | 3067 ExpectInt32("checked[15]", 17); |
3104 CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, '15')") | 3068 CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, '15')") |
3105 ->IsUndefined()); | 3069 ->IsUndefined()); |
3106 CHECK_EQ(2, access_check_data.count); | 3070 CHECK_EQ(5, access_check_data.count); |
3107 | 3071 |
3108 access_check_data.result = false; | 3072 access_check_data.result = false; |
3109 ExpectInt32("checked[15]", intercept_data_0.value); | 3073 ExpectInt32("checked[15]", intercept_data_0.value); |
3110 { | 3074 { |
3111 v8::TryCatch try_catch(isolate); | 3075 v8::TryCatch try_catch(isolate); |
3112 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); | 3076 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); |
3113 CHECK(try_catch.HasCaught()); | 3077 CHECK(try_catch.HasCaught()); |
3114 } | 3078 } |
3115 CHECK_EQ(4, access_check_data.count); | 3079 CHECK_EQ(7, access_check_data.count); |
3116 | 3080 |
3117 intercept_data_1.should_intercept = true; | 3081 intercept_data_1.should_intercept = true; |
3118 ExpectInt32("checked[15]", intercept_data_1.value); | 3082 ExpectInt32("checked[15]", intercept_data_1.value); |
3119 { | 3083 { |
3120 v8::TryCatch try_catch(isolate); | 3084 v8::TryCatch try_catch(isolate); |
3121 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); | 3085 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); |
3122 CHECK(try_catch.HasCaught()); | 3086 CHECK(try_catch.HasCaught()); |
3123 } | 3087 } |
3124 CHECK_EQ(6, access_check_data.count); | 3088 CHECK_EQ(9, access_check_data.count); |
3125 } | 3089 } |
3126 | 3090 |
3127 | 3091 |
3128 THREADED_TEST(NonMaskingInterceptorOwnProperty) { | 3092 THREADED_TEST(NonMaskingInterceptorOwnProperty) { |
3129 auto isolate = CcTest::isolate(); | 3093 auto isolate = CcTest::isolate(); |
3130 v8::HandleScope handle_scope(isolate); | 3094 v8::HandleScope handle_scope(isolate); |
3131 LocalContext context; | 3095 LocalContext context; |
3132 | 3096 |
3133 ShouldInterceptData intercept_data; | 3097 ShouldInterceptData intercept_data; |
3134 intercept_data.value = 239; | 3098 intercept_data.value = 239; |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3306 "var obj = intercepted_1;" | 3270 "var obj = intercepted_1;" |
3307 "obj.x = 4;" | 3271 "obj.x = 4;" |
3308 "eval('obj.x');" | 3272 "eval('obj.x');" |
3309 "eval('obj.x');" | 3273 "eval('obj.x');" |
3310 "eval('obj.x');" | 3274 "eval('obj.x');" |
3311 "obj = intercepted_2;" | 3275 "obj = intercepted_2;" |
3312 "obj.x = 9;" | 3276 "obj.x = 9;" |
3313 "eval('obj.x');", | 3277 "eval('obj.x');", |
3314 9); | 3278 9); |
3315 } | 3279 } |
OLD | NEW |