diff options
author | Steve Block <steveblock@google.com> | 2011-02-16 13:27:44 +0000 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-02-16 15:22:50 +0000 |
commit | 103cc40e0c7630e0dada7fcec7f9de7c16ef8844 (patch) | |
tree | 0b379f3183f0523f6a3f61925e124b09b3be23c9 /test/cctest | |
parent | 81362e16c30e9e970af6b17592f627ad8cdee4d8 (diff) | |
download | android_external_v8-103cc40e0c7630e0dada7fcec7f9de7c16ef8844.tar.gz android_external_v8-103cc40e0c7630e0dada7fcec7f9de7c16ef8844.tar.bz2 android_external_v8-103cc40e0c7630e0dada7fcec7f9de7c16ef8844.zip |
Merge V8 at Chromium 9.0.597.106
This is V8 branches/2.5 at r6641.
Note that the bug fix that we'd cherry-picked to Android
(http://code.google.com/p/v8/source/detail?r=6579)
was pulled into the 2.5 branch in
http://code.google.com/p/v8/source/detail?r=6601 so is
subsumed by this revision.
Change-Id: I63fd80c82c821d94e71db82e66cea0fbf33a1140
Diffstat (limited to 'test/cctest')
-rw-r--r-- | test/cctest/test-api.cc | 205 |
1 files changed, 188 insertions, 17 deletions
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc index fae5d3b7..4af0c52e 100644 --- a/test/cctest/test-api.cc +++ b/test/cctest/test-api.cc @@ -5133,11 +5133,13 @@ TEST(DetachAndReattachGlobal) { } +static bool allowed_access_type[v8::ACCESS_KEYS + 1] = { false }; static bool NamedAccessBlocker(Local<v8::Object> global, Local<Value> name, v8::AccessType type, Local<Value> data) { - return Context::GetCurrent()->Global()->Equals(global); + return Context::GetCurrent()->Global()->Equals(global) || + allowed_access_type[type]; } @@ -5145,7 +5147,8 @@ static bool IndexedAccessBlocker(Local<v8::Object> global, uint32_t key, v8::AccessType type, Local<Value> data) { - return Context::GetCurrent()->Global()->Equals(global); + return Context::GetCurrent()->Global()->Equals(global) || + allowed_access_type[type]; } @@ -5177,7 +5180,7 @@ static void UnreachableSetter(Local<String>, Local<Value>, } -THREADED_TEST(AccessControl) { +TEST(AccessControl) { v8::HandleScope handle_scope; v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); @@ -5203,6 +5206,27 @@ THREADED_TEST(AccessControl) { v8::Handle<v8::Object> global0 = context0->Global(); + // Define a property with JS getter and setter. + CompileRun( + "function getter() { return 'getter'; };\n" + "function setter() { return 'setter'; }\n" + "Object.defineProperty(this, 'js_accessor_p', {get:getter, set:setter})"); + + Local<Value> getter = global0->Get(v8_str("getter")); + Local<Value> setter = global0->Get(v8_str("setter")); + + // And define normal element. + global0->Set(239, v8_str("239")); + + // Define an element with JS getter and setter. + CompileRun( + "function el_getter() { return 'el_getter'; };\n" + "function el_setter() { return 'el_setter'; };\n" + "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});"); + + Local<Value> el_getter = global0->Get(v8_str("el_getter")); + Local<Value> el_setter = global0->Get(v8_str("el_setter")); + v8::HandleScope scope1; v8::Persistent<Context> context1 = Context::New(); @@ -5211,40 +5235,187 @@ THREADED_TEST(AccessControl) { v8::Handle<v8::Object> global1 = context1->Global(); global1->Set(v8_str("other"), global0); - v8::Handle<Value> value; - - // Access blocked property - value = v8_compile("other.blocked_prop = 1")->Run(); - value = v8_compile("other.blocked_prop")->Run(); - CHECK(value->IsUndefined()); + // Access blocked property. + CompileRun("other.blocked_prop = 1"); + + ExpectUndefined("other.blocked_prop"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'blocked_prop')"); + ExpectFalse("propertyIsEnumerable.call(other, 'blocked_prop')"); + + // Enable ACCESS_HAS + allowed_access_type[v8::ACCESS_HAS] = true; + ExpectUndefined("other.blocked_prop"); + // ... and now we can get the descriptor... + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'blocked_prop').value"); + // ... and enumerate the property. + ExpectTrue("propertyIsEnumerable.call(other, 'blocked_prop')"); + allowed_access_type[v8::ACCESS_HAS] = false; + + // Access blocked element. + CompileRun("other[239] = 1"); + + ExpectUndefined("other[239]"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239')"); + ExpectFalse("propertyIsEnumerable.call(other, '239')"); + + // Enable ACCESS_HAS + allowed_access_type[v8::ACCESS_HAS] = true; + ExpectUndefined("other[239]"); + // ... and now we can get the descriptor... + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '239').value"); + // ... and enumerate the property. + ExpectTrue("propertyIsEnumerable.call(other, '239')"); + allowed_access_type[v8::ACCESS_HAS] = false; + + // Access a property with JS accessor. + CompileRun("other.js_accessor_p = 2"); + + ExpectUndefined("other.js_accessor_p"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p')"); + + // Enable ACCESS_HAS. + allowed_access_type[v8::ACCESS_HAS] = true; + ExpectUndefined("other.js_accessor_p"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS and ACCESS_GET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_GET] = true; + + ExpectString("other.js_accessor_p", "getter"); + ExpectObject( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get", getter); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); + + allowed_access_type[v8::ACCESS_GET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS and ACCESS_SET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_SET] = true; + + ExpectUndefined("other.js_accessor_p"); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get"); + ExpectObject( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set", setter); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); + + allowed_access_type[v8::ACCESS_SET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS, ACCESS_GET and ACCESS_SET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_GET] = true; + allowed_access_type[v8::ACCESS_SET] = true; + + ExpectString("other.js_accessor_p", "getter"); + ExpectObject( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').get", getter); + ExpectObject( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').set", setter); + ExpectUndefined( + "Object.getOwnPropertyDescriptor(other, 'js_accessor_p').value"); + + allowed_access_type[v8::ACCESS_SET] = false; + allowed_access_type[v8::ACCESS_GET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Access an element with JS accessor. + CompileRun("other[42] = 2"); + + ExpectUndefined("other[42]"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42')"); + + // Enable ACCESS_HAS. + allowed_access_type[v8::ACCESS_HAS] = true; + ExpectUndefined("other[42]"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').get"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').set"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS and ACCESS_GET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_GET] = true; + + ExpectString("other[42]", "el_getter"); + ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').set"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); + + allowed_access_type[v8::ACCESS_GET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS and ACCESS_SET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_SET] = true; + + ExpectUndefined("other[42]"); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').get"); + ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); + + allowed_access_type[v8::ACCESS_SET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; + + // Enable both ACCESS_HAS, ACCESS_GET and ACCESS_SET. + allowed_access_type[v8::ACCESS_HAS] = true; + allowed_access_type[v8::ACCESS_GET] = true; + allowed_access_type[v8::ACCESS_SET] = true; + + ExpectString("other[42]", "el_getter"); + ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); + ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); + ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); + + allowed_access_type[v8::ACCESS_SET] = false; + allowed_access_type[v8::ACCESS_GET] = false; + allowed_access_type[v8::ACCESS_HAS] = false; - value = v8_compile("propertyIsEnumerable.call(other, 'blocked_prop')")->Run(); - CHECK(value->IsFalse()); + v8::Handle<Value> value; // Access accessible property - value = v8_compile("other.accessible_prop = 3")->Run(); + value = CompileRun("other.accessible_prop = 3"); CHECK(value->IsNumber()); CHECK_EQ(3, value->Int32Value()); CHECK_EQ(3, g_echo_value); - value = v8_compile("other.accessible_prop")->Run(); + value = CompileRun("other.accessible_prop"); CHECK(value->IsNumber()); CHECK_EQ(3, value->Int32Value()); - value = - v8_compile("propertyIsEnumerable.call(other, 'accessible_prop')")->Run(); + value = CompileRun( + "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); + CHECK(value->IsNumber()); + CHECK_EQ(3, value->Int32Value()); + + value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); CHECK(value->IsTrue()); // Enumeration doesn't enumerate accessors from inaccessible objects in // the prototype chain even if the accessors are in themselves accessible. - Local<Value> result = + value = CompileRun("(function(){var obj = {'__proto__':other};" "for (var p in obj)" " if (p == 'accessible_prop' || p == 'blocked_prop') {" " return false;" " }" "return true;})()"); - CHECK(result->IsTrue()); + CHECK(value->IsTrue()); context1->Exit(); context0->Exit(); |