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

This commit is contained in:
Shelley Vohr 2020-11-30 21:02:04 -08:00 committed by GitHub
parent 4e3e3d414d
commit acfbbe9869
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 37 deletions

View file

@ -309,10 +309,8 @@ void BrowserWindow::OnWindowResize() {
if (!draggable_regions_.empty()) { if (!draggable_regions_.empty()) {
UpdateDraggableRegions(draggable_regions_); UpdateDraggableRegions(draggable_regions_);
} else { } else {
// Ensure draggable bounds are recalculated for BrowserViews if any exist. for (NativeBrowserView* view : window_->browser_views()) {
auto browser_views = window_->browser_views(); view->UpdateDraggableRegions(view->GetDraggableRegions());
for (NativeBrowserView* view : browser_views) {
view->UpdateDraggableRegions(draggable_regions_);
} }
} }
#endif #endif

View file

@ -71,25 +71,21 @@ void BrowserWindow::UpdateDraggableRegions(
// Draggable regions are implemented by having the whole web view draggable // Draggable regions are implemented by having the whole web view draggable
// and overlaying regions that are not draggable. // and overlaying regions that are not draggable.
if (&draggable_regions_ != &regions) { if (&draggable_regions_ != &regions)
draggable_regions_.clear(); draggable_regions_ = mojo::Clone(regions);
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_);
}
std::vector<gfx::Rect> drag_exclude_rects; std::vector<gfx::Rect> drag_exclude_rects;
if (regions.empty()) { if (regions.empty()) {
drag_exclude_rects.push_back(gfx::Rect(0, 0, webViewWidth, webViewHeight)); drag_exclude_rects.emplace_back(0, 0, webViewWidth, webViewHeight);
} else { } else {
drag_exclude_rects = CalculateNonDraggableRegions( drag_exclude_rects = CalculateNonDraggableRegions(
DraggableRegionsToSkRegion(regions), webViewWidth, webViewHeight); 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 // Create and add a ControlRegionView for each region that needs to be
// excluded from the dragging. // excluded from the dragging.
for (const auto& rect : drag_exclude_rects) { for (const auto& rect : drag_exclude_rects) {

View file

@ -40,6 +40,10 @@ class NativeBrowserView : public content::WebContentsObserver {
return inspectable_web_contents_; return inspectable_web_contents_;
} }
const std::vector<mojom::DraggableRegionPtr>& GetDraggableRegions() const {
return draggable_regions_;
}
InspectableWebContentsView* GetInspectableWebContentsView(); InspectableWebContentsView* GetInspectableWebContentsView();
virtual void SetAutoResizeFlags(uint8_t flags) = 0; virtual void SetAutoResizeFlags(uint8_t flags) = 0;
@ -47,6 +51,9 @@ class NativeBrowserView : public content::WebContentsObserver {
virtual gfx::Rect GetBounds() = 0; virtual gfx::Rect GetBounds() = 0;
virtual void SetBackgroundColor(SkColor color) = 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. // Called when the window needs to update its draggable region.
virtual void UpdateDraggableRegions( virtual void UpdateDraggableRegions(
const std::vector<mojom::DraggableRegionPtr>& regions) {} const std::vector<mojom::DraggableRegionPtr>& regions) {}
@ -57,6 +64,7 @@ class NativeBrowserView : public content::WebContentsObserver {
void WebContentsDestroyed() override; void WebContentsDestroyed() override;
InspectableWebContents* inspectable_web_contents_; InspectableWebContents* inspectable_web_contents_;
std::vector<mojom::DraggableRegionPtr> draggable_regions_;
private: private:
DISALLOW_COPY_AND_ASSIGN(NativeBrowserView); DISALLOW_COPY_AND_ASSIGN(NativeBrowserView);

View file

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

View file

@ -238,7 +238,7 @@ void NativeBrowserViewMac::SetBackgroundColor(SkColor color) {
} }
void NativeBrowserViewMac::UpdateDraggableRegions( void NativeBrowserViewMac::UpdateDraggableRegions(
const std::vector<mojom::DraggableRegionPtr>& regions) { const std::vector<gfx::Rect>& drag_exclude_rects) {
if (!inspectable_web_contents_) if (!inspectable_web_contents_)
return; return;
auto* web_contents = inspectable_web_contents_->GetWebContents(); auto* web_contents = inspectable_web_contents_->GetWebContents();
@ -248,25 +248,6 @@ void NativeBrowserViewMac::UpdateDraggableRegions(
NSView* window_content_view = inspectable_view.superview; NSView* window_content_view = inspectable_view.superview;
const auto window_content_view_height = NSHeight(window_content_view.bounds); 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 // Remove all DragRegionViews that were added last time. Note that we need
// to copy the `subviews` array to avoid mutation during iteration. // to copy the `subviews` array to avoid mutation during iteration.
base::scoped_nsobject<NSArray> subviews([[web_view subviews] copy]); base::scoped_nsobject<NSArray> subviews([[web_view subviews] copy]);
@ -297,6 +278,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 // static
NativeBrowserView* NativeBrowserView::Create( NativeBrowserView* NativeBrowserView::Create(
InspectableWebContents* inspectable_web_contents) { InspectableWebContents* inspectable_web_contents) {