/* global navigator:true, window:true, Modernizr:true, describe:true, expect:true, it:true, xit:true, before:true, beforeEach:true, after:true*/ var DRIVERS = [ localforage.INDEXEDDB, localforage.LOCALSTORAGE, localforage.WEBSQL ]; DRIVERS.forEach(function(driverName) { if ((!Modernizr.indexeddb && driverName === localforage.INDEXEDDB) || (!Modernizr.localstorage && driverName === localforage.LOCALSTORAGE) || (!Modernizr.websqldatabase && driverName === localforage.WEBSQL)) { // Browser doesn't support this storage library, so we exit the API // tests. return; } describe('Service Worker support in ' + driverName, function() { 'use strict'; // Use this until a test is added to Modernizr if (!('serviceworker' in Modernizr)) { Modernizr.serviceworker = 'serviceWorker' in navigator; } if (!Modernizr.serviceworker) { before.skip("doesn't have service worker support"); beforeEach.skip("doesn't have service worker support"); it.skip("doesn't have service worker support"); after.skip("doesn't have service worker support"); return; } if (!window.MessageChannel) { before.skip("doesn't have MessageChannel support"); beforeEach.skip("doesn't have MessageChannel support"); it.skip("doesn't have MessageChannel support"); after.skip("doesn't have MessageChannel support"); return; } before(function(done) { navigator.serviceWorker .register('/test/serviceworker-client.js') .then(function() { return localforage.setDriver(driverName); }) .then(done); }); after(function(done) { navigator.serviceWorker.ready .then(function(registration) { return registration.unregister(); }) .then(function(bool) { if (bool) { done(); } else { done('service worker failed to unregister'); } }); }); beforeEach(function(done) { localforage.clear(done); }); if (driverName === localforage.LOCALSTORAGE || driverName === localforage.WEBSQL) { it.skip(driverName + ' is not supported in service workers'); return; } xit('should set a value on registration', function(done) { navigator.serviceWorker.ready .then(function() { return localforage.getItem('service worker registration'); }) .then(function(result) { expect(result) .to.equal('serviceworker present'); done(); }) .catch(function(error) { done(error); }); }); it('saves data', function(done) { var messageChannel = new MessageChannel(); messageChannel.port1.onmessage = function(event) { expect(event.data.body) .to.be('I have been set using ' + driverName); done(); }; navigator.serviceWorker.ready .then(function(registration) { registration.active.postMessage({ driver: driverName, value: 'I have been set' }, [messageChannel.port2]); }) .catch(function(error) { done(error); }); }); }); });