From 2d86fbfc481af108bd5d013427f96b8205528d76 Mon Sep 17 00:00:00 2001 From: Almog Geva Date: Mon, 5 Sep 2022 17:40:06 +0300 Subject: [PATCH] fix(waitForFunction): clearing timeout when callback function returns a truthy value (#283) --- __snapshots__/lighthouse-e2e.test.ts.js | 3 ++- __snapshots__/stringify.test.ts.js | 30 ++++++++++++++++--------- src/PuppeteerRunnerExtension.ts | 3 ++- src/PuppeteerStringifyExtension.ts | 3 ++- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/__snapshots__/lighthouse-e2e.test.ts.js b/__snapshots__/lighthouse-e2e.test.ts.js index bc3a76ff..0448c572 100644 --- a/__snapshots__/lighthouse-e2e.test.ts.js +++ b/__snapshots__/lighthouse-e2e.test.ts.js @@ -227,12 +227,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); diff --git a/__snapshots__/stringify.test.ts.js b/__snapshots__/stringify.test.ts.js index bcec6d66..7944464b 100644 --- a/__snapshots__/stringify.test.ts.js +++ b/__snapshots__/stringify.test.ts.js @@ -144,12 +144,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -316,12 +317,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -492,12 +494,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -667,12 +670,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -844,12 +848,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -1009,12 +1014,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -1174,12 +1180,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -1345,12 +1352,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -1512,12 +1520,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); @@ -1679,12 +1688,13 @@ const puppeteer = require('puppeteer'); // v13.0.0 or later async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100)); diff --git a/src/PuppeteerRunnerExtension.ts b/src/PuppeteerRunnerExtension.ts index 41763ae4..3efff5e1 100644 --- a/src/PuppeteerRunnerExtension.ts +++ b/src/PuppeteerRunnerExtension.ts @@ -636,12 +636,13 @@ async function waitForFunction( timeout: number ): Promise { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise((resolve) => setTimeout(resolve, 100)); diff --git a/src/PuppeteerStringifyExtension.ts b/src/PuppeteerStringifyExtension.ts index 0dc7778d..1aa37935 100644 --- a/src/PuppeteerStringifyExtension.ts +++ b/src/PuppeteerStringifyExtension.ts @@ -448,12 +448,13 @@ async function querySelectorAll(selector, frame) { async function waitForFunction(fn, timeout) { let isActive = true; - setTimeout(() => { + const timeoutId = setTimeout(() => { isActive = false; }, timeout); while (isActive) { const result = await fn(); if (result) { + clearTimeout(timeoutId); return; } await new Promise(resolve => setTimeout(resolve, 100));