OLD | NEW |
---|---|
1 // Helper method that waits for a {success: <boolean>, result: any} reply on | 1 // Helper method that waits for a {success: <boolean>, result: any} reply on |
2 // a port and returns a promise that resolves (if success is true) or rejects | 2 // a port and returns a promise that resolves (if success is true) or rejects |
3 // the promise with the value of the result attribute. | 3 // the promise with the value of the result attribute. |
4 function reply_as_promise(t, port) { | 4 function reply_as_promise(t, port) { |
5 return new Promise(function(resolve, reject) { | 5 return new Promise(function(resolve, reject) { |
6 var got_reply = false; | 6 var got_reply = false; |
7 port.onmessage = t.step_func(function(event) { | 7 port.onmessage = t.step_func(function(event) { |
8 assert_false(got_reply); | 8 assert_false(got_reply); |
9 assert_true('success' in event.data); | 9 assert_true('success' in event.data); |
10 assert_true('result' in event.data); | 10 assert_true('result' in event.data); |
(...skipping 27 matching lines...) Expand all Loading... | |
38 function connect_from_worker(t, service) { | 38 function connect_from_worker(t, service) { |
39 // |service| is a relative URL, but for this to work from the worker it needs | 39 // |service| is a relative URL, but for this to work from the worker it needs |
40 // an absolute URL. | 40 // an absolute URL. |
41 var target_url = location.origin + base_path() + service; | 41 var target_url = location.origin + base_path() + service; |
42 var worker = new Worker('resources/connect-helper.js'); | 42 var worker = new Worker('resources/connect-helper.js'); |
43 var channel = new MessageChannel(); | 43 var channel = new MessageChannel(); |
44 worker.postMessage | 44 worker.postMessage |
45 ({connect: target_url, port: channel.port2}, [channel.port2]); | 45 ({connect: target_url, port: channel.port2}, [channel.port2]); |
46 return reply_as_promise(t, channel.port1); | 46 return reply_as_promise(t, channel.port1); |
47 } | 47 } |
48 | |
49 // Similar to Promise.race, except that returned promise only rejects if all | |
50 // passed promises reject. Used temporarily to support both old and new client | |
51 // side APIs. | |
52 function first_to_resolve(promises) { | |
53 return new Promise(function(resolve, reject) { | |
54 var remaining = promises.length; | |
55 var resolved = false; | |
56 for (var i = 0; i < promises.length; ++i) { | |
57 Promise.resolve(promises[i]) | |
58 .then(function(result) { | |
59 if (!resolved) { | |
60 resolve(result); | |
61 resolved = true; | |
62 } | |
63 }) | |
64 .catch(function(result) { | |
65 remaining--; | |
66 if (remaining === 0) { | |
67 reject(result); | |
68 } | |
69 }); | |
70 } | |
71 }); | |
72 } | |
73 | |
74 // Takes (a promise resolving to) a ServicePort instance, and returns a Promise | |
75 // that resolves to a MessagePort wrapping that ServicePort. Used to support | |
76 // both old and new APIs at the same time. | |
77 function wrap_in_port(maybe_port) { | |
78 return Promise.resolve(maybe_port).then( | |
79 function(port) { | |
80 var channel = new MessageChannel(); | |
81 channel.port2.onmessage = function(event) { | |
82 port.postMessage(event.data, event.ports); | |
83 }; | |
84 // Should use addEventListener and check source of event, but source isn't | |
85 // set yet, so for now just assume only one wrapped port is used at a time . | |
86 navigator.services.onmessage = function(event) { | |
87 channel.port2.postMessage(event.data, event.ports); | |
88 }; | |
89 return channel.port1; | |
90 } | |
91 ); | |
92 } | |
93 | |
94 var promise_tests = Promise.resolve(); | |
95 // Helper function to run promise tests one after the other. | |
96 // TODO(ortuno): Remove once https://github.com/w3c/testharness.js/pull/115/file s | |
97 // gets through. | |
98 function sequential_promise_test(func, name) { | |
scheib
2015/06/24 04:16:55
Instead of duplicating this, move the definition t
Marijn Kruisselbrink
2015/06/24 17:03:27
It would have to be under LayoutTests/http/tests/r
scheib
2015/06/24 23:00:48
Seems worthwhile to do -- a precursor CL or in thi
Marijn Kruisselbrink
2015/06/24 23:42:47
Will do, but in a separate CL, since adjusting all
| |
99 var test = async_test(name); | |
100 promise_tests = promise_tests.then(function() { | |
101 return test.step(func, test, test); | |
102 }).then(function() { | |
103 test.done(); | |
104 }).catch(test.step_func(function(value) { | |
105 // step_func catches the error again so the error doesn't propagate. | |
106 throw value; | |
107 })); | |
108 } | |
OLD | NEW |