Do not leave dangling promises when sending messages over protocol (#742)

It's very bad to have 'unhandled promise rejection' that can't be
handled in user code. These errors will exit node process in a near
future.

This patch avoids 'unhandled promise rejection' while sending protocol
messages.

This patch:
- introduces `puppeteer:error` debug scope and starts using it for all
  swalloed errors.
- makes sure that every `client.send` method is either awaited or its
  errors are handled.
- starts return promises from Request.continue() and Request.abort().
- starts swallow errors from Request.contine() and Request.abort().

The last is the most important part of the patch. Since
`Request.continue()` might try to continue canceled request, we should
disregard the error.

Fixes #627.
This commit is contained in:
Andrey Lushnikov
2017-09-11 16:21:51 -07:00
committed by GitHub
parent f11e09d0d4
commit 0bea42bd8c
14 changed files with 61 additions and 29 deletions

View File

@@ -17,7 +17,7 @@
const fs = require('fs');
const rm = require('rimraf').sync;
const path = require('path');
const helper = require('../lib/helper');
const {helper} = require('../lib/helper');
if (process.env.COVERAGE)
helper.recordPublicAPICoverage();
console.log('Testing on Node', process.version);
@@ -986,6 +986,20 @@ describe('Page', function() {
expect(requests.length).toBe(2);
expect(requests[1].response().status).toBe(404);
}));
it('should not throw "Invalid Interception Id" if the request was cancelled', SX(async function() {
await page.setContent('<iframe></iframe>');
await page.setRequestInterceptionEnabled(true);
let request = null;
page.on('request', async r => request = r);
page.$eval('iframe', (frame, url) => frame.src = url, EMPTY_PAGE),
// Wait for request interception.
await waitForEvents(page, 'request');
// Delete frame to cause request to be canceled.
await page.$eval('iframe', frame => frame.remove());
let error = null;
await request.continue().catch(e => error = e);
expect(error).toBe(null);
}));
});
describe('Page.Events.Dialog', function() {