1 // Copyright 2015 The Chromium 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.
5 // The "onsync" event currently understands commands (passed as
6 // registration tags) coming from the test. Any other tag is
7 // passed through to the document unchanged.
9 // "delay" - Delays finishing the sync event with event.waitUntil.
10 // Send a postMessage of "completeDelayedOneShot" to finish the
12 // "unregister" - Unregisters the sync registration from within the sync event.
16 var resolveCallback
= null;
17 var rejectCallback
= null;
19 this.onmessage = function(event
) {
20 if (event
.data
=== 'completeDelayedOneShot') {
21 if (resolveCallback
=== null) {
22 sendMessageToClients('sync', 'error - resolveCallback is null');
27 sendMessageToClients('sync', 'ok - delay completed');
31 if (event
.data
=== 'rejectDelayedOneShot') {
32 if (rejectCallback
=== null) {
33 sendMessageToClients('sync', 'error - rejectCallback is null');
38 sendMessageToClients('sync', 'ok - delay rejected');
42 this.onsync = function(event
) {
43 var eventProperties
= [
44 // Extract name from toString result: "[object <Class>]"
45 Object
.prototype.toString
.call(event
).match(/\s([a-zA-Z]+)/)[1],
46 (typeof event
.waitUntil
)
49 if (eventProperties
[0] != 'SyncEvent') {
50 sendMessageToClients('sync', 'error - wrong event type');
54 if (eventProperties
[1] != 'function') {
55 sendMessageToClients('sync', 'error - wrong wait until type');
58 if (event
.registration
=== undefined) {
59 sendMessageToClients('sync', 'error - event missing registration');
63 if (event
.registration
.tag
=== undefined) {
64 sendMessageToClients('sync', 'error - registration missing tag');
68 var tag
= event
.registration
.tag
;
70 if (tag
=== 'delay') {
71 var syncPromise
= new Promise(function(resolve
, reject
) {
72 resolveCallback
= resolve
;
73 rejectCallback
= reject
;
75 event
.waitUntil(syncPromise
);
79 if (tag
=== 'unregister') {
80 event
.waitUntil(event
.registration
.unregister()
82 sendMessageToClients('sync', 'ok - unregister completed');
87 sendMessageToClients('sync', tag
+ ' fired');
90 function sendMessageToClients(type
, data
) {
91 clients
.matchAll().then(function(clients
) {
92 clients
.forEach(function(client
) {
93 client
.postMessage({type
, data
});