diff --git a/browser/ui/views/sidebar/sidebar_container_view.cc b/browser/ui/views/sidebar/sidebar_container_view.cc index 9eefd23e3f08..54fc1a912afc 100644 --- a/browser/ui/views/sidebar/sidebar_container_view.cc +++ b/browser/ui/views/sidebar/sidebar_container_view.cc @@ -810,6 +810,16 @@ void SidebarContainerView::OnEntryWillDeregister(SidePanelRegistry* registry, void SidebarContainerView::OnRegistryDestroying(SidePanelRegistry* registry) { if (panel_registry_observations_.IsObservingSource(registry)) { StopObservingContextualSidePanelRegistry(registry); + // If this is the active tab being destroyed, then reset the active item. + // Note, that items persisted across tabs like reading list or bookmarks + // don't show as active_entry, in which case leave the active item as is. + if (registry == active_contextual_registry_) { + if (registry->active_entry()) { + auto* controller = browser_->sidebar_controller(); + controller->ActivateItemAt(std::nullopt); + } + active_contextual_registry_ = nullptr; + } } } @@ -843,17 +853,11 @@ void SidebarContainerView::OnTabStripModelChanged( } } } - return; - } - - if (change.type() == TabStripModelChange::kInserted) { + } else if (change.type() == TabStripModelChange::kInserted) { for (const auto& contents : change.GetInsert()->contents) { StartObservingContextualSidePanelRegistry(contents.contents); } - return; - } - - if (change.type() == TabStripModelChange::kRemoved) { + } else if (change.type() == TabStripModelChange::kRemoved) { bool removed_for_deletion = (change.GetRemove()->contents[0].remove_reason == TabStripModelChange::RemoveReason::kDeleted); @@ -864,7 +868,18 @@ void SidebarContainerView::OnTabStripModelChanged( for (const auto& contents : change.GetRemove()->contents) { StopObservingContextualSidePanelRegistry(contents.contents); } - return; + } + } + + // Keep track of the active contextual registry + if (selection.active_tab_changed()) { + active_contextual_registry_ = + selection.new_contents + ? SidePanelRegistry::GetDeprecated(selection.new_contents) + : nullptr; + if (active_contextual_registry_) { + DCHECK(panel_registry_observations_.IsObservingSource( + active_contextual_registry_)); } } } diff --git a/browser/ui/views/sidebar/sidebar_container_view.h b/browser/ui/views/sidebar/sidebar_container_view.h index aa090fafccd9..081bbaf28c05 100644 --- a/browser/ui/views/sidebar/sidebar_container_view.h +++ b/browser/ui/views/sidebar/sidebar_container_view.h @@ -192,6 +192,7 @@ class SidebarContainerView raw_ptr side_panel_ = nullptr; raw_ptr sidebar_model_ = nullptr; raw_ptr sidebar_control_view_ = nullptr; + raw_ptr active_contextual_registry_ = nullptr; bool initialized_ = false; bool sidebar_on_left_ = true; bool operation_from_active_tab_change_ = false;