Browse Source

fix: draggable regions calculation in BrowserWindow/BrowserView (#26754)

trop[bot] 4 years ago
parent
commit
badc01c2d8

+ 2 - 4
shell/browser/api/electron_api_browser_window.cc

@@ -308,10 +308,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

+ 7 - 11
shell/browser/api/electron_api_browser_window_mac.mm

@@ -70,25 +70,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_ != &regions) {
-    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_ != &regions)
+    draggable_regions_ = mojo::Clone(regions);
 
   std::vector<gfx::Rect> 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) {

+ 8 - 0
shell/browser/native_browser_view.h

@@ -40,6 +40,10 @@ class NativeBrowserView : public content::WebContentsObserver {
     return inspectable_web_contents_;
   }
 
+  const std::vector<mojom::DraggableRegionPtr>& GetDraggableRegions() const {
+    return draggable_regions_;
+  }
+
   InspectableWebContentsView* GetInspectableWebContentsView();
   content::WebContents* GetWebContents();
 
@@ -48,6 +52,9 @@ class NativeBrowserView : public content::WebContentsObserver {
   virtual gfx::Rect GetBounds() = 0;
   virtual void SetBackgroundColor(SkColor color) = 0;
 
+  virtual void UpdateDraggableRegions(
+      const std::vector<gfx::Rect>& drag_exclude_rects) {}
+
   // Called when the window needs to update its draggable region.
   virtual void UpdateDraggableRegions(
       const std::vector<mojom::DraggableRegionPtr>& regions) {}
@@ -58,6 +65,7 @@ class NativeBrowserView : public content::WebContentsObserver {
   void WebContentsDestroyed() override;
 
   InspectableWebContents* inspectable_web_contents_;
+  std::vector<mojom::DraggableRegionPtr> draggable_regions_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(NativeBrowserView);

+ 2 - 2
shell/browser/native_browser_view_mac.h

@@ -27,8 +27,8 @@ class NativeBrowserViewMac : public NativeBrowserView {
   void UpdateDraggableRegions(
       const std::vector<mojom::DraggableRegionPtr>& regions) override;
 
- private:
-  std::vector<mojom::DraggableRegionPtr> draggable_regions_;
+  void UpdateDraggableRegions(
+      const std::vector<gfx::Rect>& drag_exclude_rects) override;
 
   DISALLOW_COPY_AND_ASSIGN(NativeBrowserViewMac);
 };

+ 27 - 20
shell/browser/native_browser_view_mac.mm

@@ -238,7 +238,7 @@ void NativeBrowserViewMac::SetBackgroundColor(SkColor color) {
 }
 
 void NativeBrowserViewMac::UpdateDraggableRegions(
-    const std::vector<mojom::DraggableRegionPtr>& regions) {
+    const std::vector<gfx::Rect>& drag_exclude_rects) {
   if (!inspectable_web_contents_)
     return;
   auto* web_contents = inspectable_web_contents_->GetWebContents();
@@ -250,25 +250,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<gfx::Rect> 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_ != &regions) {
-    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<NSArray> subviews([[web_view subviews] copy]);
@@ -299,6 +280,32 @@ void NativeBrowserViewMac::UpdateDraggableRegions(
   }
 }
 
+void NativeBrowserViewMac::UpdateDraggableRegions(
+    const std::vector<mojom::DraggableRegionPtr>& 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_ != &regions)
+    draggable_regions_ = mojo::Clone(regions);
+
+  std::vector<gfx::Rect> 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) {