diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index 075c99c2b4235..e6e9c236b68e9 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -896,7 +896,21 @@ Closes the currently open [Quick Look][quick-look] panel. * `bounds` [Rectangle](structures/rectangle.md) * `animate` Boolean (optional) _macOS_ -Resizes and moves the window to the supplied bounds +Resizes and moves the window to the supplied bounds. Any properties that are not supplied will default to their current values. + +```javascript +const { BrowserWindow } = require('electron') +const win = new BrowserWindow() + +// set all bounds properties +win.setBounds({ x: 440, y: 225, width: 800, height: 600 }) + +// set a single bounds property +win.setBounds({ width: 100 }) + +// { x: 440, y: 225, width: 100, height: 600 } +console.log(win.getBounds()) +``` #### `win.getBounds()` diff --git a/lib/browser/api/browser-window.js b/lib/browser/api/browser-window.js index 7fd90bb6cde70..a957eb390d3d0 100644 --- a/lib/browser/api/browser-window.js +++ b/lib/browser/api/browser-window.js @@ -17,6 +17,15 @@ BrowserWindow.prototype._init = function () { // Create WebContentsView. this.setContentView(new WebContentsView(this.webContents)) + const nativeSetBounds = this.setBounds + this.setBounds = (bounds, ...opts) => { + bounds = { + ...this.getBounds(), + ...bounds + } + nativeSetBounds.call(this, bounds, ...opts) + } + // Make new windows requested by links behave like "window.open" this.webContents.on('-new-window', (event, url, frameName, disposition, additionalFeatures, postData, diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index 52cfcaa0145e9..3bf7be4d36f0b 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -524,6 +524,26 @@ describe('BrowserWindow module', () => { }) }) + describe('BrowserWindow.setBounds(bounds[, animate])', () => { + it('sets the window bounds with full bounds', () => { + const fullBounds = { x: 440, y: 225, width: 500, height: 400 } + w.setBounds(fullBounds) + + assertBoundsEqual(w.getBounds(), fullBounds) + }) + + it('sets the window bounds with partial bounds', () => { + const fullBounds = { x: 440, y: 225, width: 500, height: 400 } + w.setBounds(fullBounds) + + const boundsUpdate = { width: 100 } + w.setBounds(boundsUpdate) + + const expectedBounds = Object.assign(fullBounds, boundsUpdate) + assertBoundsEqual(w.getBounds(), expectedBounds) + }) + }) + describe('BrowserWindow.setSize(width, height)', () => { it('sets the window size', async () => { const size = [300, 400]