From 0adb1d5b1d026e58ef49bb6cbb8afa93d2bf50da Mon Sep 17 00:00:00 2001 From: Nivedha Date: Fri, 24 May 2024 15:21:38 +0530 Subject: [PATCH] add back beforeunload --- lib/connection.js | 12 +++++++++++- lib/taiko.js | 23 ++++++++++++++++------- test/unit-tests/beforeunload.test.js | 4 +--- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/lib/connection.js b/lib/connection.js index 5e4cc7535..41ac132d8 100644 --- a/lib/connection.js +++ b/lib/connection.js @@ -126,13 +126,23 @@ const connect_to_cri = async (target, options = {}) => { return initCRI(tgt, numRetries, options); }; -const closeConnection = async () => { +const closeConnection = async (promisesToBeResolvedBeforeCloseBrowser) => { if (_client) { // remove listeners other than JS dialog for beforeUnload on client first to stop executing them when closing await _client.removeAllListeners(); pageHandler.addJavascriptDialogOpeningListener(); if (!defaultConfig.firefox) { await pageHandler.closePage(); + + await new Promise((resolve) => { + let timeout = setTimeout(() => { + resolve(); + }, defaultConfig.retryTimeout); + Promise.all(promisesToBeResolvedBeforeCloseBrowser).then(() => { + clearTimeout(timeout); + resolve(); + }); + }); } } defaultConfig.connectedToRemoteBrowser ? await _client.Browser.close() : await closeBrowser(); diff --git a/lib/taiko.js b/lib/taiko.js index 4b6bdfa1d..ea6241ee8 100644 --- a/lib/taiko.js +++ b/lib/taiko.js @@ -135,7 +135,7 @@ module.exports.closeBrowser = async () => { const _closeBrowser = async () => { fetchHandler.resetInterceptors(); - await closeConnection(); + await closeConnection(promisesToBeResolvedBeforeCloseBrowser); }; /** @@ -2223,11 +2223,7 @@ module.exports.confirm = (message, callback) => dialog('confirm', message, callb * * @param {function} callback - Action to perform. Accept/Dismiss. */ -module.exports.beforeunload = () => { - console.warn( - 'beforeunload handler is not supported any more refer https://developer.chrome.com/docs/web-platform/deprecating-unload', - ); -}; +module.exports.beforeunload = (callback) => dialog('beforeunload', '', callback); /** * Evaluates script on element matching the given selector. @@ -2520,8 +2516,18 @@ module.exports.getConfig = getConfig; */ module.exports.setConfig = setConfig; +const promisesToBeResolvedBeforeCloseBrowser = []; + const dialog = (dialogType, dialogMessage, callback) => { validate(); + let resolver = null; + if (dialogType === 'beforeunload') { + promisesToBeResolvedBeforeCloseBrowser.push( + new Promise((resolve) => { + resolver = resolve; + }), + ); + } let eventName = ''; if (isFunction(dialogMessage)) { eventName = dialogType; @@ -2530,7 +2536,10 @@ const dialog = (dialogType, dialogMessage, callback) => { eventName = createJsDialogEvent(dialogMessage, dialogType); eventRegexMap.set(eventName, new RegExp(dialogMessage)); } - return eventHandler.once(eventName, callback); + return eventHandler.once(eventName, async (args) => { + await callback(args); + resolver && resolver(); + }); }; const createJsDialogEvent = (message, dType) => { diff --git a/test/unit-tests/beforeunload.test.js b/test/unit-tests/beforeunload.test.js index 204aaaf6e..d1c50f2d2 100644 --- a/test/unit-tests/beforeunload.test.js +++ b/test/unit-tests/beforeunload.test.js @@ -16,9 +16,7 @@ let { let { createHtml, removeFile, openBrowserArgs } = require('./test-util'); const test_name = 'beforeunload'; -// TODO: Skip this test and remove the unload functionality -// Refer:https://developer.chrome.com/docs/web-platform/deprecating-unload -xdescribe(test_name, () => { +describe(test_name, () => { let filePath, filePath1; let called = false; before(async () => {