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 8260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8271 "function get_x_w() { return (function() {return this.x;})(); }"); | 8271 "function get_x_w() { return (function() {return this.x;})(); }"); |
8272 env1->Global()->Set(v8_str("bound_x"), CompileRun("bound_x")); | 8272 env1->Global()->Set(v8_str("bound_x"), CompileRun("bound_x")); |
8273 env1->Global()->Set(v8_str("get_x"), CompileRun("get_x")); | 8273 env1->Global()->Set(v8_str("get_x"), CompileRun("get_x")); |
8274 env1->Global()->Set(v8_str("get_x_w"), CompileRun("get_x_w")); | 8274 env1->Global()->Set(v8_str("get_x_w"), CompileRun("get_x_w")); |
8275 env1->Global()->Set( | 8275 env1->Global()->Set( |
8276 v8_str("this_x"), | 8276 v8_str("this_x"), |
8277 CompileRun("Object.getOwnPropertyDescriptor(this, 'this_x').get")); | 8277 CompileRun("Object.getOwnPropertyDescriptor(this, 'this_x').get")); |
8278 } | 8278 } |
8279 | 8279 |
8280 Local<Object> env2_global = env2->Global(); | 8280 Local<Object> env2_global = env2->Global(); |
8281 env2_global->TurnOnAccessCheck(); | |
8282 env2->DetachGlobal(); | 8281 env2->DetachGlobal(); |
8283 | 8282 |
8284 Local<Value> result; | 8283 Local<Value> result; |
8285 result = CompileRun("bound_x()"); | 8284 result = CompileRun("bound_x()"); |
8286 CHECK(v8_str("env2_x")->Equals(result)); | 8285 CHECK(v8_str("env2_x")->Equals(result)); |
8287 result = CompileRun("get_x()"); | 8286 result = CompileRun("get_x()"); |
8288 CHECK(result.IsEmpty()); | 8287 CHECK(result.IsEmpty()); |
8289 result = CompileRun("get_x_w()"); | 8288 result = CompileRun("get_x_w()"); |
8290 CHECK(result.IsEmpty()); | 8289 CHECK(result.IsEmpty()); |
8291 result = CompileRun("this_x()"); | 8290 result = CompileRun("this_x()"); |
(...skipping 4461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12753 CHECK(value_1.IsEmpty()); | 12752 CHECK(value_1.IsEmpty()); |
12754 | 12753 |
12755 Local<v8::Object> instance_2 = templ->NewInstance(); | 12754 Local<v8::Object> instance_2 = templ->NewInstance(); |
12756 context->Global()->Set(v8_str("obj_2"), instance_2); | 12755 context->Global()->Set(v8_str("obj_2"), instance_2); |
12757 | 12756 |
12758 Local<Value> value_2 = CompileRun("obj_2.a"); | 12757 Local<Value> value_2 = CompileRun("obj_2.a"); |
12759 CHECK(value_2.IsEmpty()); | 12758 CHECK(value_2.IsEmpty()); |
12760 } | 12759 } |
12761 | 12760 |
12762 | 12761 |
12763 THREADED_TEST(TurnOnAccessCheck) { | |
12764 v8::Isolate* isolate = CcTest::isolate(); | |
12765 v8::HandleScope handle_scope(isolate); | |
12766 | |
12767 // Create an environment with access check to the global object disabled by | |
12768 // default. | |
12769 v8::Handle<v8::ObjectTemplate> global_template = | |
12770 v8::ObjectTemplate::New(isolate); | |
12771 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL, | |
12772 v8::Handle<v8::Value>(), false); | |
12773 v8::Local<Context> context = Context::New(isolate, NULL, global_template); | |
12774 Context::Scope context_scope(context); | |
12775 | |
12776 // Set up a property and a number of functions. | |
12777 context->Global()->Set(v8_str("a"), v8_num(1)); | |
12778 CompileRun("function f1() {return a;}" | |
12779 "function f2() {return a;}" | |
12780 "function g1() {return h();}" | |
12781 "function g2() {return h();}" | |
12782 "function h() {return 1;}"); | |
12783 Local<Function> f1 = | |
12784 Local<Function>::Cast(context->Global()->Get(v8_str("f1"))); | |
12785 Local<Function> f2 = | |
12786 Local<Function>::Cast(context->Global()->Get(v8_str("f2"))); | |
12787 Local<Function> g1 = | |
12788 Local<Function>::Cast(context->Global()->Get(v8_str("g1"))); | |
12789 Local<Function> g2 = | |
12790 Local<Function>::Cast(context->Global()->Get(v8_str("g2"))); | |
12791 Local<Function> h = | |
12792 Local<Function>::Cast(context->Global()->Get(v8_str("h"))); | |
12793 | |
12794 // Get the global object. | |
12795 v8::Handle<v8::Object> global = context->Global(); | |
12796 | |
12797 // Call f1 one time and f2 a number of times. This will ensure that f1 still | |
12798 // uses the runtime system to retreive property a whereas f2 uses global load | |
12799 // inline cache. | |
12800 CHECK(f1->Call(global, 0, NULL)->Equals(v8_num(1))); | |
12801 for (int i = 0; i < 4; i++) { | |
12802 CHECK(f2->Call(global, 0, NULL)->Equals(v8_num(1))); | |
12803 } | |
12804 | |
12805 // Same for g1 and g2. | |
12806 CHECK(g1->Call(global, 0, NULL)->Equals(v8_num(1))); | |
12807 for (int i = 0; i < 4; i++) { | |
12808 CHECK(g2->Call(global, 0, NULL)->Equals(v8_num(1))); | |
12809 } | |
12810 | |
12811 // Detach the global and turn on access check. | |
12812 Local<Object> hidden_global = Local<Object>::Cast( | |
12813 context->Global()->GetPrototype()); | |
12814 context->DetachGlobal(); | |
12815 hidden_global->TurnOnAccessCheck(); | |
12816 | |
12817 // Failing access check results in exception. | |
12818 CHECK(f1->Call(global, 0, NULL).IsEmpty()); | |
12819 CHECK(f2->Call(global, 0, NULL).IsEmpty()); | |
12820 CHECK(g1->Call(global, 0, NULL).IsEmpty()); | |
12821 CHECK(g2->Call(global, 0, NULL).IsEmpty()); | |
12822 | |
12823 // No failing access check when just returning a constant. | |
12824 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1))); | |
12825 } | |
12826 | |
12827 | |
12828 // Tests that ScriptData can be serialized and deserialized. | 12762 // Tests that ScriptData can be serialized and deserialized. |
12829 TEST(PreCompileSerialization) { | 12763 TEST(PreCompileSerialization) { |
12830 v8::V8::Initialize(); | 12764 v8::V8::Initialize(); |
12831 LocalContext env; | 12765 LocalContext env; |
12832 v8::Isolate* isolate = env->GetIsolate(); | 12766 v8::Isolate* isolate = env->GetIsolate(); |
12833 HandleScope handle_scope(isolate); | 12767 HandleScope handle_scope(isolate); |
12834 | 12768 |
12835 i::FLAG_min_preparse_length = 0; | 12769 i::FLAG_min_preparse_length = 0; |
12836 const char* script = "function foo(a) { return a+1; }"; | 12770 const char* script = "function foo(a) { return a+1; }"; |
12837 v8::ScriptCompiler::Source source(v8_str(script)); | 12771 v8::ScriptCompiler::Source source(v8_str(script)); |
(...skipping 3955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16793 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); | 16727 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); |
16794 | 16728 |
16795 v8::Isolate* isolate = CcTest::isolate(); | 16729 v8::Isolate* isolate = CcTest::isolate(); |
16796 v8::HandleScope scope(isolate); | 16730 v8::HandleScope scope(isolate); |
16797 | 16731 |
16798 // Create an ObjectTemplate for global objects and install access | 16732 // Create an ObjectTemplate for global objects and install access |
16799 // check callbacks that will block access. | 16733 // check callbacks that will block access. |
16800 v8::Handle<v8::ObjectTemplate> global_template = | 16734 v8::Handle<v8::ObjectTemplate> global_template = |
16801 v8::ObjectTemplate::New(isolate); | 16735 v8::ObjectTemplate::New(isolate); |
16802 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL, | 16736 global_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL, |
16803 v8::Handle<v8::Value>(), false); | 16737 v8::Handle<v8::Value>()); |
16804 | 16738 |
16805 // Create a context and set an x property on it's global object. | 16739 // Create a context and set an x property on it's global object. |
16806 LocalContext context0(NULL, global_template); | 16740 LocalContext context0(NULL, global_template); |
16807 context0->Global()->Set(v8_str("x"), v8_num(42)); | 16741 context0->Global()->Set(v8_str("x"), v8_num(42)); |
16808 v8::Handle<v8::Object> global0 = context0->Global(); | 16742 v8::Handle<v8::Object> global0 = context0->Global(); |
16809 | 16743 |
16810 // Create a context with a different security token so that the | 16744 // Create a context with a different security token so that the |
16811 // failed access check callback will be called on each access. | 16745 // failed access check callback will be called on each access. |
16812 LocalContext context1(NULL, global_template); | 16746 LocalContext context1(NULL, global_template); |
16813 context1->Global()->Set(v8_str("other"), global0); | 16747 context1->Global()->Set(v8_str("other"), global0); |
(...skipping 2425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19239 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); | 19173 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); |
19240 } | 19174 } |
19241 // Create a context with a different security token so that the | 19175 // Create a context with a different security token so that the |
19242 // failed access check callback will be called on each access. | 19176 // failed access check callback will be called on each access. |
19243 LocalContext context1(NULL, global_template); | 19177 LocalContext context1(NULL, global_template); |
19244 context1->Global()->Set(v8_str("other"), global0); | 19178 context1->Global()->Set(v8_str("other"), global0); |
19245 | 19179 |
19246 CHECK(CompileRun("JSON.stringify(other)").IsEmpty()); | 19180 CHECK(CompileRun("JSON.stringify(other)").IsEmpty()); |
19247 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty()); | 19181 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty()); |
19248 CHECK(CompileRun("JSON.stringify([other, 'b', 'c'])").IsEmpty()); | 19182 CHECK(CompileRun("JSON.stringify([other, 'b', 'c'])").IsEmpty()); |
19249 | |
19250 v8::Handle<v8::Array> array = v8::Array::New(isolate, 2); | |
19251 array->Set(0, v8_str("a")); | |
19252 array->Set(1, v8_str("b")); | |
19253 context1->Global()->Set(v8_str("array"), array); | |
19254 ExpectString("JSON.stringify(array)", "[\"a\",\"b\"]"); | |
19255 array->TurnOnAccessCheck(); | |
19256 CHECK(CompileRun("JSON.stringify(array)").IsEmpty()); | |
19257 CHECK(CompileRun("JSON.stringify([array])").IsEmpty()); | |
19258 CHECK(CompileRun("JSON.stringify({'a' : array})").IsEmpty()); | |
19259 } | 19183 } |
19260 } | 19184 } |
19261 | 19185 |
19262 | 19186 |
19263 bool access_check_fail_thrown = false; | 19187 bool access_check_fail_thrown = false; |
19264 bool catch_callback_called = false; | 19188 bool catch_callback_called = false; |
19265 | 19189 |
19266 | 19190 |
19267 // Failed access check callback that performs a GC on each invocation. | 19191 // Failed access check callback that performs a GC on each invocation. |
19268 void FailedAccessCheckThrows(Local<v8::Object> target, | 19192 void FailedAccessCheckThrows(Local<v8::Object> target, |
(...skipping 2387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21656 CHECK(set->Has(env.local(), set).FromJust()); | 21580 CHECK(set->Has(env.local(), set).FromJust()); |
21657 | 21581 |
21658 CHECK(set->Delete(env.local(), set).FromJust()); | 21582 CHECK(set->Delete(env.local(), set).FromJust()); |
21659 CHECK_EQ(2U, set->Size()); | 21583 CHECK_EQ(2U, set->Size()); |
21660 CHECK(!set->Has(env.local(), set).FromJust()); | 21584 CHECK(!set->Has(env.local(), set).FromJust()); |
21661 CHECK(!set->Delete(env.local(), set).FromJust()); | 21585 CHECK(!set->Delete(env.local(), set).FromJust()); |
21662 | 21586 |
21663 set->Clear(); | 21587 set->Clear(); |
21664 CHECK_EQ(0U, set->Size()); | 21588 CHECK_EQ(0U, set->Size()); |
21665 } | 21589 } |
OLD | NEW |