blob: dd180d40c7fea9784cf5d7d25a96f82418636152 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// The "onsync" event currently understands commands (passed as
// registration tags) coming from the test. Any other tag is
// passed through to the document unchanged.
//
// "delay" - Delays finishing the sync event with event.waitUntil.
// Send a postMessage of "completeDelayedRegistration" to finish the
// event.
'use strict';
var resolveCallback = null;
var rejectCallback = null;
this.onmessage = function(event) {
if (event.data['action'] === 'completeDelayedSyncEvent') {
if (resolveCallback === null) {
sendMessageToClients('sync', 'error - resolveCallback is null');
return;
}
resolveCallback();
sendMessageToClients('sync', 'ok - delay completed');
return;
}
if (event.data['action'] === 'rejectDelayedSyncEvent') {
if (rejectCallback === null) {
sendMessageToClients('sync', 'error - rejectCallback is null');
return;
}
rejectCallback();
sendMessageToClients('sync', 'ok - delay rejected');
}
if (event.data['action'] === 'register') {
var tag = event.data['tag'];
registration.sync.register(tag)
.then(function () {
sendMessageToClients('register', 'ok - ' + tag + ' registered in SW');
})
.catch(sendSyncErrorToClients);
}
if (event.data['action'] === 'hasTag') {
var tag = event.data['tag'];
registration.sync.getTags()
.then(function(tags) {
if (tags.indexOf(tag) >= 0) {
sendMessageToClients('register', 'ok - ' + tag + ' found');
} else {
sendMessageToClients('register', 'error - ' + tag + ' not found');
return;
}
})
.catch(sendSyncErrorToClients);
}
if (event.data['action'] === 'getTags') {
registration.sync.getTags()
.then(function(tags) {
sendMessageToClients('register', 'ok - ' + tags.toString());
})
.catch(sendSyncErrorToClients);
}
}
this.onsync = function(event) {
var eventProperties = [
// Extract name from toString result: "[object <Class>]"
Object.prototype.toString.call(event).match(/\s([a-zA-Z]+)/)[1],
(typeof event.waitUntil)
];
if (eventProperties[0] != 'SyncEvent') {
sendMessageToClients('sync', 'error - wrong event type');
return;
}
if (eventProperties[1] != 'function') {
sendMessageToClients('sync', 'error - wrong wait until type');
}
if (event.tag === undefined) {
sendMessageToClients('sync', 'error - registration missing tag');
return;
}
var tag = event.tag;
if (tag === 'delay') {
var syncPromise = new Promise(function(resolve, reject) {
resolveCallback = resolve;
rejectCallback = reject;
});
event.waitUntil(syncPromise);
return;
}
sendMessageToClients('sync', tag + ' fired');
};
function sendMessageToClients(type, data) {
clients.matchAll({ includeUncontrolled: true }).then(function(clients) {
clients.forEach(function(client) {
client.postMessage({type, data});
});
}, function(error) {
console.log(error);
});
}
function sendSyncErrorToClients(error) {
sendMessageToClients('sync', error.name + ' - ' + error.message);
}