From b6884b5c5001a013edfbf84ad7e23611f8314a92 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2025 11:21:36 +0100 Subject: [PATCH] fix: osr crash on window close (#45630) Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr --- .../osr/osr_render_widget_host_view.cc | 62 ++++++++++++++----- .../browser/osr/osr_render_widget_host_view.h | 3 +- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/shell/browser/osr/osr_render_widget_host_view.cc b/shell/browser/osr/osr_render_widget_host_view.cc index ff8f62f969ff..72e105dd3682 100644 --- a/shell/browser/osr/osr_render_widget_host_view.cc +++ b/shell/browser/osr/osr_render_widget_host_view.cc @@ -208,8 +208,8 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView( compositor_->SetRootLayer(root_layer_.get()); ResizeRootLayer(false); + render_widget_host_->SetView(this); - render_widget_host_->render_frame_metadata_provider()->AddObserver(this); if (content::GpuDataManager::GetInstance()->HardwareAccelerationEnabled()) { video_consumer_ = std::make_unique( @@ -233,17 +233,32 @@ void OffScreenRenderWidgetHostView::OnLocalSurfaceIdChanged( } OffScreenRenderWidgetHostView::~OffScreenRenderWidgetHostView() { - render_widget_host_->render_frame_metadata_provider()->RemoveObserver(this); + ReleaseCompositor(); + root_layer_.reset(); + + DCHECK(!parent_host_view_); + DCHECK(!popup_host_view_); + DCHECK(!child_host_view_); + DCHECK(guest_host_views_.empty()); +} + +void OffScreenRenderWidgetHostView::ReleaseCompositor() { + if (!compositor_) { + return; // already released + } // Marking the DelegatedFrameHost as removed from the window hierarchy is // necessary to remove all connections to its old ui::Compositor. - if (is_showing_) - delegated_frame_host_->WasHidden( + if (is_showing_) { + delegated_frame_host()->WasHidden( content::DelegatedFrameHost::HiddenCause::kOther); - delegated_frame_host_->DetachFromCompositor(); + } + delegated_frame_host()->DetachFromCompositor(); + delegated_frame_host_.reset(); + + host_display_client_ = nullptr; compositor_.reset(); - root_layer_.reset(); } void OffScreenRenderWidgetHostView::InitAsChild(gfx::NativeView) { @@ -301,21 +316,36 @@ void OffScreenRenderWidgetHostView::ShowWithVisibility( delegated_frame_host_->WasShown(GetLocalSurfaceId(), root_layer()->bounds().size(), {}); - if (render_widget_host_) - render_widget_host_->WasShown({}); + if (render_widget_host_) { + render_widget_host_->WasShown( + /*record_tab_switch_time_request=*/{}); + + // Call OnRenderFrameMetadataChangedAfterActivation for every frame. + auto* provider = content::RenderWidgetHostImpl::From(render_widget_host_) + ->render_frame_metadata_provider(); + provider->AddObserver(this); + } } void OffScreenRenderWidgetHostView::Hide() { if (!is_showing_) return; - if (render_widget_host_) - render_widget_host_->WasHidden(); + if (render_widget_host_) { + // TODO(codebytere) - remove when CL:6250383 is released. + if (render_widget_host_->delegate()) + render_widget_host_->WasHidden(); - // TODO(deermichel): correct or kOther? - delegated_frame_host()->WasHidden( - content::DelegatedFrameHost::HiddenCause::kOccluded); - delegated_frame_host()->DetachFromCompositor(); + auto* provider = content::RenderWidgetHostImpl::From(render_widget_host_) + ->render_frame_metadata_provider(); + provider->RemoveObserver(this); + } + + if (delegated_frame_host()) { + delegated_frame_host()->WasHidden( + content::DelegatedFrameHost::HiddenCause::kOther); + delegated_frame_host()->DetachFromCompositor(); + } is_showing_ = false; } @@ -531,8 +561,8 @@ const viz::FrameSinkId& OffScreenRenderWidgetHostView::GetFrameSinkId() const { void OffScreenRenderWidgetHostView::DidNavigate() { ResizeRootLayer(true); - if (delegated_frame_host_) - delegated_frame_host_->DidNavigate(); + if (delegated_frame_host()) + delegated_frame_host()->DidNavigate(); } bool OffScreenRenderWidgetHostView::TransformPointToCoordSpaceForView( diff --git a/shell/browser/osr/osr_render_widget_host_view.h b/shell/browser/osr/osr_render_widget_host_view.h index 293909cfbb9a..5c7322f0a52f 100644 --- a/shell/browser/osr/osr_render_widget_host_view.h +++ b/shell/browser/osr/osr_render_widget_host_view.h @@ -262,6 +262,7 @@ class OffScreenRenderWidgetHostView } private: + void ReleaseCompositor(); void SetupFrameRate(bool force); void ResizeRootLayer(bool force); @@ -314,7 +315,7 @@ class OffScreenRenderWidgetHostView delegated_frame_host_client_; // depends-on: delegated_frame_host_client_ - const std::unique_ptr delegated_frame_host_; + std::unique_ptr delegated_frame_host_; std::unique_ptr cursor_manager_;