fix: BrowserView autoresizing conversion error (#42138)
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
This commit is contained in:
		
					parent
					
						
							
								9694e7593f
							
						
					
				
			
			
				commit
				
					
						75cefdb527
					
				
			
		
					 3 changed files with 24 additions and 5 deletions
				
			
		|  | @ -34,13 +34,17 @@ export default class BrowserView { | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   setAutoResize (options: AutoResizeOptions) { |   setAutoResize (options: AutoResizeOptions) { | ||||||
|     if (options == null || typeof options !== 'object') { throw new Error('Invalid auto resize options'); } |     if (options == null || typeof options !== 'object') { | ||||||
|  |       throw new Error('Invalid auto resize options'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     this.#autoResizeFlags = { |     this.#autoResizeFlags = { | ||||||
|       width: !!options.width, |       width: !!options.width, | ||||||
|       height: !!options.height, |       height: !!options.height, | ||||||
|       horizontal: !!options.horizontal, |       horizontal: !!options.horizontal, | ||||||
|       vertical: !!options.vertical |       vertical: !!options.vertical | ||||||
|     }; |     }; | ||||||
|  | 
 | ||||||
|     this.#autoHorizontalProportion = null; |     this.#autoHorizontalProportion = null; | ||||||
|     this.#autoVerticalProportion = null; |     this.#autoVerticalProportion = null; | ||||||
|   } |   } | ||||||
|  | @ -71,7 +75,10 @@ export default class BrowserView { | ||||||
|   #autoHorizontalProportion: {width: number, left: number} | null = null; |   #autoHorizontalProportion: {width: number, left: number} | null = null; | ||||||
|   #autoVerticalProportion: {height: number, top: number} | null = null; |   #autoVerticalProportion: {height: number, top: number} | null = null; | ||||||
|   #autoResize () { |   #autoResize () { | ||||||
|     if (!this.ownerWindow) throw new Error('Electron bug: #autoResize called without owner window'); |     if (!this.ownerWindow) { | ||||||
|  |       throw new Error('Electron bug: #autoResize called without owner window'); | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|     if (this.#autoResizeFlags.horizontal && this.#autoHorizontalProportion == null) { |     if (this.#autoResizeFlags.horizontal && this.#autoHorizontalProportion == null) { | ||||||
|       const viewBounds = this.#webContentsView.getBounds(); |       const viewBounds = this.#webContentsView.getBounds(); | ||||||
|       this.#autoHorizontalProportion = { |       this.#autoHorizontalProportion = { | ||||||
|  | @ -79,6 +86,7 @@ export default class BrowserView { | ||||||
|         left: this.#lastWindowSize.width / viewBounds.x |         left: this.#lastWindowSize.width / viewBounds.x | ||||||
|       }; |       }; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     if (this.#autoResizeFlags.vertical && this.#autoVerticalProportion == null) { |     if (this.#autoResizeFlags.vertical && this.#autoVerticalProportion == null) { | ||||||
|       const viewBounds = this.#webContentsView.getBounds(); |       const viewBounds = this.#webContentsView.getBounds(); | ||||||
|       this.#autoVerticalProportion = { |       this.#autoVerticalProportion = { | ||||||
|  | @ -86,6 +94,7 @@ export default class BrowserView { | ||||||
|         top: this.#lastWindowSize.height / viewBounds.y |         top: this.#lastWindowSize.height / viewBounds.y | ||||||
|       }; |       }; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     const newBounds = this.ownerWindow.getBounds(); |     const newBounds = this.ownerWindow.getBounds(); | ||||||
|     let widthDelta = newBounds.width - this.#lastWindowSize.width; |     let widthDelta = newBounds.width - this.#lastWindowSize.width; | ||||||
|     let heightDelta = newBounds.height - this.#lastWindowSize.height; |     let heightDelta = newBounds.height - this.#lastWindowSize.height; | ||||||
|  | @ -105,10 +114,12 @@ export default class BrowserView { | ||||||
|       newViewBounds.width = newBounds.width / this.#autoHorizontalProportion.width; |       newViewBounds.width = newBounds.width / this.#autoHorizontalProportion.width; | ||||||
|       newViewBounds.x = newBounds.width / this.#autoHorizontalProportion.left; |       newViewBounds.x = newBounds.width / this.#autoHorizontalProportion.left; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     if (this.#autoVerticalProportion) { |     if (this.#autoVerticalProportion) { | ||||||
|       newViewBounds.height = newBounds.height / this.#autoVerticalProportion.height; |       newViewBounds.height = newBounds.height / this.#autoVerticalProportion.height; | ||||||
|       newViewBounds.y = newBounds.y / this.#autoVerticalProportion.top; |       newViewBounds.y = newBounds.y / this.#autoVerticalProportion.top; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     if (this.#autoHorizontalProportion || this.#autoVerticalProportion) { |     if (this.#autoHorizontalProportion || this.#autoVerticalProportion) { | ||||||
|       this.#webContentsView.setBounds(newViewBounds); |       this.#webContentsView.setBounds(newViewBounds); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
| #include "ui/gfx/geometry/insets.h" | #include "ui/gfx/geometry/insets.h" | ||||||
| #include "ui/gfx/geometry/point.h" | #include "ui/gfx/geometry/point.h" | ||||||
| #include "ui/gfx/geometry/point_f.h" | #include "ui/gfx/geometry/point_f.h" | ||||||
| #include "ui/gfx/geometry/rect.h" | #include "ui/gfx/geometry/rect_conversions.h" | ||||||
| #include "ui/gfx/geometry/resize_utils.h" | #include "ui/gfx/geometry/resize_utils.h" | ||||||
| #include "ui/gfx/geometry/size.h" | #include "ui/gfx/geometry/size.h" | ||||||
| 
 | 
 | ||||||
|  | @ -100,11 +100,12 @@ bool Converter<gfx::Rect>::FromV8(v8::Isolate* isolate, | ||||||
|   gin::Dictionary dict(isolate); |   gin::Dictionary dict(isolate); | ||||||
|   if (!gin::ConvertFromV8(isolate, val, &dict)) |   if (!gin::ConvertFromV8(isolate, val, &dict)) | ||||||
|     return false; |     return false; | ||||||
|   int x, y, width, height; |   float x, y, width, height; | ||||||
|   if (!dict.Get("x", &x) || !dict.Get("y", &y) || !dict.Get("width", &width) || |   if (!dict.Get("x", &x) || !dict.Get("y", &y) || !dict.Get("width", &width) || | ||||||
|       !dict.Get("height", &height)) |       !dict.Get("height", &height)) | ||||||
|     return false; |     return false; | ||||||
|   *out = gfx::Rect(x, y, width, height); | 
 | ||||||
|  |   *out = ToRoundedRect(gfx::RectF(x, y, width, height)); | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1503,6 +1503,13 @@ describe('BrowserWindow module', () => { | ||||||
|         expectBoundsEqual(w.getBounds(), fullBounds); |         expectBoundsEqual(w.getBounds(), fullBounds); | ||||||
|       }); |       }); | ||||||
| 
 | 
 | ||||||
|  |       it('rounds non-integer bounds', () => { | ||||||
|  |         w.setBounds({ x: 440.5, y: 225.1, width: 500.4, height: 400.9 }); | ||||||
|  | 
 | ||||||
|  |         const bounds = w.getBounds(); | ||||||
|  |         expect(bounds).to.deep.equal({ x: 441, y: 225, width: 500, height: 401 }); | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|       it('sets the window bounds with partial bounds', () => { |       it('sets the window bounds with partial bounds', () => { | ||||||
|         const fullBounds = { x: 440, y: 225, width: 500, height: 400 }; |         const fullBounds = { x: 440, y: 225, width: 500, height: 400 }; | ||||||
|         w.setBounds(fullBounds); |         w.setBounds(fullBounds); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	![37223003+trop[bot]@users.noreply.github.com](/assets/img/avatar_default.png) trop[bot]
				trop[bot]