fix: osr crash on window close (#45629)

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
This commit is contained in:
trop[bot] 2025-02-18 16:19:48 -05:00 committed by GitHub
parent c8c5f9c986
commit f2ec3763c2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 48 additions and 17 deletions

View file

@ -210,8 +210,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<OffScreenVideoConsumer>(
@ -235,17 +235,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) {
@ -303,21 +318,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;
}
@ -533,8 +563,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(

View file

@ -263,6 +263,7 @@ class OffScreenRenderWidgetHostView
}
private:
void ReleaseCompositor();
void SetupFrameRate(bool force);
void ResizeRootLayer(bool force);
@ -315,7 +316,7 @@ class OffScreenRenderWidgetHostView
delegated_frame_host_client_;
// depends-on: delegated_frame_host_client_
const std::unique_ptr<content::DelegatedFrameHost> delegated_frame_host_;
std::unique_ptr<content::DelegatedFrameHost> delegated_frame_host_;
std::unique_ptr<input::CursorManager> cursor_manager_;