fix: draggable regions calculation in BrowserWindow/BrowserView (#26690)
This commit is contained in:
parent
4e3e3d414d
commit
acfbbe9869
5 changed files with 46 additions and 37 deletions
|
@ -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
|
||||||
|
|
|
@ -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_ != ®ions) {
|
if (&draggable_regions_ != ®ions)
|
||||||
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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
@ -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_ != ®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
|
// 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_ != ®ions)
|
||||||
|
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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue