Skip to content

Commit

Permalink
fix(page): fix race condition in WaitTask (#2739)
Browse files Browse the repository at this point in the history
This patch eliminates a common race condition with WaitTask, that
happens when predicate function gets resolved right before the execution
context gets destroyed.
This situation results in a "Cannot find context with specified id undefined"
exception.

Credits go to @jakub300 for his wonderful [investigation](#1325 (comment)).

Fixes #1325.
  • Loading branch information
aslushnikov committed Jun 14, 2018
1 parent ed7a26c commit ddfdaf9
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/FrameManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -869,7 +869,9 @@ class WaitTask {
}

// Ignore timeouts in pageScript - we track timeouts ourselves.
if (!error && await this._frame.evaluate(s => !s, success)) {
// If the frame's execution context has already changed, `frame.evaluate` will
// throw an error - ignore this predicate run altogether.
if (!error && await this._frame.evaluate(s => !s, success).catch(e => true)) {
await success.dispose();
return;
}
Expand Down
8 changes: 8 additions & 0 deletions test/frame.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,14 @@ module.exports.addTests = function({testRunner, expect}) {
await page.evaluate(() => window.__FOO = 1);
await watchdog;
});
it('should work when resolved right before execution context disposal', async({page, server}) => {
await page.evaluateOnNewDocument(() => window.__RELOADED = true);
await page.waitForFunction(() => {
if (!window.__RELOADED)
window.location.reload();
return true;
});
});
it('should poll on interval', async({page, server}) => {
let success = false;
const startTime = Date.now();
Expand Down

0 comments on commit ddfdaf9

Please sign in to comment.