| 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 8239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8250 | 8250 |
| 8251 static bool IndexedAccessBlocker(Local<v8::Object> global, | 8251 static bool IndexedAccessBlocker(Local<v8::Object> global, |
| 8252 uint32_t key, | 8252 uint32_t key, |
| 8253 v8::AccessType type, | 8253 v8::AccessType type, |
| 8254 Local<Value> data) { | 8254 Local<Value> data) { |
| 8255 return Context::GetCurrent()->Global()->Equals(global) || | 8255 return Context::GetCurrent()->Global()->Equals(global) || |
| 8256 allowed_access_type[type]; | 8256 allowed_access_type[type]; |
| 8257 } | 8257 } |
| 8258 | 8258 |
| 8259 | 8259 |
| 8260 static int g_echo_value = -1; | 8260 static int g_echo_value_1 = -1; |
| 8261 static int g_echo_value_2 = -1; |
| 8262 |
| 8263 |
| 8261 static void EchoGetter( | 8264 static void EchoGetter( |
| 8262 Local<String> name, | 8265 Local<String> name, |
| 8263 const v8::PropertyCallbackInfo<v8::Value>& info) { | 8266 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 8264 info.GetReturnValue().Set(v8_num(g_echo_value)); | 8267 info.GetReturnValue().Set(v8_num(g_echo_value_1)); |
| 8265 } | 8268 } |
| 8266 | 8269 |
| 8267 | 8270 |
| 8271 static void EchoGetter(const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 8272 info.GetReturnValue().Set(v8_num(g_echo_value_2)); |
| 8273 } |
| 8274 |
| 8275 |
| 8268 static void EchoSetter(Local<String> name, | 8276 static void EchoSetter(Local<String> name, |
| 8269 Local<Value> value, | 8277 Local<Value> value, |
| 8270 const v8::PropertyCallbackInfo<void>&) { | 8278 const v8::PropertyCallbackInfo<void>&) { |
| 8271 if (value->IsNumber()) | 8279 if (value->IsNumber()) |
| 8272 g_echo_value = value->Int32Value(); | 8280 g_echo_value_1 = value->Int32Value(); |
| 8273 } | 8281 } |
| 8274 | 8282 |
| 8275 | 8283 |
| 8284 static void EchoSetter(const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 8285 v8::Handle<v8::Value> value = info[0]; |
| 8286 if (value->IsNumber()) |
| 8287 g_echo_value_2 = value->Int32Value(); |
| 8288 } |
| 8289 |
| 8290 |
| 8276 static void UnreachableGetter( | 8291 static void UnreachableGetter( |
| 8277 Local<String> name, | 8292 Local<String> name, |
| 8278 const v8::PropertyCallbackInfo<v8::Value>& info) { | 8293 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 8279 CHECK(false); // This function should not be called.. | 8294 CHECK(false); // This function should not be called.. |
| 8280 } | 8295 } |
| 8281 | 8296 |
| 8282 | 8297 |
| 8283 static void UnreachableSetter(Local<String>, | 8298 static void UnreachableSetter(Local<String>, |
| 8284 Local<Value>, | 8299 Local<Value>, |
| 8285 const v8::PropertyCallbackInfo<void>&) { | 8300 const v8::PropertyCallbackInfo<void>&) { |
| 8286 CHECK(false); // This function should nto be called. | 8301 CHECK(false); // This function should nto be called. |
| 8287 } | 8302 } |
| 8288 | 8303 |
| 8289 | 8304 |
| 8305 static void UnreachableFunction( |
| 8306 const v8::FunctionCallbackInfo<v8::Value>& info) { |
| 8307 CHECK(false); // This function should not be called.. |
| 8308 } |
| 8309 |
| 8310 |
| 8290 TEST(AccessControl) { | 8311 TEST(AccessControl) { |
| 8291 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 8312 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 8292 v8::HandleScope handle_scope(isolate); | 8313 v8::HandleScope handle_scope(isolate); |
| 8293 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 8314 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
| 8294 | 8315 |
| 8295 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, | 8316 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, |
| 8296 IndexedAccessBlocker); | 8317 IndexedAccessBlocker); |
| 8297 | 8318 |
| 8298 // Add an accessor accessible by cross-domain JS code. | 8319 // Add an accessor accessible by cross-domain JS code. |
| 8299 global_template->SetAccessor( | 8320 global_template->SetAccessor( |
| 8300 v8_str("accessible_prop"), | 8321 v8_str("accessible_prop"), |
| 8301 EchoGetter, EchoSetter, | 8322 EchoGetter, EchoSetter, |
| 8302 v8::Handle<Value>(), | 8323 v8::Handle<Value>(), |
| 8303 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 8324 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
| 8304 | 8325 |
| 8326 |
| 8327 global_template->SetAccessorProperty( |
| 8328 v8_str("accessible_js_prop"), |
| 8329 v8::FunctionTemplate::New(EchoGetter), |
| 8330 v8::FunctionTemplate::New(EchoSetter), |
| 8331 v8::None, |
| 8332 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
| 8333 |
| 8305 // Add an accessor that is not accessible by cross-domain JS code. | 8334 // Add an accessor that is not accessible by cross-domain JS code. |
| 8306 global_template->SetAccessor(v8_str("blocked_prop"), | 8335 global_template->SetAccessor(v8_str("blocked_prop"), |
| 8307 UnreachableGetter, UnreachableSetter, | 8336 UnreachableGetter, UnreachableSetter, |
| 8308 v8::Handle<Value>(), | 8337 v8::Handle<Value>(), |
| 8309 v8::DEFAULT); | 8338 v8::DEFAULT); |
| 8310 | 8339 |
| 8340 global_template->SetAccessorProperty( |
| 8341 v8_str("blocked_js_prop"), |
| 8342 v8::FunctionTemplate::New(UnreachableFunction), |
| 8343 v8::FunctionTemplate::New(UnreachableFunction), |
| 8344 v8::None, |
| 8345 v8::DEFAULT); |
| 8346 |
| 8311 // Create an environment | 8347 // Create an environment |
| 8312 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); | 8348 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
| 8313 context0->Enter(); | 8349 context0->Enter(); |
| 8314 | 8350 |
| 8315 v8::Handle<v8::Object> global0 = context0->Global(); | 8351 v8::Handle<v8::Object> global0 = context0->Global(); |
| 8316 | 8352 |
| 8317 // Define a property with JS getter and setter. | 8353 // Define a property with JS getter and setter. |
| 8318 CompileRun( | 8354 CompileRun( |
| 8319 "function getter() { return 'getter'; };\n" | 8355 "function getter() { return 'getter'; };\n" |
| 8320 "function setter() { return 'setter'; }\n" | 8356 "function setter() { return 'setter'; }\n" |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8493 allowed_access_type[v8::ACCESS_SET] = false; | 8529 allowed_access_type[v8::ACCESS_SET] = false; |
| 8494 allowed_access_type[v8::ACCESS_GET] = false; | 8530 allowed_access_type[v8::ACCESS_GET] = false; |
| 8495 allowed_access_type[v8::ACCESS_HAS] = false; | 8531 allowed_access_type[v8::ACCESS_HAS] = false; |
| 8496 | 8532 |
| 8497 v8::Handle<Value> value; | 8533 v8::Handle<Value> value; |
| 8498 | 8534 |
| 8499 // Access accessible property | 8535 // Access accessible property |
| 8500 value = CompileRun("other.accessible_prop = 3"); | 8536 value = CompileRun("other.accessible_prop = 3"); |
| 8501 CHECK(value->IsNumber()); | 8537 CHECK(value->IsNumber()); |
| 8502 CHECK_EQ(3, value->Int32Value()); | 8538 CHECK_EQ(3, value->Int32Value()); |
| 8503 CHECK_EQ(3, g_echo_value); | 8539 CHECK_EQ(3, g_echo_value_1); |
| 8540 |
| 8541 // Access accessible js property |
| 8542 value = CompileRun("other.accessible_js_prop = 3"); |
| 8543 CHECK(value->IsNumber()); |
| 8544 CHECK_EQ(3, value->Int32Value()); |
| 8545 CHECK_EQ(3, g_echo_value_2); |
| 8504 | 8546 |
| 8505 value = CompileRun("other.accessible_prop"); | 8547 value = CompileRun("other.accessible_prop"); |
| 8506 CHECK(value->IsNumber()); | 8548 CHECK(value->IsNumber()); |
| 8507 CHECK_EQ(3, value->Int32Value()); | 8549 CHECK_EQ(3, value->Int32Value()); |
| 8508 | 8550 |
| 8551 value = CompileRun("other.accessible_js_prop"); |
| 8552 CHECK(value->IsNumber()); |
| 8553 CHECK_EQ(3, value->Int32Value()); |
| 8554 |
| 8509 value = CompileRun( | 8555 value = CompileRun( |
| 8510 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); | 8556 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); |
| 8511 CHECK(value->IsNumber()); | 8557 CHECK(value->IsNumber()); |
| 8512 CHECK_EQ(3, value->Int32Value()); | 8558 CHECK_EQ(3, value->Int32Value()); |
| 8513 | 8559 |
| 8560 value = CompileRun( |
| 8561 "Object.getOwnPropertyDescriptor(other, 'accessible_js_prop').get()"); |
| 8562 CHECK(value->IsNumber()); |
| 8563 CHECK_EQ(3, value->Int32Value()); |
| 8564 |
| 8514 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); | 8565 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); |
| 8515 CHECK(value->IsTrue()); | 8566 CHECK(value->IsTrue()); |
| 8516 | 8567 |
| 8568 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_js_prop')"); |
| 8569 CHECK(value->IsTrue()); |
| 8570 |
| 8517 // Enumeration doesn't enumerate accessors from inaccessible objects in | 8571 // Enumeration doesn't enumerate accessors from inaccessible objects in |
| 8518 // the prototype chain even if the accessors are in themselves accessible. | 8572 // the prototype chain even if the accessors are in themselves accessible. |
| 8519 value = | 8573 value = |
| 8520 CompileRun("(function(){var obj = {'__proto__':other};" | 8574 CompileRun("(function(){var obj = {'__proto__':other};" |
| 8521 "for (var p in obj)" | 8575 "for (var p in obj)" |
| 8522 " if (p == 'accessible_prop' || p == 'blocked_prop') {" | 8576 " if (p == 'accessible_prop' ||" |
| 8577 " p == 'accessible_js_prop' ||" |
| 8578 " p == 'blocked_js_prop' ||" |
| 8579 " p == 'blocked_js_prop') {" |
| 8523 " return false;" | 8580 " return false;" |
| 8524 " }" | 8581 " }" |
| 8525 "return true;})()"); | 8582 "return true;})()"); |
| 8526 CHECK(value->IsTrue()); | 8583 CHECK(value->IsTrue()); |
| 8527 | 8584 |
| 8528 context1->Exit(); | 8585 context1->Exit(); |
| 8529 context0->Exit(); | 8586 context0->Exit(); |
| 8530 } | 8587 } |
| 8531 | 8588 |
| 8532 | 8589 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8584 CompileRun("Object.freeze(other)"); | 8641 CompileRun("Object.freeze(other)"); |
| 8585 ExpectTrue("Object.isExtensible(other)"); | 8642 ExpectTrue("Object.isExtensible(other)"); |
| 8586 | 8643 |
| 8587 CompileRun("Object.seal(other)"); | 8644 CompileRun("Object.seal(other)"); |
| 8588 ExpectTrue("Object.isExtensible(other)"); | 8645 ExpectTrue("Object.isExtensible(other)"); |
| 8589 | 8646 |
| 8590 // Regression test for issue 1250. | 8647 // Regression test for issue 1250. |
| 8591 // Make sure that we can set the accessible accessors value using normal | 8648 // Make sure that we can set the accessible accessors value using normal |
| 8592 // assignment. | 8649 // assignment. |
| 8593 CompileRun("other.accessible_prop = 42"); | 8650 CompileRun("other.accessible_prop = 42"); |
| 8594 CHECK_EQ(42, g_echo_value); | 8651 CHECK_EQ(42, g_echo_value_1); |
| 8595 | 8652 |
| 8596 v8::Handle<Value> value; | 8653 v8::Handle<Value> value; |
| 8597 // We follow Safari in ignoring assignments to host object accessors. | 8654 // We follow Safari in ignoring assignments to host object accessors. |
| 8598 CompileRun("Object.defineProperty(other, 'accessible_prop', {value: -1})"); | 8655 CompileRun("Object.defineProperty(other, 'accessible_prop', {value: -1})"); |
| 8599 value = CompileRun("other.accessible_prop == 42"); | 8656 value = CompileRun("other.accessible_prop == 42"); |
| 8600 CHECK(value->IsTrue()); | 8657 CHECK(value->IsTrue()); |
| 8601 } | 8658 } |
| 8602 | 8659 |
| 8603 | 8660 |
| 8604 static bool GetOwnPropertyNamesNamedBlocker(Local<v8::Object> global, | 8661 static bool GetOwnPropertyNamesNamedBlocker(Local<v8::Object> global, |
| (...skipping 11587 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20192 CheckCorrectThrow("%GetLocalPropertyNames(other, true)"); | 20249 CheckCorrectThrow("%GetLocalPropertyNames(other, true)"); |
| 20193 CheckCorrectThrow("%DefineOrRedefineAccessorProperty(" | 20250 CheckCorrectThrow("%DefineOrRedefineAccessorProperty(" |
| 20194 "other, 'x', null, null, 1)"); | 20251 "other, 'x', null, null, 1)"); |
| 20195 | 20252 |
| 20196 // Reset the failed access check callback so it does not influence | 20253 // Reset the failed access check callback so it does not influence |
| 20197 // the other tests. | 20254 // the other tests. |
| 20198 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); | 20255 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); |
| 20199 } | 20256 } |
| 20200 | 20257 |
| 20201 #endif // WIN32 | 20258 #endif // WIN32 |
| OLD | NEW |