feat(bringToFront): enable on all browsers (#3052)

This commit is contained in:
Pavel Feldman 2020-07-21 09:36:54 -07:00 committed by GitHub
parent a03f1dd156
commit 99658c2d32
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 67 additions and 1 deletions

View file

@ -7,7 +7,7 @@
}, },
{ {
"name": "firefox", "name": "firefox",
"revision": "1128" "revision": "1134"
}, },
{ {
"name": "webkit", "name": "webkit",

View file

@ -702,6 +702,7 @@ page.removeListener('request', logRequest);
- [page.addInitScript(script[, arg])](#pageaddinitscriptscript-arg) - [page.addInitScript(script[, arg])](#pageaddinitscriptscript-arg)
- [page.addScriptTag(options)](#pageaddscripttagoptions) - [page.addScriptTag(options)](#pageaddscripttagoptions)
- [page.addStyleTag(options)](#pageaddstyletagoptions) - [page.addStyleTag(options)](#pageaddstyletagoptions)
- [page.bringToFront()](#pagebringtofront)
- [page.check(selector, [options])](#pagecheckselector-options) - [page.check(selector, [options])](#pagecheckselector-options)
- [page.click(selector[, options])](#pageclickselector-options) - [page.click(selector[, options])](#pageclickselector-options)
- [page.close([options])](#pagecloseoptions) - [page.close([options])](#pagecloseoptions)
@ -1007,6 +1008,14 @@ Adds a `<link rel="stylesheet">` tag into the page with the desired url or a `<s
Shortcut for [page.mainFrame().addStyleTag(options)](#frameaddstyletagoptions). Shortcut for [page.mainFrame().addStyleTag(options)](#frameaddstyletagoptions).
#### page.bringToFront()
- returns: <[Promise]>
Brings page to front (activates tab).
#### page.check(selector, [options]) #### page.check(selector, [options])
- `selector` <[string]> A selector to search for checkbox or radio button to check. If there are multiple elements satisfying the selector, the first will be checked. See [working with selectors](#working-with-selectors) for more details. - `selector` <[string]> A selector to search for checkbox or radio button to check. If there are multiple elements satisfying the selector, the first will be checked. See [working with selectors](#working-with-selectors) for more details.
- `options` <[Object]> - `options` <[Object]>

View file

@ -143,6 +143,10 @@ export class CRPage implements PageDelegate {
await this._mainFrameSession._updateViewport(); await this._mainFrameSession._updateViewport();
} }
async bringToFront(): Promise<void> {
await this._mainFrameSession._client.send('Page.bringToFront');
}
async updateEmulateMedia(): Promise<void> { async updateEmulateMedia(): Promise<void> {
await this._forAllFrameSessions(frame => frame._updateEmulateMedia()); await this._forAllFrameSessions(frame => frame._updateEmulateMedia());
} }

View file

@ -286,6 +286,10 @@ export class FFPage implements PageDelegate {
}); });
} }
async bringToFront(): Promise<void> {
await this._session.send('Page.bringToFront', {});
}
async updateEmulateMedia(): Promise<void> { async updateEmulateMedia(): Promise<void> {
const colorScheme = this._page._state.colorScheme || this._browserContext._options.colorScheme || 'light'; const colorScheme = this._page._state.colorScheme || this._browserContext._options.colorScheme || 'light';
await this._session.send('Page.setEmulatedMedia', { await this._session.send('Page.setEmulatedMedia', {

View file

@ -409,6 +409,9 @@ export module Protocol {
}|null; }|null;
}; };
export type setViewportSizeReturnValue = void; export type setViewportSizeReturnValue = void;
export type bringToFrontParameters = {
};
export type bringToFrontReturnValue = void;
export type setEmulatedMediaParameters = { export type setEmulatedMediaParameters = {
type?: ("screen"|"print"|""); type?: ("screen"|"print"|"");
colorScheme?: ("dark"|"light"|"no-preference"); colorScheme?: ("dark"|"light"|"no-preference");
@ -963,6 +966,7 @@ export module Protocol {
"Page.setFileInputFiles": Page.setFileInputFilesParameters; "Page.setFileInputFiles": Page.setFileInputFilesParameters;
"Page.addBinding": Page.addBindingParameters; "Page.addBinding": Page.addBindingParameters;
"Page.setViewportSize": Page.setViewportSizeParameters; "Page.setViewportSize": Page.setViewportSizeParameters;
"Page.bringToFront": Page.bringToFrontParameters;
"Page.setEmulatedMedia": Page.setEmulatedMediaParameters; "Page.setEmulatedMedia": Page.setEmulatedMediaParameters;
"Page.setCacheDisabled": Page.setCacheDisabledParameters; "Page.setCacheDisabled": Page.setCacheDisabledParameters;
"Page.describeNode": Page.describeNodeParameters; "Page.describeNode": Page.describeNodeParameters;
@ -1033,6 +1037,7 @@ export module Protocol {
"Page.setFileInputFiles": Page.setFileInputFilesReturnValue; "Page.setFileInputFiles": Page.setFileInputFilesReturnValue;
"Page.addBinding": Page.addBindingReturnValue; "Page.addBinding": Page.addBindingReturnValue;
"Page.setViewportSize": Page.setViewportSizeReturnValue; "Page.setViewportSize": Page.setViewportSizeReturnValue;
"Page.bringToFront": Page.bringToFrontReturnValue;
"Page.setEmulatedMedia": Page.setEmulatedMediaReturnValue; "Page.setEmulatedMedia": Page.setEmulatedMediaReturnValue;
"Page.setCacheDisabled": Page.setCacheDisabledReturnValue; "Page.setCacheDisabled": Page.setCacheDisabledReturnValue;
"Page.describeNode": Page.describeNodeReturnValue; "Page.describeNode": Page.describeNodeReturnValue;

View file

@ -53,6 +53,7 @@ export interface PageDelegate {
updateEmulateMedia(): Promise<void>; updateEmulateMedia(): Promise<void>;
updateRequestInterception(): Promise<void>; updateRequestInterception(): Promise<void>;
setFileChooserIntercepted(enabled: boolean): Promise<void>; setFileChooserIntercepted(enabled: boolean): Promise<void>;
bringToFront(): Promise<void>;
canScreenshotOutsideViewport(): boolean; canScreenshotOutsideViewport(): boolean;
resetViewport(): Promise<void>; // Only called if canScreenshotOutsideViewport() returns false. resetViewport(): Promise<void>; // Only called if canScreenshotOutsideViewport() returns false.
@ -403,6 +404,10 @@ export class Page extends EventEmitter {
return this._state.viewportSize; return this._state.viewportSize;
} }
async bringToFront(): Promise<void> {
await this._delegate.bringToFront();
}
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R>; async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R>;
async evaluate<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<R>; async evaluate<R>(pageFunction: js.Func1<void, R>, arg?: any): Promise<R>;
async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R> { async evaluate<R, Arg>(pageFunction: js.Func1<Arg, R>, arg: Arg): Promise<R> {

View file

@ -544,6 +544,7 @@ export interface PageChannel extends Channel {
crStopJSCoverage(params?: PageCrStopJSCoverageParams): Promise<PageCrStopJSCoverageResult>; crStopJSCoverage(params?: PageCrStopJSCoverageParams): Promise<PageCrStopJSCoverageResult>;
crStartCSSCoverage(params: PageCrStartCSSCoverageParams): Promise<PageCrStartCSSCoverageResult>; crStartCSSCoverage(params: PageCrStartCSSCoverageParams): Promise<PageCrStartCSSCoverageResult>;
crStopCSSCoverage(params?: PageCrStopCSSCoverageParams): Promise<PageCrStopCSSCoverageResult>; crStopCSSCoverage(params?: PageCrStopCSSCoverageParams): Promise<PageCrStopCSSCoverageResult>;
bringToFront(params?: PageBringToFrontParams): Promise<PageBringToFrontResult>;
} }
export type PageBindingCallEvent = { export type PageBindingCallEvent = {
binding: BindingCallChannel, binding: BindingCallChannel,
@ -798,6 +799,8 @@ export type PageCrStopCSSCoverageResult = {
}[], }[],
}[], }[],
}; };
export type PageBringToFrontParams = {};
export type PageBringToFrontResult = void;
// ----------- Frame ----------- // ----------- Frame -----------
export type FrameInitializer = { export type FrameInitializer = {

View file

@ -414,6 +414,12 @@ export class Page extends ChannelOwner<PageChannel, PageInitializer> {
return this._attributeToPage(() => this._mainFrame.title()); return this._attributeToPage(() => this._mainFrame.title());
} }
async bringToFront(): Promise<void> {
return this._wrapApiCall('page.bringToFront', async () => {
await this._channel.bringToFront();
});
}
async close(options: { runBeforeUnload?: boolean } = {runBeforeUnload: undefined}) { async close(options: { runBeforeUnload?: boolean } = {runBeforeUnload: undefined}) {
return this._wrapApiCall('page.close', async () => { return this._wrapApiCall('page.close', async () => {
await this._channel.close(options); await this._channel.close(options);

View file

@ -718,6 +718,8 @@ interface Page
start: number start: number
end: number end: number
command bringToFront
interface Frame interface Frame
initializer initializer
url: string url: string

View file

@ -195,6 +195,10 @@ export class PageDispatcher extends Dispatcher<Page, PageInitializer> implements
return { pdf: buffer.toString('base64') }; return { pdf: buffer.toString('base64') };
} }
async bringToFront(): Promise<void> {
await this._page.bringToFront();
}
async crStartJSCoverage(params: types.JSCoverageOptions): Promise<void> { async crStartJSCoverage(params: types.JSCoverageOptions): Promise<void> {
const coverage = this._page.coverage as CRCoverage; const coverage = this._page.coverage as CRCoverage;
await coverage.startJSCoverage(params); await coverage.startJSCoverage(params);

View file

@ -576,6 +576,12 @@ export class WKPage implements PageDelegate {
await this._updateViewport(); await this._updateViewport();
} }
async bringToFront(): Promise<void> {
this._pageProxySession.send('Target.activate', {
targetId: this._session.sessionId
});
}
async _updateViewport(): Promise<void> { async _updateViewport(): Promise<void> {
const options = this._browserContext._options; const options = this._browserContext._options;
const viewportSize = this._page._state.viewportSize; const viewportSize = this._page._state.viewportSize;

View file

@ -143,4 +143,22 @@ describe('Headful', function() {
await context.close(); await context.close();
await browser.close(); await browser.close();
}); });
it('Page.bringToFront should work', async ({browserType, defaultBrowserOptions}) => {
const browser = await browserType.launch({...defaultBrowserOptions, headless: false });
const page1 = await browser.newPage();
await page1.setContent('Page1')
const page2 = await browser.newPage();
await page2.setContent('Page2')
await page1.bringToFront();
expect(await page1.evaluate('document.visibilityState')).toBe('visible');
expect(await page2.evaluate('document.visibilityState')).toBe('visible');
await page2.bringToFront();
expect(await page1.evaluate('document.visibilityState')).toBe('visible');
expect(await page2.evaluate('document.visibilityState')).toBe(
'visible'
);
await browser.close();
});
}); });