Skip to content

Commit

Permalink
fix(frames): make sure evaluation does not hang in detached iframes
Browse files Browse the repository at this point in the history
  • Loading branch information
aslushnikov committed Jan 15, 2019
1 parent 7fabf32 commit 40ea53e
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/FrameManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -951,6 +951,7 @@ class Frame {
for (const waitTask of this._waitTasks)
waitTask.terminate(new Error('waitForFunction failed: frame got detached.'));
this._detached = true;
this._contextPromise = Promise.reject(new Error(`Cannot evaluate in detached frame "${this.url()}"`));
if (this._parentFrame)
this._parentFrame._childFrames.delete(this);
this._parentFrame = null;
Expand Down
21 changes: 21 additions & 0 deletions test/frame.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@ module.exports.addTests = function({testRunner, expect}) {
const windowHandle = await mainFrame.evaluateHandle(() => window);
expect(windowHandle).toBeTruthy();
});
it('should throw for detached frames', async({page, server}) => {
const frame1 = await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
await utils.detachFrame(page, 'frame1');
let error = null;
await frame1.evaluate(() => 7 * 8).catch(e => error = e);
console.log(error);
});
});

describe('Frame Management', function() {
Expand Down Expand Up @@ -146,5 +153,19 @@ module.exports.addTests = function({testRunner, expect}) {
expect(page.frames()[1].parentFrame()).toBe(page.mainFrame());
expect(page.frames()[2].parentFrame()).toBe(page.mainFrame());
});
it('should report different frame instance when frame re-attaches', async({page, server}) => {
const frame1 = await utils.attachFrame(page, 'frame1', server.EMPTY_PAGE);
await page.evaluate(() => {
window.frame = document.querySelector('#frame1');
window.frame.remove();
});
expect(frame1.isDetached()).toBe(true);
const [frame2] = await Promise.all([
utils.waitEvent(page, 'frameattached'),
page.evaluate(() => document.body.appendChild(window.frame)),
]);
expect(frame2.isDetached()).toBe(false);
expect(frame1).not.toBe(frame2);
});
});
};

0 comments on commit 40ea53e

Please sign in to comment.