| 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 | 
|---|