From f97d68c4bf64a935fa6344b40a8f1bcb7e92d942 Mon Sep 17 00:00:00 2001 From: Milan Burda Date: Mon, 20 Feb 2023 12:30:57 +0100 Subject: [PATCH] test: convert functions to async & eliminate duplicates (#37316) test: convert functions to async Co-authored-by: Milan Burda --- spec/api-app-spec.ts | 17 +++---- spec/api-browser-window-spec.ts | 72 +++++++++++------------------ spec/api-context-bridge-spec.ts | 7 +-- spec/api-crash-reporter-spec.ts | 9 +--- spec/api-debugger-spec.ts | 37 ++++++++------- spec/api-ipc-spec.ts | 9 ++-- spec/api-media-handler-spec.ts | 5 +- spec/api-net-log-spec.ts | 11 ++--- spec/api-net-spec.ts | 36 +++++++-------- spec/api-protocol-spec.ts | 21 +++------ spec/api-service-workers-spec.ts | 10 ++-- spec/api-session-spec.ts | 77 ++++++++++++------------------- spec/api-shell-spec.ts | 6 +-- spec/api-subframe-spec.ts | 12 ++--- spec/api-web-contents-spec.ts | 65 ++++++++++---------------- spec/api-web-frame-main-spec.ts | 14 ++---- spec/api-web-request-spec.ts | 16 +++---- spec/chromium-spec.ts | 60 +++++++++--------------- spec/extensions-spec.ts | 15 ++---- spec/guest-window-manager-spec.ts | 15 +++--- spec/lib/spec-helpers.ts | 11 +++++ spec/security-warnings-spec.ts | 10 ++-- spec/spellchecker-spec.ts | 10 ++-- spec/webview-spec.ts | 23 ++++----- 24 files changed, 225 insertions(+), 343 deletions(-) diff --git a/spec/api-app-spec.ts b/spec/api-app-spec.ts index 8599d42e13..b47a59be73 100644 --- a/spec/api-app-spec.ts +++ b/spec/api-app-spec.ts @@ -9,7 +9,7 @@ import { promisify } from 'util'; import { app, BrowserWindow, Menu, session, net as electronNet } from 'electron/main'; import { emittedOnce } from './lib/events-helpers'; import { closeWindow, closeAllWindows } from './lib/window-helpers'; -import { ifdescribe, ifit, waitUntil } from './lib/spec-helpers'; +import { ifdescribe, ifit, listen, waitUntil } from './lib/spec-helpers'; import split = require('split') const fixturesPath = path.resolve(__dirname, 'fixtures'); @@ -33,7 +33,7 @@ describe('app module', () => { let secureUrl: string; const certPath = path.join(fixturesPath, 'certificates'); - before((done) => { + before(async () => { const options = { key: fs.readFileSync(path.join(certPath, 'server.key')), cert: fs.readFileSync(path.join(certPath, 'server.pem')), @@ -55,11 +55,7 @@ describe('app module', () => { } }); - server.listen(0, '127.0.0.1', () => { - const port = (server.address() as net.AddressInfo).port; - secureUrl = `https://127.0.0.1:${port}`; - done(); - }); + secureUrl = (await listen(server)).url; }); after(done => { @@ -1937,7 +1933,7 @@ describe('default behavior', () => { let server: http.Server; let serverUrl: string; - before((done) => { + before(async () => { server = http.createServer((request, response) => { if (request.headers.authorization) { return response.end('ok'); @@ -1945,10 +1941,9 @@ describe('default behavior', () => { response .writeHead(401, { 'WWW-Authenticate': 'Basic realm="Foo"' }) .end(); - }).listen(0, '127.0.0.1', () => { - serverUrl = 'http://127.0.0.1:' + (server.address() as net.AddressInfo).port; - done(); }); + + serverUrl = (await listen(server)).url; }); it('should emit a login event on app when a WebContents hits a 401', async () => { diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index 138fd281a1..244450ea78 100644 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -5,11 +5,10 @@ import * as fs from 'fs'; import * as qs from 'querystring'; import * as http from 'http'; import * as os from 'os'; -import { AddressInfo } from 'net'; import { app, BrowserWindow, BrowserView, dialog, ipcMain, OnBeforeSendHeadersListenerDetails, protocol, screen, webContents, session, WebContents } from 'electron/main'; import { emittedOnce, emittedUntil, emittedNTimes } from './lib/events-helpers'; -import { ifit, ifdescribe, defer, delay } from './lib/spec-helpers'; +import { ifit, ifdescribe, defer, delay, listen } from './lib/spec-helpers'; import { closeWindow, closeAllWindows } from './lib/window-helpers'; import { areColorsSimilar, captureScreen, HexColors, getPixelColor } from './lib/screen-helpers'; @@ -153,7 +152,7 @@ describe('BrowserWindow module', () => { let server: http.Server; let url: string; - before((done) => { + before(async () => { server = http.createServer((request, response) => { switch (request.url) { case '/net-error': @@ -175,10 +174,9 @@ describe('BrowserWindow module', () => { default: throw new Error(`unsupported endpoint: ${request.url}`); } - }).listen(0, '127.0.0.1', () => { - url = 'http://127.0.0.1:' + (server.address() as AddressInfo).port; - done(); }); + + url = (await listen(server)).url; }); after(() => { @@ -297,7 +295,7 @@ describe('BrowserWindow module', () => { let server: http.Server; let url: string; let postData = null as any; - before((done) => { + before(async () => { const filePath = path.join(fixtures, 'pages', 'a.html'); const fileStats = fs.statSync(filePath); postData = [ @@ -340,10 +338,8 @@ describe('BrowserWindow module', () => { } setTimeout(respond, req.url && req.url.includes('slow') ? 200 : 0); }); - server.listen(0, '127.0.0.1', () => { - url = `http://127.0.0.1:${(server.address() as AddressInfo).port}`; - done(); - }); + + url = (await listen(server)).url; }); after(() => { @@ -486,7 +482,7 @@ describe('BrowserWindow module', () => { describe('will-navigate event', () => { let server: http.Server; let url: string; - before((done) => { + before(async () => { server = http.createServer((req, res) => { if (req.url === '/navigate-top') { res.end('navigate _top'); @@ -494,22 +490,18 @@ describe('BrowserWindow module', () => { res.end(''); } }); - server.listen(0, '127.0.0.1', () => { - url = `http://127.0.0.1:${(server.address() as AddressInfo).port}/`; - done(); - }); + url = (await listen(server)).url; }); after(() => { server.close(); }); - it('allows the window to be closed from the event listener', (done) => { - w.webContents.once('will-navigate', () => { - w.close(); - done(); - }); + it('allows the window to be closed from the event listener', async () => { + const event = emittedOnce(w.webContents, 'will-navigate'); w.loadFile(path.join(fixtures, 'pages', 'will-navigate.html')); + await event; + w.close(); }); it('can be prevented', (done) => { @@ -541,7 +533,7 @@ describe('BrowserWindow module', () => { resolve(url); }); }); - expect(navigatedTo).to.equal(url); + expect(navigatedTo).to.equal(url + '/'); expect(w.webContents.getURL()).to.match(/^file:/); }); @@ -554,12 +546,12 @@ describe('BrowserWindow module', () => { resolve(url); }); }); - expect(navigatedTo).to.equal(url); + expect(navigatedTo).to.equal(url + '/'); expect(w.webContents.getURL()).to.equal('about:blank'); }); it('is triggered when a cross-origin iframe navigates _top', async () => { - await w.loadURL(`data:text/html,`); + await w.loadURL(`data:text/html,`); await delay(1000); w.webContents.debugger.attach('1.1'); const targets = await w.webContents.debugger.sendCommand('Target.getTargets'); @@ -594,7 +586,7 @@ describe('BrowserWindow module', () => { describe('will-redirect event', () => { let server: http.Server; let url: string; - before((done) => { + before(async () => { server = http.createServer((req, res) => { if (req.url === '/302') { res.setHeader('Location', '/200'); @@ -606,10 +598,7 @@ describe('BrowserWindow module', () => { res.end(); } }); - server.listen(0, '127.0.0.1', () => { - url = `http://127.0.0.1:${(server.address() as AddressInfo).port}`; - done(); - }); + url = (await listen(server)).url; }); after(() => { @@ -643,12 +632,11 @@ describe('BrowserWindow module', () => { expect(stopCalled).to.equal(false, 'should not have called did-stop-loading first'); }); - it('allows the window to be closed from the event listener', (done) => { - w.webContents.once('will-redirect', () => { - w.close(); - done(); - }); + it('allows the window to be closed from the event listener', async () => { + const event = emittedOnce(w.webContents, 'will-redirect'); w.loadURL(`${url}/302`); + await event; + w.close(); }); it('can be prevented', (done) => { @@ -1914,9 +1902,7 @@ describe('BrowserWindow module', () => { res.end(); }); server.on('connection', () => { connections++; }); - - await new Promise(resolve => server.listen(0, '127.0.0.1', () => resolve())); - url = `http://127.0.0.1:${(server.address() as AddressInfo).port}`; + url = (await listen(server)).url; }); afterEach(async () => { server.close(); @@ -2944,7 +2930,7 @@ describe('BrowserWindow module', () => { let server: http.Server; let serverUrl: string; - before((done) => { + before(async () => { server = http.createServer((request, response) => { switch (request.url) { case '/cross-site': @@ -2953,10 +2939,8 @@ describe('BrowserWindow module', () => { default: throw new Error(`unsupported endpoint: ${request.url}`); } - }).listen(0, '127.0.0.1', () => { - serverUrl = 'http://127.0.0.1:' + (server.address() as AddressInfo).port; - done(); }); + serverUrl = (await listen(server)).url; }); after(() => { @@ -4475,13 +4459,11 @@ describe('BrowserWindow module', () => { let server: http.Server; let serverUrl: string; - before((done) => { + before(async () => { server = http.createServer((request, response) => { response.end(); - }).listen(0, '127.0.0.1', () => { - serverUrl = 'http://127.0.0.1:' + (server.address() as AddressInfo).port; - done(); }); + serverUrl = (await listen(server)).url; }); after(() => { diff --git a/spec/api-context-bridge-spec.ts b/spec/api-context-bridge-spec.ts index 667eecd43d..253d004c7f 100644 --- a/spec/api-context-bridge-spec.ts +++ b/spec/api-context-bridge-spec.ts @@ -9,7 +9,7 @@ import * as cp from 'child_process'; import { closeWindow } from './lib/window-helpers'; import { emittedOnce } from './lib/events-helpers'; -import { AddressInfo } from 'net'; +import { listen } from './lib/spec-helpers'; const fixturesPath = path.resolve(__dirname, 'fixtures', 'api', 'context-bridge'); @@ -17,13 +17,14 @@ describe('contextBridge', () => { let w: BrowserWindow; let dir: string; let server: http.Server; + let serverUrl: string; before(async () => { server = http.createServer((req, res) => { res.setHeader('Content-Type', 'text/html'); res.end(''); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + serverUrl = (await listen(server)).url; }); after(async () => { @@ -95,7 +96,7 @@ describe('contextBridge', () => { additionalArguments: ['--unsafely-expose-electron-internals-for-testing'] } }); - await w.loadURL(`http://127.0.0.1:${(server.address() as AddressInfo).port}`); + await w.loadURL(serverUrl); }; const callWithBindings = (fn: Function, worldId: number = 0) => diff --git a/spec/api-crash-reporter-spec.ts b/spec/api-crash-reporter-spec.ts index c29efad5e1..974e7169d8 100644 --- a/spec/api-crash-reporter-spec.ts +++ b/spec/api-crash-reporter-spec.ts @@ -3,10 +3,9 @@ import * as childProcess from 'child_process'; import * as http from 'http'; import * as Busboy from 'busboy'; import * as path from 'path'; -import { ifdescribe, ifit, defer, startRemoteControlApp, delay, repeatedly } from './lib/spec-helpers'; +import { ifdescribe, ifit, defer, startRemoteControlApp, delay, repeatedly, listen } from './lib/spec-helpers'; import { app } from 'electron/main'; import { crashReporter } from 'electron/common'; -import { AddressInfo } from 'net'; import { EventEmitter } from 'events'; import * as fs from 'fs'; import * as uuid from 'uuid'; @@ -89,11 +88,7 @@ const startServer = async () => { req.pipe(busboy); }); - await new Promise(resolve => { - server.listen(0, '127.0.0.1', () => { resolve(); }); - }); - - const port = (server.address() as AddressInfo).port; + const { port } = await listen(server); defer(() => { server.close(); }); diff --git a/spec/api-debugger-spec.ts b/spec/api-debugger-spec.ts index 75ff74d91e..d3c22be11e 100644 --- a/spec/api-debugger-spec.ts +++ b/spec/api-debugger-spec.ts @@ -1,10 +1,10 @@ import { expect } from 'chai'; import * as http from 'http'; import * as path from 'path'; -import { AddressInfo } from 'net'; import { BrowserWindow } from 'electron/main'; import { closeAllWindows } from './lib/window-helpers'; import { emittedOnce, emittedUntil } from './lib/events-helpers'; +import { listen } from './lib/spec-helpers'; describe('debugger module', () => { const fixtures = path.resolve(__dirname, 'fixtures'); @@ -138,9 +138,9 @@ describe('debugger module', () => { res.setHeader('Content-Type', 'text/plain; charset=utf-8'); res.end('\u0024'); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - w.loadURL(`http://127.0.0.1:${(server.address() as AddressInfo).port}`); + const { url } = await listen(server); + w.loadURL(url); // If we do this synchronously, it's fast enough to attach and enable // network capture before the load. If we do it before the loadURL, for // some reason network capture doesn't get enabled soon enough and we get @@ -155,19 +155,17 @@ describe('debugger module', () => { expect(body).to.equal('\u0024'); }); - it('does not crash for invalid unicode characters in message', (done) => { - try { - w.webContents.debugger.attach(); - } catch (err) { - done(`unexpected error : ${err}`); - } + it('does not crash for invalid unicode characters in message', async () => { + w.webContents.debugger.attach(); - w.webContents.debugger.on('message', (event, method) => { - // loadingFinished indicates that page has been loaded and it did not - // crash because of invalid UTF-8 data - if (method === 'Network.loadingFinished') { - done(); - } + const loadingFinished = new Promise(resolve => { + w.webContents.debugger.on('message', (event, method) => { + // loadingFinished indicates that page has been loaded and it did not + // crash because of invalid UTF-8 data + if (method === 'Network.loadingFinished') { + resolve(); + } + }); }); server = http.createServer((req, res) => { @@ -175,10 +173,11 @@ describe('debugger module', () => { res.end('\uFFFF'); }); - server.listen(0, '127.0.0.1', () => { - w.webContents.debugger.sendCommand('Network.enable'); - w.loadURL(`http://127.0.0.1:${(server.address() as AddressInfo).port}`); - }); + const { url } = await listen(server); + w.webContents.debugger.sendCommand('Network.enable'); + w.loadURL(url); + + await loadingFinished; }); it('uses empty sessionId by default', async () => { diff --git a/spec/api-ipc-spec.ts b/spec/api-ipc-spec.ts index 8696f360be..76b574c048 100644 --- a/spec/api-ipc-spec.ts +++ b/spec/api-ipc-spec.ts @@ -3,10 +3,9 @@ import { expect } from 'chai'; import { BrowserWindow, ipcMain, IpcMainInvokeEvent, MessageChannelMain, WebContents } from 'electron/main'; import { closeAllWindows } from './lib/window-helpers'; import { emittedOnce } from './lib/events-helpers'; -import { defer } from './lib/spec-helpers'; +import { defer, listen } from './lib/spec-helpers'; import * as path from 'path'; import * as http from 'http'; -import { AddressInfo } from 'net'; const v8Util = process._linkedBinding('electron_common_v8_util'); const fixturesPath = path.resolve(__dirname, 'fixtures'); @@ -644,8 +643,7 @@ describe('ipc module', () => { res.setHeader('content-type', 'text/html'); res.end(''); }); - await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); - const port = (server.address() as AddressInfo).port; + const { port } = await listen(server); defer(() => { server.close(); }); @@ -745,8 +743,7 @@ describe('ipc module', () => { res.setHeader('content-type', 'text/html'); res.end(''); }); - await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)); - const port = (server.address() as AddressInfo).port; + const { port } = await listen(server); defer(() => { server.close(); }); diff --git a/spec/api-media-handler-spec.ts b/spec/api-media-handler-spec.ts index 4db626aca4..2ddd79239c 100644 --- a/spec/api-media-handler-spec.ts +++ b/spec/api-media-handler-spec.ts @@ -2,7 +2,7 @@ import { expect } from 'chai'; import { BrowserWindow, session, desktopCapturer } from 'electron/main'; import { closeAllWindows } from './lib/window-helpers'; import * as http from 'http'; -import { ifdescribe, ifit } from './lib/spec-helpers'; +import { ifdescribe, ifit, listen } from './lib/spec-helpers'; const features = process._linkedBinding('electron_common_features'); @@ -17,8 +17,7 @@ ifdescribe(features.isDesktopCapturerEnabled())('setDisplayMediaRequestHandler', res.setHeader('Content-Type', 'text/html'); res.end(''); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - serverUrl = `http://localhost:${(server.address() as any).port}`; + serverUrl = (await listen(server)).url; }); after(() => { server.close(); diff --git a/spec/api-net-log-spec.ts b/spec/api-net-log-spec.ts index 2a8dae45d2..5ed162b805 100644 --- a/spec/api-net-log-spec.ts +++ b/spec/api-net-log-spec.ts @@ -5,8 +5,8 @@ import * as os from 'os'; import * as path from 'path'; import * as ChildProcess from 'child_process'; import { session, net } from 'electron/main'; -import { Socket, AddressInfo } from 'net'; -import { ifit } from './lib/spec-helpers'; +import { Socket } from 'net'; +import { ifit, listen } from './lib/spec-helpers'; import { emittedOnce } from './lib/events-helpers'; const appPath = path.join(__dirname, 'fixtures', 'api', 'net-log'); @@ -20,12 +20,8 @@ describe('netLog module', () => { let serverUrl: string; const connections: Set = new Set(); - before(done => { + before(async () => { server = http.createServer(); - server.listen(0, '127.0.0.1', () => { - serverUrl = `http://127.0.0.1:${(server.address() as AddressInfo).port}`; - done(); - }); server.on('connection', (connection) => { connections.add(connection); connection.once('close', () => { @@ -35,6 +31,7 @@ describe('netLog module', () => { server.on('request', (request, response) => { response.end(); }); + serverUrl = (await listen(server)).url; }); after(done => { diff --git a/spec/api-net-spec.ts b/spec/api-net-spec.ts index fb09bd5f88..d52efa2688 100644 --- a/spec/api-net-spec.ts +++ b/spec/api-net-spec.ts @@ -3,9 +3,9 @@ import * as dns from 'dns'; import { net, session, ClientRequest, BrowserWindow, ClientRequestConstructorOptions } from 'electron/main'; import * as http from 'http'; import * as url from 'url'; -import { AddressInfo, Socket } from 'net'; +import { Socket } from 'net'; import { emittedOnce } from './lib/events-helpers'; -import { defer, delay } from './lib/spec-helpers'; +import { defer, delay, listen } from './lib/spec-helpers'; // See https://github.com/nodejs/node/issues/40702. dns.setDefaultResultOrder('ipv4first'); @@ -53,26 +53,22 @@ function collectStreamBodyBuffer (response: Electron.IncomingMessage | http.Inco }); } -function respondNTimes (fn: http.RequestListener, n: number): Promise { - return new Promise((resolve) => { - const server = http.createServer((request, response) => { - fn(request, response); - // don't close if a redirect was returned - if ((response.statusCode < 300 || response.statusCode >= 399) && n <= 0) { - n--; - server.close(); - } - }); - server.listen(0, '127.0.0.1', () => { - resolve(`http://127.0.0.1:${(server.address() as AddressInfo).port}`); - }); - const sockets: Socket[] = []; - server.on('connection', s => sockets.push(s)); - defer(() => { +async function respondNTimes (fn: http.RequestListener, n: number): Promise { + const server = http.createServer((request, response) => { + fn(request, response); + // don't close if a redirect was returned + if ((response.statusCode < 300 || response.statusCode >= 399) && n <= 0) { + n--; server.close(); - sockets.forEach(s => s.destroy()); - }); + } }); + const sockets: Socket[] = []; + server.on('connection', s => sockets.push(s)); + defer(() => { + server.close(); + sockets.forEach(s => s.destroy()); + }); + return (await listen(server)).url; } function respondOnce (fn: http.RequestListener) { diff --git a/spec/api-protocol-spec.ts b/spec/api-protocol-spec.ts index d85a3f6fa5..8b5664745f 100644 --- a/spec/api-protocol-spec.ts +++ b/spec/api-protocol-spec.ts @@ -1,7 +1,6 @@ import { expect } from 'chai'; import { v4 } from 'uuid'; import { protocol, webContents, WebContents, session, BrowserWindow, ipcMain } from 'electron/main'; -import { AddressInfo } from 'net'; import * as ChildProcess from 'child_process'; import * as path from 'path'; import * as http from 'http'; @@ -12,7 +11,7 @@ import { EventEmitter } from 'events'; import { closeAllWindows, closeWindow } from './lib/window-helpers'; import { emittedOnce } from './lib/events-helpers'; import { WebmGenerator } from './lib/video-helpers'; -import { delay } from './lib/spec-helpers'; +import { delay, listen } from './lib/spec-helpers'; const fixturesPath = path.resolve(__dirname, 'fixtures'); @@ -324,10 +323,8 @@ describe('protocol module', () => { res.end(text); server.close(); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + const { url } = await listen(server); - const port = (server.address() as AddressInfo).port; - const url = 'http://127.0.0.1:' + port; registerHttpProtocol(protocolName, (request, callback) => callback({ url })); const r = await ajax(protocolName + '://fake-host'); expect(r.data).to.equal(text); @@ -354,9 +351,7 @@ describe('protocol module', () => { } }); after(() => server.close()); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - - const port = (server.address() as AddressInfo).port; + const { port } = await listen(server); const url = `${protocolName}://fake-host`; const redirectURL = `http://127.0.0.1:${port}/serverRedirect`; registerHttpProtocol(protocolName, (request, callback) => callback({ url: redirectURL })); @@ -653,10 +648,7 @@ describe('protocol module', () => { server.close(); }); after(() => server.close()); - server.listen(0, '127.0.0.1'); - - const port = (server.address() as AddressInfo).port; - const url = `http://127.0.0.1:${port}`; + const { url } = await listen(server); interceptHttpProtocol('http', (request, callback) => { const data: Electron.ProtocolResponse = { url: url, @@ -874,9 +866,8 @@ describe('protocol module', () => { server.close(); requestReceived.resolve(); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - const port = (server.address() as AddressInfo).port; - const content = ``; + const { url } = await listen(server); + const content = ``; registerStringProtocol(standardScheme, (request, callback) => callback({ data: content, mimeType: 'text/html' })); await w.loadURL(origin); await requestReceived; diff --git a/spec/api-service-workers-spec.ts b/spec/api-service-workers-spec.ts index 3a16f2fd0e..03932b9975 100644 --- a/spec/api-service-workers-spec.ts +++ b/spec/api-service-workers-spec.ts @@ -4,8 +4,8 @@ import * as path from 'path'; import { session, webContents, WebContents } from 'electron/main'; import { expect } from 'chai'; import { v4 } from 'uuid'; -import { AddressInfo } from 'net'; import { emittedOnce, emittedNTimes } from './lib/events-helpers'; +import { listen } from './lib/spec-helpers'; const partition = 'service-workers-spec'; @@ -32,12 +32,8 @@ describe('session.serviceWorkers', () => { } res.end(fs.readFileSync(path.resolve(__dirname, 'fixtures', 'api', 'service-workers', file))); }); - await new Promise(resolve => { - server.listen(0, '127.0.0.1', () => { - baseUrl = `http://localhost:${(server.address() as AddressInfo).port}/${uuid}`; - resolve(); - }); - }); + const { port } = await listen(server); + baseUrl = `http://localhost:${port}/${uuid}`; w = (webContents as typeof ElectronInternal.WebContents).create({ session: ses }); }); diff --git a/spec/api-session-spec.ts b/spec/api-session-spec.ts index 405c0819c7..c82823c194 100644 --- a/spec/api-session-spec.ts +++ b/spec/api-session-spec.ts @@ -9,8 +9,7 @@ import * as send from 'send'; import * as auth from 'basic-auth'; import { closeAllWindows } from './lib/window-helpers'; import { emittedOnce } from './lib/events-helpers'; -import { defer, delay } from './lib/spec-helpers'; -import { AddressInfo } from 'net'; +import { defer, delay, listen } from './lib/spec-helpers'; /* The whole session API doesn't use standard callbacks */ /* eslint-disable standard/no-callback-literal */ @@ -51,8 +50,7 @@ describe('session module', () => { res.end('finished'); server.close(); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - const { port } = server.address() as AddressInfo; + const { port } = await listen(server); const w = new BrowserWindow({ show: false }); await w.loadURL(`${url}:${port}`); const list = await w.webContents.session.cookies.get({ url }); @@ -275,10 +273,7 @@ describe('session module', () => { res.end(mockFile); downloadServer.close(); }); - await new Promise(resolve => downloadServer.listen(0, '127.0.0.1', resolve)); - - const port = (downloadServer.address() as AddressInfo).port; - const url = `http://127.0.0.1:${port}/`; + const url = (await listen(downloadServer)).url; const downloadPrevented: Promise<{itemUrl: string, itemFilename: string, item: Electron.DownloadItem}> = new Promise(resolve => { w.webContents.session.once('will-download', function (e, item) { @@ -288,7 +283,7 @@ describe('session module', () => { }); w.loadURL(url); const { item, itemUrl, itemFilename } = await downloadPrevented; - expect(itemUrl).to.equal(url); + expect(itemUrl).to.equal(url + '/'); expect(itemFilename).to.equal('mockFile.txt'); // Delay till the next tick. await new Promise(setImmediate); @@ -392,15 +387,15 @@ describe('session module', () => { }); res.end(pac); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + const { url } = await listen(server); { - const config = { pacScript: `http://127.0.0.1:${(server.address() as AddressInfo).port}` }; + const config = { pacScript: url }; await customSession.setProxy(config); const proxy = await customSession.resolveProxy('https://google.com'); expect(proxy).to.equal('PROXY myproxy:8132'); } { - const config = { mode: 'pac_script' as any, pacScript: `http://127.0.0.1:${(server.address() as AddressInfo).port}` }; + const config = { mode: 'pac_script' as any, pacScript: url }; await customSession.setProxy(config); const proxy = await customSession.resolveProxy('https://google.com'); expect(proxy).to.equal('PROXY myproxy:8132'); @@ -466,8 +461,8 @@ describe('session module', () => { }); res.end(pac); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - const config = { mode: 'pac_script' as any, pacScript: `http://127.0.0.1:${(server.address() as AddressInfo).port}` }; + const { url } = await listen(server); + const config = { mode: 'pac_script' as any, pacScript: url }; await customSession.setProxy(config); { const proxy = await customSession.resolveProxy('https://google.com'); @@ -575,8 +570,9 @@ describe('session module', () => { describe('ses.setCertificateVerifyProc(callback)', () => { let server: http.Server; + let serverUrl: string; - beforeEach((done) => { + beforeEach(async () => { const certPath = path.join(fixtures, 'certificates'); const options = { key: fs.readFileSync(path.join(certPath, 'server.key')), @@ -592,7 +588,7 @@ describe('session module', () => { res.writeHead(200); res.end('hello'); }); - server.listen(0, '127.0.0.1', done); + serverUrl = (await listen(server)).url; }); afterEach((done) => { @@ -613,7 +609,7 @@ describe('session module', () => { }); const w = new BrowserWindow({ show: false, webPreferences: { session: ses } }); - await w.loadURL(`https://127.0.0.1:${(server.address() as AddressInfo).port}`); + await w.loadURL(serverUrl); expect(w.webContents.getTitle()).to.equal('hello'); expect(validate!).not.to.be.undefined(); validate!(); @@ -640,10 +636,9 @@ describe('session module', () => { callback(-2); }); - const url = `https://127.0.0.1:${(server.address() as AddressInfo).port}`; const w = new BrowserWindow({ show: false, webPreferences: { session: ses } }); - await expect(w.loadURL(url)).to.eventually.be.rejectedWith(/ERR_FAILED/); - expect(w.webContents.getTitle()).to.equal(url); + await expect(w.loadURL(serverUrl)).to.eventually.be.rejectedWith(/ERR_FAILED/); + expect(w.webContents.getTitle()).to.equal(serverUrl); expect(validate!).not.to.be.undefined(); validate!(); }); @@ -657,12 +652,11 @@ describe('session module', () => { callback(-2); }); - const url = `https://127.0.0.1:${(server.address() as AddressInfo).port}`; const w = new BrowserWindow({ show: false, webPreferences: { session: ses } }); - await expect(w.loadURL(url), 'first load').to.eventually.be.rejectedWith(/ERR_FAILED/); + await expect(w.loadURL(serverUrl), 'first load').to.eventually.be.rejectedWith(/ERR_FAILED/); await emittedOnce(w.webContents, 'did-stop-loading'); - await expect(w.loadURL(url + '/test'), 'second load').to.eventually.be.rejectedWith(/ERR_FAILED/); - expect(w.webContents.getTitle()).to.equal(url + '/test'); + await expect(w.loadURL(serverUrl + '/test'), 'second load').to.eventually.be.rejectedWith(/ERR_FAILED/); + expect(w.webContents.getTitle()).to.equal(serverUrl + '/test'); expect(numVerificationRequests).to.equal(1); }); @@ -671,8 +665,7 @@ describe('session module', () => { ses1.setCertificateVerifyProc((opts, cb) => cb(0)); const ses2 = session.fromPartition(`${Math.random()}`); - const url = `https://127.0.0.1:${(server.address() as AddressInfo).port}`; - const req = net.request({ url, session: ses1, credentials: 'include' }); + const req = net.request({ url: serverUrl, session: ses1, credentials: 'include' }); req.end(); setTimeout(() => { ses2.setCertificateVerifyProc((opts, callback) => callback(0)); @@ -701,8 +694,7 @@ describe('session module', () => { res.end('authenticated'); } }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - const port = (server.address() as AddressInfo).port; + const { port } = await listen(server); const fetch = (url: string) => new Promise((resolve, reject) => { const request = net.request({ url, session: ses }); request.on('response', (response) => { @@ -742,7 +734,7 @@ describe('session module', () => { const downloadFilePath = path.join(__dirname, '..', 'fixtures', 'mock.pdf'); const protocolName = 'custom-dl'; const contentDisposition = 'inline; filename="mock.pdf"'; - let address: AddressInfo; + let port: number; let downloadServer: http.Server; before(async () => { downloadServer = http.createServer((req, res) => { @@ -753,8 +745,7 @@ describe('session module', () => { }); res.end(mockPDF); }); - await new Promise(resolve => downloadServer.listen(0, '127.0.0.1', resolve)); - address = downloadServer.address() as AddressInfo; + port = (await listen(downloadServer)).port; }); after(async () => { await new Promise(resolve => downloadServer.close(resolve)); @@ -772,7 +763,7 @@ describe('session module', () => { if (isCustom) { expect(item.getURL()).to.equal(`${protocolName}://item`); } else { - expect(item.getURL()).to.be.equal(`${url}:${address.port}/`); + expect(item.getURL()).to.be.equal(`${url}:${port}/`); } expect(item.getMimeType()).to.equal('application/pdf'); expect(item.getReceivedBytes()).to.equal(mockPDF.length); @@ -783,7 +774,6 @@ describe('session module', () => { }; it('can download using session.downloadURL', (done) => { - const port = address.port; session.defaultSession.once('will-download', function (e, item) { item.savePath = downloadFilePath; item.on('done', function (e, state) { @@ -799,7 +789,6 @@ describe('session module', () => { }); it('can download using WebContents.downloadURL', (done) => { - const port = address.port; const w = new BrowserWindow({ show: false }); w.webContents.session.once('will-download', function (e, item) { item.savePath = downloadFilePath; @@ -817,7 +806,6 @@ describe('session module', () => { it('can download from custom protocols using WebContents.downloadURL', (done) => { const protocol = session.defaultSession.protocol; - const port = address.port; const handler = (ignoredError: any, callback: Function) => { callback({ url: `${url}:${port}` }); }; @@ -838,7 +826,6 @@ describe('session module', () => { }); it('can download using WebView.downloadURL', async () => { - const port = address.port; const w = new BrowserWindow({ show: false, webPreferences: { webviewTag: true } }); await w.loadURL('about:blank'); function webviewDownload ({ fixtures, url, port }: {fixtures: string, url: string, port: string}) { @@ -863,7 +850,6 @@ describe('session module', () => { }); it('can cancel download', (done) => { - const port = address.port; const w = new BrowserWindow({ show: false }); w.webContents.session.once('will-download', function (e, item) { item.savePath = downloadFilePath; @@ -892,7 +878,6 @@ describe('session module', () => { return done(); } - const port = address.port; const w = new BrowserWindow({ show: false }); w.webContents.session.once('will-download', function (e, item) { item.savePath = downloadFilePath; @@ -911,7 +896,6 @@ describe('session module', () => { it('can set options for the save dialog', (done) => { const filePath = path.join(__dirname, 'fixtures', 'mock.pdf'); - const port = address.port; const options = { window: null, title: 'title', @@ -999,8 +983,7 @@ describe('session module', () => { .on('error', (error: any) => { throw error; }).pipe(res); }); try { - await new Promise(resolve => rangeServer.listen(0, '127.0.0.1', resolve)); - const port = (rangeServer.address() as AddressInfo).port; + const { url } = await listen(rangeServer); const w = new BrowserWindow({ show: false }); const downloadCancelled: Promise = new Promise((resolve) => { w.webContents.session.once('will-download', function (e, item) { @@ -1011,7 +994,7 @@ describe('session module', () => { item.cancel(); }); }); - const downloadUrl = `http://127.0.0.1:${port}/assets/logo.png`; + const downloadUrl = `${url}/assets/logo.png`; w.webContents.downloadURL(downloadUrl); const item = await downloadCancelled; expect(item.getState()).to.equal('cancelled'); @@ -1062,8 +1045,7 @@ describe('session module', () => { res.setHeader('Content-Type', 'text/html'); res.end(''); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - serverUrl = `http://localhost:${(server.address() as any).port}`; + serverUrl = (await listen(server)).url; }); after(() => { server.close(); @@ -1269,8 +1251,8 @@ describe('session module', () => { res.end(); server.close(); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - await w.loadURL(`http://127.0.0.1:${(server.address() as AddressInfo).port}`); + const { url } = await listen(server); + await w.loadURL(url); expect(headers!['user-agent']).to.equal(userAgent); expect(headers!['accept-language']).to.equal('en-US,fr;q=0.9,de;q=0.8'); }); @@ -1335,9 +1317,8 @@ describe('session module', () => { }, (req, res) => { res.end('hi'); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + const { port } = await listen(server); defer(() => server.close()); - const { port } = server.address() as AddressInfo; function request () { return new Promise((resolve, reject) => { diff --git a/spec/api-shell-spec.ts b/spec/api-shell-spec.ts index 69da8f9dfd..2dc883dc87 100644 --- a/spec/api-shell-spec.ts +++ b/spec/api-shell-spec.ts @@ -2,12 +2,11 @@ import { BrowserWindow, app } from 'electron/main'; import { shell } from 'electron/common'; import { closeAllWindows } from './lib/window-helpers'; import { emittedOnce } from './lib/events-helpers'; -import { ifdescribe, ifit } from './lib/spec-helpers'; +import { ifdescribe, ifit, listen } from './lib/spec-helpers'; import * as http from 'http'; import * as fs from 'fs-extra'; import * as os from 'os'; import * as path from 'path'; -import { AddressInfo } from 'net'; import { expect } from 'chai'; describe('shell module', () => { @@ -51,9 +50,8 @@ describe('shell module', () => { const server = http.createServer((req, res) => { res.end(); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); + url = (await listen(server)).url; requestReceived = new Promise(resolve => server.on('connection', () => resolve())); - url = `http://127.0.0.1:${(server.address() as AddressInfo).port}`; } await Promise.all([ diff --git a/spec/api-subframe-spec.ts b/spec/api-subframe-spec.ts index fb02ea2f39..d9b4b198e1 100644 --- a/spec/api-subframe-spec.ts +++ b/spec/api-subframe-spec.ts @@ -4,8 +4,7 @@ import * as http from 'http'; import { emittedNTimes, emittedOnce } from './lib/events-helpers'; import { closeWindow } from './lib/window-helpers'; import { app, BrowserWindow, ipcMain } from 'electron/main'; -import { AddressInfo } from 'net'; -import { ifdescribe } from './lib/spec-helpers'; +import { ifdescribe, listen } from './lib/spec-helpers'; describe('renderer nodeIntegrationInSubFrames', () => { const generateTests = (description: string, webPreferences: any) => { @@ -218,15 +217,12 @@ ifdescribe(process.platform !== 'linux')('cross-site frame sandboxing', () => { let crossSiteUrl: string; let serverUrl: string; - before(function (done) { + before(async function () { server = http.createServer((req, res) => { res.end(`'; + ``; w.loadURL(`data:text/html,${html}`); await fullscreenChange; @@ -2328,7 +2314,7 @@ describe('iframe using HTML fullscreen API while window is OS-fullscreened', () await emittedOnce(w, 'enter-full-screen'); const fullscreenChange = emittedOnce(ipcMain, 'fullscreenChange'); const html = - ''; + ``; w.loadURL(`data:text/html,${html}`); await fullscreenChange; @@ -2791,8 +2777,7 @@ describe('navigator.hid', () => { res.setHeader('Content-Type', 'text/html'); res.end(''); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - serverUrl = `http://localhost:${(server.address() as any).port}`; + serverUrl = (await listen(server)).url; }); const requestDevices: any = () => { @@ -2990,8 +2975,7 @@ describe('navigator.usb', () => { res.setHeader('Content-Type', 'text/html'); res.end(''); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - serverUrl = `http://localhost:${(server.address() as any).port}`; + serverUrl = (await listen(server)).url; }); const requestDevices: any = () => { diff --git a/spec/extensions-spec.ts b/spec/extensions-spec.ts index 13843a44aa..1aa083de44 100644 --- a/spec/extensions-spec.ts +++ b/spec/extensions-spec.ts @@ -2,12 +2,11 @@ import { expect } from 'chai'; import { app, session, BrowserWindow, ipcMain, WebContents, Extension, Session } from 'electron/main'; import { closeAllWindows, closeWindow } from './lib/window-helpers'; import * as http from 'http'; -import { AddressInfo } from 'net'; import * as path from 'path'; import * as fs from 'fs'; import * as WebSocket from 'ws'; import { emittedOnce, emittedNTimes, emittedUntil } from './lib/events-helpers'; -import { ifit } from './lib/spec-helpers'; +import { ifit, listen } from './lib/spec-helpers'; const uuid = require('uuid'); @@ -19,7 +18,7 @@ describe('chrome extensions', () => { // NB. extensions are only allowed on http://, https:// and ftp:// (!) urls by default. let server: http.Server; let url: string; - let port: string; + let port: number; before(async () => { server = http.createServer((req, res) => { if (req.url === '/cors') { @@ -37,11 +36,7 @@ describe('chrome extensions', () => { }); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', () => { - port = String((server.address() as AddressInfo).port); - url = `http://127.0.0.1:${port}`; - resolve(); - })); + ({ port, url } = await listen(server)); }); after(() => { server.close(); @@ -324,7 +319,7 @@ describe('chrome extensions', () => { customSession.webRequest.onBeforeSendHeaders(() => { resolve(); }); - await w.loadFile(path.join(fixtures, 'api', 'webrequest.html'), { query: { port } }); + await w.loadFile(path.join(fixtures, 'api', 'webrequest.html'), { query: { port: `${port}` } }); await customSession.loadExtension(path.join(fixtures, 'extensions', 'chrome-webRequest-wss')); })(); }); @@ -332,7 +327,7 @@ describe('chrome extensions', () => { describe('WebSocket', () => { it('can be proxied', async () => { - await w.loadFile(path.join(fixtures, 'api', 'webrequest.html'), { query: { port } }); + await w.loadFile(path.join(fixtures, 'api', 'webrequest.html'), { query: { port: `${port}` } }); await customSession.loadExtension(path.join(fixtures, 'extensions', 'chrome-webRequest-wss')); customSession.webRequest.onSendHeaders((details) => { if (details.url.startsWith('ws://')) { diff --git a/spec/guest-window-manager-spec.ts b/spec/guest-window-manager-spec.ts index 2e96f32e1a..58d682254d 100644 --- a/spec/guest-window-manager-spec.ts +++ b/spec/guest-window-manager-spec.ts @@ -176,17 +176,16 @@ describe('webContents.setWindowOpenHandler', () => { await emittedOnce(browserWindow.webContents, 'did-create-window'); }); - it('can change webPreferences of child windows', (done) => { + it('can change webPreferences of child windows', async () => { browserWindow.webContents.setWindowOpenHandler(() => ({ action: 'allow', overrideBrowserWindowOptions: { webPreferences: { defaultFontSize: 30 } } })); - browserWindow.webContents.on('did-create-window', async (childWindow) => { - await childWindow.webContents.executeJavaScript("document.write('hello')"); - const size = await childWindow.webContents.executeJavaScript("getComputedStyle(document.querySelector('body')).fontSize"); - expect(size).to.equal('30px'); - done(); - }); - + const didCreateWindow = emittedOnce(browserWindow.webContents, 'did-create-window'); browserWindow.webContents.executeJavaScript("window.open('about:blank', '', 'show=no') && true"); + const [childWindow] = await didCreateWindow; + + await childWindow.webContents.executeJavaScript("document.write('hello')"); + const size = await childWindow.webContents.executeJavaScript("getComputedStyle(document.querySelector('body')).fontSize"); + expect(size).to.equal('30px'); }); it('does not hang parent window when denying window.open', async () => { diff --git a/spec/lib/spec-helpers.ts b/spec/lib/spec-helpers.ts index 267e91a30e..e132ad8872 100644 --- a/spec/lib/spec-helpers.ts +++ b/spec/lib/spec-helpers.ts @@ -1,7 +1,10 @@ import * as childProcess from 'child_process'; import * as path from 'path'; import * as http from 'http'; +import * as https from 'https'; +import * as net from 'net'; import * as v8 from 'v8'; +import * as url from 'url'; import { SuiteFunction, TestFunction } from 'mocha'; import { BrowserWindow } from 'electron/main'; import { AssertionError } from 'chai'; @@ -191,3 +194,11 @@ export async function itremote (name: string, fn: Function, args?: any[]) { if (!ok) { throw new AssertionError(message); } }); } + +export async function listen (server: http.Server | https.Server) { + const hostname = '127.0.0.1'; + await new Promise(resolve => server.listen(0, hostname, () => resolve())); + const { port } = server.address() as net.AddressInfo; + const protocol = (server instanceof https.Server) ? 'https' : 'http'; + return { port, url: url.format({ protocol, hostname, port }) }; +} diff --git a/spec/security-warnings-spec.ts b/spec/security-warnings-spec.ts index 848bdf91e7..1e3d351e61 100644 --- a/spec/security-warnings-spec.ts +++ b/spec/security-warnings-spec.ts @@ -7,9 +7,8 @@ import * as url from 'url'; import { BrowserWindow, WebPreferences } from 'electron/main'; import { closeWindow } from './lib/window-helpers'; -import { AddressInfo } from 'net'; import { emittedUntil } from './lib/events-helpers'; -import { delay } from './lib/spec-helpers'; +import { delay, listen } from './lib/spec-helpers'; const messageContainsSecurityWarning = (event: Event, level: number, message: string) => { return message.indexOf('Electron Security Warning') > -1; @@ -25,7 +24,7 @@ describe('security warnings', () => { let useCsp = true; let serverUrl: string; - before((done) => { + before(async () => { // Create HTTP Server server = http.createServer((request, response) => { const uri = url.parse(request.url!).pathname!; @@ -57,10 +56,9 @@ describe('security warnings', () => { response.end(); }); }); - }).listen(0, '127.0.0.1', () => { - serverUrl = `http://localhost2:${(server.address() as AddressInfo).port}`; - done(); }); + + serverUrl = `http://localhost2:${(await listen(server)).port}`; }); after(() => { diff --git a/spec/spellchecker-spec.ts b/spec/spellchecker-spec.ts index 87f0513b96..4a63c437f8 100644 --- a/spec/spellchecker-spec.ts +++ b/spec/spellchecker-spec.ts @@ -4,10 +4,9 @@ import { expect } from 'chai'; import * as path from 'path'; import * as fs from 'fs'; import * as http from 'http'; -import { AddressInfo } from 'net'; import { closeWindow } from './lib/window-helpers'; import { emittedOnce } from './lib/events-helpers'; -import { ifit, ifdescribe, delay } from './lib/spec-helpers'; +import { ifit, ifdescribe, delay, listen } from './lib/spec-helpers'; const features = process._linkedBinding('electron_common_features'); const v8Util = process._linkedBinding('electron_common_v8_util'); @@ -57,8 +56,9 @@ ifdescribe(features.isBuiltinSpellCheckerEnabled())('spellchecker', function () res.end(data); }); }); - before((done) => { - server.listen(0, '127.0.0.1', () => done()); + let serverUrl: string; + before(async () => { + serverUrl = (await listen(server)).url; }); after(() => server.close()); @@ -77,7 +77,7 @@ ifdescribe(features.isBuiltinSpellCheckerEnabled())('spellchecker', function () sandbox } }); - w.webContents.session.setSpellCheckerDictionaryDownloadURL(`http://127.0.0.1:${(server.address() as AddressInfo).port}/`); + w.webContents.session.setSpellCheckerDictionaryDownloadURL(serverUrl); w.webContents.session.setSpellCheckerLanguages(['en-US']); await w.loadFile(path.resolve(__dirname, './fixtures/chromium/spellchecker.html')); }); diff --git a/spec/webview-spec.ts b/spec/webview-spec.ts index 362219a8a0..58ddb04e9a 100644 --- a/spec/webview-spec.ts +++ b/spec/webview-spec.ts @@ -3,10 +3,9 @@ import * as url from 'url'; import { BrowserWindow, session, ipcMain, app, WebContents } from 'electron/main'; import { closeAllWindows } from './lib/window-helpers'; import { emittedOnce, emittedUntil } from './lib/events-helpers'; -import { ifit, ifdescribe, delay, defer, itremote, useRemoteContext } from './lib/spec-helpers'; +import { ifit, ifdescribe, delay, defer, itremote, useRemoteContext, listen } from './lib/spec-helpers'; import { expect } from 'chai'; import * as http from 'http'; -import { AddressInfo } from 'net'; import * as auth from 'basic-auth'; declare let WebView: any; @@ -1208,11 +1207,11 @@ describe(' tag', function () { res.end(); server.close(); } - }).listen(0, '127.0.0.1', () => { - const port = (server.address() as AddressInfo).port; + }); + listen(server).then(({ url }) => { loadWebView(w, { httpreferrer: referrer, - src: `http://127.0.0.1:${port}` + src: url }); }); }); @@ -1464,15 +1463,13 @@ describe(' tag', function () { res.end(); } }); - const uri = await new Promise(resolve => server.listen(0, '127.0.0.1', () => { - resolve(`http://127.0.0.1:${(server.address() as AddressInfo).port}`); - })); + const { url } = await listen(server); defer(() => { server.close(); }); const event = await loadWebViewAndWaitForEvent(w, { - src: `${uri}/302` + src: `${url}/302` }, 'did-redirect-navigation'); - expect(event.url).to.equal(`${uri}/200`); + expect(event.url).to.equal(`${url}/200`); expect(event.isInPlace).to.be.false(); expect(event.isMainFrame).to.be.true(); expect(event.frameProcessId).to.be.a('number'); @@ -1572,8 +1569,7 @@ describe(' tag', function () { describe('dom-ready event', () => { it('emits when document is loaded', async () => { const server = http.createServer(() => {}); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - const port = (server.address() as AddressInfo).port; + const { port } = await listen(server); await loadWebViewAndWaitForEvent(w, { src: `file://${fixtures}/pages/dom-ready.html?port=${port}` }, 'dom-ready'); @@ -2063,8 +2059,7 @@ describe(' tag', function () { defer(() => { server.close(); }); - await new Promise(resolve => server.listen(0, '127.0.0.1', resolve)); - const port = (server.address() as AddressInfo).port; + const { port } = await listen(server); const e = await loadWebViewAndWaitForEvent(w, { nodeintegration: 'on', webpreferences: 'contextIsolation=no',