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)