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 6160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6171 v8::HandleScope scope(isolate); | 6171 v8::HandleScope scope(isolate); |
6172 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6172 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
6173 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); | 6173 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); |
6174 | 6174 |
6175 LocalContext context; | 6175 LocalContext context; |
6176 Local<v8::Object> obj = templ->NewInstance(); | 6176 Local<v8::Object> obj = templ->NewInstance(); |
6177 obj->TurnOnAccessCheck(); | 6177 obj->TurnOnAccessCheck(); |
6178 context->Global()->Set(v8_str("obj"), obj); | 6178 context->Global()->Set(v8_str("obj"), obj); |
6179 | 6179 |
6180 const char* code = | 6180 const char* code = |
6181 "try {" | 6181 "var result = 'PASSED';" |
6182 " for (var i = 0; i < 100; i++) {" | 6182 "for (var i = 0; i < 100; i++) {" |
| 6183 " try {" |
6183 " var v = obj[0];" | 6184 " var v = obj[0];" |
6184 " if (v != undefined) throw 'Wrong value ' + v + ' at iteration ' + i;" | 6185 " result = 'Wrong value ' + v + ' at iteration ' + i;" |
| 6186 " break;" |
| 6187 " } catch (e) {" |
| 6188 " /* pass */" |
6185 " }" | 6189 " }" |
6186 " 'PASSED'" | 6190 "}" |
6187 "} catch(e) {" | 6191 "result"; |
6188 " e" | |
6189 "}"; | |
6190 ExpectString(code, "PASSED"); | 6192 ExpectString(code, "PASSED"); |
6191 } | 6193 } |
6192 | 6194 |
6193 | 6195 |
6194 THREADED_TEST(IndexedInterceptorWithAccessorCheckSwitchedOn) { | 6196 THREADED_TEST(IndexedInterceptorWithAccessorCheckSwitchedOn) { |
6195 i::FLAG_allow_natives_syntax = true; | 6197 i::FLAG_allow_natives_syntax = true; |
6196 v8::Isolate* isolate = CcTest::isolate(); | 6198 v8::Isolate* isolate = CcTest::isolate(); |
6197 v8::HandleScope scope(isolate); | 6199 v8::HandleScope scope(isolate); |
6198 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6200 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
6199 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); | 6201 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); |
6200 | 6202 |
6201 LocalContext context; | 6203 LocalContext context; |
6202 Local<v8::Object> obj = templ->NewInstance(); | 6204 Local<v8::Object> obj = templ->NewInstance(); |
6203 context->Global()->Set(v8_str("obj"), obj); | 6205 context->Global()->Set(v8_str("obj"), obj); |
6204 | 6206 |
6205 const char* code = | 6207 const char* code = |
6206 "try {" | 6208 "var result = 'PASSED';" |
6207 " for (var i = 0; i < 100; i++) {" | 6209 "for (var i = 0; i < 100; i++) {" |
6208 " var expected = i;" | 6210 " var expected = i;" |
| 6211 " if (i == 5) {" |
| 6212 " %EnableAccessChecks(obj);" |
| 6213 " }" |
| 6214 " try {" |
| 6215 " var v = obj[i];" |
6209 " if (i == 5) {" | 6216 " if (i == 5) {" |
6210 " %EnableAccessChecks(obj);" | 6217 " result = 'Should not have reached this!';" |
6211 " expected = undefined;" | 6218 " break;" |
| 6219 " } else if (v != expected) {" |
| 6220 " result = 'Wrong value ' + v + ' at iteration ' + i;" |
| 6221 " break;" |
6212 " }" | 6222 " }" |
6213 " var v = obj[i];" | 6223 " } catch (e) {" |
6214 " if (v != expected) throw 'Wrong value ' + v + ' at iteration ' + i;" | 6224 " if (i != 5) {" |
6215 " if (i == 5) %DisableAccessChecks(obj);" | 6225 " result = e;" |
| 6226 " }" |
6216 " }" | 6227 " }" |
6217 " 'PASSED'" | 6228 " if (i == 5) %DisableAccessChecks(obj);" |
6218 "} catch(e) {" | 6229 "}" |
6219 " e" | 6230 "result"; |
6220 "}"; | |
6221 ExpectString(code, "PASSED"); | 6231 ExpectString(code, "PASSED"); |
6222 } | 6232 } |
6223 | 6233 |
6224 | 6234 |
6225 THREADED_TEST(IndexedInterceptorWithDifferentIndices) { | 6235 THREADED_TEST(IndexedInterceptorWithDifferentIndices) { |
6226 v8::Isolate* isolate = CcTest::isolate(); | 6236 v8::Isolate* isolate = CcTest::isolate(); |
6227 v8::HandleScope scope(isolate); | 6237 v8::HandleScope scope(isolate); |
6228 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6238 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
6229 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); | 6239 templ->SetIndexedPropertyHandler(IdentityIndexedPropertyGetter); |
6230 | 6240 |
(...skipping 2390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8621 | 8631 |
8622 current->Global()->Set(v8_str("other"), other->Global()); | 8632 current->Global()->Set(v8_str("other"), other->Global()); |
8623 CHECK(v8_compile("other")->Run()->Equals(other->Global())); | 8633 CHECK(v8_compile("other")->Run()->Equals(other->Global())); |
8624 | 8634 |
8625 // Make sure the security check fails here and we get an undefined | 8635 // Make sure the security check fails here and we get an undefined |
8626 // result instead of getting the Object function. Repeat in a loop | 8636 // result instead of getting the Object function. Repeat in a loop |
8627 // to make sure to exercise the IC code. | 8637 // to make sure to exercise the IC code. |
8628 v8::Local<Script> access_other0 = v8_compile("other.Object"); | 8638 v8::Local<Script> access_other0 = v8_compile("other.Object"); |
8629 v8::Local<Script> access_other1 = v8_compile("other[42]"); | 8639 v8::Local<Script> access_other1 = v8_compile("other[42]"); |
8630 for (int i = 0; i < 5; i++) { | 8640 for (int i = 0; i < 5; i++) { |
8631 CHECK(!access_other0->Run()->Equals(other_object)); | 8641 CHECK(access_other0->Run().IsEmpty()); |
8632 CHECK(access_other0->Run()->IsUndefined()); | 8642 CHECK(access_other1->Run().IsEmpty()); |
8633 CHECK(!access_other1->Run()->Equals(v8_num(87))); | |
8634 CHECK(access_other1->Run()->IsUndefined()); | |
8635 } | 8643 } |
8636 | 8644 |
8637 // Create an object that has 'other' in its prototype chain and make | 8645 // Create an object that has 'other' in its prototype chain and make |
8638 // sure we cannot access the Object function indirectly through | 8646 // sure we cannot access the Object function indirectly through |
8639 // that. Repeat in a loop to make sure to exercise the IC code. | 8647 // that. Repeat in a loop to make sure to exercise the IC code. |
8640 v8_compile("function F() { };" | 8648 v8_compile("function F() { };" |
8641 "F.prototype = other;" | 8649 "F.prototype = other;" |
8642 "var f = new F();")->Run(); | 8650 "var f = new F();")->Run(); |
8643 v8::Local<Script> access_f0 = v8_compile("f.Object"); | 8651 v8::Local<Script> access_f0 = v8_compile("f.Object"); |
8644 v8::Local<Script> access_f1 = v8_compile("f[42]"); | 8652 v8::Local<Script> access_f1 = v8_compile("f[42]"); |
8645 for (int j = 0; j < 5; j++) { | 8653 for (int j = 0; j < 5; j++) { |
8646 CHECK(!access_f0->Run()->Equals(other_object)); | 8654 CHECK(access_f0->Run().IsEmpty()); |
8647 CHECK(access_f0->Run()->IsUndefined()); | 8655 CHECK(access_f1->Run().IsEmpty()); |
8648 CHECK(!access_f1->Run()->Equals(v8_num(87))); | |
8649 CHECK(access_f1->Run()->IsUndefined()); | |
8650 } | 8656 } |
8651 | 8657 |
8652 // Now it gets hairy: Set the prototype for the other global object | 8658 // Now it gets hairy: Set the prototype for the other global object |
8653 // to be the current global object. The prototype chain for 'f' now | 8659 // to be the current global object. The prototype chain for 'f' now |
8654 // goes through 'other' but ends up in the current global object. | 8660 // goes through 'other' but ends up in the current global object. |
8655 { Context::Scope scope(other); | 8661 { Context::Scope scope(other); |
8656 other->Global()->Set(v8_str("__proto__"), current->Global()); | 8662 other->Global()->Set(v8_str("__proto__"), current->Global()); |
8657 } | 8663 } |
8658 // Set a named and an index property on the current global | 8664 // Set a named and an index property on the current global |
8659 // object. To force the lookup to go through the other global object, | 8665 // object. To force the lookup to go through the other global object, |
8660 // the properties must not exist in the other global object. | 8666 // the properties must not exist in the other global object. |
8661 current->Global()->Set(v8_str("foo"), v8_num(100)); | 8667 current->Global()->Set(v8_str("foo"), v8_num(100)); |
8662 current->Global()->Set(v8_num(99), v8_num(101)); | 8668 current->Global()->Set(v8_num(99), v8_num(101)); |
8663 // Try to read the properties from f and make sure that the access | 8669 // Try to read the properties from f and make sure that the access |
8664 // gets stopped by the security checks on the other global object. | 8670 // gets stopped by the security checks on the other global object. |
8665 Local<Script> access_f2 = v8_compile("f.foo"); | 8671 Local<Script> access_f2 = v8_compile("f.foo"); |
8666 Local<Script> access_f3 = v8_compile("f[99]"); | 8672 Local<Script> access_f3 = v8_compile("f[99]"); |
8667 for (int k = 0; k < 5; k++) { | 8673 for (int k = 0; k < 5; k++) { |
8668 CHECK(!access_f2->Run()->Equals(v8_num(100))); | 8674 CHECK(access_f2->Run().IsEmpty()); |
8669 CHECK(access_f2->Run()->IsUndefined()); | 8675 CHECK(access_f3->Run().IsEmpty()); |
8670 CHECK(!access_f3->Run()->Equals(v8_num(101))); | |
8671 CHECK(access_f3->Run()->IsUndefined()); | |
8672 } | 8676 } |
8673 } | 8677 } |
8674 | 8678 |
8675 | 8679 |
8676 static bool named_security_check_with_gc_called; | 8680 static bool named_security_check_with_gc_called; |
8677 | 8681 |
8678 static bool NamedSecurityCallbackWithGC(Local<v8::Object> global, | 8682 static bool NamedSecurityCallbackWithGC(Local<v8::Object> global, |
8679 Local<Value> name, | 8683 Local<Value> name, |
8680 v8::AccessType type, | 8684 v8::AccessType type, |
8681 Local<Value> data) { | 8685 Local<Value> data) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8742 | 8746 |
8743 env1->Global()->Set(v8_str("prop"), v8_num(3)); | 8747 env1->Global()->Set(v8_str("prop"), v8_num(3)); |
8744 env2->Global()->Set(v8_str("env1"), env1->Global()); | 8748 env2->Global()->Set(v8_str("env1"), env1->Global()); |
8745 | 8749 |
8746 // Change env2 to a different domain and delete env1.prop. | 8750 // Change env2 to a different domain and delete env1.prop. |
8747 env2->SetSecurityToken(bar); | 8751 env2->SetSecurityToken(bar); |
8748 { | 8752 { |
8749 Context::Scope scope_env2(env2); | 8753 Context::Scope scope_env2(env2); |
8750 Local<Value> result = | 8754 Local<Value> result = |
8751 CompileRun("delete env1.prop"); | 8755 CompileRun("delete env1.prop"); |
8752 CHECK(result->IsFalse()); | 8756 CHECK(result.IsEmpty()); |
8753 } | 8757 } |
8754 | 8758 |
8755 // Check that env1.prop still exists. | 8759 // Check that env1.prop still exists. |
8756 Local<Value> v = env1->Global()->Get(v8_str("prop")); | 8760 Local<Value> v = env1->Global()->Get(v8_str("prop")); |
8757 CHECK(v->IsNumber()); | 8761 CHECK(v->IsNumber()); |
8758 CHECK_EQ(3, v->Int32Value()); | 8762 CHECK_EQ(3, v->Int32Value()); |
8759 } | 8763 } |
8760 | 8764 |
8761 | 8765 |
8762 THREADED_TEST(CrossDomainIsPropertyEnumerable) { | 8766 THREADED_TEST(CrossDomainIsPropertyEnumerable) { |
(...skipping 17 matching lines...) Expand all Loading... |
8780 Context::Scope scope_env2(env2); | 8784 Context::Scope scope_env2(env2); |
8781 Local<Value> result = CompileRun(test); | 8785 Local<Value> result = CompileRun(test); |
8782 CHECK(result->IsTrue()); | 8786 CHECK(result->IsTrue()); |
8783 } | 8787 } |
8784 | 8788 |
8785 // Change env2 to a different domain and test again. | 8789 // Change env2 to a different domain and test again. |
8786 env2->SetSecurityToken(bar); | 8790 env2->SetSecurityToken(bar); |
8787 { | 8791 { |
8788 Context::Scope scope_env2(env2); | 8792 Context::Scope scope_env2(env2); |
8789 Local<Value> result = CompileRun(test); | 8793 Local<Value> result = CompileRun(test); |
8790 CHECK(result->IsFalse()); | 8794 CHECK(result.IsEmpty()); |
8791 } | 8795 } |
8792 } | 8796 } |
8793 | 8797 |
8794 | 8798 |
8795 THREADED_TEST(CrossDomainForIn) { | 8799 THREADED_TEST(CrossDomainForIn) { |
8796 LocalContext env1; | 8800 LocalContext env1; |
8797 v8::HandleScope handle_scope(env1->GetIsolate()); | 8801 v8::HandleScope handle_scope(env1->GetIsolate()); |
8798 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 8802 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); |
8799 | 8803 |
8800 Local<Value> foo = v8_str("foo"); | 8804 Local<Value> foo = v8_str("foo"); |
8801 Local<Value> bar = v8_str("bar"); | 8805 Local<Value> bar = v8_str("bar"); |
8802 | 8806 |
8803 // Set to the same domain. | 8807 // Set to the same domain. |
8804 env1->SetSecurityToken(foo); | 8808 env1->SetSecurityToken(foo); |
8805 env2->SetSecurityToken(foo); | 8809 env2->SetSecurityToken(foo); |
8806 | 8810 |
8807 env1->Global()->Set(v8_str("prop"), v8_num(3)); | 8811 env1->Global()->Set(v8_str("prop"), v8_num(3)); |
8808 env2->Global()->Set(v8_str("env1"), env1->Global()); | 8812 env2->Global()->Set(v8_str("env1"), env1->Global()); |
8809 | 8813 |
8810 // Change env2 to a different domain and set env1's global object | 8814 // Change env2 to a different domain and set env1's global object |
8811 // as the __proto__ of an object in env2 and enumerate properties | 8815 // as the __proto__ of an object in env2 and enumerate properties |
8812 // in for-in. It shouldn't enumerate properties on env1's global | 8816 // in for-in. It shouldn't enumerate properties on env1's global |
8813 // object. | 8817 // object. |
8814 env2->SetSecurityToken(bar); | 8818 env2->SetSecurityToken(bar); |
8815 { | 8819 { |
8816 Context::Scope scope_env2(env2); | 8820 Context::Scope scope_env2(env2); |
8817 Local<Value> result = | 8821 Local<Value> result = CompileRun( |
8818 CompileRun("(function(){var obj = {'__proto__':env1};" | 8822 "(function() {" |
8819 "for (var p in obj)" | 8823 " var obj = { '__proto__': env1 };" |
8820 " if (p == 'prop') return false;" | 8824 " try {" |
8821 "return true;})()"); | 8825 " for (var p in obj) {" |
| 8826 " if (p == 'prop') return false;" |
| 8827 " }" |
| 8828 " return false;" |
| 8829 " } catch (e) {" |
| 8830 " return true;" |
| 8831 " }" |
| 8832 "})()"); |
8822 CHECK(result->IsTrue()); | 8833 CHECK(result->IsTrue()); |
8823 } | 8834 } |
8824 } | 8835 } |
8825 | 8836 |
8826 | 8837 |
8827 TEST(ContextDetachGlobal) { | 8838 TEST(ContextDetachGlobal) { |
8828 LocalContext env1; | 8839 LocalContext env1; |
8829 v8::HandleScope handle_scope(env1->GetIsolate()); | 8840 v8::HandleScope handle_scope(env1->GetIsolate()); |
8830 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 8841 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); |
8831 | 8842 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8873 CHECK(get_prop->IsFunction()); | 8884 CHECK(get_prop->IsFunction()); |
8874 v8::TryCatch try_catch; | 8885 v8::TryCatch try_catch; |
8875 Local<Value> r = Function::Cast(*get_prop)->Call(global1, 0, NULL); | 8886 Local<Value> r = Function::Cast(*get_prop)->Call(global1, 0, NULL); |
8876 CHECK(!try_catch.HasCaught()); | 8887 CHECK(!try_catch.HasCaught()); |
8877 CHECK_EQ(1, r->Int32Value()); | 8888 CHECK_EQ(1, r->Int32Value()); |
8878 } | 8889 } |
8879 | 8890 |
8880 // Check that env3 is not accessible from env1 | 8891 // Check that env3 is not accessible from env1 |
8881 { | 8892 { |
8882 Local<Value> r = global3->Get(v8_str("prop2")); | 8893 Local<Value> r = global3->Get(v8_str("prop2")); |
8883 CHECK(r->IsUndefined()); | 8894 CHECK(r.IsEmpty()); |
8884 } | 8895 } |
8885 } | 8896 } |
8886 | 8897 |
8887 | 8898 |
8888 TEST(DetachGlobal) { | 8899 TEST(DetachGlobal) { |
8889 LocalContext env1; | 8900 LocalContext env1; |
8890 v8::HandleScope scope(env1->GetIsolate()); | 8901 v8::HandleScope scope(env1->GetIsolate()); |
8891 | 8902 |
8892 // Create second environment. | 8903 // Create second environment. |
8893 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 8904 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); |
(...skipping 18 matching lines...) Expand all Loading... |
8912 CHECK(result->IsInt32()); | 8923 CHECK(result->IsInt32()); |
8913 CHECK_EQ(42, result->Int32Value()); | 8924 CHECK_EQ(42, result->Int32Value()); |
8914 | 8925 |
8915 // Hold on to global from env2 and detach global from env2. | 8926 // Hold on to global from env2 and detach global from env2. |
8916 Local<v8::Object> global2 = env2->Global(); | 8927 Local<v8::Object> global2 = env2->Global(); |
8917 env2->DetachGlobal(); | 8928 env2->DetachGlobal(); |
8918 | 8929 |
8919 // Check that the global has been detached. No other.p property can | 8930 // Check that the global has been detached. No other.p property can |
8920 // be found. | 8931 // be found. |
8921 result = CompileRun("other.p"); | 8932 result = CompileRun("other.p"); |
8922 CHECK(result->IsUndefined()); | 8933 CHECK(result.IsEmpty()); |
8923 | 8934 |
8924 // Reuse global2 for env3. | 8935 // Reuse global2 for env3. |
8925 v8::Handle<Context> env3 = Context::New(env1->GetIsolate(), | 8936 v8::Handle<Context> env3 = Context::New(env1->GetIsolate(), |
8926 0, | 8937 0, |
8927 v8::Handle<v8::ObjectTemplate>(), | 8938 v8::Handle<v8::ObjectTemplate>(), |
8928 global2); | 8939 global2); |
8929 CHECK_EQ(global2, env3->Global()); | 8940 CHECK_EQ(global2, env3->Global()); |
8930 | 8941 |
8931 // Start by using the same security token for env3 as for env1 and env2. | 8942 // Start by using the same security token for env3 as for env1 and env2. |
8932 env3->SetSecurityToken(foo); | 8943 env3->SetSecurityToken(foo); |
8933 | 8944 |
8934 // Create a property on the global object in env3. | 8945 // Create a property on the global object in env3. |
8935 { | 8946 { |
8936 v8::Context::Scope scope(env3); | 8947 v8::Context::Scope scope(env3); |
8937 env3->Global()->Set(v8_str("p"), v8::Integer::New(env3->GetIsolate(), 24)); | 8948 env3->Global()->Set(v8_str("p"), v8::Integer::New(env3->GetIsolate(), 24)); |
8938 } | 8949 } |
8939 | 8950 |
8940 // Check that other.p is now the property in env3 and that we have access. | 8951 // Check that other.p is now the property in env3 and that we have access. |
8941 result = CompileRun("other.p"); | 8952 result = CompileRun("other.p"); |
8942 CHECK(result->IsInt32()); | 8953 CHECK(result->IsInt32()); |
8943 CHECK_EQ(24, result->Int32Value()); | 8954 CHECK_EQ(24, result->Int32Value()); |
8944 | 8955 |
8945 // Change security token for env3 to something different from env1 and env2. | 8956 // Change security token for env3 to something different from env1 and env2. |
8946 env3->SetSecurityToken(v8_str("bar")); | 8957 env3->SetSecurityToken(v8_str("bar")); |
8947 | 8958 |
8948 // Check that we do not have access to other.p in env1. |other| is now | 8959 // Check that we do not have access to other.p in env1. |other| is now |
8949 // the global object for env3 which has a different security token, | 8960 // the global object for env3 which has a different security token, |
8950 // so access should be blocked. | 8961 // so access should be blocked. |
8951 result = CompileRun("other.p"); | 8962 result = CompileRun("other.p"); |
8952 CHECK(result->IsUndefined()); | 8963 CHECK(result.IsEmpty()); |
8953 } | 8964 } |
8954 | 8965 |
8955 | 8966 |
8956 void GetThisX(const v8::FunctionCallbackInfo<v8::Value>& info) { | 8967 void GetThisX(const v8::FunctionCallbackInfo<v8::Value>& info) { |
8957 info.GetReturnValue().Set( | 8968 info.GetReturnValue().Set( |
8958 info.GetIsolate()->GetCurrentContext()->Global()->Get(v8_str("x"))); | 8969 info.GetIsolate()->GetCurrentContext()->Global()->Get(v8_str("x"))); |
8959 } | 8970 } |
8960 | 8971 |
8961 | 8972 |
8962 TEST(DetachedAccesses) { | 8973 TEST(DetachedAccesses) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8995 } | 9006 } |
8996 | 9007 |
8997 Local<Object> env2_global = env2->Global(); | 9008 Local<Object> env2_global = env2->Global(); |
8998 env2_global->TurnOnAccessCheck(); | 9009 env2_global->TurnOnAccessCheck(); |
8999 env2->DetachGlobal(); | 9010 env2->DetachGlobal(); |
9000 | 9011 |
9001 Local<Value> result; | 9012 Local<Value> result; |
9002 result = CompileRun("bound_x()"); | 9013 result = CompileRun("bound_x()"); |
9003 CHECK_EQ(v8_str("env2_x"), result); | 9014 CHECK_EQ(v8_str("env2_x"), result); |
9004 result = CompileRun("get_x()"); | 9015 result = CompileRun("get_x()"); |
9005 CHECK(result->IsUndefined()); | 9016 CHECK(result.IsEmpty()); |
9006 result = CompileRun("get_x_w()"); | 9017 result = CompileRun("get_x_w()"); |
9007 CHECK(result->IsUndefined()); | 9018 CHECK(result.IsEmpty()); |
9008 result = CompileRun("this_x()"); | 9019 result = CompileRun("this_x()"); |
9009 CHECK_EQ(v8_str("env2_x"), result); | 9020 CHECK_EQ(v8_str("env2_x"), result); |
9010 | 9021 |
9011 // Reattach env2's proxy | 9022 // Reattach env2's proxy |
9012 env2 = Context::New(env1->GetIsolate(), | 9023 env2 = Context::New(env1->GetIsolate(), |
9013 0, | 9024 0, |
9014 v8::Handle<v8::ObjectTemplate>(), | 9025 v8::Handle<v8::ObjectTemplate>(), |
9015 env2_global); | 9026 env2_global); |
9016 env2->SetSecurityToken(foo); | 9027 env2->SetSecurityToken(foo); |
9017 { | 9028 { |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9193 | 9204 |
9194 v8::Local<Context> context1 = Context::New(isolate); | 9205 v8::Local<Context> context1 = Context::New(isolate); |
9195 context1->Enter(); | 9206 context1->Enter(); |
9196 | 9207 |
9197 v8::Handle<v8::Object> global1 = context1->Global(); | 9208 v8::Handle<v8::Object> global1 = context1->Global(); |
9198 global1->Set(v8_str("other"), global0); | 9209 global1->Set(v8_str("other"), global0); |
9199 | 9210 |
9200 // Access blocked property. | 9211 // Access blocked property. |
9201 CompileRun("other.blocked_prop = 1"); | 9212 CompileRun("other.blocked_prop = 1"); |
9202 | 9213 |
9203 ExpectUndefined("other.blocked_prop"); | 9214 CHECK(CompileRun("other.blocked_prop").IsEmpty()); |
9204 ExpectUndefined( | 9215 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')") |
9205 "Object.getOwnPropertyDescriptor(other, 'blocked_prop')"); | 9216 .IsEmpty()); |
9206 ExpectFalse("propertyIsEnumerable.call(other, 'blocked_prop')"); | 9217 CHECK( |
| 9218 CompileRun("propertyIsEnumerable.call(other, 'blocked_prop')").IsEmpty()); |
9207 | 9219 |
9208 // Access blocked element. | 9220 // Access blocked element. |
9209 CompileRun("other[239] = 1"); | 9221 CHECK(CompileRun("other[239] = 1").IsEmpty()); |
9210 | 9222 |
9211 ExpectUndefined("other[239]"); | 9223 CHECK(CompileRun("other[239]").IsEmpty()); |
9212 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239')"); | 9224 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239')").IsEmpty()); |
9213 ExpectFalse("propertyIsEnumerable.call(other, '239')"); | 9225 CHECK(CompileRun("propertyIsEnumerable.call(other, '239')").IsEmpty()); |
9214 | 9226 |
9215 // Enable ACCESS_HAS | 9227 // Enable ACCESS_HAS |
9216 allowed_access_type[v8::ACCESS_HAS] = true; | 9228 allowed_access_type[v8::ACCESS_HAS] = true; |
9217 ExpectUndefined("other[239]"); | 9229 CHECK(CompileRun("other[239]").IsEmpty()); |
9218 // ... and now we can get the descriptor... | 9230 // ... and now we can get the descriptor... |
9219 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239').value"); | 9231 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '239').value") |
| 9232 .IsEmpty()); |
9220 // ... and enumerate the property. | 9233 // ... and enumerate the property. |
9221 ExpectTrue("propertyIsEnumerable.call(other, '239')"); | 9234 ExpectTrue("propertyIsEnumerable.call(other, '239')"); |
9222 allowed_access_type[v8::ACCESS_HAS] = false; | 9235 allowed_access_type[v8::ACCESS_HAS] = false; |
9223 | 9236 |
9224 // Access a property with JS accessor. | 9237 // Access a property with JS accessor. |
9225 CompileRun("other.js_accessor_p = 2"); | 9238 CHECK(CompileRun("other.js_accessor_p = 2").IsEmpty()); |
9226 | 9239 |
9227 ExpectUndefined("other.js_accessor_p"); | 9240 CHECK(CompileRun("other.js_accessor_p").IsEmpty()); |
9228 ExpectUndefined( | 9241 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'js_accessor_p')") |
9229 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p')"); | 9242 .IsEmpty()); |
9230 | 9243 |
9231 // Enable both ACCESS_HAS and ACCESS_GET. | 9244 // Enable both ACCESS_HAS and ACCESS_GET. |
9232 allowed_access_type[v8::ACCESS_HAS] = true; | 9245 allowed_access_type[v8::ACCESS_HAS] = true; |
9233 allowed_access_type[v8::ACCESS_GET] = true; | 9246 allowed_access_type[v8::ACCESS_GET] = true; |
9234 | 9247 |
9235 ExpectString("other.js_accessor_p", "getter"); | 9248 ExpectString("other.js_accessor_p", "getter"); |
9236 ExpectObject( | 9249 ExpectObject( |
9237 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get", getter); | 9250 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get", getter); |
9238 ExpectObject( | 9251 ExpectObject( |
9239 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set", setter); | 9252 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set", setter); |
9240 ExpectUndefined( | 9253 ExpectUndefined( |
9241 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); | 9254 "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); |
9242 | 9255 |
9243 allowed_access_type[v8::ACCESS_HAS] = false; | 9256 allowed_access_type[v8::ACCESS_HAS] = false; |
9244 allowed_access_type[v8::ACCESS_GET] = false; | 9257 allowed_access_type[v8::ACCESS_GET] = false; |
9245 | 9258 |
9246 // Access an element with JS accessor. | 9259 // Access an element with JS accessor. |
9247 CompileRun("other[42] = 2"); | 9260 CHECK(CompileRun("other[42] = 2").IsEmpty()); |
9248 | 9261 |
9249 ExpectUndefined("other[42]"); | 9262 CHECK(CompileRun("other[42]").IsEmpty()); |
9250 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42')"); | 9263 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, '42')").IsEmpty()); |
9251 | 9264 |
9252 // Enable both ACCESS_HAS and ACCESS_GET. | 9265 // Enable both ACCESS_HAS and ACCESS_GET. |
9253 allowed_access_type[v8::ACCESS_HAS] = true; | 9266 allowed_access_type[v8::ACCESS_HAS] = true; |
9254 allowed_access_type[v8::ACCESS_GET] = true; | 9267 allowed_access_type[v8::ACCESS_GET] = true; |
9255 | 9268 |
9256 ExpectString("other[42]", "el_getter"); | 9269 ExpectString("other[42]", "el_getter"); |
9257 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); | 9270 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); |
9258 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); | 9271 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); |
9259 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); | 9272 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); |
9260 | 9273 |
(...skipping 15 matching lines...) Expand all Loading... |
9276 value = CompileRun( | 9289 value = CompileRun( |
9277 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); | 9290 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); |
9278 CHECK(value->IsNumber()); | 9291 CHECK(value->IsNumber()); |
9279 CHECK_EQ(3, value->Int32Value()); | 9292 CHECK_EQ(3, value->Int32Value()); |
9280 | 9293 |
9281 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); | 9294 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); |
9282 CHECK(value->IsTrue()); | 9295 CHECK(value->IsTrue()); |
9283 | 9296 |
9284 // Enumeration doesn't enumerate accessors from inaccessible objects in | 9297 // Enumeration doesn't enumerate accessors from inaccessible objects in |
9285 // the prototype chain even if the accessors are in themselves accessible. | 9298 // the prototype chain even if the accessors are in themselves accessible. |
9286 value = | 9299 value = CompileRun( |
9287 CompileRun("(function(){var obj = {'__proto__':other};" | 9300 "(function() {" |
9288 "for (var p in obj)" | 9301 " var obj = { '__proto__': other };" |
9289 " if (p == 'accessible_prop' ||" | 9302 " try {" |
9290 " p == 'blocked_js_prop' ||" | 9303 " for (var p in obj) {" |
9291 " p == 'blocked_js_prop') {" | 9304 " if (p == 'accessible_prop' ||" |
9292 " return false;" | 9305 " p == 'blocked_js_prop' ||" |
9293 " }" | 9306 " p == 'blocked_js_prop') {" |
9294 "return true;})()"); | 9307 " return false;" |
| 9308 " }" |
| 9309 " }" |
| 9310 " return false;" |
| 9311 " } catch (e) {" |
| 9312 " return true;" |
| 9313 " }" |
| 9314 "})()"); |
9295 CHECK(value->IsTrue()); | 9315 CHECK(value->IsTrue()); |
9296 | 9316 |
9297 context1->Exit(); | 9317 context1->Exit(); |
9298 context0->Exit(); | 9318 context0->Exit(); |
9299 } | 9319 } |
9300 | 9320 |
9301 | 9321 |
9302 TEST(AccessControlES5) { | 9322 TEST(AccessControlES5) { |
9303 v8::Isolate* isolate = CcTest::isolate(); | 9323 v8::Isolate* isolate = CcTest::isolate(); |
9304 v8::HandleScope handle_scope(isolate); | 9324 v8::HandleScope handle_scope(isolate); |
(...skipping 22 matching lines...) Expand all Loading... |
9327 context0->Enter(); | 9347 context0->Enter(); |
9328 | 9348 |
9329 v8::Handle<v8::Object> global0 = context0->Global(); | 9349 v8::Handle<v8::Object> global0 = context0->Global(); |
9330 | 9350 |
9331 v8::Local<Context> context1 = Context::New(isolate); | 9351 v8::Local<Context> context1 = Context::New(isolate); |
9332 context1->Enter(); | 9352 context1->Enter(); |
9333 v8::Handle<v8::Object> global1 = context1->Global(); | 9353 v8::Handle<v8::Object> global1 = context1->Global(); |
9334 global1->Set(v8_str("other"), global0); | 9354 global1->Set(v8_str("other"), global0); |
9335 | 9355 |
9336 // Regression test for issue 1154. | 9356 // Regression test for issue 1154. |
9337 ExpectTrue("Object.keys(other).indexOf('blocked_prop') == -1"); | 9357 CHECK(CompileRun("Object.keys(other)").IsEmpty()); |
9338 | 9358 CHECK(CompileRun("other.blocked_prop").IsEmpty()); |
9339 ExpectUndefined("other.blocked_prop"); | |
9340 | 9359 |
9341 // Regression test for issue 1027. | 9360 // Regression test for issue 1027. |
9342 CompileRun("Object.defineProperty(\n" | 9361 CompileRun("Object.defineProperty(\n" |
9343 " other, 'blocked_prop', {configurable: false})"); | 9362 " other, 'blocked_prop', {configurable: false})"); |
9344 ExpectUndefined("other.blocked_prop"); | 9363 CHECK(CompileRun("other.blocked_prop").IsEmpty()); |
9345 ExpectUndefined( | 9364 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')") |
9346 "Object.getOwnPropertyDescriptor(other, 'blocked_prop')"); | 9365 .IsEmpty()); |
9347 | 9366 |
9348 // Regression test for issue 1171. | 9367 // Regression test for issue 1171. |
9349 ExpectTrue("Object.isExtensible(other)"); | 9368 ExpectTrue("Object.isExtensible(other)"); |
9350 CompileRun("Object.preventExtensions(other)"); | 9369 CompileRun("Object.preventExtensions(other)"); |
9351 ExpectTrue("Object.isExtensible(other)"); | 9370 ExpectTrue("Object.isExtensible(other)"); |
9352 | 9371 |
9353 // Object.seal and Object.freeze. | 9372 // Object.seal and Object.freeze. |
9354 CompileRun("Object.freeze(other)"); | 9373 CompileRun("Object.freeze(other)"); |
9355 ExpectTrue("Object.isExtensible(other)"); | 9374 ExpectTrue("Object.isExtensible(other)"); |
9356 | 9375 |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9412 global1->Set(v8_str("object"), obj_template->NewInstance()); | 9431 global1->Set(v8_str("object"), obj_template->NewInstance()); |
9413 | 9432 |
9414 v8::Handle<Value> value; | 9433 v8::Handle<Value> value; |
9415 | 9434 |
9416 // Attempt to get the property names of the other global object and | 9435 // Attempt to get the property names of the other global object and |
9417 // of an object that requires access checks. Accessing the other | 9436 // of an object that requires access checks. Accessing the other |
9418 // global object should be blocked by access checks on the global | 9437 // global object should be blocked by access checks on the global |
9419 // proxy object. Accessing the object that requires access checks | 9438 // proxy object. Accessing the object that requires access checks |
9420 // is blocked by the access checks on the object itself. | 9439 // is blocked by the access checks on the object itself. |
9421 value = CompileRun("Object.getOwnPropertyNames(other).length == 0"); | 9440 value = CompileRun("Object.getOwnPropertyNames(other).length == 0"); |
9422 CHECK(value->IsTrue()); | 9441 CHECK(value.IsEmpty()); |
9423 | 9442 |
9424 value = CompileRun("Object.getOwnPropertyNames(object).length == 0"); | 9443 value = CompileRun("Object.getOwnPropertyNames(object).length == 0"); |
9425 CHECK(value->IsTrue()); | 9444 CHECK(value.IsEmpty()); |
9426 | 9445 |
9427 context1->Exit(); | 9446 context1->Exit(); |
9428 context0->Exit(); | 9447 context0->Exit(); |
9429 } | 9448 } |
9430 | 9449 |
9431 | 9450 |
9432 static void IndexedPropertyEnumerator( | 9451 static void IndexedPropertyEnumerator( |
9433 const v8::PropertyCallbackInfo<v8::Array>& info) { | 9452 const v8::PropertyCallbackInfo<v8::Array>& info) { |
9434 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); | 9453 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); |
9435 result->Set(0, v8::Integer::New(info.GetIsolate(), 7)); | 9454 result->Set(0, v8::Integer::New(info.GetIsolate(), 7)); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9523 | 9542 |
9524 v8::Handle<v8::Object> global1 = context1->Global(); | 9543 v8::Handle<v8::Object> global1 = context1->Global(); |
9525 global1->Set(v8_str("other"), global); | 9544 global1->Set(v8_str("other"), global); |
9526 | 9545 |
9527 // Should return 10, instead of 11 | 9546 // Should return 10, instead of 11 |
9528 v8::Handle<Value> value = v8_compile("other.accessible")->Run(); | 9547 v8::Handle<Value> value = v8_compile("other.accessible")->Run(); |
9529 CHECK(value->IsNumber()); | 9548 CHECK(value->IsNumber()); |
9530 CHECK_EQ(10, value->Int32Value()); | 9549 CHECK_EQ(10, value->Int32Value()); |
9531 | 9550 |
9532 value = v8_compile("other.unreachable")->Run(); | 9551 value = v8_compile("other.unreachable")->Run(); |
9533 CHECK(value->IsUndefined()); | 9552 CHECK(value.IsEmpty()); |
9534 | 9553 |
9535 context1->Exit(); | 9554 context1->Exit(); |
9536 context0->Exit(); | 9555 context0->Exit(); |
9537 } | 9556 } |
9538 | 9557 |
9539 | 9558 |
9540 static int named_access_count = 0; | 9559 static int named_access_count = 0; |
9541 static int indexed_access_count = 0; | 9560 static int indexed_access_count = 0; |
9542 | 9561 |
9543 static bool NamedAccessCounter(Local<v8::Object> global, | 9562 static bool NamedAccessCounter(Local<v8::Object> global, |
(...skipping 5091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14635 buf[3] = 0; | 14654 buf[3] = 0; |
14636 templ->Set(v8_str(buf), v8::Number::New(isolate, k)); | 14655 templ->Set(v8_str(buf), v8::Number::New(isolate, k)); |
14637 } | 14656 } |
14638 } | 14657 } |
14639 } | 14658 } |
14640 | 14659 |
14641 Local<v8::Object> instance_1 = templ->NewInstance(); | 14660 Local<v8::Object> instance_1 = templ->NewInstance(); |
14642 context->Global()->Set(v8_str("obj_1"), instance_1); | 14661 context->Global()->Set(v8_str("obj_1"), instance_1); |
14643 | 14662 |
14644 Local<Value> value_1 = CompileRun("obj_1.a"); | 14663 Local<Value> value_1 = CompileRun("obj_1.a"); |
14645 CHECK(value_1->IsUndefined()); | 14664 CHECK(value_1.IsEmpty()); |
14646 | 14665 |
14647 Local<v8::Object> instance_2 = templ->NewInstance(); | 14666 Local<v8::Object> instance_2 = templ->NewInstance(); |
14648 context->Global()->Set(v8_str("obj_2"), instance_2); | 14667 context->Global()->Set(v8_str("obj_2"), instance_2); |
14649 | 14668 |
14650 Local<Value> value_2 = CompileRun("obj_2.a"); | 14669 Local<Value> value_2 = CompileRun("obj_2.a"); |
14651 CHECK(value_2->IsUndefined()); | 14670 CHECK(value_2.IsEmpty()); |
14652 } | 14671 } |
14653 | 14672 |
14654 | 14673 |
14655 // This tests that access check information remains on the global | 14674 // This tests that access check information remains on the global |
14656 // object template when creating contexts. | 14675 // object template when creating contexts. |
14657 THREADED_TEST(AccessControlRepeatedContextCreation) { | 14676 THREADED_TEST(AccessControlRepeatedContextCreation) { |
14658 v8::Isolate* isolate = CcTest::isolate(); | 14677 v8::Isolate* isolate = CcTest::isolate(); |
14659 v8::HandleScope handle_scope(isolate); | 14678 v8::HandleScope handle_scope(isolate); |
14660 v8::Handle<v8::ObjectTemplate> global_template = | 14679 v8::Handle<v8::ObjectTemplate> global_template = |
14661 v8::ObjectTemplate::New(isolate); | 14680 v8::ObjectTemplate::New(isolate); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14722 for (int i = 0; i < 4; i++) { | 14741 for (int i = 0; i < 4; i++) { |
14723 CHECK(g2->Call(global, 0, NULL)->Equals(v8_num(1))); | 14742 CHECK(g2->Call(global, 0, NULL)->Equals(v8_num(1))); |
14724 } | 14743 } |
14725 | 14744 |
14726 // Detach the global and turn on access check. | 14745 // Detach the global and turn on access check. |
14727 Local<Object> hidden_global = Local<Object>::Cast( | 14746 Local<Object> hidden_global = Local<Object>::Cast( |
14728 context->Global()->GetPrototype()); | 14747 context->Global()->GetPrototype()); |
14729 context->DetachGlobal(); | 14748 context->DetachGlobal(); |
14730 hidden_global->TurnOnAccessCheck(); | 14749 hidden_global->TurnOnAccessCheck(); |
14731 | 14750 |
14732 // Failing access check to property get results in undefined. | 14751 // Failing access check results in exception. |
14733 CHECK(f1->Call(global, 0, NULL)->IsUndefined()); | 14752 CHECK(f1->Call(global, 0, NULL).IsEmpty()); |
14734 CHECK(f2->Call(global, 0, NULL)->IsUndefined()); | 14753 CHECK(f2->Call(global, 0, NULL).IsEmpty()); |
14735 | |
14736 // Failing access check to function call results in exception. | |
14737 CHECK(g1->Call(global, 0, NULL).IsEmpty()); | 14754 CHECK(g1->Call(global, 0, NULL).IsEmpty()); |
14738 CHECK(g2->Call(global, 0, NULL).IsEmpty()); | 14755 CHECK(g2->Call(global, 0, NULL).IsEmpty()); |
14739 | 14756 |
14740 // No failing access check when just returning a constant. | 14757 // No failing access check when just returning a constant. |
14741 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1))); | 14758 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1))); |
14742 } | 14759 } |
14743 | 14760 |
14744 | 14761 |
14745 static const char* kPropertyA = "a"; | 14762 static const char* kPropertyA = "a"; |
14746 static const char* kPropertyH = "h"; | 14763 static const char* kPropertyH = "h"; |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14810 CHECK(g2->Call(global, 0, NULL)->Equals(v8_num(1))); | 14827 CHECK(g2->Call(global, 0, NULL)->Equals(v8_num(1))); |
14811 } | 14828 } |
14812 | 14829 |
14813 // Detach the global and turn on access check now blocking access to property | 14830 // Detach the global and turn on access check now blocking access to property |
14814 // a and function h. | 14831 // a and function h. |
14815 Local<Object> hidden_global = Local<Object>::Cast( | 14832 Local<Object> hidden_global = Local<Object>::Cast( |
14816 context->Global()->GetPrototype()); | 14833 context->Global()->GetPrototype()); |
14817 context->DetachGlobal(); | 14834 context->DetachGlobal(); |
14818 hidden_global->TurnOnAccessCheck(); | 14835 hidden_global->TurnOnAccessCheck(); |
14819 | 14836 |
14820 // Failing access check to property get results in undefined. | 14837 // Failing access check results in exception. |
14821 CHECK(f1->Call(global, 0, NULL)->IsUndefined()); | 14838 CHECK(f1->Call(global, 0, NULL).IsEmpty()); |
14822 CHECK(f2->Call(global, 0, NULL)->IsUndefined()); | 14839 CHECK(f2->Call(global, 0, NULL).IsEmpty()); |
14823 | |
14824 // Failing access check to function call results in exception. | |
14825 CHECK(g1->Call(global, 0, NULL).IsEmpty()); | 14840 CHECK(g1->Call(global, 0, NULL).IsEmpty()); |
14826 CHECK(g2->Call(global, 0, NULL).IsEmpty()); | 14841 CHECK(g2->Call(global, 0, NULL).IsEmpty()); |
14827 | 14842 |
14828 // No failing access check when just returning a constant. | 14843 // No failing access check when just returning a constant. |
14829 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1))); | 14844 CHECK(h->Call(global, 0, NULL)->Equals(v8_num(1))); |
14830 | 14845 |
14831 // Now compile the source again. And get the newly compiled functions, except | 14846 // Now compile the source again. And get the newly compiled functions, except |
14832 // for h for which access is blocked. | 14847 // for h for which access is blocked. |
14833 CompileRun(source); | 14848 CompileRun(source); |
14834 f1 = Local<Function>::Cast(hidden_global->Get(v8_str("f1"))); | 14849 f1 = Local<Function>::Cast(hidden_global->Get(v8_str("f1"))); |
14835 f2 = Local<Function>::Cast(hidden_global->Get(v8_str("f2"))); | 14850 f2 = Local<Function>::Cast(hidden_global->Get(v8_str("f2"))); |
14836 g1 = Local<Function>::Cast(hidden_global->Get(v8_str("g1"))); | 14851 g1 = Local<Function>::Cast(hidden_global->Get(v8_str("g1"))); |
14837 g2 = Local<Function>::Cast(hidden_global->Get(v8_str("g2"))); | 14852 g2 = Local<Function>::Cast(hidden_global->Get(v8_str("g2"))); |
14838 CHECK(hidden_global->Get(v8_str("h"))->IsUndefined()); | 14853 CHECK(hidden_global->Get(v8_str("h")).IsEmpty()); |
14839 | 14854 |
14840 // Failing access check to property get results in undefined. | 14855 // Failing access check results in exception. |
14841 CHECK(f1->Call(global, 0, NULL)->IsUndefined()); | 14856 v8::Local<v8::Value> result = f1->Call(global, 0, NULL); |
14842 CHECK(f2->Call(global, 0, NULL)->IsUndefined()); | 14857 CHECK(result.IsEmpty()); |
14843 | 14858 CHECK(f1->Call(global, 0, NULL).IsEmpty()); |
14844 // Failing access check to function call results in exception. | 14859 CHECK(f2->Call(global, 0, NULL).IsEmpty()); |
14845 CHECK(g1->Call(global, 0, NULL).IsEmpty()); | 14860 CHECK(g1->Call(global, 0, NULL).IsEmpty()); |
14846 CHECK(g2->Call(global, 0, NULL).IsEmpty()); | 14861 CHECK(g2->Call(global, 0, NULL).IsEmpty()); |
14847 } | 14862 } |
14848 | 14863 |
14849 | 14864 |
14850 // Tests that ScriptData can be serialized and deserialized. | 14865 // Tests that ScriptData can be serialized and deserialized. |
14851 TEST(PreCompileSerialization) { | 14866 TEST(PreCompileSerialization) { |
14852 v8::V8::Initialize(); | 14867 v8::V8::Initialize(); |
14853 LocalContext env; | 14868 LocalContext env; |
14854 v8::Isolate* isolate = env->GetIsolate(); | 14869 v8::Isolate* isolate = env->GetIsolate(); |
(...skipping 5502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20357 global_template->Set(v8_str("proxy"), proxy_object); | 20372 global_template->Set(v8_str("proxy"), proxy_object); |
20358 global_template->Set(v8_str("hidden"), object_with_hidden); | 20373 global_template->Set(v8_str("hidden"), object_with_hidden); |
20359 global_template->Set(v8_str("phidden"), object_with_protected_hidden); | 20374 global_template->Set(v8_str("phidden"), object_with_protected_hidden); |
20360 | 20375 |
20361 LocalContext context2(NULL, global_template); | 20376 LocalContext context2(NULL, global_template); |
20362 | 20377 |
20363 Local<Value> result1 = CompileRun("Object.getPrototypeOf(simple)"); | 20378 Local<Value> result1 = CompileRun("Object.getPrototypeOf(simple)"); |
20364 CHECK(result1->Equals(simple_object->GetPrototype())); | 20379 CHECK(result1->Equals(simple_object->GetPrototype())); |
20365 | 20380 |
20366 Local<Value> result2 = CompileRun("Object.getPrototypeOf(protected)"); | 20381 Local<Value> result2 = CompileRun("Object.getPrototypeOf(protected)"); |
20367 CHECK(result2->Equals(Undefined(isolate))); | 20382 CHECK(result2.IsEmpty()); |
20368 | 20383 |
20369 Local<Value> result3 = CompileRun("Object.getPrototypeOf(global)"); | 20384 Local<Value> result3 = CompileRun("Object.getPrototypeOf(global)"); |
20370 CHECK(result3->Equals(global_object->GetPrototype())); | 20385 CHECK(result3->Equals(global_object->GetPrototype())); |
20371 | 20386 |
20372 Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)"); | 20387 Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)"); |
20373 CHECK(result4->Equals(Undefined(isolate))); | 20388 CHECK(result4.IsEmpty()); |
20374 | 20389 |
20375 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)"); | 20390 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)"); |
20376 CHECK(result5->Equals( | 20391 CHECK(result5->Equals( |
20377 object_with_hidden->GetPrototype()->ToObject()->GetPrototype())); | 20392 object_with_hidden->GetPrototype()->ToObject()->GetPrototype())); |
20378 | 20393 |
20379 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)"); | 20394 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)"); |
20380 CHECK(result6->Equals(Undefined(isolate))); | 20395 CHECK(result6.IsEmpty()); |
20381 } | 20396 } |
20382 | 20397 |
20383 | 20398 |
20384 THREADED_TEST(Regress125988) { | 20399 THREADED_TEST(Regress125988) { |
20385 v8::HandleScope scope(CcTest::isolate()); | 20400 v8::HandleScope scope(CcTest::isolate()); |
20386 Handle<FunctionTemplate> intercept = FunctionTemplate::New(CcTest::isolate()); | 20401 Handle<FunctionTemplate> intercept = FunctionTemplate::New(CcTest::isolate()); |
20387 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter); | 20402 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter); |
20388 LocalContext env; | 20403 LocalContext env; |
20389 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction()); | 20404 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction()); |
20390 CompileRun("var a = new Object();" | 20405 CompileRun("var a = new Object();" |
(...skipping 1174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21565 v8::Handle<v8::FunctionTemplate> toJSON = | 21580 v8::Handle<v8::FunctionTemplate> toJSON = |
21566 v8::FunctionTemplate::New(isolate, UnreachableCallback); | 21581 v8::FunctionTemplate::New(isolate, UnreachableCallback); |
21567 | 21582 |
21568 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); | 21583 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); |
21569 } | 21584 } |
21570 // Create a context with a different security token so that the | 21585 // Create a context with a different security token so that the |
21571 // failed access check callback will be called on each access. | 21586 // failed access check callback will be called on each access. |
21572 LocalContext context1(NULL, global_template); | 21587 LocalContext context1(NULL, global_template); |
21573 context1->Global()->Set(v8_str("other"), global0); | 21588 context1->Global()->Set(v8_str("other"), global0); |
21574 | 21589 |
21575 ExpectString("JSON.stringify(other)", "{}"); | 21590 CHECK(CompileRun("JSON.stringify(other)").IsEmpty()); |
21576 ExpectString("JSON.stringify({ 'a' : other, 'b' : ['c'] })", | 21591 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty()); |
21577 "{\"a\":{},\"b\":[\"c\"]}"); | 21592 CHECK(CompileRun("JSON.stringify([other, 'b', 'c'])").IsEmpty()); |
21578 ExpectString("JSON.stringify([other, 'b', 'c'])", | |
21579 "[{},\"b\",\"c\"]"); | |
21580 | 21593 |
21581 v8::Handle<v8::Array> array = v8::Array::New(isolate, 2); | 21594 v8::Handle<v8::Array> array = v8::Array::New(isolate, 2); |
21582 array->Set(0, v8_str("a")); | 21595 array->Set(0, v8_str("a")); |
21583 array->Set(1, v8_str("b")); | 21596 array->Set(1, v8_str("b")); |
21584 context1->Global()->Set(v8_str("array"), array); | 21597 context1->Global()->Set(v8_str("array"), array); |
21585 ExpectString("JSON.stringify(array)", "[\"a\",\"b\"]"); | 21598 ExpectString("JSON.stringify(array)", "[\"a\",\"b\"]"); |
21586 array->TurnOnAccessCheck(); | 21599 array->TurnOnAccessCheck(); |
21587 ExpectString("JSON.stringify(array)", "[]"); | 21600 CHECK(CompileRun("JSON.stringify(array)").IsEmpty()); |
21588 ExpectString("JSON.stringify([array])", "[[]]"); | 21601 CHECK(CompileRun("JSON.stringify([array])").IsEmpty()); |
21589 ExpectString("JSON.stringify({'a' : array})", "{\"a\":[]}"); | 21602 CHECK(CompileRun("JSON.stringify({'a' : array})").IsEmpty()); |
21590 } | 21603 } |
21591 } | 21604 } |
21592 | 21605 |
21593 | 21606 |
21594 bool access_check_fail_thrown = false; | 21607 bool access_check_fail_thrown = false; |
21595 bool catch_callback_called = false; | 21608 bool catch_callback_called = false; |
21596 | 21609 |
21597 | 21610 |
21598 // Failed access check callback that performs a GC on each invocation. | 21611 // Failed access check callback that performs a GC on each invocation. |
21599 void FailedAccessCheckThrows(Local<v8::Object> target, | 21612 void FailedAccessCheckThrows(Local<v8::Object> target, |
(...skipping 1229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
22829 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); | 22842 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); |
22830 Local<Function> set = | 22843 Local<Function> set = |
22831 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); | 22844 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); |
22832 Local<Function> get = | 22845 Local<Function> get = |
22833 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); | 22846 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); |
22834 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); | 22847 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); |
22835 Handle<Value> args[] = { v8_num(14) }; | 22848 Handle<Value> args[] = { v8_num(14) }; |
22836 set->Call(x, 1, args); | 22849 set->Call(x, 1, args); |
22837 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); | 22850 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); |
22838 } | 22851 } |
OLD | NEW |