api-service-workers-spec.ts 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import * as fs from 'fs';
  2. import * as http from 'http';
  3. import * as path from 'path';
  4. import { session, webContents, WebContents } from 'electron/main';
  5. import { expect } from 'chai';
  6. import { v4 } from 'uuid';
  7. import { AddressInfo } from 'net';
  8. import { emittedOnce, emittedNTimes } from './lib/events-helpers';
  9. const partition = 'service-workers-spec';
  10. describe('session.serviceWorkers', () => {
  11. let ses: Electron.Session;
  12. let server: http.Server;
  13. let baseUrl: string;
  14. let w: WebContents = null as unknown as WebContents;
  15. before(async () => {
  16. ses = session.fromPartition(partition);
  17. await ses.clearStorageData();
  18. });
  19. beforeEach(async () => {
  20. const uuid = v4();
  21. server = http.createServer((req, res) => {
  22. // /{uuid}/{file}
  23. const file = req.url!.split('/')[2]!;
  24. if (file.endsWith('.js')) {
  25. res.setHeader('Content-Type', 'application/javascript');
  26. }
  27. res.end(fs.readFileSync(path.resolve(__dirname, 'fixtures', 'api', 'service-workers', file)));
  28. });
  29. await new Promise<void>(resolve => {
  30. server.listen(0, '127.0.0.1', () => {
  31. baseUrl = `http://localhost:${(server.address() as AddressInfo).port}/${uuid}`;
  32. resolve();
  33. });
  34. });
  35. w = (webContents as typeof ElectronInternal.WebContents).create({ session: ses });
  36. });
  37. afterEach(async () => {
  38. w.destroy();
  39. server.close();
  40. await ses.clearStorageData();
  41. });
  42. describe('getAllRunning()', () => {
  43. it('should initially report none are running', () => {
  44. expect(ses.serviceWorkers.getAllRunning()).to.deep.equal({});
  45. });
  46. it('should report one as running once you load a page with a service worker', async () => {
  47. await emittedOnce(ses.serviceWorkers, 'console-message', () => w.loadURL(`${baseUrl}/index.html`));
  48. const workers = ses.serviceWorkers.getAllRunning();
  49. const ids = Object.keys(workers) as any[] as number[];
  50. expect(ids).to.have.lengthOf(1, 'should have one worker running');
  51. });
  52. });
  53. describe('getFromVersionID()', () => {
  54. it('should report the correct script url and scope', async () => {
  55. const eventInfo = await emittedOnce(ses.serviceWorkers, 'console-message', () => w.loadURL(`${baseUrl}/index.html`));
  56. const details: Electron.MessageDetails = eventInfo[1];
  57. const worker = ses.serviceWorkers.getFromVersionID(details.versionId);
  58. expect(worker).to.not.equal(null);
  59. expect(worker).to.have.property('scope', baseUrl + '/');
  60. expect(worker).to.have.property('scriptUrl', baseUrl + '/sw.js');
  61. });
  62. });
  63. describe('console-message event', () => {
  64. it('should correctly keep the source, message and level', async () => {
  65. const messages: Record<string, Electron.MessageDetails> = {};
  66. const events = await emittedNTimes(ses.serviceWorkers, 'console-message', 4, () => w.loadURL(`${baseUrl}/logs.html`));
  67. for (const event of events) {
  68. messages[event[1].message] = event[1];
  69. expect(event[1]).to.have.property('source', 'console-api');
  70. }
  71. expect(messages).to.have.property('log log');
  72. expect(messages).to.have.property('info log');
  73. expect(messages).to.have.property('warn log');
  74. expect(messages).to.have.property('error log');
  75. expect(messages['log log']).to.have.property('level', 1);
  76. expect(messages['info log']).to.have.property('level', 1);
  77. expect(messages['warn log']).to.have.property('level', 2);
  78. expect(messages['error log']).to.have.property('level', 3);
  79. });
  80. });
  81. });