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:
parent
c8c5f9c986
commit
f2ec3763c2
2 changed files with 48 additions and 17 deletions
|
@ -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(
|
||||
|
|
|
@ -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_;
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue