fix(popup): do not report frameless pages (#2910)
This commit is contained in:
parent
c21b637358
commit
c89c30e333
|
|
@ -151,12 +151,15 @@ export class CRBrowser extends BrowserBase {
|
||||||
const opener = targetInfo.openerId ? this._crPages.get(targetInfo.openerId) || null : null;
|
const opener = targetInfo.openerId ? this._crPages.get(targetInfo.openerId) || null : null;
|
||||||
const crPage = new CRPage(session, targetInfo.targetId, context, opener, !!this._options.headful);
|
const crPage = new CRPage(session, targetInfo.targetId, context, opener, !!this._options.headful);
|
||||||
this._crPages.set(targetInfo.targetId, crPage);
|
this._crPages.set(targetInfo.targetId, crPage);
|
||||||
crPage.pageOrError().then(() => {
|
crPage.pageOrError().then(pageOrError => {
|
||||||
context!.emit(CommonEvents.BrowserContext.Page, crPage._page);
|
const page = crPage._page;
|
||||||
|
if (pageOrError instanceof Error)
|
||||||
|
page._setIsError();
|
||||||
|
context!.emit(CommonEvents.BrowserContext.Page, page);
|
||||||
if (opener) {
|
if (opener) {
|
||||||
opener.pageOrError().then(openerPage => {
|
opener.pageOrError().then(openerPage => {
|
||||||
if (openerPage instanceof Page && !openerPage.isClosed())
|
if (openerPage instanceof Page && !openerPage.isClosed())
|
||||||
openerPage.emit(CommonEvents.Page.Popup, crPage._page);
|
openerPage.emit(CommonEvents.Page.Popup, page);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -97,8 +97,10 @@ export class FFBrowser extends BrowserBase {
|
||||||
const ffPage = new FFPage(session, context, opener);
|
const ffPage = new FFPage(session, context, opener);
|
||||||
this._ffPages.set(targetId, ffPage);
|
this._ffPages.set(targetId, ffPage);
|
||||||
|
|
||||||
ffPage.pageOrError().then(async () => {
|
ffPage.pageOrError().then(async pageOrError => {
|
||||||
const page = ffPage._page;
|
const page = ffPage._page;
|
||||||
|
if (pageOrError instanceof Error)
|
||||||
|
page._setIsError();
|
||||||
context.emit(Events.BrowserContext.Page, page);
|
context.emit(Events.BrowserContext.Page, page);
|
||||||
if (!opener)
|
if (!opener)
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -490,6 +490,11 @@ export class Page extends EventEmitter {
|
||||||
await this._ownedContext.close();
|
await this._ownedContext.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_setIsError() {
|
||||||
|
if (!this._frameManager.mainFrame())
|
||||||
|
this._frameManager.frameAttached('<dummy>', null);
|
||||||
|
}
|
||||||
|
|
||||||
isClosed(): boolean {
|
isClosed(): boolean {
|
||||||
return this._closedState === 'closed';
|
return this._closedState === 'closed';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -167,7 +167,8 @@ export interface PageChannel extends Channel {
|
||||||
|
|
||||||
export type PageInitializer = {
|
export type PageInitializer = {
|
||||||
mainFrame: FrameChannel,
|
mainFrame: FrameChannel,
|
||||||
viewportSize: types.Size | null
|
viewportSize: types.Size | null,
|
||||||
|
isClosed: boolean
|
||||||
};
|
};
|
||||||
|
|
||||||
export type PageAttribution = { isPage?: boolean };
|
export type PageAttribution = { isPage?: boolean };
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,7 @@ export class Page extends ChannelOwner<PageChannel, PageInitializer> {
|
||||||
this._mainFrame._page = this;
|
this._mainFrame._page = this;
|
||||||
this._frames.add(this._mainFrame);
|
this._frames.add(this._mainFrame);
|
||||||
this._viewportSize = initializer.viewportSize;
|
this._viewportSize = initializer.viewportSize;
|
||||||
|
this._closed = initializer.isClosed;
|
||||||
|
|
||||||
this._channel.on('bindingCall', bindingCall => this._onBinding(BindingCall.from(bindingCall)));
|
this._channel.on('bindingCall', bindingCall => this._onBinding(BindingCall.from(bindingCall)));
|
||||||
this._channel.on('close', () => this._onClose());
|
this._channel.on('close', () => this._onClose());
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,8 @@ export class PageDispatcher extends Dispatcher<Page, PageInitializer> implements
|
||||||
constructor(scope: DispatcherScope, page: Page) {
|
constructor(scope: DispatcherScope, page: Page) {
|
||||||
super(scope, page, 'page', {
|
super(scope, page, 'page', {
|
||||||
mainFrame: FrameDispatcher.from(scope, page.mainFrame()),
|
mainFrame: FrameDispatcher.from(scope, page.mainFrame()),
|
||||||
viewportSize: page.viewportSize()
|
viewportSize: page.viewportSize(),
|
||||||
|
isClosed: page.isClosed()
|
||||||
});
|
});
|
||||||
this._page = page;
|
this._page = page;
|
||||||
page.on(Events.Page.Close, () => this._dispatchEvent('close'));
|
page.on(Events.Page.Close, () => this._dispatchEvent('close'));
|
||||||
|
|
|
||||||
|
|
@ -140,8 +140,10 @@ export class WKBrowser extends BrowserBase {
|
||||||
const wkPage = new WKPage(context, pageProxySession, opener || null);
|
const wkPage = new WKPage(context, pageProxySession, opener || null);
|
||||||
this._wkPages.set(pageProxyId, wkPage);
|
this._wkPages.set(pageProxyId, wkPage);
|
||||||
|
|
||||||
wkPage.pageOrError().then(async () => {
|
wkPage.pageOrError().then(async pageOrError => {
|
||||||
const page = wkPage._page;
|
const page = wkPage._page;
|
||||||
|
if (pageOrError instanceof Error)
|
||||||
|
page._setIsError();
|
||||||
context!.emit(Events.BrowserContext.Page, page);
|
context!.emit(Events.BrowserContext.Page, page);
|
||||||
if (!opener)
|
if (!opener)
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -129,6 +129,23 @@ describe('BrowserContext', function() {
|
||||||
]);
|
]);
|
||||||
await context.close();
|
await context.close();
|
||||||
});
|
});
|
||||||
|
it('should not report frameless pages on error', async({browser, server}) => {
|
||||||
|
const context = await browser.newContext();
|
||||||
|
page = await context.newPage();
|
||||||
|
server.setRoute('/empty.html', (req, res) => {
|
||||||
|
res.end(`<a href="${server.EMPTY_PAGE}" target="_blank">Click me</a>`);
|
||||||
|
});
|
||||||
|
let popup;
|
||||||
|
context.on('page', p => popup = p);
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
|
await page.click('"Click me"');
|
||||||
|
await context.close();
|
||||||
|
if (popup) {
|
||||||
|
// This races on Firefox :/
|
||||||
|
expect(popup.isClosed()).toBeTruthy();
|
||||||
|
expect(popup.mainFrame()).toBeTruthy();
|
||||||
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('BrowserContext({userAgent})', function() {
|
describe('BrowserContext({userAgent})', function() {
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ describe.skip(!CHANNEL)('Channels', function() {
|
||||||
await expectScopeState(browser, GOLDEN_PRECONDITION);
|
await expectScopeState(browser, GOLDEN_PRECONDITION);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should scope CDPSession handles', async({browserType, browser, server}) => {
|
it.skip(!CHROMIUM)('should scope CDPSession handles', async({browserType, browser, server}) => {
|
||||||
const GOLDEN_PRECONDITION = {
|
const GOLDEN_PRECONDITION = {
|
||||||
objects: [ 'chromium', 'firefox', 'webkit', 'playwright', 'browser' ],
|
objects: [ 'chromium', 'firefox', 'webkit', 'playwright', 'browser' ],
|
||||||
scopes: [
|
scopes: [
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ describe('Async stacks', () => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe.fail(FFOX && WIN)('Page.Events.Crash', function() {
|
describe.fail(FFOX && WIN).skip(CHANNEL)('Page.Events.Crash', function() {
|
||||||
// Firefox Win: it just doesn't crash sometimes.
|
// Firefox Win: it just doesn't crash sometimes.
|
||||||
|
|
||||||
function crash(page) {
|
function crash(page) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue