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 8723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8734 } | 8734 } |
8735 | 8735 |
8736 | 8736 |
8737 static bool AccessAlwaysBlocked(Local<v8::Object> global, Local<Value> name, | 8737 static bool AccessAlwaysBlocked(Local<v8::Object> global, Local<Value> name, |
8738 v8::AccessType type, Local<Value> data) { | 8738 v8::AccessType type, Local<Value> data) { |
8739 i::PrintF("Access blocked.\n"); | 8739 i::PrintF("Access blocked.\n"); |
8740 return false; | 8740 return false; |
8741 } | 8741 } |
8742 | 8742 |
8743 | 8743 |
| 8744 static bool AccessAlwaysAllowed(Local<v8::Object> global, Local<Value> name, |
| 8745 v8::AccessType type, Local<Value> data) { |
| 8746 i::PrintF("Access allowed.\n"); |
| 8747 return true; |
| 8748 } |
| 8749 |
| 8750 |
8744 THREADED_TEST(AccessControlGetOwnPropertyNames) { | 8751 THREADED_TEST(AccessControlGetOwnPropertyNames) { |
8745 v8::Isolate* isolate = CcTest::isolate(); | 8752 v8::Isolate* isolate = CcTest::isolate(); |
8746 v8::HandleScope handle_scope(isolate); | 8753 v8::HandleScope handle_scope(isolate); |
8747 v8::Handle<v8::ObjectTemplate> obj_template = | 8754 v8::Handle<v8::ObjectTemplate> obj_template = |
8748 v8::ObjectTemplate::New(isolate); | 8755 v8::ObjectTemplate::New(isolate); |
8749 | 8756 |
8750 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); | 8757 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); |
8751 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); | 8758 obj_template->SetAccessCheckCallbacks(AccessAlwaysBlocked, NULL); |
8752 | 8759 |
8753 // Add an accessor accessible by cross-domain JS code. | 8760 // Add an accessor accessible by cross-domain JS code. |
(...skipping 1219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9973 // Put the function into context1 and call it before and after | 9980 // Put the function into context1 and call it before and after |
9974 // detaching the global. Before detaching, the call succeeds and | 9981 // detaching the global. Before detaching, the call succeeds and |
9975 // after detaching and exception is thrown. | 9982 // after detaching and exception is thrown. |
9976 context1->Enter(); | 9983 context1->Enter(); |
9977 context1->Global()->Set(v8_str("fun"), fun); | 9984 context1->Global()->Set(v8_str("fun"), fun); |
9978 v8::Handle<v8::Value> x_value = CompileRun("fun('x')"); | 9985 v8::Handle<v8::Value> x_value = CompileRun("fun('x')"); |
9979 CHECK_EQ(42, x_value->Int32Value()); | 9986 CHECK_EQ(42, x_value->Int32Value()); |
9980 context0->DetachGlobal(); | 9987 context0->DetachGlobal(); |
9981 v8::TryCatch catcher(isolate); | 9988 v8::TryCatch catcher(isolate); |
9982 x_value = CompileRun("fun('x')"); | 9989 x_value = CompileRun("fun('x')"); |
9983 CHECK_EQ(42, x_value->Int32Value()); | 9990 CHECK(x_value->IsUndefined()); |
9984 context1->Exit(); | 9991 context1->Exit(); |
9985 } | 9992 } |
9986 | 9993 |
9987 | 9994 |
9988 THREADED_TEST(CrossLazyLoad) { | 9995 THREADED_TEST(CrossLazyLoad) { |
9989 v8::HandleScope scope(CcTest::isolate()); | 9996 v8::HandleScope scope(CcTest::isolate()); |
9990 LocalContext other; | 9997 LocalContext other; |
9991 LocalContext current; | 9998 LocalContext current; |
9992 | 9999 |
9993 Local<String> token = v8_str("<security token>"); | 10000 Local<String> token = v8_str("<security token>"); |
(...skipping 11945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21939 LocalContext env; | 21946 LocalContext env; |
21940 | 21947 |
21941 env->Global()->Set(v8_str("keys"), v8::Array::GetKeysIterator(isolate)); | 21948 env->Global()->Set(v8_str("keys"), v8::Array::GetKeysIterator(isolate)); |
21942 env->Global()->Set(v8_str("values"), v8::Array::GetValuesIterator(isolate)); | 21949 env->Global()->Set(v8_str("values"), v8::Array::GetValuesIterator(isolate)); |
21943 env->Global()->Set(v8_str("entries"), v8::Array::GetEntriesIterator(isolate)); | 21950 env->Global()->Set(v8_str("entries"), v8::Array::GetEntriesIterator(isolate)); |
21944 | 21951 |
21945 ExpectString("typeof keys", "function"); | 21952 ExpectString("typeof keys", "function"); |
21946 ExpectString("typeof values", "function"); | 21953 ExpectString("typeof values", "function"); |
21947 ExpectString("typeof entries", "function"); | 21954 ExpectString("typeof entries", "function"); |
21948 } | 21955 } |
| 21956 |
| 21957 |
| 21958 Local<v8::Context> call_eval_context; |
| 21959 Local<v8::Function> call_eval_bound_function; |
| 21960 static void CallEval(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 21961 v8::Context::Scope scope(call_eval_context); |
| 21962 args.GetReturnValue().Set( |
| 21963 call_eval_bound_function->Call(call_eval_context->Global(), 0, NULL)); |
| 21964 } |
| 21965 |
| 21966 |
| 21967 TEST(CrossActivationEval) { |
| 21968 LocalContext env; |
| 21969 v8::Isolate* isolate = env->GetIsolate(); |
| 21970 v8::HandleScope scope(isolate); |
| 21971 { |
| 21972 call_eval_context = v8::Context::New(isolate); |
| 21973 v8::Context::Scope scope(call_eval_context); |
| 21974 call_eval_bound_function = |
| 21975 Local<Function>::Cast(CompileRun("eval.bind(this, '1')")); |
| 21976 } |
| 21977 env->Global()->Set( |
| 21978 v8_str("CallEval"), |
| 21979 v8::FunctionTemplate::New(isolate, CallEval)->GetFunction()); |
| 21980 Local<Value> result = CompileRun("CallEval();"); |
| 21981 CHECK(result->IsInt32()); |
| 21982 CHECK_EQ(1, result->Int32Value()); |
| 21983 } |
| 21984 |
| 21985 |
| 21986 TEST(EvalInAccessCheckedContext) { |
| 21987 v8::Isolate* isolate = CcTest::isolate(); |
| 21988 v8::HandleScope scope(isolate); |
| 21989 |
| 21990 v8::Handle<v8::ObjectTemplate> obj_template = |
| 21991 v8::ObjectTemplate::New(isolate); |
| 21992 |
| 21993 obj_template->SetAccessCheckCallbacks(AccessAlwaysAllowed, NULL); |
| 21994 |
| 21995 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); |
| 21996 v8::Local<Context> context1 = Context::New(isolate, NULL, obj_template); |
| 21997 |
| 21998 Local<Value> foo = v8_str("foo"); |
| 21999 Local<Value> bar = v8_str("bar"); |
| 22000 |
| 22001 // Set to different domains. |
| 22002 context0->SetSecurityToken(foo); |
| 22003 context1->SetSecurityToken(bar); |
| 22004 |
| 22005 // Set up function in context0 that uses eval from context0. |
| 22006 context0->Enter(); |
| 22007 v8::Handle<v8::Value> fun = CompileRun( |
| 22008 "var x = 42;" |
| 22009 "(function() {" |
| 22010 " var e = eval;" |
| 22011 " return function(s) { return e(s); }" |
| 22012 "})()"); |
| 22013 context0->Exit(); |
| 22014 |
| 22015 // Put the function into context1 and call it. Since the access check |
| 22016 // callback always returns true, the call succeeds even though the tokens |
| 22017 // are different. |
| 22018 context1->Enter(); |
| 22019 context1->Global()->Set(v8_str("fun"), fun); |
| 22020 v8::Handle<v8::Value> x_value = CompileRun("fun('x')"); |
| 22021 CHECK_EQ(42, x_value->Int32Value()); |
| 22022 context1->Exit(); |
| 22023 } |
OLD | NEW |