OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2014 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 // Flags: --allow-natives-syntax --expose-debug-as debug | |
6 | |
7 Debug = debug.Debug; | |
8 | |
9 var eventsExpected = 13; | |
10 var exception = null; | |
11 var result = []; | |
12 | |
13 function updatePromise(promise, parentPromise, status, value) { | |
14 var i; | |
15 for (i = 0; i < result.length; ++i) { | |
16 if (result[i].promise === promise) { | |
17 result[i].parentPromise = parentPromise || result[i].parentPromise; | |
18 result[i].status = status || result[i].status; | |
19 result[i].value = value || result[i].value; | |
20 break; | |
21 } | |
22 } | |
23 assertTrue(i < result.length); | |
24 } | |
25 | |
26 function listener(event, exec_state, event_data, data) { | |
27 if (event != Debug.DebugEvent.PromiseEvent) return; | |
28 try { | |
29 eventsExpected--; | |
30 if (event_data.status() === 0) { | |
31 // New promise. | |
32 assertTrue(event_data.promise().isPromise()); | |
33 assertEquals("pending", event_data.promise().status()); | |
34 result.push({ promise: event_data.promise().value(), status: 0 }); | |
35 } else if (event_data.status() !== undefined) { | |
36 // Resolve/reject promise. | |
37 assertTrue(event_data.promise().isPromise()); | |
38 updatePromise(event_data.promise().value(), | |
39 undefined, | |
40 event_data.status(), | |
41 event_data.value().value()); | |
42 } else { | |
43 // Chain promises. | |
44 assertTrue(event_data.promise().isPromise()); | |
aandrey
2014/08/01 13:22:21
code dup x3
Alexandra Mikhaylova
2014/08/01 13:44:53
Done.
| |
45 assertTrue(event_data.parentPromise().isPromise()); | |
46 updatePromise(event_data.promise().value(), | |
47 event_data.parentPromise().value()); | |
48 } | |
49 } catch (e) { | |
50 print(e + e.stack) | |
51 exception = e; | |
52 } | |
53 } | |
54 | |
55 Debug.setListener(listener); | |
56 | |
57 function resolver(resolve, reject) { | |
58 resolve(); | |
59 } | |
60 | |
61 var p1 = new Promise(resolver); | |
62 var p2 = p1.then().then(); | |
63 var p3 = new Promise(function(resolve, reject) { reject("rejected"); }); | |
64 var p4 = p3.then(); | |
aandrey
2014/08/01 13:22:21
there is still no tree of promises, isn't it? mayb
Alexandra Mikhaylova
2014/08/01 13:44:53
Done.
| |
65 | |
66 function assertOrAbort(b, s) { | |
aandrey
2014/08/01 13:22:21
can we use same name from where it's copied, to ea
Alexandra Mikhaylova
2014/08/01 13:44:53
Done.
| |
67 if (b) { | |
68 print(s, "succeeded"); | |
69 } else { | |
70 %AbortJS(s + " FAILED!"); | |
71 } | |
72 } | |
73 | |
74 function testDone(iteration) { | |
75 var iteration = iteration || 0; | |
76 var dummy = {}; | |
77 Object.observe(dummy, | |
78 function() { | |
aandrey
2014/08/01 13:22:21
extract this function to top level
Alexandra Mikhaylova
2014/08/01 13:44:53
Done.
| |
79 if (eventsExpected === 0) { | |
80 assertOrAbort(result.length === 5, "result.length"); | |
81 | |
82 assertOrAbort(result[0].promise === p1, | |
83 "result[0].promise"); | |
84 assertOrAbort(result[0].parentPromise === undefined, | |
85 "result[0].parentPromise"); | |
86 assertOrAbort(result[0].status === 1, "result[0].status"); | |
87 assertOrAbort(result[0].value === undefined, | |
88 "result[0].value"); | |
89 | |
90 assertOrAbort(result[1].parentPromise === p1, | |
91 "result[1].parentPromise"); | |
92 assertOrAbort(result[1].status === 1, "result[1].status"); | |
93 | |
94 assertOrAbort(result[2].promise === p2, | |
95 "result[2].promise"); | |
96 | |
97 assertOrAbort(result[3].promise === p3, | |
98 "result[3].promise"); | |
99 assertOrAbort(result[3].parentPromise === undefined, | |
100 "result[3].parentPromise"); | |
101 assertOrAbort(result[3].status === -1, "result[3].status"); | |
102 assertOrAbort(result[3].value === "rejected", | |
103 "result[3].value"); | |
104 | |
105 assertOrAbort(result[4].promise === p4, | |
106 "result[4].promise"); | |
107 assertOrAbort(result[4].parentPromise === p3, | |
108 "result[4].parentPromise"); | |
109 assertOrAbort(result[4].status === -1, "result[4].status"); | |
110 assertOrAbort(result[4].value === "rejected", | |
111 "result[4].value"); | |
112 | |
113 assertOrAbort(exception === null, "exception === null"); | |
114 Debug.setListener(null); | |
115 } else if (iteration > 10) { | |
116 %AbortJS("Not all events were received!"); | |
117 } else { | |
118 testDone(iteration + 1); | |
119 } | |
120 }); | |
121 dummy.dummy = dummy; | |
122 } | |
123 | |
124 testDone(); | |
OLD | NEW |