diff --git a/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.cc b/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.cc index 3308c8bc53ad..59aa44049881 100644 --- a/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.cc +++ b/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.cc @@ -10,6 +10,7 @@ #include "base/check.h" #include "brave/browser/ui/views/frame/brave_browser_view.h" #include "brave/browser/ui/views/frame/vertical_tab_strip_region_view.h" +#include "brave/browser/ui/views/tabs/vertical_tab_utils.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/theme_copying_widget.h" @@ -138,11 +139,15 @@ VerticalTabStripWidgetDelegateView::VerticalTabStripWidgetDelegateView( SetLayoutManager(std::make_unique()); host_view_observation_.Observe(host_); - widget_observation_.Observe(host_->GetWidget()); + widget_observation_.AddObservation(host_->GetWidget()); ChildPreferredSizeChanged(region_view_); } +void VerticalTabStripWidgetDelegateView::AddedToWidget() { + widget_observation_.AddObservation(GetWidget()); +} + void VerticalTabStripWidgetDelegateView::ChildPreferredSizeChanged( views::View* child) { if (!host_) @@ -184,9 +189,27 @@ void VerticalTabStripWidgetDelegateView::OnViewIsDeleting( host_ = nullptr; } +void VerticalTabStripWidgetDelegateView::OnWidgetVisibilityChanged( + views::Widget* widget, + bool visible) { + if (widget == GetWidget()) { + if (!tabs::utils::ShouldShowVerticalTabs(browser_view_->browser()) && + visible) { + // This happens when restoring browser window. The upstream implementation + // make child widgets visible regardless of their previous visibility. + // https://github.com/brave/brave-browser/issues/29917 + widget->Hide(); + } + } +} + void VerticalTabStripWidgetDelegateView::OnWidgetBoundsChanged( views::Widget* widget, const gfx::Rect& new_bounds) { + if (widget == GetWidget()) { + return; + } + // The parent widget could be resized because fullscreen status changed. // Try resetting preferred size. ChildPreferredSizeChanged(region_view_); @@ -208,6 +231,8 @@ void VerticalTabStripWidgetDelegateView::UpdateWidgetBounds() { return; } + DCHECK(tabs::utils::ShouldShowVerticalTabs(browser_view_->browser())); + auto insets = host_->GetInsets(); widget_bounds.set_width(widget_bounds.width() + insets.width()); if (GetInsets() != insets) { @@ -232,7 +257,7 @@ void VerticalTabStripWidgetDelegateView::UpdateWidgetBounds() { void VerticalTabStripWidgetDelegateView::OnWidgetDestroying( views::Widget* widget) { - widget_observation_.Reset(); + widget_observation_.RemoveObservation(widget); } #if BUILDFLAG(IS_MAC) diff --git a/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.h b/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.h index fbf7bad5687c..7784c04fd03e 100644 --- a/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.h +++ b/browser/ui/views/frame/vertical_tab_strip_widget_delegate_view.h @@ -8,6 +8,7 @@ #include +#include "base/scoped_multi_source_observation.h" #include "ui/views/view_observer.h" #include "ui/views/widget/widget_delegate.h" #include "ui/views/widget/widget_observer.h" @@ -47,6 +48,7 @@ class VerticalTabStripWidgetDelegateView : public views::WidgetDelegateView, } // views::WidgetDelegateView: + void AddedToWidget() override; void ChildPreferredSizeChanged(views::View* child) override; // views::ViewObserver: @@ -56,6 +58,7 @@ class VerticalTabStripWidgetDelegateView : public views::WidgetDelegateView, void OnViewIsDeleting(views::View* observed_view) override; // views::WidgetObserver: + void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override; void OnWidgetBoundsChanged(views::Widget* widget, const gfx::Rect& new_bounds) override; void OnWidgetDestroying(views::Widget* widget) override; @@ -76,7 +79,7 @@ class VerticalTabStripWidgetDelegateView : public views::WidgetDelegateView, base::ScopedObservation host_view_observation_{this}; - base::ScopedObservation + base::ScopedMultiSourceObservation widget_observation_{this}; };