From 38bb3e81d306a4b7af3e9053bb9e9b52b52df737 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Thu, 22 Sep 2022 10:01:11 -0700 Subject: [PATCH] fix: compensate for title bar height when setting bounds on `BrowserView` (#35502) fix: compensate for title bar height when setting bounds Co-authored-by: Shelley Vohr --- shell/browser/native_browser_view_mac.mm | 39 +++++++++++++++++++----- spec-main/api-browser-view-spec.ts | 9 +++++- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/shell/browser/native_browser_view_mac.mm b/shell/browser/native_browser_view_mac.mm index 9cb5d11d8610b..685b7194b5280 100644 --- a/shell/browser/native_browser_view_mac.mm +++ b/shell/browser/native_browser_view_mac.mm @@ -262,9 +262,21 @@ - (void)drawDebugRect:(NSRect)aRect { auto* view = iwc_view->GetNativeView().GetNativeNSView(); auto* superview = view.superview; const auto superview_height = superview ? superview.frame.size.height : 0; + + // We need to use the content rect to calculate the titlebar height if the + // superview is an framed NSWindow, otherwise it will be offset incorrectly by + // the height of the titlebar. + auto titlebar_height = 0; + if (auto* win = [superview window]) { + const auto content_rect_height = + [win contentRectForFrameRect:superview.frame].size.height; + titlebar_height = superview_height - content_rect_height; + } + + auto new_height = + superview_height - bounds.y() - bounds.height() + titlebar_height; view.frame = - NSMakeRect(bounds.x(), superview_height - bounds.y() - bounds.height(), - bounds.width(), bounds.height()); + NSMakeRect(bounds.x(), new_height, bounds.width(), bounds.height()); // Ensure draggable regions are properly updated to reflect new bounds. UpdateDraggableRegions(draggable_regions_); @@ -275,12 +287,23 @@ - (void)drawDebugRect:(NSRect)aRect { if (!iwc_view) return gfx::Rect(); NSView* view = iwc_view->GetNativeView().GetNativeNSView(); - const int superview_height = - (view.superview) ? view.superview.frame.size.height : 0; - return gfx::Rect( - view.frame.origin.x, - superview_height - view.frame.origin.y - view.frame.size.height, - view.frame.size.width, view.frame.size.height); + auto* superview = view.superview; + const int superview_height = superview ? superview.frame.size.height : 0; + + // We need to use the content rect to calculate the titlebar height if the + // superview is an framed NSWindow, otherwise it will be offset incorrectly by + // the height of the titlebar. + auto titlebar_height = 0; + if (auto* win = [superview window]) { + const auto content_rect_height = + [win contentRectForFrameRect:superview.frame].size.height; + titlebar_height = superview_height - content_rect_height; + } + + auto new_height = superview_height - view.frame.origin.y - + view.frame.size.height + titlebar_height; + return gfx::Rect(view.frame.origin.x, new_height, view.frame.size.width, + view.frame.size.height); } void NativeBrowserViewMac::SetBackgroundColor(SkColor color) { diff --git a/spec-main/api-browser-view-spec.ts b/spec-main/api-browser-view-spec.ts index 3352c06e991a4..ef32bef9feaa2 100644 --- a/spec-main/api-browser-view-spec.ts +++ b/spec-main/api-browser-view-spec.ts @@ -146,7 +146,14 @@ describe('BrowserView module', () => { }); describe('BrowserView.getBounds()', () => { - it('returns the current bounds', () => { + it('returns correct bounds on a framed window', () => { + view = new BrowserView(); + const bounds = { x: 10, y: 20, width: 30, height: 40 }; + view.setBounds(bounds); + expect(view.getBounds()).to.deep.equal(bounds); + }); + + it('returns correct bounds on a frameless window', () => { view = new BrowserView(); const bounds = { x: 10, y: 20, width: 30, height: 40 }; view.setBounds(bounds);