{"record":{"id":"9537796fccdcb98c","repo":"microsoft/playwright","slug":"ismobile-option-is-not-supported-with-null-view","errorCode":null,"errorMessage":"\"isMobile\" option is not supported with null \"viewport\"","messagePattern":"\"isMobile\" option is not supported with null \"viewport\"","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/browserContext.ts","lineNumber":762,"sourceCode":"\n  addRouteInFlight(route: network.Route) {\n    this._routesInFlight.add(route);\n  }\n\n  removeRouteInFlight(route: network.Route) {\n    this._routesInFlight.delete(route);\n  }\n\n  async notifyRoutesInFlightAboutRemovedHandler(handler: network.RouteHandler): Promise<void> {\n    await Promise.all([...this._routesInFlight].map(route => route.removeHandler(handler)));\n  }\n}\n\nexport function validateBrowserContextOptions(options: types.BrowserContextOptions, browserOptions: BrowserOptions) {\n  if (options.noDefaultViewport && options.deviceScaleFactor !== undefined)\n    throw new Error(`\"deviceScaleFactor\" option is not supported with null \"viewport\"`);\n  if (options.noDefaultViewport && !!options.isMobile)\n    throw new Error(`\"isMobile\" option is not supported with null \"viewport\"`);\n  if (options.acceptDownloads === undefined && browserOptions.name !== 'electron')\n    options.acceptDownloads = 'accept';\n  // Electron requires explicit acceptDownloads: true since we wait for\n  // https://github.com/electron/electron/pull/41718 to be widely shipped.\n  // In 6-12 months, we can remove this check.\n  else if (options.acceptDownloads === undefined && browserOptions.name === 'electron')\n    options.acceptDownloads = 'internal-browser-default';\n  if (!options.viewport && !options.noDefaultViewport)\n    options.viewport = { width: 1280, height: 720 };\n  if (options.proxy)\n    options.proxy = normalizeProxySettings(options.proxy);\n  verifyGeolocation(options.geolocation);\n}\n\nexport function findMatchingHttpCredentials(credentials: HttpCredentials[] | undefined, url: string): HttpCredentials | undefined {\n  const origin = new URL(url).origin.toLowerCase();\n  return credentials?.find(c => !c.origin || c.origin.toLowerCase() === origin);\n}","sourceCodeStart":744,"sourceCodeEnd":780,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/browserContext.ts#L744-L780","documentation":"`validateBrowserContextOptions` rejects `noDefaultViewport: true` combined with `isMobile: true`. Mobile emulation needs a viewport to apply the mobile layout metrics.","triggerScenarios":"`browser.newContext({ noDefaultViewport: true, isMobile: true })` or `{ viewport: null, isMobile: true }`.","commonSituations":"Combining desktop/windowed mode (null viewport) with mobile emulation flags; partial config merges that keep isMobile from a device-preset.","solutions":["Remove `isMobile` when using `noDefaultViewport`","Or set an explicit viewport to enable mobile emulation"],"exampleFix":"// before\nawait browser.newContext({ viewport: null, isMobile: true });\n\n// after\nawait browser.newContext({ viewport: { width: 375, height: 667 }, isMobile: true });","handlingStrategy":"validation","validationCode":"const nullVp = opts.viewport === null || !!opts.noDefaultViewport;\nif (nullVp && !!opts.isMobile) {\n  throw new Error('isMobile requires an explicit viewport; remove noDefaultViewport or unset isMobile.');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Mobile emulation requires a viewport","Avoid reusing device presets that set isMobile when going viewport-less","Validate context options centrally before launch"],"tags":["browser-context","viewport","config","validation","mobile"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}