| OLD | NEW |
| 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 9001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9012 | 9012 |
| 9013 static bool IndexedAccessBlocker(Local<v8::Object> global, | 9013 static bool IndexedAccessBlocker(Local<v8::Object> global, |
| 9014 uint32_t key, | 9014 uint32_t key, |
| 9015 v8::AccessType type, | 9015 v8::AccessType type, |
| 9016 Local<Value> data) { | 9016 Local<Value> data) { |
| 9017 return CcTest::isolate()->GetCurrentContext()->Global()->Equals(global) || | 9017 return CcTest::isolate()->GetCurrentContext()->Global()->Equals(global) || |
| 9018 allowed_access_type[type]; | 9018 allowed_access_type[type]; |
| 9019 } | 9019 } |
| 9020 | 9020 |
| 9021 | 9021 |
| 9022 static int g_echo_value_1 = -1; | 9022 static int g_echo_value = -1; |
| 9023 static int g_echo_value_2 = -1; | |
| 9024 | 9023 |
| 9025 | 9024 |
| 9026 static void EchoGetter( | 9025 static void EchoGetter( |
| 9027 Local<String> name, | 9026 Local<String> name, |
| 9028 const v8::PropertyCallbackInfo<v8::Value>& info) { | 9027 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 9029 info.GetReturnValue().Set(v8_num(g_echo_value_1)); | 9028 info.GetReturnValue().Set(v8_num(g_echo_value)); |
| 9030 } | 9029 } |
| 9031 | 9030 |
| 9032 | 9031 |
| 9033 static void EchoGetter(const v8::FunctionCallbackInfo<v8::Value>& info) { | |
| 9034 info.GetReturnValue().Set(v8_num(g_echo_value_2)); | |
| 9035 } | |
| 9036 | |
| 9037 | |
| 9038 static void EchoSetter(Local<String> name, | 9032 static void EchoSetter(Local<String> name, |
| 9039 Local<Value> value, | 9033 Local<Value> value, |
| 9040 const v8::PropertyCallbackInfo<void>&) { | 9034 const v8::PropertyCallbackInfo<void>&) { |
| 9041 if (value->IsNumber()) | 9035 if (value->IsNumber()) |
| 9042 g_echo_value_1 = value->Int32Value(); | 9036 g_echo_value = value->Int32Value(); |
| 9043 } | 9037 } |
| 9044 | 9038 |
| 9045 | 9039 |
| 9046 static void EchoSetter(const v8::FunctionCallbackInfo<v8::Value>& info) { | |
| 9047 v8::Handle<v8::Value> value = info[0]; | |
| 9048 if (value->IsNumber()) | |
| 9049 g_echo_value_2 = value->Int32Value(); | |
| 9050 } | |
| 9051 | |
| 9052 | |
| 9053 static void UnreachableGetter( | 9040 static void UnreachableGetter( |
| 9054 Local<String> name, | 9041 Local<String> name, |
| 9055 const v8::PropertyCallbackInfo<v8::Value>& info) { | 9042 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 9056 CHECK(false); // This function should not be called.. | 9043 CHECK(false); // This function should not be called.. |
| 9057 } | 9044 } |
| 9058 | 9045 |
| 9059 | 9046 |
| 9060 static void UnreachableSetter(Local<String>, | 9047 static void UnreachableSetter(Local<String>, |
| 9061 Local<Value>, | 9048 Local<Value>, |
| 9062 const v8::PropertyCallbackInfo<void>&) { | 9049 const v8::PropertyCallbackInfo<void>&) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 9080 IndexedAccessBlocker); | 9067 IndexedAccessBlocker); |
| 9081 | 9068 |
| 9082 // Add an accessor accessible by cross-domain JS code. | 9069 // Add an accessor accessible by cross-domain JS code. |
| 9083 global_template->SetAccessor( | 9070 global_template->SetAccessor( |
| 9084 v8_str("accessible_prop"), | 9071 v8_str("accessible_prop"), |
| 9085 EchoGetter, EchoSetter, | 9072 EchoGetter, EchoSetter, |
| 9086 v8::Handle<Value>(), | 9073 v8::Handle<Value>(), |
| 9087 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 9074 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
| 9088 | 9075 |
| 9089 | 9076 |
| 9090 global_template->SetAccessorProperty( | |
| 9091 v8_str("accessible_js_prop"), | |
| 9092 v8::FunctionTemplate::New(isolate, EchoGetter), | |
| 9093 v8::FunctionTemplate::New(isolate, EchoSetter), | |
| 9094 v8::None, | |
| 9095 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | |
| 9096 | |
| 9097 // Add an accessor that is not accessible by cross-domain JS code. | 9077 // Add an accessor that is not accessible by cross-domain JS code. |
| 9098 global_template->SetAccessor(v8_str("blocked_prop"), | 9078 global_template->SetAccessor(v8_str("blocked_prop"), |
| 9099 UnreachableGetter, UnreachableSetter, | 9079 UnreachableGetter, UnreachableSetter, |
| 9100 v8::Handle<Value>(), | 9080 v8::Handle<Value>(), |
| 9101 v8::DEFAULT); | 9081 v8::DEFAULT); |
| 9102 | 9082 |
| 9103 global_template->SetAccessorProperty( | 9083 global_template->SetAccessorProperty( |
| 9104 v8_str("blocked_js_prop"), | 9084 v8_str("blocked_js_prop"), |
| 9105 v8::FunctionTemplate::New(isolate, UnreachableFunction), | 9085 v8::FunctionTemplate::New(isolate, UnreachableFunction), |
| 9106 v8::FunctionTemplate::New(isolate, UnreachableFunction), | 9086 v8::FunctionTemplate::New(isolate, UnreachableFunction), |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9215 | 9195 |
| 9216 allowed_access_type[v8::ACCESS_HAS] = false; | 9196 allowed_access_type[v8::ACCESS_HAS] = false; |
| 9217 allowed_access_type[v8::ACCESS_GET] = false; | 9197 allowed_access_type[v8::ACCESS_GET] = false; |
| 9218 | 9198 |
| 9219 v8::Handle<Value> value; | 9199 v8::Handle<Value> value; |
| 9220 | 9200 |
| 9221 // Access accessible property | 9201 // Access accessible property |
| 9222 value = CompileRun("other.accessible_prop = 3"); | 9202 value = CompileRun("other.accessible_prop = 3"); |
| 9223 CHECK(value->IsNumber()); | 9203 CHECK(value->IsNumber()); |
| 9224 CHECK_EQ(3, value->Int32Value()); | 9204 CHECK_EQ(3, value->Int32Value()); |
| 9225 CHECK_EQ(3, g_echo_value_1); | 9205 CHECK_EQ(3, g_echo_value); |
| 9226 | |
| 9227 // Access accessible js property | |
| 9228 value = CompileRun("other.accessible_js_prop = 3"); | |
| 9229 CHECK(value->IsNumber()); | |
| 9230 CHECK_EQ(3, value->Int32Value()); | |
| 9231 CHECK_EQ(3, g_echo_value_2); | |
| 9232 | 9206 |
| 9233 value = CompileRun("other.accessible_prop"); | 9207 value = CompileRun("other.accessible_prop"); |
| 9234 CHECK(value->IsNumber()); | 9208 CHECK(value->IsNumber()); |
| 9235 CHECK_EQ(3, value->Int32Value()); | 9209 CHECK_EQ(3, value->Int32Value()); |
| 9236 | 9210 |
| 9237 value = CompileRun("other.accessible_js_prop"); | |
| 9238 CHECK(value->IsNumber()); | |
| 9239 CHECK_EQ(3, value->Int32Value()); | |
| 9240 | |
| 9241 value = CompileRun( | 9211 value = CompileRun( |
| 9242 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); | 9212 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); |
| 9243 CHECK(value->IsNumber()); | 9213 CHECK(value->IsNumber()); |
| 9244 CHECK_EQ(3, value->Int32Value()); | 9214 CHECK_EQ(3, value->Int32Value()); |
| 9245 | 9215 |
| 9246 value = CompileRun( | |
| 9247 "Object.getOwnPropertyDescriptor(other, 'accessible_js_prop').get()"); | |
| 9248 CHECK(value->IsNumber()); | |
| 9249 CHECK_EQ(3, value->Int32Value()); | |
| 9250 | |
| 9251 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); | 9216 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); |
| 9252 CHECK(value->IsTrue()); | 9217 CHECK(value->IsTrue()); |
| 9253 | 9218 |
| 9254 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_js_prop')"); | |
| 9255 CHECK(value->IsTrue()); | |
| 9256 | |
| 9257 // Enumeration doesn't enumerate accessors from inaccessible objects in | 9219 // Enumeration doesn't enumerate accessors from inaccessible objects in |
| 9258 // the prototype chain even if the accessors are in themselves accessible. | 9220 // the prototype chain even if the accessors are in themselves accessible. |
| 9259 value = | 9221 value = |
| 9260 CompileRun("(function(){var obj = {'__proto__':other};" | 9222 CompileRun("(function(){var obj = {'__proto__':other};" |
| 9261 "for (var p in obj)" | 9223 "for (var p in obj)" |
| 9262 " if (p == 'accessible_prop' ||" | 9224 " if (p == 'accessible_prop' ||" |
| 9263 " p == 'accessible_js_prop' ||" | |
| 9264 " p == 'blocked_js_prop' ||" | 9225 " p == 'blocked_js_prop' ||" |
| 9265 " p == 'blocked_js_prop') {" | 9226 " p == 'blocked_js_prop') {" |
| 9266 " return false;" | 9227 " return false;" |
| 9267 " }" | 9228 " }" |
| 9268 "return true;})()"); | 9229 "return true;})()"); |
| 9269 CHECK(value->IsTrue()); | 9230 CHECK(value->IsTrue()); |
| 9270 | 9231 |
| 9271 context1->Exit(); | 9232 context1->Exit(); |
| 9272 context0->Exit(); | 9233 context0->Exit(); |
| 9273 } | 9234 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9328 CompileRun("Object.freeze(other)"); | 9289 CompileRun("Object.freeze(other)"); |
| 9329 ExpectTrue("Object.isExtensible(other)"); | 9290 ExpectTrue("Object.isExtensible(other)"); |
| 9330 | 9291 |
| 9331 CompileRun("Object.seal(other)"); | 9292 CompileRun("Object.seal(other)"); |
| 9332 ExpectTrue("Object.isExtensible(other)"); | 9293 ExpectTrue("Object.isExtensible(other)"); |
| 9333 | 9294 |
| 9334 // Regression test for issue 1250. | 9295 // Regression test for issue 1250. |
| 9335 // Make sure that we can set the accessible accessors value using normal | 9296 // Make sure that we can set the accessible accessors value using normal |
| 9336 // assignment. | 9297 // assignment. |
| 9337 CompileRun("other.accessible_prop = 42"); | 9298 CompileRun("other.accessible_prop = 42"); |
| 9338 CHECK_EQ(42, g_echo_value_1); | 9299 CHECK_EQ(42, g_echo_value); |
| 9339 | 9300 |
| 9340 v8::Handle<Value> value; | 9301 v8::Handle<Value> value; |
| 9341 CompileRun("Object.defineProperty(other, 'accessible_prop', {value: -1})"); | 9302 CompileRun("Object.defineProperty(other, 'accessible_prop', {value: -1})"); |
| 9342 value = CompileRun("other.accessible_prop == 42"); | 9303 value = CompileRun("other.accessible_prop == 42"); |
| 9343 CHECK(value->IsTrue()); | 9304 CHECK(value->IsTrue()); |
| 9344 } | 9305 } |
| 9345 | 9306 |
| 9346 | 9307 |
| 9347 static bool GetOwnPropertyNamesNamedBlocker(Local<v8::Object> global, | 9308 static bool GetOwnPropertyNamesNamedBlocker(Local<v8::Object> global, |
| 9348 Local<Value> name, | 9309 Local<Value> name, |
| (...skipping 13373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22722 call_eval_context = v8::Context::New(isolate); | 22683 call_eval_context = v8::Context::New(isolate); |
| 22723 v8::Context::Scope scope(call_eval_context); | 22684 v8::Context::Scope scope(call_eval_context); |
| 22724 call_eval_bound_function = | 22685 call_eval_bound_function = |
| 22725 Local<Function>::Cast(CompileRun("eval.bind(this, '1')")); | 22686 Local<Function>::Cast(CompileRun("eval.bind(this, '1')")); |
| 22726 } | 22687 } |
| 22727 env->Global()->Set(v8_str("CallEval"), | 22688 env->Global()->Set(v8_str("CallEval"), |
| 22728 v8::FunctionTemplate::New(isolate, CallEval)->GetFunction()); | 22689 v8::FunctionTemplate::New(isolate, CallEval)->GetFunction()); |
| 22729 Local<Value> result = CompileRun("CallEval();"); | 22690 Local<Value> result = CompileRun("CallEval();"); |
| 22730 CHECK_EQ(result, v8::Integer::New(isolate, 1)); | 22691 CHECK_EQ(result, v8::Integer::New(isolate, 1)); |
| 22731 } | 22692 } |
| OLD | NEW |