diff --git a/shell/browser/api/electron_api_browser_window.cc b/shell/browser/api/electron_api_browser_window.cc index 8b6c05ae4d19..6a6566facad0 100644 --- a/shell/browser/api/electron_api_browser_window.cc +++ b/shell/browser/api/electron_api_browser_window.cc @@ -309,10 +309,8 @@ void BrowserWindow::OnWindowResize() { if (!draggable_regions_.empty()) { UpdateDraggableRegions(draggable_regions_); } else { - // Ensure draggable bounds are recalculated for BrowserViews if any exist. - auto browser_views = window_->browser_views(); - for (NativeBrowserView* view : browser_views) { - view->UpdateDraggableRegions(draggable_regions_); + for (NativeBrowserView* view : window_->browser_views()) { + view->UpdateDraggableRegions(view->GetDraggableRegions()); } } #endif diff --git a/shell/browser/api/electron_api_browser_window_mac.mm b/shell/browser/api/electron_api_browser_window_mac.mm index 7b94344eb069..73a7da2c90ea 100644 --- a/shell/browser/api/electron_api_browser_window_mac.mm +++ b/shell/browser/api/electron_api_browser_window_mac.mm @@ -71,25 +71,21 @@ void BrowserWindow::UpdateDraggableRegions( // Draggable regions are implemented by having the whole web view draggable // and overlaying regions that are not draggable. - if (&draggable_regions_ != ®ions) { - draggable_regions_.clear(); - for (const auto& r : regions) - draggable_regions_.push_back(r.Clone()); - } - - auto browser_views = window_->browser_views(); - for (NativeBrowserView* view : browser_views) { - view->UpdateDraggableRegions(draggable_regions_); - } + if (&draggable_regions_ != ®ions) + draggable_regions_ = mojo::Clone(regions); std::vector drag_exclude_rects; if (regions.empty()) { - drag_exclude_rects.push_back(gfx::Rect(0, 0, webViewWidth, webViewHeight)); + drag_exclude_rects.emplace_back(0, 0, webViewWidth, webViewHeight); } else { drag_exclude_rects = CalculateNonDraggableRegions( DraggableRegionsToSkRegion(regions), webViewWidth, webViewHeight); } + for (NativeBrowserView* view : window_->browser_views()) { + view->UpdateDraggableRegions(drag_exclude_rects); + } + // Create and add a ControlRegionView for each region that needs to be // excluded from the dragging. for (const auto& rect : drag_exclude_rects) { diff --git a/shell/browser/native_browser_view.h b/shell/browser/native_browser_view.h index aa33d41ac6e4..e8a2de3e5390 100644 --- a/shell/browser/native_browser_view.h +++ b/shell/browser/native_browser_view.h @@ -40,6 +40,10 @@ class NativeBrowserView : public content::WebContentsObserver { return inspectable_web_contents_; } + const std::vector& GetDraggableRegions() const { + return draggable_regions_; + } + InspectableWebContentsView* GetInspectableWebContentsView(); virtual void SetAutoResizeFlags(uint8_t flags) = 0; @@ -47,6 +51,9 @@ class NativeBrowserView : public content::WebContentsObserver { virtual gfx::Rect GetBounds() = 0; virtual void SetBackgroundColor(SkColor color) = 0; + virtual void UpdateDraggableRegions( + const std::vector& drag_exclude_rects) {} + // Called when the window needs to update its draggable region. virtual void UpdateDraggableRegions( const std::vector& regions) {} @@ -57,6 +64,7 @@ class NativeBrowserView : public content::WebContentsObserver { void WebContentsDestroyed() override; InspectableWebContents* inspectable_web_contents_; + std::vector draggable_regions_; private: DISALLOW_COPY_AND_ASSIGN(NativeBrowserView); diff --git a/shell/browser/native_browser_view_mac.h b/shell/browser/native_browser_view_mac.h index 99e8ec46731c..b225409f6551 100644 --- a/shell/browser/native_browser_view_mac.h +++ b/shell/browser/native_browser_view_mac.h @@ -27,8 +27,8 @@ class NativeBrowserViewMac : public NativeBrowserView { void UpdateDraggableRegions( const std::vector& regions) override; - private: - std::vector draggable_regions_; + void UpdateDraggableRegions( + const std::vector& drag_exclude_rects) override; DISALLOW_COPY_AND_ASSIGN(NativeBrowserViewMac); }; diff --git a/shell/browser/native_browser_view_mac.mm b/shell/browser/native_browser_view_mac.mm index d5988fbf7bdc..54057a083b26 100644 --- a/shell/browser/native_browser_view_mac.mm +++ b/shell/browser/native_browser_view_mac.mm @@ -238,7 +238,7 @@ void NativeBrowserViewMac::SetBackgroundColor(SkColor color) { } void NativeBrowserViewMac::UpdateDraggableRegions( - const std::vector& regions) { + const std::vector& drag_exclude_rects) { if (!inspectable_web_contents_) return; auto* web_contents = inspectable_web_contents_->GetWebContents(); @@ -248,25 +248,6 @@ void NativeBrowserViewMac::UpdateDraggableRegions( NSView* window_content_view = inspectable_view.superview; const auto window_content_view_height = NSHeight(window_content_view.bounds); - NSInteger webViewWidth = NSWidth([web_view bounds]); - NSInteger webViewHeight = NSHeight([web_view bounds]); - - std::vector drag_exclude_rects; - if (regions.empty()) { - drag_exclude_rects.push_back(gfx::Rect(0, 0, webViewWidth, webViewHeight)); - } else { - drag_exclude_rects = CalculateNonDraggableRegions( - DraggableRegionsToSkRegion(regions), webViewWidth, webViewHeight); - } - - // Draggable regions are implemented by having the whole web view draggable - // and overlaying regions that are not draggable. - if (&draggable_regions_ != ®ions) { - draggable_regions_.clear(); - for (const auto& r : regions) - draggable_regions_.push_back(r.Clone()); - } - // Remove all DragRegionViews that were added last time. Note that we need // to copy the `subviews` array to avoid mutation during iteration. base::scoped_nsobject subviews([[web_view subviews] copy]); @@ -297,6 +278,32 @@ void NativeBrowserViewMac::UpdateDraggableRegions( } } +void NativeBrowserViewMac::UpdateDraggableRegions( + const std::vector& regions) { + if (!inspectable_web_contents_) + return; + auto* web_contents = inspectable_web_contents_->GetWebContents(); + NSView* web_view = web_contents->GetNativeView().GetNativeNSView(); + + NSInteger webViewWidth = NSWidth([web_view bounds]); + NSInteger webViewHeight = NSHeight([web_view bounds]); + + // Draggable regions are implemented by having the whole web view draggable + // and overlaying regions that are not draggable. + if (&draggable_regions_ != ®ions) + draggable_regions_ = mojo::Clone(regions); + + std::vector drag_exclude_rects; + if (regions.empty()) { + drag_exclude_rects.emplace_back(0, 0, webViewWidth, webViewHeight); + } else { + drag_exclude_rects = CalculateNonDraggableRegions( + DraggableRegionsToSkRegion(regions), webViewWidth, webViewHeight); + } + + UpdateDraggableRegions(drag_exclude_rects); +} + // static NativeBrowserView* NativeBrowserView::Create( InspectableWebContents* inspectable_web_contents) {