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 13058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13069 Local<Boolean> should_throw_on_error_value = | 13069 Local<Boolean> should_throw_on_error_value = |
13070 Boolean::New(isolate, info.ShouldThrowOnError()); | 13070 Boolean::New(isolate, info.ShouldThrowOnError()); |
13071 CHECK(context->Global() | 13071 CHECK(context->Global() |
13072 ->Set(isolate->GetCurrentContext(), v8_str("should_throw_setter"), | 13072 ->Set(isolate->GetCurrentContext(), v8_str("should_throw_setter"), |
13073 should_throw_on_error_value) | 13073 should_throw_on_error_value) |
13074 .FromJust()); | 13074 .FromJust()); |
13075 } | 13075 } |
13076 | 13076 |
13077 | 13077 |
13078 THREADED_TEST(AccessorShouldThrowOnError) { | 13078 THREADED_TEST(AccessorShouldThrowOnError) { |
13079 i::FLAG_strong_mode = true; | |
13080 LocalContext context; | 13079 LocalContext context; |
13081 v8::Isolate* isolate = context->GetIsolate(); | 13080 v8::Isolate* isolate = context->GetIsolate(); |
13082 v8::HandleScope scope(isolate); | 13081 v8::HandleScope scope(isolate); |
13083 Local<Object> global = context->Global(); | 13082 Local<Object> global = context->Global(); |
13084 | 13083 |
13085 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 13084 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
13086 Local<ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 13085 Local<ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
13087 instance_templ->SetAccessor(v8_str("f"), ShouldThrowOnErrorGetter, | 13086 instance_templ->SetAccessor(v8_str("f"), ShouldThrowOnErrorGetter, |
13088 ShouldThrowOnErrorSetter<void>); | 13087 ShouldThrowOnErrorSetter<void>); |
13089 | 13088 |
(...skipping 12 matching lines...) Expand all Loading... |
13102 .ToLocalChecked(); | 13101 .ToLocalChecked(); |
13103 CHECK(value->IsFalse()); | 13102 CHECK(value->IsFalse()); |
13104 | 13103 |
13105 // STRICT mode | 13104 // STRICT mode |
13106 value = v8_compile("'use strict';o.f")->Run(context.local()).ToLocalChecked(); | 13105 value = v8_compile("'use strict';o.f")->Run(context.local()).ToLocalChecked(); |
13107 CHECK(value->IsFalse()); | 13106 CHECK(value->IsFalse()); |
13108 v8_compile("'use strict'; o.f = 153")->Run(context.local()).ToLocalChecked(); | 13107 v8_compile("'use strict'; o.f = 153")->Run(context.local()).ToLocalChecked(); |
13109 value = global->Get(context.local(), v8_str("should_throw_setter")) | 13108 value = global->Get(context.local(), v8_str("should_throw_setter")) |
13110 .ToLocalChecked(); | 13109 .ToLocalChecked(); |
13111 CHECK(value->IsTrue()); | 13110 CHECK(value->IsTrue()); |
13112 | |
13113 // STRONG mode | |
13114 value = v8_compile("'use strong';o.f")->Run(context.local()).ToLocalChecked(); | |
13115 CHECK(value->IsFalse()); | |
13116 v8_compile("'use strong'; o.f = 153")->Run(context.local()).ToLocalChecked(); | |
13117 value = global->Get(context.local(), v8_str("should_throw_setter")) | |
13118 .ToLocalChecked(); | |
13119 CHECK(value->IsTrue()); | |
13120 } | 13111 } |
13121 | 13112 |
13122 | 13113 |
13123 static void ShouldThrowOnErrorQuery( | 13114 static void ShouldThrowOnErrorQuery( |
13124 Local<Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) { | 13115 Local<Name> name, const v8::PropertyCallbackInfo<v8::Integer>& info) { |
13125 ApiTestFuzzer::Fuzz(); | 13116 ApiTestFuzzer::Fuzz(); |
13126 v8::Isolate* isolate = info.GetIsolate(); | 13117 v8::Isolate* isolate = info.GetIsolate(); |
13127 info.GetReturnValue().Set(v8::None); | 13118 info.GetReturnValue().Set(v8::None); |
13128 | 13119 |
13129 auto context = isolate->GetCurrentContext(); | 13120 auto context = isolate->GetCurrentContext(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13165 Boolean::New(isolate, info.ShouldThrowOnError()); | 13156 Boolean::New(isolate, info.ShouldThrowOnError()); |
13166 CHECK(context->Global() | 13157 CHECK(context->Global() |
13167 ->Set(isolate->GetCurrentContext(), | 13158 ->Set(isolate->GetCurrentContext(), |
13168 v8_str("should_throw_enumerator"), | 13159 v8_str("should_throw_enumerator"), |
13169 should_throw_on_error_value) | 13160 should_throw_on_error_value) |
13170 .FromJust()); | 13161 .FromJust()); |
13171 } | 13162 } |
13172 | 13163 |
13173 | 13164 |
13174 THREADED_TEST(InterceptorShouldThrowOnError) { | 13165 THREADED_TEST(InterceptorShouldThrowOnError) { |
13175 i::FLAG_strong_mode = true; | |
13176 LocalContext context; | 13166 LocalContext context; |
13177 v8::Isolate* isolate = context->GetIsolate(); | 13167 v8::Isolate* isolate = context->GetIsolate(); |
13178 v8::HandleScope scope(isolate); | 13168 v8::HandleScope scope(isolate); |
13179 Local<Object> global = context->Global(); | 13169 Local<Object> global = context->Global(); |
13180 | 13170 |
13181 auto interceptor_templ = v8::ObjectTemplate::New(isolate); | 13171 auto interceptor_templ = v8::ObjectTemplate::New(isolate); |
13182 v8::NamedPropertyHandlerConfiguration handler( | 13172 v8::NamedPropertyHandlerConfiguration handler( |
13183 ShouldThrowOnErrorGetter, ShouldThrowOnErrorSetter<Value>, | 13173 ShouldThrowOnErrorGetter, ShouldThrowOnErrorSetter<Value>, |
13184 ShouldThrowOnErrorQuery, ShouldThrowOnErrorDeleter, | 13174 ShouldThrowOnErrorQuery, ShouldThrowOnErrorDeleter, |
13185 ShouldThrowOnErrorPropertyEnumerator); | 13175 ShouldThrowOnErrorPropertyEnumerator); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13222 value = global->Get(context.local(), v8_str("should_throw_deleter")) | 13212 value = global->Get(context.local(), v8_str("should_throw_deleter")) |
13223 .ToLocalChecked(); | 13213 .ToLocalChecked(); |
13224 CHECK(value->IsTrue()); | 13214 CHECK(value->IsTrue()); |
13225 | 13215 |
13226 v8_compile("'use strict'; Object.getOwnPropertyNames(o)") | 13216 v8_compile("'use strict'; Object.getOwnPropertyNames(o)") |
13227 ->Run(context.local()) | 13217 ->Run(context.local()) |
13228 .ToLocalChecked(); | 13218 .ToLocalChecked(); |
13229 value = global->Get(context.local(), v8_str("should_throw_enumerator")) | 13219 value = global->Get(context.local(), v8_str("should_throw_enumerator")) |
13230 .ToLocalChecked(); | 13220 .ToLocalChecked(); |
13231 CHECK(value->IsFalse()); | 13221 CHECK(value->IsFalse()); |
13232 | |
13233 // STRONG mode | |
13234 value = v8_compile("'use strong';o.f")->Run(context.local()).ToLocalChecked(); | |
13235 CHECK(value->IsFalse()); | |
13236 v8_compile("'use strong'; o.f = 153")->Run(context.local()).ToLocalChecked(); | |
13237 value = global->Get(context.local(), v8_str("should_throw_setter")) | |
13238 .ToLocalChecked(); | |
13239 CHECK(value->IsTrue()); | |
13240 | |
13241 v8_compile("'use strong'; Object.getOwnPropertyNames(o)") | |
13242 ->Run(context.local()) | |
13243 .ToLocalChecked(); | |
13244 value = global->Get(context.local(), v8_str("should_throw_enumerator")) | |
13245 .ToLocalChecked(); | |
13246 CHECK(value->IsFalse()); | |
13247 } | 13222 } |
13248 | 13223 |
13249 | 13224 |
13250 static void IsConstructHandler( | 13225 static void IsConstructHandler( |
13251 const v8::FunctionCallbackInfo<v8::Value>& args) { | 13226 const v8::FunctionCallbackInfo<v8::Value>& args) { |
13252 ApiTestFuzzer::Fuzz(); | 13227 ApiTestFuzzer::Fuzz(); |
13253 args.GetReturnValue().Set(args.IsConstructCall()); | 13228 args.GetReturnValue().Set(args.IsConstructCall()); |
13254 } | 13229 } |
13255 | 13230 |
13256 | 13231 |
(...skipping 11096 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
24353 v8::HandleScope handle_scope(isolate); | 24328 v8::HandleScope handle_scope(isolate); |
24354 | 24329 |
24355 // Should work | 24330 // Should work |
24356 v8::Local<v8::Object> obj = v8::Object::New(isolate); | 24331 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
24357 | 24332 |
24358 USE(obj); | 24333 USE(obj); |
24359 } | 24334 } |
24360 } | 24335 } |
24361 | 24336 |
24362 | 24337 |
24363 static bool access_was_called = false; | |
24364 | |
24365 static bool AccessAlwaysAllowedWithFlag(Local<v8::Context> accessing_context, | |
24366 Local<v8::Object> accessed_object, | |
24367 Local<v8::Value> data) { | |
24368 access_was_called = true; | |
24369 return true; | |
24370 } | |
24371 | |
24372 static bool AccessAlwaysBlockedWithFlag(Local<v8::Context> accessing_context, | |
24373 Local<v8::Object> accessed_object, | |
24374 Local<v8::Value> data) { | |
24375 access_was_called = true; | |
24376 return false; | |
24377 } | |
24378 | |
24379 | |
24380 TEST(StrongModeAccessCheckAllowed) { | |
24381 i::FLAG_strong_mode = true; | |
24382 v8::Isolate* isolate = CcTest::isolate(); | |
24383 v8::HandleScope handle_scope(isolate); | |
24384 v8::Local<Value> value; | |
24385 access_was_called = false; | |
24386 | |
24387 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); | |
24388 | |
24389 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); | |
24390 obj_template->SetAccessCheckCallback(AccessAlwaysAllowedWithFlag); | |
24391 | |
24392 // Create an environment | |
24393 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); | |
24394 context0->Enter(); | |
24395 v8::Local<v8::Object> global0 = context0->Global(); | |
24396 global0->Set(context0, v8_str("object"), | |
24397 obj_template->NewInstance(context0).ToLocalChecked()) | |
24398 .FromJust(); | |
24399 { | |
24400 v8::TryCatch try_catch(isolate); | |
24401 value = CompileRun("'use strong'; object.x"); | |
24402 CHECK(!try_catch.HasCaught()); | |
24403 CHECK(!access_was_called); | |
24404 CHECK_EQ(42, value->Int32Value(context0).FromJust()); | |
24405 } | |
24406 { | |
24407 v8::TryCatch try_catch(isolate); | |
24408 value = CompileRun("'use strong'; object.foo"); | |
24409 CHECK(try_catch.HasCaught()); | |
24410 CHECK(!access_was_called); | |
24411 } | |
24412 { | |
24413 v8::TryCatch try_catch(isolate); | |
24414 value = CompileRun("'use strong'; object[10]"); | |
24415 CHECK(try_catch.HasCaught()); | |
24416 CHECK(!access_was_called); | |
24417 } | |
24418 | |
24419 // Create an environment | |
24420 v8::Local<Context> context1 = Context::New(isolate); | |
24421 context1->Enter(); | |
24422 v8::Local<v8::Object> global1 = context1->Global(); | |
24423 global1->Set(context1, v8_str("object"), | |
24424 obj_template->NewInstance(context1).ToLocalChecked()) | |
24425 .FromJust(); | |
24426 { | |
24427 v8::TryCatch try_catch(isolate); | |
24428 value = CompileRun("'use strong'; object.x"); | |
24429 CHECK(!try_catch.HasCaught()); | |
24430 CHECK(access_was_called); | |
24431 CHECK_EQ(42, value->Int32Value(context1).FromJust()); | |
24432 } | |
24433 access_was_called = false; | |
24434 { | |
24435 v8::TryCatch try_catch(isolate); | |
24436 value = CompileRun("'use strong'; object.foo"); | |
24437 CHECK(try_catch.HasCaught()); | |
24438 CHECK(access_was_called); | |
24439 } | |
24440 access_was_called = false; | |
24441 { | |
24442 v8::TryCatch try_catch(isolate); | |
24443 value = CompileRun("'use strong'; object[10]"); | |
24444 CHECK(try_catch.HasCaught()); | |
24445 CHECK(access_was_called); | |
24446 } | |
24447 | |
24448 context1->Exit(); | |
24449 context0->Exit(); | |
24450 } | |
24451 | |
24452 | |
24453 TEST(StrongModeAccessCheckBlocked) { | |
24454 i::FLAG_strong_mode = true; | |
24455 v8::Isolate* isolate = CcTest::isolate(); | |
24456 v8::HandleScope handle_scope(isolate); | |
24457 v8::Local<Value> value; | |
24458 access_was_called = false; | |
24459 | |
24460 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); | |
24461 | |
24462 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); | |
24463 obj_template->SetAccessCheckCallback(AccessAlwaysBlockedWithFlag); | |
24464 | |
24465 // Create an environment | |
24466 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); | |
24467 context0->Enter(); | |
24468 v8::Local<v8::Object> global0 = context0->Global(); | |
24469 global0->Set(context0, v8_str("object"), | |
24470 obj_template->NewInstance(context0).ToLocalChecked()) | |
24471 .FromJust(); | |
24472 { | |
24473 v8::TryCatch try_catch(isolate); | |
24474 value = CompileRun("'use strong'; object.x"); | |
24475 CHECK(!try_catch.HasCaught()); | |
24476 CHECK(!access_was_called); | |
24477 CHECK_EQ(42, value->Int32Value(context0).FromJust()); | |
24478 } | |
24479 { | |
24480 v8::TryCatch try_catch(isolate); | |
24481 value = CompileRun("'use strong'; object.foo"); | |
24482 CHECK(try_catch.HasCaught()); | |
24483 CHECK(!access_was_called); | |
24484 } | |
24485 { | |
24486 v8::TryCatch try_catch(isolate); | |
24487 value = CompileRun("'use strong'; object[10]"); | |
24488 CHECK(try_catch.HasCaught()); | |
24489 CHECK(!access_was_called); | |
24490 } | |
24491 | |
24492 // Create an environment | |
24493 v8::Local<Context> context1 = Context::New(isolate); | |
24494 context1->Enter(); | |
24495 v8::Local<v8::Object> global1 = context1->Global(); | |
24496 global1->Set(context1, v8_str("object"), | |
24497 obj_template->NewInstance(context1).ToLocalChecked()) | |
24498 .FromJust(); | |
24499 { | |
24500 v8::TryCatch try_catch(isolate); | |
24501 value = CompileRun("'use strong'; object.x"); | |
24502 CHECK(try_catch.HasCaught()); | |
24503 CHECK(access_was_called); | |
24504 } | |
24505 access_was_called = false; | |
24506 { | |
24507 v8::TryCatch try_catch(isolate); | |
24508 value = CompileRun("'use strong'; object.foo"); | |
24509 CHECK(try_catch.HasCaught()); | |
24510 CHECK(access_was_called); | |
24511 } | |
24512 access_was_called = false; | |
24513 { | |
24514 v8::TryCatch try_catch(isolate); | |
24515 value = CompileRun("'use strong'; object[10]"); | |
24516 CHECK(try_catch.HasCaught()); | |
24517 CHECK(access_was_called); | |
24518 } | |
24519 | |
24520 context1->Exit(); | |
24521 context0->Exit(); | |
24522 } | |
24523 | |
24524 | |
24525 TEST(StrongModeArityCallFromApi) { | |
24526 i::FLAG_strong_mode = true; | |
24527 LocalContext env; | |
24528 v8::Isolate* isolate = env->GetIsolate(); | |
24529 v8::HandleScope scope(isolate); | |
24530 Local<Function> fun; | |
24531 { | |
24532 v8::TryCatch try_catch(isolate); | |
24533 fun = Local<Function>::Cast(CompileRun( | |
24534 "function f(x) { 'use strong'; }" | |
24535 "f")); | |
24536 | |
24537 CHECK(!try_catch.HasCaught()); | |
24538 } | |
24539 | |
24540 { | |
24541 v8::TryCatch try_catch(isolate); | |
24542 CHECK(fun->Call(env.local(), v8::Undefined(isolate), 0, nullptr).IsEmpty()); | |
24543 CHECK(try_catch.HasCaught()); | |
24544 } | |
24545 | |
24546 { | |
24547 v8::TryCatch try_catch(isolate); | |
24548 v8::Local<Value> args[] = {v8_num(42)}; | |
24549 fun->Call(env.local(), v8::Undefined(isolate), arraysize(args), args) | |
24550 .ToLocalChecked(); | |
24551 CHECK(!try_catch.HasCaught()); | |
24552 } | |
24553 | |
24554 { | |
24555 v8::TryCatch try_catch(isolate); | |
24556 v8::Local<Value> args[] = {v8_num(42), v8_num(555)}; | |
24557 fun->Call(env.local(), v8::Undefined(isolate), arraysize(args), args) | |
24558 .ToLocalChecked(); | |
24559 CHECK(!try_catch.HasCaught()); | |
24560 } | |
24561 } | |
24562 | |
24563 | |
24564 TEST(StrongModeArityCallFromApi2) { | |
24565 i::FLAG_strong_mode = true; | |
24566 LocalContext env; | |
24567 v8::Isolate* isolate = env->GetIsolate(); | |
24568 v8::HandleScope scope(isolate); | |
24569 Local<Function> fun; | |
24570 { | |
24571 v8::TryCatch try_catch(isolate); | |
24572 fun = Local<Function>::Cast(CompileRun( | |
24573 "'use strong';" | |
24574 "function f(x) {}" | |
24575 "f")); | |
24576 | |
24577 CHECK(!try_catch.HasCaught()); | |
24578 } | |
24579 | |
24580 { | |
24581 v8::TryCatch try_catch(isolate); | |
24582 CHECK(fun->Call(env.local(), v8::Undefined(isolate), 0, nullptr).IsEmpty()); | |
24583 CHECK(try_catch.HasCaught()); | |
24584 } | |
24585 | |
24586 { | |
24587 v8::TryCatch try_catch(isolate); | |
24588 v8::Local<Value> args[] = {v8_num(42)}; | |
24589 fun->Call(env.local(), v8::Undefined(isolate), arraysize(args), args) | |
24590 .ToLocalChecked(); | |
24591 CHECK(!try_catch.HasCaught()); | |
24592 } | |
24593 | |
24594 { | |
24595 v8::TryCatch try_catch(isolate); | |
24596 v8::Local<Value> args[] = {v8_num(42), v8_num(555)}; | |
24597 fun->Call(env.local(), v8::Undefined(isolate), arraysize(args), args) | |
24598 .ToLocalChecked(); | |
24599 CHECK(!try_catch.HasCaught()); | |
24600 } | |
24601 } | |
24602 | |
24603 | |
24604 static void ExtrasBindingTestRuntimeFunction( | 24338 static void ExtrasBindingTestRuntimeFunction( |
24605 const v8::FunctionCallbackInfo<v8::Value>& args) { | 24339 const v8::FunctionCallbackInfo<v8::Value>& args) { |
24606 CHECK_EQ( | 24340 CHECK_EQ( |
24607 3, | 24341 3, |
24608 args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust()); | 24342 args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust()); |
24609 args.GetReturnValue().Set(v8_num(7)); | 24343 args.GetReturnValue().Set(v8_num(7)); |
24610 } | 24344 } |
24611 | 24345 |
24612 TEST(ExtrasFunctionSource) { | 24346 TEST(ExtrasFunctionSource) { |
24613 v8::Isolate* isolate = CcTest::isolate(); | 24347 v8::Isolate* isolate = CcTest::isolate(); |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
25119 CHECK(proxy->GetTarget()->SameValue(target)); | 24853 CHECK(proxy->GetTarget()->SameValue(target)); |
25120 CHECK(proxy->GetHandler()->SameValue(handler)); | 24854 CHECK(proxy->GetHandler()->SameValue(handler)); |
25121 | 24855 |
25122 proxy->Revoke(); | 24856 proxy->Revoke(); |
25123 CHECK(proxy->IsProxy()); | 24857 CHECK(proxy->IsProxy()); |
25124 CHECK(!target->IsProxy()); | 24858 CHECK(!target->IsProxy()); |
25125 CHECK(proxy->IsRevoked()); | 24859 CHECK(proxy->IsRevoked()); |
25126 CHECK(proxy->GetTarget()->SameValue(target)); | 24860 CHECK(proxy->GetTarget()->SameValue(target)); |
25127 CHECK(proxy->GetHandler()->IsNull()); | 24861 CHECK(proxy->GetHandler()->IsNull()); |
25128 } | 24862 } |
OLD | NEW |