Skip to content

Commit ff978e5

Browse files
feat(browser): playwright provider doesn't allow resizing the browser viewport (#5984)
Co-authored-by: Vladimir Sheremet <sleuths.slews0s@icloud.com>
1 parent b1a27d4 commit ff978e5

File tree

4 files changed

+62
-7
lines changed

4 files changed

+62
-7
lines changed

packages/browser/src/node/providers/playwright.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type {
22
Browser,
3-
43
BrowserContext,
54
BrowserContextOptions,
65
Frame,
@@ -67,10 +66,22 @@ export class PlaywrightBrowserProvider implements BrowserProvider {
6766

6867
const playwright = await import('playwright')
6968

70-
const browser = await playwright[this.browserName].launch({
69+
const launchOptions = {
7170
...this.options?.launch,
7271
headless: options.headless,
73-
})
72+
} satisfies LaunchOptions
73+
74+
// start Vitest UI maximized only on supported browsers
75+
if (this.ctx.config.browser.ui && this.browserName === 'chromium') {
76+
if (!launchOptions.args) {
77+
launchOptions.args = []
78+
}
79+
if (!launchOptions.args.includes('--start-maximized') && !launchOptions.args.includes('--start-fullscreen')) {
80+
launchOptions.args.push('--start-maximized')
81+
}
82+
}
83+
84+
const browser = await playwright[this.browserName].launch(launchOptions)
7485
this.browser = browser
7586
this.browserPromise = null
7687
return this.browser
@@ -85,11 +96,15 @@ export class PlaywrightBrowserProvider implements BrowserProvider {
8596
}
8697

8798
const browser = await this.openBrowser()
88-
const context = await browser.newContext({
99+
const options = {
89100
...this.options?.context,
90101
ignoreHTTPSErrors: true,
91102
serviceWorkers: 'allow',
92-
})
103+
} satisfies BrowserContextOptions
104+
if (this.ctx.config.browser.ui) {
105+
options.viewport = null
106+
}
107+
const context = await browser.newContext(options)
93108
this.contexts.set(contextId, context)
94109
return context
95110
}

packages/browser/src/node/providers/webdriver.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,19 @@ export class WebdriverBrowserProvider implements BrowserProvider {
104104
capabilities[key] = { ...currentValues, args: newArgs as any }
105105
}
106106

107+
// start Vitest UI maximized only on supported browsers
108+
if (options.ui && (browser === 'chrome' || browser === 'edge')) {
109+
const key = browser === 'chrome'
110+
? 'goog:chromeOptions'
111+
: 'ms:edgeOptions'
112+
const args = capabilities[key]?.args || []
113+
if (!args.includes('--start-maximized') && !args.includes('--start-fullscreen')) {
114+
args.push('--start-maximized')
115+
}
116+
capabilities[key] ??= {}
117+
capabilities[key]!.args = args
118+
}
119+
107120
return capabilities
108121
}
109122

test/browser/specs/runner.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ describe('running browser tests', async () => {
2323
console.error(stderr)
2424
})
2525

26-
expect(browserResultJson.testResults).toHaveLength(18)
27-
expect(passedTests).toHaveLength(16)
26+
expect(browserResultJson.testResults).toHaveLength(19)
27+
expect(passedTests).toHaveLength(17)
2828
expect(failedTests).toHaveLength(2)
2929

3030
expect(stderr).not.toContain('has been externalized for browser compatibility')

test/browser/test/viewport.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { page, server } from '@vitest/browser/context'
2+
import { describe, expect, it } from 'vitest'
3+
4+
describe.skipIf(server.provider === 'preview')('viewport window has been properly initialized', () => {
5+
it.skipIf(!page.config.browser.headless)('viewport has proper size', () => {
6+
const { width, height } = page.config.browser.viewport
7+
const { width: actualWidth, height: actualHeight } = window.document.documentElement.getBoundingClientRect()
8+
9+
expect(actualWidth).toBe(width)
10+
expect(actualHeight).toBe(height)
11+
})
12+
13+
it.skipIf(page.config.browser.headless)('window has been maximized', () => {
14+
let topWindow = window
15+
while (topWindow.parent && topWindow !== topWindow.parent) {
16+
topWindow = topWindow.parent as unknown as any
17+
}
18+
19+
// edge will show the Hub Apps right panel
20+
if (server.browser === 'edge') {
21+
expect(topWindow.visualViewport.width - topWindow.innerWidth === 0).toBe(true)
22+
}
23+
else {
24+
expect(screen.availWidth - topWindow.innerWidth === 0).toBe(true)
25+
}
26+
})
27+
})

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy