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 21837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
21848 " fake.age;\n" | 21848 " fake.age;\n" |
21849 " result = 1;\n" | 21849 " result = 1;\n" |
21850 " } catch (e) {\n" | 21850 " } catch (e) {\n" |
21851 " }\n" | 21851 " }\n" |
21852 " test(d+1);\n" | 21852 " test(d+1);\n" |
21853 "}\n" | 21853 "}\n" |
21854 "test(0);\n" | 21854 "test(0);\n" |
21855 "result;\n", | 21855 "result;\n", |
21856 0); | 21856 0); |
21857 } | 21857 } |
21858 | |
21859 | |
21860 static bool AccessSymbolsAlwaysBlocked(Local<v8::Object> global, | |
21861 Local<Value> name, v8::AccessType type, | |
21862 Local<Value> data) { | |
21863 if (!name->IsSymbol()) return true; | |
21864 i::PrintF("Access blocked.\n"); | |
21865 return false; | |
21866 } | |
21867 | |
21868 | |
21869 THREADED_TEST(Regress507553) { | |
21870 v8::Isolate* isolate = CcTest::isolate(); | |
21871 HandleScope scope(isolate); | |
21872 | |
21873 // Template for object with security check. | |
21874 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate); | |
21875 spreadable_template->SetAccessCheckCallbacks(AccessSymbolsAlwaysBlocked, | |
21876 NULL); | |
21877 | |
21878 // Context for "foreign" objects used in test. | |
21879 Local<Context> context = v8::Context::New(isolate); | |
21880 context->Enter(); | |
21881 | |
21882 // Object with explicit security check. | |
21883 Local<Object> protected_object = spreadable_template->NewInstance(); | |
21884 | |
21885 // JSGlobalProxy object, always have security check. | |
21886 Local<Object> proxy_object = context->Global(); | |
21887 | |
21888 // Global object, the prototype of proxy_object. No security checks. | |
21889 Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate); | |
adamk
2015/07/09 18:59:13
I don't think you need this stuff any more.
| |
21890 | |
21891 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate), | |
21892 v8::Boolean::New(isolate, true)); | |
21893 | |
21894 protected_object->Set(v8_str("length"), v8::Integer::New(isolate, 2)); | |
21895 protected_object->Set(0U, v8_str("a")); | |
21896 protected_object->Set(1U, v8_str("b")); | |
21897 | |
21898 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); | |
21899 global_template->Set(v8_str("protected"), protected_object); | |
21900 global_template->Set(v8_str("global"), global_object); | |
21901 | |
21902 context->Exit(); | |
21903 | |
21904 LocalContext context2(NULL, global_template); | |
21905 | |
21906 Local<Value> result1 = CompileRun("[].concat(protected)"); | |
21907 CHECK(result1->IsArray()); | |
21908 CHECK(result1.As<Object>()->Get(0)->Equals(protected_object)); | |
adamk
2015/07/09 18:59:13
I think you also want a test for an access checked
| |
21909 } | |
OLD | NEW |