@vitest/browser 2.0.0-beta.11 → 2.0.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/providers.js CHANGED
@@ -1,4 +1,4 @@
1
- import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-BRud6NtS.js';
1
+ import { W as WebdriverBrowserProvider, P as PlaywrightBrowserProvider } from './webdriver-BdVqnfdE.js';
2
2
 
3
3
  class PreviewBrowserProvider {
4
4
  name = "preview";
@@ -19,7 +19,7 @@ class PreviewBrowserProvider {
19
19
  this.open = false;
20
20
  if (ctx.config.browser.headless) {
21
21
  throw new Error(
22
- `You've enabled headless mode for "preview" provider but it doesn't support it. Use "playwright" or "webdriverio" instead: https://vitest.dev/guide/browser#configuration`
22
+ `You've enabled headless mode for "preview" provider but it doesn't support it. Use "playwright" or "webdriverio" instead: https://vitest.dev/guide/browser/#configuration`
23
23
  );
24
24
  }
25
25
  }
package/dist/state.js CHANGED
@@ -1 +1 @@
1
- const{parse:$parse,stringify:$stringify}=JSON;const{keys}=Object;const Primitive=String;const primitive="string";const ignore={};const object="object";const noop=(_,value)=>value;const primitives=value=>value instanceof Primitive?Primitive(value):value;const Primitives=(_,value)=>typeof value===primitive?new Primitive(value):value;const revive=(input,parsed,output,$)=>{const lazy=[];for(let ke=keys(output),{length}=ke,y=0;y<length;y++){const k=ke[y];const value=output[k];if(value instanceof Primitive){const tmp=input[value];if(typeof tmp===object&&!parsed.has(tmp)){parsed.add(tmp);output[k]=ignore;lazy.push({k,a:[input,parsed,tmp,$]})}else output[k]=$.call(output,k,tmp)}else if(output[k]!==ignore)output[k]=$.call(output,k,value)}for(let{length}=lazy,i=0;i<length;i++){const{k,a}=lazy[i];output[k]=$.call(output,k,revive.apply(null,a))}return output};const parse=(text,reviver)=>{const input=$parse(text,Primitives).map(primitives);const value=input[0];const $=noop;const tmp=typeof value===object&&value?revive(input,new Set,value,$):value;return $.call({"":tmp},"",tmp)};function getBrowserState(){return window.__vitest_browser_runner__}const config=getBrowserState().config;const providedContext=parse(getBrowserState().providedContext);const state={ctx:{pool:"browser",worker:"./browser.js",workerId:1,config,projectName:config.name||"",files:[],environment:{name:"browser",options:null},providedContext,invalidates:[]},onCancel:null,mockMap:new Map,config,environment:{name:"browser",transformMode:"web",setup(){throw new Error("Not called in the browser")}},moduleCache:getBrowserState().moduleCache,rpc:null,durations:{environment:0,prepare:performance.now()},providedContext};globalThis.__vitest_browser__=true;globalThis.__vitest_worker__=state;
1
+ const{parse:$parse,stringify:$stringify}=JSON;const{keys}=Object;const Primitive=String;const primitive="string";const ignore={};const object="object";const noop=(_,value)=>value;const primitives=value=>value instanceof Primitive?Primitive(value):value;const Primitives=(_,value)=>typeof value===primitive?new Primitive(value):value;const revive=(input,parsed,output,$)=>{const lazy=[];for(let ke=keys(output),{length}=ke,y=0;y<length;y++){const k=ke[y];const value=output[k];if(value instanceof Primitive){const tmp=input[value];if(typeof tmp===object&&!parsed.has(tmp)){parsed.add(tmp);output[k]=ignore;lazy.push({k,a:[input,parsed,tmp,$]})}else output[k]=$.call(output,k,tmp)}else if(output[k]!==ignore)output[k]=$.call(output,k,value)}for(let{length}=lazy,i=0;i<length;i++){const{k,a}=lazy[i];output[k]=$.call(output,k,revive.apply(null,a))}return output};const parse=(text,reviver)=>{const input=$parse(text,Primitives).map(primitives);const value=input[0];const $=noop;const tmp=typeof value===object&&value?revive(input,new Set,value,$):value;return $.call({"":tmp},"",tmp)};function getBrowserState(){return window.__vitest_browser_runner__}const config=getBrowserState().config;const contextId=getBrowserState().contextId;const providedContext=parse(getBrowserState().providedContext);const state={ctx:{pool:"browser",worker:"./browser.js",workerId:1,config,projectName:config.name||"",files:[],environment:{name:"browser",options:null},providedContext,invalidates:[]},onCancel:null,mockMap:new Map,config,environment:{name:"browser",transformMode:"web",setup(){throw new Error("Not called in the browser")}},moduleCache:getBrowserState().moduleCache,rpc:null,durations:{environment:0,prepare:performance.now()},providedContext};globalThis.__vitest_browser__=true;globalThis.__vitest_worker__=state;getBrowserState().cdp=createCdp();function rpc(){return state.rpc}function createCdp(){const listenersMap=new WeakMap;function getId(listener){const id=listenersMap.get(listener)||crypto.randomUUID();listenersMap.set(listener,id);return id}const listeners={};const error=err=>{window.dispatchEvent(new ErrorEvent("error",{error:err}))};const cdp={send(method,params){return rpc().sendCdpEvent(contextId,method,params)},on(event,listener){const listenerId=getId(listener);listeners[event]=listeners[event]||[];listeners[event].push(listener);rpc().trackCdpEvent(contextId,"on",event,listenerId).catch(error);return cdp},once(event,listener){const listenerId=getId(listener);const handler=data=>{listener(data);cdp.off(event,listener)};listeners[event]=listeners[event]||[];listeners[event].push(handler);rpc().trackCdpEvent(contextId,"once",event,listenerId).catch(error);return cdp},off(event,listener){const listenerId=getId(listener);if(listeners[event]){listeners[event]=listeners[event].filter(l=>l!==listener)}rpc().trackCdpEvent(contextId,"off",event,listenerId).catch(error);return cdp},emit(event,payload){if(listeners[event]){listeners[event].forEach(l=>{try{l(payload)}catch(err){error(err)}})}}};return cdp}
@@ -27,10 +27,19 @@ class PlaywrightBrowserProvider {
27
27
  this.browserPromise = (async () => {
28
28
  const options = this.ctx.config.browser;
29
29
  const playwright = await import('playwright');
30
- const browser = await playwright[this.browserName].launch({
30
+ const launchOptions = {
31
31
  ...this.options?.launch,
32
32
  headless: options.headless
33
- });
33
+ };
34
+ if (this.ctx.config.browser.ui && this.browserName === "chromium") {
35
+ if (!launchOptions.args) {
36
+ launchOptions.args = [];
37
+ }
38
+ if (!launchOptions.args.includes("--start-maximized") && !launchOptions.args.includes("--start-fullscreen")) {
39
+ launchOptions.args.push("--start-maximized");
40
+ }
41
+ }
42
+ const browser = await playwright[this.browserName].launch(launchOptions);
34
43
  this.browser = browser;
35
44
  this.browserPromise = null;
36
45
  return this.browser;
@@ -42,11 +51,15 @@ class PlaywrightBrowserProvider {
42
51
  return this.contexts.get(contextId);
43
52
  }
44
53
  const browser = await this.openBrowser();
45
- const context = await browser.newContext({
54
+ const options = {
46
55
  ...this.options?.context,
47
56
  ignoreHTTPSErrors: true,
48
57
  serviceWorkers: "allow"
49
- });
58
+ };
59
+ if (this.ctx.config.browser.ui) {
60
+ options.viewport = null;
61
+ }
62
+ const context = await browser.newContext(options);
50
63
  this.contexts.set(contextId, context);
51
64
  return context;
52
65
  }
@@ -62,8 +75,24 @@ class PlaywrightBrowserProvider {
62
75
  return {
63
76
  page,
64
77
  context: this.contexts.get(contextId),
65
- get frame() {
66
- return page.frame("vitest-iframe");
78
+ frame() {
79
+ return new Promise((resolve, reject) => {
80
+ const frame = page.frame("vitest-iframe");
81
+ if (frame) {
82
+ return resolve(frame);
83
+ }
84
+ const timeout = setTimeout(() => {
85
+ const err = new Error(`Cannot find "vitest-iframe" on the page. This is a bug in Vitest, please report it.`);
86
+ reject(err);
87
+ }, 1e3);
88
+ page.on("frameattached", (frame2) => {
89
+ clearTimeout(timeout);
90
+ resolve(frame2);
91
+ });
92
+ });
93
+ },
94
+ get iframe() {
95
+ return page.frameLocator('[data-vitest="true"]');
67
96
  }
68
97
  };
69
98
  }
@@ -76,12 +105,43 @@ class PlaywrightBrowserProvider {
76
105
  const context = await this.createContext(contextId);
77
106
  const page = await context.newPage();
78
107
  this.pages.set(contextId, page);
108
+ if (process.env.VITEST_PW_DEBUG) {
109
+ page.on("requestfailed", (request) => {
110
+ console.error(
111
+ "[PW Error]",
112
+ request.resourceType(),
113
+ "request failed for",
114
+ request.url(),
115
+ "url:",
116
+ request.failure()?.errorText
117
+ );
118
+ });
119
+ }
79
120
  return page;
80
121
  }
81
122
  async openPage(contextId, url) {
82
123
  const browserPage = await this.openBrowserPage(contextId);
83
124
  await browserPage.goto(url);
84
125
  }
126
+ async getCDPSession(contextId) {
127
+ const page = this.getPage(contextId);
128
+ const cdp = await page.context().newCDPSession(page);
129
+ return {
130
+ async send(method, params) {
131
+ const result = await cdp.send(method, params);
132
+ return result;
133
+ },
134
+ on(event, listener) {
135
+ cdp.on(event, listener);
136
+ },
137
+ off(event, listener) {
138
+ cdp.off(event, listener);
139
+ },
140
+ once(event, listener) {
141
+ cdp.once(event, listener);
142
+ }
143
+ };
144
+ }
85
145
  async close() {
86
146
  const browser = this.browser;
87
147
  this.browser = null;
@@ -163,6 +223,15 @@ class WebdriverBrowserProvider {
163
223
  const newArgs = [...currentValues.args || [], ...args];
164
224
  capabilities[key] = { ...currentValues, args: newArgs };
165
225
  }
226
+ if (options.ui && (browser === "chrome" || browser === "edge")) {
227
+ const key = browser === "chrome" ? "goog:chromeOptions" : "ms:edgeOptions";
228
+ const args = capabilities[key]?.args || [];
229
+ if (!args.includes("--start-maximized") && !args.includes("--start-fullscreen")) {
230
+ args.push("--start-maximized");
231
+ }
232
+ capabilities[key] ??= {};
233
+ capabilities[key].args = args;
234
+ }
166
235
  return capabilities;
167
236
  }
168
237
  async openPage(_contextId, url) {