Index: test/cctest/test-debug.cc |
=================================================================== |
--- test/cctest/test-debug.cc (revision 3255) |
+++ test/cctest/test-debug.cc (working copy) |
@@ -3439,7 +3439,74 @@ |
} |
+// See http://crbug.com/26491 |
Mads Ager (chromium)
2009/11/10 16:04:08
Could you add a one line description before the bu
yurys
2009/11/10 16:09:07
Done.
|
+TEST(NoHiddenProperties) { |
+ // Create a V8 environment with debug access. |
+ v8::HandleScope scope; |
+ DebugLocalContext env; |
+ env.ExposeDebug(); |
+ // Create an object in the global scope. |
+ const char* source = "var obj = {a: 1};"; |
+ v8::Script::Compile(v8::String::New(source))->Run(); |
+ v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast( |
+ env->Global()->Get(v8::String::New("obj"))); |
+ // Set a hidden property on the object. |
+ obj->SetHiddenValue(v8::String::New("v8::test-debug::a"), |
+ v8::Int32::New(11)); |
+ |
+ // Get mirror for the object with property getter. |
+ CompileRun("var obj_mirror = debug.MakeMirror(obj);"); |
+ CHECK(CompileRun( |
+ "obj_mirror instanceof debug.ObjectMirror")->BooleanValue()); |
+ CompileRun("var named_names = obj_mirror.propertyNames();"); |
+ // There should be exactly one property. But there is also an unnamed |
+ // property whose value is hidden properties dictionary. The latter |
+ // property should not be in the list of reguar properties. |
+ CHECK_EQ(1, CompileRun("named_names.length")->Int32Value()); |
+ CHECK(CompileRun("named_names[0] == 'a'")->BooleanValue()); |
+ CHECK(CompileRun( |
+ "obj_mirror.property('a').value().value() == 1")->BooleanValue()); |
+ |
+ // Object created by t0 will become hidden prototype of object 'obj'. |
+ v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(); |
+ t0->InstanceTemplate()->Set(v8::String::New("b"), v8::Number::New(2)); |
+ t0->SetHiddenPrototype(true); |
+ v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); |
+ t1->InstanceTemplate()->Set(v8::String::New("c"), v8::Number::New(3)); |
+ |
+ // Create proto objects, add hidden properties to them and set them on |
+ // the global object. |
+ v8::Handle<v8::Object> protoObj = t0->GetFunction()->NewInstance(); |
+ protoObj->SetHiddenValue(v8::String::New("v8::test-debug::b"), |
+ v8::Int32::New(12)); |
+ env->Global()->Set(v8::String::New("protoObj"), protoObj); |
+ v8::Handle<v8::Object> grandProtoObj = t1->GetFunction()->NewInstance(); |
+ grandProtoObj->SetHiddenValue(v8::String::New("v8::test-debug::c"), |
+ v8::Int32::New(13)); |
+ env->Global()->Set(v8::String::New("grandProtoObj"), grandProtoObj); |
+ |
+ // Setting prototypes: obj->protoObj->grandProtoObj |
+ protoObj->Set(v8::String::New("__proto__"), grandProtoObj); |
+ obj->Set(v8::String::New("__proto__"), protoObj); |
+ |
+ // Get mirror for the object with property getter. |
+ CompileRun("var obj_mirror = debug.MakeMirror(obj);"); |
+ CHECK(CompileRun( |
+ "obj_mirror instanceof debug.ObjectMirror")->BooleanValue()); |
+ CompileRun("var named_names = obj_mirror.propertyNames();"); |
+ // There should be exactly two properties - one from the object itself and |
+ // another from its hidden prototype. |
+ CHECK_EQ(2, CompileRun("named_names.length")->Int32Value()); |
+ CHECK(CompileRun("named_names.sort(); named_names[0] == 'a' &&" |
+ "named_names[1] == 'b'")->BooleanValue()); |
+ CHECK(CompileRun( |
+ "obj_mirror.property('a').value().value() == 1")->BooleanValue()); |
+ CHECK(CompileRun( |
+ "obj_mirror.property('b').value().value() == 2")->BooleanValue()); |
+} |
+ |
+ |
// Multithreaded tests of JSON debugger protocol |
// Support classes |