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 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 CHECK_EQ(44, v8::Script::Compile(ctx, code) | 569 CHECK_EQ(44, v8::Script::Compile(ctx, code) |
570 .ToLocalChecked() | 570 .ToLocalChecked() |
571 ->Run(ctx) | 571 ->Run(ctx) |
572 .ToLocalChecked() | 572 .ToLocalChecked() |
573 ->Int32Value(ctx) | 573 ->Int32Value(ctx) |
574 .FromJust()); | 574 .FromJust()); |
575 CHECK_EQ(3, set_was_called_counter); | 575 CHECK_EQ(3, set_was_called_counter); |
576 } | 576 } |
577 | 577 |
578 namespace { | 578 namespace { |
| 579 int descriptor_was_called; |
| 580 |
| 581 void PropertyDescriptorCallback( |
| 582 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 583 // Intercept the callback by setting a different descriptor. |
| 584 descriptor_was_called++; |
| 585 const char* code = |
| 586 "var desc = {value: 5};" |
| 587 "desc;"; |
| 588 Local<Value> descriptor = v8_compile(code) |
| 589 ->Run(info.GetIsolate()->GetCurrentContext()) |
| 590 .ToLocalChecked(); |
| 591 info.GetReturnValue().Set(descriptor); |
| 592 } |
| 593 } // namespace |
| 594 |
| 595 // Check that the descriptor callback is called on the global object. |
| 596 THREADED_TEST(DescriptorCallbackOnGlobalObject) { |
| 597 v8::HandleScope scope(CcTest::isolate()); |
| 598 LocalContext env; |
| 599 v8::Local<v8::FunctionTemplate> templ = |
| 600 v8::FunctionTemplate::New(CcTest::isolate()); |
| 601 |
| 602 v8::Local<ObjectTemplate> object_template = templ->InstanceTemplate(); |
| 603 object_template->SetHandler(v8::NamedPropertyHandlerConfiguration( |
| 604 nullptr, nullptr, PropertyDescriptorCallback, nullptr, nullptr, nullptr)); |
| 605 v8::Local<v8::Context> ctx = |
| 606 v8::Context::New(CcTest::isolate(), nullptr, object_template); |
| 607 |
| 608 descriptor_was_called = 0; |
| 609 |
| 610 // Declare function. |
| 611 v8::Local<v8::String> code = v8_str( |
| 612 "var x = 42; var desc = Object.getOwnPropertyDescriptor(this, 'x'); " |
| 613 "desc.value;"); |
| 614 CHECK_EQ(5, v8::Script::Compile(ctx, code) |
| 615 .ToLocalChecked() |
| 616 ->Run(ctx) |
| 617 .ToLocalChecked() |
| 618 ->Int32Value(ctx) |
| 619 .FromJust()); |
| 620 CHECK_EQ(1, descriptor_was_called); |
| 621 } |
| 622 |
| 623 namespace { |
579 void QueryCallbackSetDontDelete( | 624 void QueryCallbackSetDontDelete( |
580 Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) { | 625 Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) { |
581 info.GetReturnValue().Set(v8::PropertyAttribute::DontDelete); | 626 info.GetReturnValue().Set(v8::PropertyAttribute::DontDelete); |
582 } | 627 } |
583 | 628 |
584 } // namespace | 629 } // namespace |
585 | 630 |
586 // Regression for a Node.js test that fails in debug mode. | 631 // Regression for a Node.js test that fails in debug mode. |
587 THREADED_TEST(InterceptorFunctionRedeclareWithQueryCallback) { | 632 THREADED_TEST(InterceptorFunctionRedeclareWithQueryCallback) { |
588 v8::HandleScope scope(CcTest::isolate()); | 633 v8::HandleScope scope(CcTest::isolate()); |
(...skipping 4040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4629 .FromJust(); | 4674 .FromJust(); |
4630 CompileRun( | 4675 CompileRun( |
4631 "checked.__proto__ = intercepted_1;" | 4676 "checked.__proto__ = intercepted_1;" |
4632 "intercepted_1.__proto__ = intercepted_0;"); | 4677 "intercepted_1.__proto__ = intercepted_0;"); |
4633 | 4678 |
4634 CHECK_EQ(3, access_check_data.count); | 4679 CHECK_EQ(3, access_check_data.count); |
4635 | 4680 |
4636 ExpectInt32("checked.whatever", 17); | 4681 ExpectInt32("checked.whatever", 17); |
4637 CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')") | 4682 CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')") |
4638 ->IsUndefined()); | 4683 ->IsUndefined()); |
4639 CHECK_EQ(5, access_check_data.count); | 4684 CHECK_EQ(6, access_check_data.count); |
4640 | 4685 |
4641 access_check_data.result = false; | 4686 access_check_data.result = false; |
4642 ExpectInt32("checked.whatever", intercept_data_0.value); | 4687 ExpectInt32("checked.whatever", intercept_data_0.value); |
4643 { | 4688 { |
4644 v8::TryCatch try_catch(isolate); | 4689 v8::TryCatch try_catch(isolate); |
4645 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); | 4690 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); |
4646 CHECK(try_catch.HasCaught()); | 4691 CHECK(try_catch.HasCaught()); |
4647 } | 4692 } |
4648 CHECK_EQ(7, access_check_data.count); | 4693 CHECK_EQ(9, access_check_data.count); |
4649 | 4694 |
4650 intercept_data_1.should_intercept = true; | 4695 intercept_data_1.should_intercept = true; |
4651 ExpectInt32("checked.whatever", intercept_data_1.value); | 4696 ExpectInt32("checked.whatever", intercept_data_1.value); |
4652 { | 4697 { |
4653 v8::TryCatch try_catch(isolate); | 4698 v8::TryCatch try_catch(isolate); |
4654 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); | 4699 CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); |
4655 CHECK(try_catch.HasCaught()); | 4700 CHECK(try_catch.HasCaught()); |
4656 } | 4701 } |
4657 CHECK_EQ(9, access_check_data.count); | 4702 CHECK_EQ(12, access_check_data.count); |
4658 g_access_check_data = nullptr; | 4703 g_access_check_data = nullptr; |
4659 } | 4704 } |
4660 | 4705 |
4661 | 4706 |
4662 TEST(IndexedAllCanReadInterceptor) { | 4707 TEST(IndexedAllCanReadInterceptor) { |
4663 auto isolate = CcTest::isolate(); | 4708 auto isolate = CcTest::isolate(); |
4664 v8::HandleScope handle_scope(isolate); | 4709 v8::HandleScope handle_scope(isolate); |
4665 LocalContext context; | 4710 LocalContext context; |
4666 | 4711 |
4667 AccessCheckData access_check_data; | 4712 AccessCheckData access_check_data; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4716 CompileRun( | 4761 CompileRun( |
4717 "checked.__proto__ = intercepted_1;" | 4762 "checked.__proto__ = intercepted_1;" |
4718 "intercepted_1.__proto__ = intercepted_0;"); | 4763 "intercepted_1.__proto__ = intercepted_0;"); |
4719 | 4764 |
4720 CHECK_EQ(3, access_check_data.count); | 4765 CHECK_EQ(3, access_check_data.count); |
4721 | 4766 |
4722 access_check_data.result = true; | 4767 access_check_data.result = true; |
4723 ExpectInt32("checked[15]", 17); | 4768 ExpectInt32("checked[15]", 17); |
4724 CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, '15')") | 4769 CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, '15')") |
4725 ->IsUndefined()); | 4770 ->IsUndefined()); |
4726 CHECK_EQ(5, access_check_data.count); | 4771 CHECK_EQ(6, access_check_data.count); |
4727 | 4772 |
4728 access_check_data.result = false; | 4773 access_check_data.result = false; |
4729 ExpectInt32("checked[15]", intercept_data_0.value); | 4774 ExpectInt32("checked[15]", intercept_data_0.value); |
4730 { | 4775 { |
4731 v8::TryCatch try_catch(isolate); | 4776 v8::TryCatch try_catch(isolate); |
4732 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); | 4777 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); |
4733 CHECK(try_catch.HasCaught()); | 4778 CHECK(try_catch.HasCaught()); |
4734 } | 4779 } |
4735 CHECK_EQ(7, access_check_data.count); | 4780 CHECK_EQ(9, access_check_data.count); |
4736 | 4781 |
4737 intercept_data_1.should_intercept = true; | 4782 intercept_data_1.should_intercept = true; |
4738 ExpectInt32("checked[15]", intercept_data_1.value); | 4783 ExpectInt32("checked[15]", intercept_data_1.value); |
4739 { | 4784 { |
4740 v8::TryCatch try_catch(isolate); | 4785 v8::TryCatch try_catch(isolate); |
4741 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); | 4786 CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); |
4742 CHECK(try_catch.HasCaught()); | 4787 CHECK(try_catch.HasCaught()); |
4743 } | 4788 } |
4744 CHECK_EQ(9, access_check_data.count); | 4789 CHECK_EQ(12, access_check_data.count); |
4745 | 4790 |
4746 g_access_check_data = nullptr; | 4791 g_access_check_data = nullptr; |
4747 } | 4792 } |
4748 | 4793 |
4749 | 4794 |
4750 THREADED_TEST(NonMaskingInterceptorOwnProperty) { | 4795 THREADED_TEST(NonMaskingInterceptorOwnProperty) { |
4751 auto isolate = CcTest::isolate(); | 4796 auto isolate = CcTest::isolate(); |
4752 v8::HandleScope handle_scope(isolate); | 4797 v8::HandleScope handle_scope(isolate); |
4753 LocalContext context; | 4798 LocalContext context; |
4754 | 4799 |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4970 ->Set(env.local(), v8_str("Fun"), | 5015 ->Set(env.local(), v8_str("Fun"), |
4971 fun_templ->GetFunction(env.local()).ToLocalChecked()) | 5016 fun_templ->GetFunction(env.local()).ToLocalChecked()) |
4972 .FromJust()); | 5017 .FromJust()); |
4973 | 5018 |
4974 CompileRun( | 5019 CompileRun( |
4975 "var f = new Fun();" | 5020 "var f = new Fun();" |
4976 "Number.prototype.__proto__ = f;" | 5021 "Number.prototype.__proto__ = f;" |
4977 "var a = 42;" | 5022 "var a = 42;" |
4978 "for (var i = 0; i<3; i++) { a.foo; }"); | 5023 "for (var i = 0; i<3; i++) { a.foo; }"); |
4979 } | 5024 } |
OLD | NEW |