| 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 16762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16773 } | 16773 } |
| 16774 } | 16774 } |
| 16775 } | 16775 } |
| 16776 | 16776 |
| 16777 | 16777 |
| 16778 // Failed access check callback that performs a GC on each invocation. | 16778 // Failed access check callback that performs a GC on each invocation. |
| 16779 void FailedAccessCheckCallbackGC(Local<v8::Object> target, | 16779 void FailedAccessCheckCallbackGC(Local<v8::Object> target, |
| 16780 v8::AccessType type, | 16780 v8::AccessType type, |
| 16781 Local<v8::Value> data) { | 16781 Local<v8::Value> data) { |
| 16782 CcTest::heap()->CollectAllGarbage(); | 16782 CcTest::heap()->CollectAllGarbage(); |
| 16783 CcTest::isolate()->ThrowException( |
| 16784 v8::Exception::Error(v8_str("cross context"))); |
| 16783 } | 16785 } |
| 16784 | 16786 |
| 16785 | 16787 |
| 16786 TEST(GCInFailedAccessCheckCallback) { | 16788 TEST(GCInFailedAccessCheckCallback) { |
| 16787 // Install a failed access check callback that performs a GC on each | 16789 // Install a failed access check callback that performs a GC on each |
| 16788 // invocation. Then force the callback to be called from va | 16790 // invocation. Then force the callback to be called from va |
| 16789 | 16791 |
| 16790 v8::V8::Initialize(); | 16792 v8::V8::Initialize(); |
| 16791 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); | 16793 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); |
| 16792 | 16794 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 16803 // Create a context and set an x property on it's global object. | 16805 // Create a context and set an x property on it's global object. |
| 16804 LocalContext context0(NULL, global_template); | 16806 LocalContext context0(NULL, global_template); |
| 16805 context0->Global()->Set(v8_str("x"), v8_num(42)); | 16807 context0->Global()->Set(v8_str("x"), v8_num(42)); |
| 16806 v8::Handle<v8::Object> global0 = context0->Global(); | 16808 v8::Handle<v8::Object> global0 = context0->Global(); |
| 16807 | 16809 |
| 16808 // Create a context with a different security token so that the | 16810 // Create a context with a different security token so that the |
| 16809 // failed access check callback will be called on each access. | 16811 // failed access check callback will be called on each access. |
| 16810 LocalContext context1(NULL, global_template); | 16812 LocalContext context1(NULL, global_template); |
| 16811 context1->Global()->Set(v8_str("other"), global0); | 16813 context1->Global()->Set(v8_str("other"), global0); |
| 16812 | 16814 |
| 16815 v8::TryCatch try_catch(isolate); |
| 16816 |
| 16813 // Get property with failed access check. | 16817 // Get property with failed access check. |
| 16814 ExpectUndefined("other.x"); | 16818 CHECK(CompileRun("other.x").IsEmpty()); |
| 16819 CHECK(try_catch.HasCaught()); |
| 16820 try_catch.Reset(); |
| 16815 | 16821 |
| 16816 // Get element with failed access check. | 16822 // Get element with failed access check. |
| 16817 ExpectUndefined("other[0]"); | 16823 CHECK(CompileRun("other[0]").IsEmpty()); |
| 16824 CHECK(try_catch.HasCaught()); |
| 16825 try_catch.Reset(); |
| 16818 | 16826 |
| 16819 // Set property with failed access check. | 16827 // Set property with failed access check. |
| 16820 v8::Handle<v8::Value> result = CompileRun("other.x = new Object()"); | 16828 CHECK(CompileRun("other.x = new Object()").IsEmpty()); |
| 16821 CHECK(result->IsObject()); | 16829 CHECK(try_catch.HasCaught()); |
| 16830 try_catch.Reset(); |
| 16822 | 16831 |
| 16823 // Set element with failed access check. | 16832 // Set element with failed access check. |
| 16824 result = CompileRun("other[0] = new Object()"); | 16833 CHECK(CompileRun("other[0] = new Object()").IsEmpty()); |
| 16825 CHECK(result->IsObject()); | 16834 CHECK(try_catch.HasCaught()); |
| 16835 try_catch.Reset(); |
| 16826 | 16836 |
| 16827 // Get property attribute with failed access check. | 16837 // Get property attribute with failed access check. |
| 16828 ExpectFalse("\'x\' in other"); | 16838 CHECK(CompileRun("\'x\' in other").IsEmpty()); |
| 16839 CHECK(try_catch.HasCaught()); |
| 16840 try_catch.Reset(); |
| 16829 | 16841 |
| 16830 // Get property attribute for element with failed access check. | 16842 // Get property attribute for element with failed access check. |
| 16831 ExpectFalse("0 in other"); | 16843 CHECK(CompileRun("0 in other").IsEmpty()); |
| 16844 CHECK(try_catch.HasCaught()); |
| 16845 try_catch.Reset(); |
| 16832 | 16846 |
| 16833 // Delete property. | 16847 // Delete property. |
| 16834 ExpectFalse("delete other.x"); | 16848 CHECK(CompileRun("delete other.x").IsEmpty()); |
| 16849 CHECK(try_catch.HasCaught()); |
| 16850 try_catch.Reset(); |
| 16835 | 16851 |
| 16836 // Delete element. | 16852 // Delete element. |
| 16837 CHECK_EQ(false, global0->Delete(0)); | 16853 CHECK_EQ(false, global0->Delete(0)); |
| 16838 | 16854 |
| 16839 // DefineAccessor. | 16855 // DefineAccessor. |
| 16840 CHECK_EQ(false, | 16856 CHECK_EQ(false, |
| 16841 global0->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("x"))); | 16857 global0->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("x"))); |
| 16842 | 16858 |
| 16843 // Define JavaScript accessor. | 16859 // Define JavaScript accessor. |
| 16844 ExpectUndefined("Object.prototype.__defineGetter__.call(" | 16860 CHECK(CompileRun( |
| 16845 " other, \'x\', function() { return 42; })"); | 16861 "Object.prototype.__defineGetter__.call(" |
| 16862 " other, \'x\', function() { return 42; })").IsEmpty()); |
| 16863 CHECK(try_catch.HasCaught()); |
| 16864 try_catch.Reset(); |
| 16846 | 16865 |
| 16847 // LookupAccessor. | 16866 // LookupAccessor. |
| 16848 ExpectUndefined("Object.prototype.__lookupGetter__.call(" | 16867 CHECK(CompileRun( |
| 16849 " other, \'x\')"); | 16868 "Object.prototype.__lookupGetter__.call(" |
| 16869 " other, \'x\')").IsEmpty()); |
| 16870 CHECK(try_catch.HasCaught()); |
| 16871 try_catch.Reset(); |
| 16850 | 16872 |
| 16851 // HasOwnElement. | 16873 // HasOwnElement. |
| 16852 ExpectFalse("Object.prototype.hasOwnProperty.call(other, \'0\')"); | 16874 CHECK(CompileRun( |
| 16875 "Object.prototype.hasOwnProperty.call(" |
| 16876 "other, \'0\')").IsEmpty()); |
| 16877 CHECK(try_catch.HasCaught()); |
| 16878 try_catch.Reset(); |
| 16853 | 16879 |
| 16854 CHECK_EQ(false, global0->HasRealIndexedProperty(0)); | 16880 CHECK_EQ(false, global0->HasRealIndexedProperty(0)); |
| 16855 CHECK_EQ(false, global0->HasRealNamedProperty(v8_str("x"))); | 16881 CHECK_EQ(false, global0->HasRealNamedProperty(v8_str("x"))); |
| 16856 CHECK_EQ(false, global0->HasRealNamedCallbackProperty(v8_str("x"))); | 16882 CHECK_EQ(false, global0->HasRealNamedCallbackProperty(v8_str("x"))); |
| 16857 | 16883 |
| 16858 // Reset the failed access check callback so it does not influence | 16884 // Reset the failed access check callback so it does not influence |
| 16859 // the other tests. | 16885 // the other tests. |
| 16860 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); | 16886 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); |
| 16861 } | 16887 } |
| 16862 | 16888 |
| (...skipping 4647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21510 CHECK_EQ(2U, set->Size()); | 21536 CHECK_EQ(2U, set->Size()); |
| 21511 | 21537 |
| 21512 v8::Local<v8::Array> keys = set->AsArray(); | 21538 v8::Local<v8::Array> keys = set->AsArray(); |
| 21513 CHECK_EQ(2U, keys->Length()); | 21539 CHECK_EQ(2U, keys->Length()); |
| 21514 CHECK_EQ(1, keys->Get(0).As<v8::Int32>()->Value()); | 21540 CHECK_EQ(1, keys->Get(0).As<v8::Int32>()->Value()); |
| 21515 CHECK_EQ(2, keys->Get(1).As<v8::Int32>()->Value()); | 21541 CHECK_EQ(2, keys->Get(1).As<v8::Int32>()->Value()); |
| 21516 | 21542 |
| 21517 set = v8::Set::FromArray(env.local(), keys).ToLocalChecked(); | 21543 set = v8::Set::FromArray(env.local(), keys).ToLocalChecked(); |
| 21518 CHECK_EQ(2U, set->Size()); | 21544 CHECK_EQ(2U, set->Size()); |
| 21519 } | 21545 } |
| OLD | NEW |