Browse Source

fix: propagate layout call to all children of `InspectableWebContentsViewViews` (#40036)

Propagate layout call to all children of InspectableWebContentsViewViews.

When BrowserView bounds are set from js, those might not trigger layout
immediately, sometimes propagating InvalidateLayout call to parent.
View is marked as needing layout, expecting to receive it from parent on
next layout call. The problem is that BrowserView's view is added as child
of InspectableWebContentsViews which does not call setBounds (which
would trigger layout) on all of it's children when doing it's layout,
so it skips propagating Layout call to its children BrowserViews views,
even though those were marked as needing layout.
Call base class View::Layout which will iterate over views' children
and call Layout on those that were marked as needing them.

Fixes #39993.

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Marek Haranczyk <[email protected]>
trop[bot] 1 year ago
parent
commit
7f53717e48
1 changed files with 5 additions and 0 deletions
  1. 5 0
      shell/browser/ui/views/inspectable_web_contents_view_views.cc

+ 5 - 0
shell/browser/ui/views/inspectable_web_contents_view_views.cc

@@ -212,6 +212,8 @@ void InspectableWebContentsViewViews::SetTitle(const std::u16string& title) {
 void InspectableWebContentsViewViews::Layout() {
   if (!devtools_web_view_->GetVisible()) {
     contents_web_view_->SetBoundsRect(GetContentsBounds());
+    // Propagate layout call to all children, for example browser views.
+    View::Layout();
     return;
   }
 
@@ -229,6 +231,9 @@ void InspectableWebContentsViewViews::Layout() {
   devtools_web_view_->SetBoundsRect(new_devtools_bounds);
   contents_web_view_->SetBoundsRect(new_contents_bounds);
 
+  // Propagate layout call to all children, for example browser views.
+  View::Layout();
+
   if (GetDelegate())
     GetDelegate()->DevToolsResized();
 }