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 13541 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13552 { | 13552 { |
13553 v8::TryCatch try_catch(isolate); | 13553 v8::TryCatch try_catch(isolate); |
13554 CHECK(access_checked->DefineOwnProperty(env.local(), v8_str("foo"), | 13554 CHECK(access_checked->DefineOwnProperty(env.local(), v8_str("foo"), |
13555 v8::Integer::New(isolate, 42)) | 13555 v8::Integer::New(isolate, 42)) |
13556 .IsNothing()); | 13556 .IsNothing()); |
13557 CHECK(try_catch.HasCaught()); | 13557 CHECK(try_catch.HasCaught()); |
13558 } | 13558 } |
13559 } | 13559 } |
13560 | 13560 |
13561 | 13561 |
13562 static v8::Local<Context> calling_context0; | |
13563 static v8::Local<Context> calling_context1; | |
13564 static v8::Local<Context> calling_context2; | |
13565 | |
13566 | |
13567 // Check that the call to the callback is initiated in | |
13568 // calling_context2, the directly calling context is calling_context1 | |
13569 // and the callback itself is in calling_context0. | |
13570 static void GetCallingContextCallback( | |
13571 const v8::FunctionCallbackInfo<v8::Value>& args) { | |
13572 ApiTestFuzzer::Fuzz(); | |
13573 CHECK(args.GetIsolate()->GetCurrentContext() == calling_context0); | |
13574 CHECK(args.GetIsolate()->GetCallingContext() == calling_context1); | |
13575 CHECK(args.GetIsolate()->GetEnteredContext() == calling_context2); | |
13576 args.GetReturnValue().Set(42); | |
13577 } | |
13578 | |
13579 | |
13580 THREADED_TEST(GetCurrentContextWhenNotInContext) { | 13562 THREADED_TEST(GetCurrentContextWhenNotInContext) { |
13581 i::Isolate* isolate = CcTest::i_isolate(); | 13563 i::Isolate* isolate = CcTest::i_isolate(); |
13582 CHECK(isolate != NULL); | 13564 CHECK(isolate != NULL); |
13583 CHECK(isolate->context() == NULL); | 13565 CHECK(isolate->context() == NULL); |
13584 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 13566 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); |
13585 v8::HandleScope scope(v8_isolate); | 13567 v8::HandleScope scope(v8_isolate); |
13586 // The following should not crash, but return an empty handle. | 13568 // The following should not crash, but return an empty handle. |
13587 v8::Local<v8::Context> current = v8_isolate->GetCurrentContext(); | 13569 v8::Local<v8::Context> current = v8_isolate->GetCurrentContext(); |
13588 CHECK(current.IsEmpty()); | 13570 CHECK(current.IsEmpty()); |
13589 } | 13571 } |
13590 | 13572 |
13591 | 13573 |
13592 THREADED_TEST(GetCallingContext) { | |
13593 v8::Isolate* isolate = CcTest::isolate(); | |
13594 v8::HandleScope scope(isolate); | |
13595 | |
13596 Local<Context> calling_context0(Context::New(isolate)); | |
13597 Local<Context> calling_context1(Context::New(isolate)); | |
13598 Local<Context> calling_context2(Context::New(isolate)); | |
13599 ::calling_context0 = calling_context0; | |
13600 ::calling_context1 = calling_context1; | |
13601 ::calling_context2 = calling_context2; | |
13602 | |
13603 // Allow cross-domain access. | |
13604 Local<String> token = v8_str("<security token>"); | |
13605 calling_context0->SetSecurityToken(token); | |
13606 calling_context1->SetSecurityToken(token); | |
13607 calling_context2->SetSecurityToken(token); | |
13608 | |
13609 // Create an object with a C++ callback in context0. | |
13610 calling_context0->Enter(); | |
13611 Local<v8::FunctionTemplate> callback_templ = | |
13612 v8::FunctionTemplate::New(isolate, GetCallingContextCallback); | |
13613 calling_context0->Global()->Set(v8_str("callback"), | |
13614 callback_templ->GetFunction()); | |
13615 calling_context0->Exit(); | |
13616 | |
13617 // Expose context0 in context1 and set up a function that calls the | |
13618 // callback function. | |
13619 calling_context1->Enter(); | |
13620 calling_context1->Global()->Set(v8_str("context0"), | |
13621 calling_context0->Global()); | |
13622 CompileRun("function f() { context0.callback() }"); | |
13623 calling_context1->Exit(); | |
13624 | |
13625 // Expose context1 in context2 and call the callback function in | |
13626 // context0 indirectly through f in context1. | |
13627 calling_context2->Enter(); | |
13628 calling_context2->Global()->Set(v8_str("context1"), | |
13629 calling_context1->Global()); | |
13630 CompileRun("context1.f()"); | |
13631 calling_context2->Exit(); | |
13632 ::calling_context0.Clear(); | |
13633 ::calling_context1.Clear(); | |
13634 ::calling_context2.Clear(); | |
13635 } | |
13636 | |
13637 | |
13638 // Check that a variable declaration with no explicit initialization | 13574 // Check that a variable declaration with no explicit initialization |
13639 // value does shadow an existing property in the prototype chain. | 13575 // value does shadow an existing property in the prototype chain. |
13640 THREADED_TEST(InitGlobalVarInProtoChain) { | 13576 THREADED_TEST(InitGlobalVarInProtoChain) { |
13641 LocalContext context; | 13577 LocalContext context; |
13642 v8::HandleScope scope(context->GetIsolate()); | 13578 v8::HandleScope scope(context->GetIsolate()); |
13643 // Introduce a variable in the prototype chain. | 13579 // Introduce a variable in the prototype chain. |
13644 CompileRun("__proto__.x = 42"); | 13580 CompileRun("__proto__.x = 42"); |
13645 v8::Handle<v8::Value> result = CompileRun("var x = 43; x"); | 13581 v8::Handle<v8::Value> result = CompileRun("var x = 43; x"); |
13646 CHECK(!result->IsUndefined()); | 13582 CHECK(!result->IsUndefined()); |
13647 CHECK_EQ(43, result->Int32Value()); | 13583 CHECK_EQ(43, result->Int32Value()); |
(...skipping 8308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21956 env2->Global()->Set(v8_str("obj2"), object2); | 21892 env2->Global()->Set(v8_str("obj2"), object2); |
21957 ExpectString("typeof obj2.values", "function"); | 21893 ExpectString("typeof obj2.values", "function"); |
21958 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); | 21894 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); |
21959 | 21895 |
21960 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); | 21896 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); |
21961 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); | 21897 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); |
21962 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); | 21898 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); |
21963 CHECK_EQ(fn2->GetCreationContext(), *ctx2); | 21899 CHECK_EQ(fn2->GetCreationContext(), *ctx2); |
21964 } | 21900 } |
21965 } | 21901 } |
OLD | NEW |