Index: test/cctest/test-object-observe.cc |
diff --git a/test/cctest/test-object-observe.cc b/test/cctest/test-object-observe.cc |
index abd10117dd49ea4fa5c8f7191dc66ddb42f6fed9..07db3a3916e977b1cf29f040757e3544c5af6f5c 100644 |
--- a/test/cctest/test-object-observe.cc |
+++ b/test/cctest/test-object-observe.cc |
@@ -279,6 +279,7 @@ TEST(GlobalObjectObservation) { |
CHECK_EQ(3, CompileRun("records.length")->Int32Value()); |
} |
+ |
struct RecordExpectation { |
Handle<Value> object; |
const char* type; |
@@ -310,6 +311,9 @@ static void ExpectRecords(Handle<Value> records, |
} |
} |
+#define EXPECT_RECORDS(records, expectations) \ |
+ ExpectRecords(records, expectations, ARRAY_SIZE(expectations)) |
+ |
TEST(APITestBasicMutation) { |
HarmonyIsolate isolate; |
HandleScope scope; |
@@ -348,7 +352,50 @@ TEST(APITestBasicMutation) { |
{ obj, "deleted", "1", Number::New(5) }, |
{ obj, "deleted", "1.1", Number::New(6) } |
}; |
- ExpectRecords(CompileRun("records"), |
- expected_records, |
- ARRAY_SIZE(expected_records)); |
+ EXPECT_RECORDS(CompileRun("records"), expected_records); |
+} |
+ |
+TEST(HiddenPrototypeObservation) { |
+ HarmonyIsolate isolate; |
+ HandleScope scope; |
+ LocalContext context; |
+ Handle<FunctionTemplate> tmpl = FunctionTemplate::New(); |
+ tmpl->SetHiddenPrototype(true); |
+ tmpl->InstanceTemplate()->Set(String::New("foo"), Number::New(75)); |
+ Handle<Object> proto = tmpl->GetFunction()->NewInstance(); |
+ Handle<Object> obj = Object::New(); |
+ obj->SetPrototype(proto); |
+ context->Global()->Set(String::New("obj"), obj); |
+ context->Global()->Set(String::New("proto"), proto); |
+ CompileRun( |
+ "var records;" |
+ "function observer(r) { records = r; };" |
+ "Object.observe(obj, observer);" |
+ "obj.foo = 41;" // triggers a notification |
+ "proto.foo = 42;" // does not trigger a notification |
+ ); |
+ const RecordExpectation expected_records[] = { |
+ { obj, "updated", "foo", Number::New(75) } |
+ }; |
+ EXPECT_RECORDS(CompileRun("records"), expected_records); |
+ obj->SetPrototype(Null()); |
+ CompileRun("obj.foo = 43"); |
+ const RecordExpectation expected_records2[] = { |
+ { obj, "new", "foo", Handle<Value>() } |
+ }; |
+ EXPECT_RECORDS(CompileRun("records"), expected_records2); |
+ obj->SetPrototype(proto); |
+ CompileRun( |
+ "Object.observe(proto, observer);" |
+ "proto.bar = 1;" |
+ "Object.unobserve(obj, observer);" |
+ "obj.foo = 44;" |
+ ); |
+ const RecordExpectation expected_records3[] = { |
+ { proto, "new", "bar", Handle<Value>() } |
+ // TODO(adamk): The below record should be emitted since proto is observed |
+ // and has been modified. Not clear if this happens in practice. |
+ // { proto, "updated", "foo", Number::New(43) } |
+ }; |
+ EXPECT_RECORDS(CompileRun("records"), expected_records3); |
} |