feat(webkit): page.on('popup')
This commit is contained in:
parent
f1f9dc166b
commit
f0210a7532
|
|
@ -24,6 +24,7 @@ import { Page } from '../page';
|
||||||
import { Target } from './Target';
|
import { Target } from './Target';
|
||||||
import { Protocol } from './protocol';
|
import { Protocol } from './protocol';
|
||||||
import * as types from '../types';
|
import * as types from '../types';
|
||||||
|
import { Events } from '../events';
|
||||||
|
|
||||||
export class Browser extends EventEmitter {
|
export class Browser extends EventEmitter {
|
||||||
readonly _defaultViewport: types.Viewport;
|
readonly _defaultViewport: types.Viewport;
|
||||||
|
|
@ -119,7 +120,7 @@ export class Browser extends EventEmitter {
|
||||||
const existingTarget = this.targets().find(predicate);
|
const existingTarget = this.targets().find(predicate);
|
||||||
if (existingTarget)
|
if (existingTarget)
|
||||||
return existingTarget;
|
return existingTarget;
|
||||||
let resolve;
|
let resolve : (a: Target) => void;
|
||||||
const targetPromise = new Promise<Target>(x => resolve = x);
|
const targetPromise = new Promise<Target>(x => resolve = x);
|
||||||
this._privateEvents.on(BrowserEvents.TargetCreated, check);
|
this._privateEvents.on(BrowserEvents.TargetCreated, check);
|
||||||
try {
|
try {
|
||||||
|
|
@ -158,6 +159,16 @@ export class Browser extends EventEmitter {
|
||||||
const target = new Target(session, targetInfo, context);
|
const target = new Target(session, targetInfo, context);
|
||||||
this._targets.set(targetInfo.targetId, target);
|
this._targets.set(targetInfo.targetId, target);
|
||||||
this._privateEvents.emit(BrowserEvents.TargetCreated, target);
|
this._privateEvents.emit(BrowserEvents.TargetCreated, target);
|
||||||
|
if (!targetInfo.oldTargetId && targetInfo.openerId) {
|
||||||
|
const opener = this._targets.get(targetInfo.openerId);
|
||||||
|
if (!opener)
|
||||||
|
return;
|
||||||
|
const openerPage = opener._page;
|
||||||
|
if (!openerPage)
|
||||||
|
return;
|
||||||
|
const page = await target.page();
|
||||||
|
openerPage.emit(Events.Page.Popup, page);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_onTargetDestroyed({targetId}) {
|
_onTargetDestroyed({targetId}) {
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ export class Target {
|
||||||
readonly _type: 'page' | 'service-worker' | 'worker';
|
readonly _type: 'page' | 'service-worker' | 'worker';
|
||||||
private readonly _session: TargetSession;
|
private readonly _session: TargetSession;
|
||||||
private _pagePromise: Promise<Page<Browser, BrowserContext>> | null = null;
|
private _pagePromise: Promise<Page<Browser, BrowserContext>> | null = null;
|
||||||
private _page: Page<Browser, BrowserContext> | null = null;
|
_page: Page<Browser, BrowserContext> | null = null;
|
||||||
|
|
||||||
static fromPage(page: Page<Browser, BrowserContext>): Target {
|
static fromPage(page: Page<Browser, BrowserContext>): Target {
|
||||||
return (page as any)[targetSymbol];
|
return (page as any)[targetSymbol];
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ module.exports.addTests = function({testRunner, expect, headless, playwright, FF
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe.skip(WEBKIT)('Page.Events.Popup', function() {
|
describe('Page.Events.Popup', function() {
|
||||||
it('should work', async({page}) => {
|
it('should work', async({page}) => {
|
||||||
const [popup] = await Promise.all([
|
const [popup] = await Promise.all([
|
||||||
new Promise(x => page.once('popup', x)),
|
new Promise(x => page.once('popup', x)),
|
||||||
|
|
@ -136,7 +136,7 @@ module.exports.addTests = function({testRunner, expect, headless, playwright, FF
|
||||||
});
|
});
|
||||||
it('should work with clicking target=_blank', async({page, server}) => {
|
it('should work with clicking target=_blank', async({page, server}) => {
|
||||||
await page.goto(server.EMPTY_PAGE);
|
await page.goto(server.EMPTY_PAGE);
|
||||||
await page.setContent('<a target=_blank href="/one-style.html">yo</a>');
|
await page.setContent('<a target=_blank rel="opener" href="/one-style.html">yo</a>');
|
||||||
const [popup] = await Promise.all([
|
const [popup] = await Promise.all([
|
||||||
new Promise(x => page.once('popup', x)),
|
new Promise(x => page.once('popup', x)),
|
||||||
page.click('a'),
|
page.click('a'),
|
||||||
|
|
@ -164,6 +164,18 @@ module.exports.addTests = function({testRunner, expect, headless, playwright, FF
|
||||||
expect(await page.evaluate(() => !!window.opener)).toBe(false);
|
expect(await page.evaluate(() => !!window.opener)).toBe(false);
|
||||||
expect(await popup.evaluate(() => !!window.opener)).toBe(false);
|
expect(await popup.evaluate(() => !!window.opener)).toBe(false);
|
||||||
});
|
});
|
||||||
|
it('should not treat navigations as new popups', async({page, server}) => {
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
|
await page.setContent('<a target=_blank rel=noopener href="/one-style.html">yo</a>');
|
||||||
|
const [popup] = await Promise.all([
|
||||||
|
new Promise(x => page.once('popup', x)),
|
||||||
|
page.click('a'),
|
||||||
|
]);
|
||||||
|
let badSecondPopup = false;
|
||||||
|
page.on('popup', () => badSecondPopup = true);
|
||||||
|
await popup.goto(server.CROSS_PROCESS_PREFIX + '/empty.html');
|
||||||
|
expect(badSecondPopup).toBe(false);
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
describe.skip(FFOX || WEBKIT)('Interception.setOfflineMode', function() {
|
describe.skip(FFOX || WEBKIT)('Interception.setOfflineMode', function() {
|
||||||
|
|
@ -1172,10 +1184,8 @@ module.exports.addTests = function({testRunner, expect, headless, playwright, FF
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// FIXME: WebKit shouldn't send targetDestroyed on PSON so that we could
|
|
||||||
// convert target destroy events into close.
|
|
||||||
describe('Page.Events.Close', function() {
|
describe('Page.Events.Close', function() {
|
||||||
it.skip(WEBKIT)('should work with window.close', async function({ browser, page, context, server }) {
|
it('should work with window.close', async function({ browser, page, context, server }) {
|
||||||
const newPagePromise = new Promise(f => page.once('popup', f));
|
const newPagePromise = new Promise(f => page.once('popup', f));
|
||||||
await page.evaluate(() => window['newPage'] = window.open('about:blank'));
|
await page.evaluate(() => window['newPage'] = window.open('about:blank'));
|
||||||
const newPage = await newPagePromise;
|
const newPage = await newPagePromise;
|
||||||
|
|
@ -1183,7 +1193,7 @@ module.exports.addTests = function({testRunner, expect, headless, playwright, FF
|
||||||
await page.evaluate(() => window['newPage'].close());
|
await page.evaluate(() => window['newPage'].close());
|
||||||
await closedPromise;
|
await closedPromise;
|
||||||
});
|
});
|
||||||
it.skip(WEBKIT)('should work with page.close', async function({ page, context, server }) {
|
it('should work with page.close', async function({ page, context, server }) {
|
||||||
const newPage = await context.newPage();
|
const newPage = await context.newPage();
|
||||||
const closedPromise = new Promise(x => newPage.on('close', x));
|
const closedPromise = new Promise(x => newPage.on('close', x));
|
||||||
await newPage.close();
|
await newPage.close();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue