1d3a5f576840015fc44df81b7e357ab7c5e76b51
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / LayoutTests / http / tests / serviceworker / resources / worker-test-harness.js
1 /*
2  * worker-test-harness should be considered a temporary polyfill around
3  * testharness.js for supporting Service Worker based tests. It should not be
4  * necessary once the test harness is able to drive worker based tests natively.
5  * See https://github.com/w3c/testharness.js/pull/82 for status of effort to
6  * update upstream testharness.js. Once the upstreaming is complete, tests that
7  * reference worker-test-harness should be updated to directly import
8  * testharness.js.
9  */
10
11 // The following are necessary to appease attempts by testharness to access the
12 // DOM.
13 self.document = {getElementsByTagName: function() { return []; }};
14 self.window = self;
15 self.parent = self;
16
17 // An onload event handler is used to indicate to the testharness that the
18 // document has finished loading. At this point the test suite would be
19 // considered complete if there are no more pending tests and the test isn't
20 // marked as requring an explicit done() call.
21 //
22 // Since ServiceWorkers don't have an onload event, we monkey-patch
23 // addEventListener to rewire the event to be fired at oninstall which is
24 // functionally equivalent to onload.
25 (function() {
26   var previous_addEventListener = self.addEventListener;
27   self.addEventListener = function() {
28     if (arguments.length > 0 && arguments[0] == 'load') {
29       arguments[0] = 'install';
30     }
31     previous_addEventListener.apply(this, arguments);
32   };
33 })();
34
35 importScripts('/resources/testharness.js');
36
37 (function() {
38   // This prevents the worker from attempting to display test results using the
39   // DOM.
40   setup({output: false});
41
42   // Once the test are considered complete, this logic packages up all the
43   // results into a promise resolution so that it can be passed back to the
44   // client document when it connects.
45   var completion_promise = new Promise(function(resolve, reject) {
46       add_completion_callback(function(tests, harness_status) {
47           var results = {
48             tests: tests.map(function(test) {
49                 return test.structured_clone();
50               }),
51             status: harness_status.structured_clone()
52           };
53           resolve(results);
54         });
55     });
56
57   // The 'fetch_results' message is sent by the client document to signal that
58   // it is now ready to receive test results. It also includes a MessagePort
59   // which the worker should use to communicate.
60   self.addEventListener('message', function(ev) {
61       var message = ev.data;
62       if (message.type == 'fetch_results') {
63         var port = ev.ports[0];
64         completion_promise.then(function(results) {
65             var message = {
66               type: 'complete',
67               tests: results.tests,
68               status: results.status
69             };
70             port.postMessage(message);
71           });
72       }
73     });
74 })();
75
76 // 'promise_test' is a new kind of testharness test that handles some
77 // boilerplate for testing with promises.
78 function promise_test(func, name, properties) {
79   properties = properties || {};
80   var test = async_test(name, properties);
81   Promise.resolve(test.step(func, test, test))
82     .then(function() { test.done(); })
83     .catch(test.step_func(function(value) {
84         throw value;
85       }));
86 }