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 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
53 | 53 |
54 TEST(PerIsolateState) { | 54 TEST(PerIsolateState) { |
55 HarmonyIsolate isolate; | 55 HarmonyIsolate isolate; |
56 HandleScope scope; | 56 HandleScope scope; |
57 LocalContext context1; | 57 LocalContext context1; |
58 CompileRun( | 58 CompileRun( |
59 "var count = 0;" | 59 "var count = 0;" |
60 "var calls = 0;" | 60 "var calls = 0;" |
61 "var observer = function(records) { count = records.length; calls++ };" | 61 "var observer = function(records) { count = records.length; calls++ };" |
62 "var obj = {};" | 62 "var obj = {};" |
63 "Object.observe(obj, observer);" | 63 "Object.observe(obj, observer);"); |
64 "Object.notify(obj, {type: 'a'});"); | |
65 Handle<Value> observer = CompileRun("observer"); | 64 Handle<Value> observer = CompileRun("observer"); |
66 Handle<Value> obj = CompileRun("obj"); | 65 Handle<Value> obj = CompileRun("obj"); |
66 Handle<Value> notify_fun1 = CompileRun( | |
67 "(function() { Object.notify(obj, {type: 'a'}); })"); | |
68 Handle<Value> notify_fun2; | |
67 { | 69 { |
68 LocalContext context2; | 70 LocalContext context2; |
69 context2->Global()->Set(String::New("obj"), obj); | 71 context2->Global()->Set(String::New("obj"), obj); |
70 CompileRun("Object.notify(obj, {type: 'b'});"); | 72 notify_fun2 = CompileRun( |
73 "(function() { Object.notify(obj, {type: 'b'}); })"); | |
71 } | 74 } |
75 Handle<Value> notify_fun3; | |
72 { | 76 { |
73 LocalContext context3; | 77 LocalContext context3; |
74 context3->Global()->Set(String::New("obj"), obj); | 78 context3->Global()->Set(String::New("obj"), obj); |
75 CompileRun("Object.notify(obj, {type: 'c'});"); | 79 notify_fun3 = CompileRun( |
80 "(function() { Object.notify(obj, {type: 'c'}); })"); | |
76 } | 81 } |
77 { | 82 { |
78 LocalContext context4; | 83 LocalContext context4; |
79 context4->Global()->Set(String::New("observer"), observer); | 84 context4->Global()->Set(String::New("observer"), observer); |
80 CompileRun("Object.deliverChangeRecords(observer)"); | 85 context4->Global()->Set(String::New("fun1"), notify_fun1); |
86 context4->Global()->Set(String::New("fun2"), notify_fun2); | |
87 context4->Global()->Set(String::New("fun3"), notify_fun3); | |
88 CompileRun("fun1(); fun2(); fun3(); Object.deliverChangeRecords(observer)"); | |
81 } | 89 } |
82 CHECK_EQ(1, CompileRun("calls")->Int32Value()); | 90 CHECK_EQ(1, CompileRun("calls")->Int32Value()); |
83 CHECK_EQ(3, CompileRun("count")->Int32Value()); | 91 CHECK_EQ(3, CompileRun("count")->Int32Value()); |
84 } | 92 } |
93 | |
94 TEST(EndOfMicrotaskDelivery) { | |
95 HarmonyIsolate isolate; | |
96 HandleScope scope; | |
97 LocalContext context; | |
98 CompileRun( | |
99 "var obj = {};" | |
100 "var count = 0;" | |
101 "var observer = function(records) { count = records.length };" | |
102 "Object.observe(obj, observer);" | |
103 "Object.notify(obj, {type: 'a'});"); | |
104 CHECK_EQ(1, CompileRun("count")->Int32Value()); | |
105 } | |
106 | |
107 TEST(DeliveryOrdering) { | |
108 HarmonyIsolate isolate; | |
109 HandleScope scope; | |
110 LocalContext context; | |
111 CompileRun( | |
112 "var obj1 = {};" | |
113 "var obj2 = {};" | |
114 "var ordering = [];" | |
115 "function observer2() { ordering.push(2); };" | |
116 "function observer1() { ordering.push(1); };" | |
117 "function observer3() { ordering.push(3); };" | |
118 "Object.observe(obj1, observer1);" | |
119 "Object.observe(obj1, observer2);" | |
120 "Object.observe(obj1, observer3);" | |
121 "Object.notify(obj1, {type: 'a'});"); | |
122 CHECK_EQ(3, CompileRun("ordering.length")->Int32Value()); | |
123 CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); | |
124 CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); | |
125 CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); | |
126 CompileRun( | |
127 "ordering = [];" | |
128 "Object.observe(obj2, observer3);" | |
129 "Object.observe(obj2, observer2);" | |
130 "Object.observe(obj2, observer1);" | |
131 "Object.notify(obj2, {type: 'b'});"); | |
132 CHECK_EQ(3, CompileRun("ordering.length")->Int32Value()); | |
133 CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); | |
134 CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); | |
135 CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); | |
136 } | |
137 | |
138 TEST(DeliveryOrderingReentrant) { | |
139 HarmonyIsolate isolate; | |
140 HandleScope scope; | |
141 LocalContext context; | |
142 CompileRun( | |
143 "var obj = {};" | |
144 "var reentered = false;" | |
145 "var ordering = [];" | |
146 "function observer1() { ordering.push(1); };" | |
147 "function observer2() {" | |
148 " if (!reentered) {" | |
149 " Object.notify(obj, {type: 'b'});" | |
150 " reentered = true;" | |
151 " }" | |
152 " ordering.push(2);" | |
153 "};" | |
154 "function observer3() { ordering.push(3); };" | |
rafaelw
2012/11/06 17:04:41
maybe a comment noting that observer3 gets deliver
| |
155 "Object.observe(obj, observer1);" | |
156 "Object.observe(obj, observer2);" | |
157 "Object.observe(obj, observer3);" | |
158 "Object.notify(obj, {type: 'a'});"); | |
159 CHECK_EQ(5, CompileRun("ordering.length")->Int32Value()); | |
160 CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); | |
161 CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); | |
162 CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); | |
163 CHECK_EQ(1, CompileRun("ordering[3]")->Int32Value()); | |
164 CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); | |
165 } | |
OLD | NEW |