diff --git a/docs/breaking-changes.md b/docs/breaking-changes.md index 4a8830667c..46db5b77db 100644 --- a/docs/breaking-changes.md +++ b/docs/breaking-changes.md @@ -21,6 +21,23 @@ macOS 11 (Big Sur) is no longer supported by [Chromium](https://chromium-review. Older versions of Electron will continue to run on Big Sur, but macOS 12 (Monterey) or later will be required to run Electron v38.0.0 and higher. +### Behavior Changed: window.open popups are always resizable + +Per current [WHATWG spec](https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-open-dev), the `window.open` API will now always create a resizable popup window. + +To restore previous behavior: + +```js +webContents.setWindowOpenHandler((details) => { + return { + action: 'allow', + overrideBrowserWindowOptions: { + resizable: details.features.includes('resizable=yes') + } + } +}) +``` + ## Planned Breaking API Changes (37.0) ### Utility Process unhandled rejection behavior change diff --git a/lib/browser/parse-features-string.ts b/lib/browser/parse-features-string.ts index be37505c64..d14eb2f877 100644 --- a/lib/browser/parse-features-string.ts +++ b/lib/browser/parse-features-string.ts @@ -91,6 +91,12 @@ export function parseFeatures (features: string) { delete parsed[key]; } + // Per spec - https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-open-dev + // windows are always resizable. + if (parsed.resizable !== undefined) { + delete parsed.resizable; + } + if (parsed.left !== undefined) parsed.x = parsed.left; if (parsed.top !== undefined) parsed.y = parsed.top; diff --git a/spec/chromium-spec.ts b/spec/chromium-spec.ts index 80688a97ea..24b1f80336 100644 --- a/spec/chromium-spec.ts +++ b/spec/chromium-spec.ts @@ -1273,6 +1273,16 @@ describe('chromium features', () => { }); } + it('is always resizable', async () => { + const w = new BrowserWindow({ show: false }); + w.loadFile(path.resolve(__dirname, 'fixtures', 'blank.html')); + w.webContents.executeJavaScript(` + { b = window.open('about:blank', '', 'resizable=no,show=no'); null } + `); + const [, popup] = await once(app, 'browser-window-created') as [any, BrowserWindow]; + expect(popup.isResizable()).to.be.true(); + }); + // FIXME(zcbenz): This test is making the spec runner hang on exit on Windows. ifit(process.platform !== 'win32')('disables node integration when it is disabled on the parent window', async () => { const windowUrl = url.pathToFileURL(path.join(fixturesPath, 'pages', 'window-opener-no-node-integration.html'));