diff --git content/browser/renderer_host/render_widget_host_view_child_frame.cc content/browser/renderer_host/render_widget_host_view_child_frame.cc index 88681456e180..aec9ee42e21b 100644 --- content/browser/renderer_host/render_widget_host_view_child_frame.cc +++ content/browser/renderer_host/render_widget_host_view_child_frame.cc @@ -650,6 +650,7 @@ void RenderWidgetHostViewChildFrame::SubmitCompositorFrame( "RenderWidgetHostViewChildFrame::OnSwapCompositorFrame"); support_->SubmitCompositorFrame(local_surface_id, std::move(frame), std::move(hit_test_region_list)); + ProcessFrameSwappedCallbacks(); } void RenderWidgetHostViewChildFrame::OnDidNotProduceFrame( @@ -658,6 +659,15 @@ void RenderWidgetHostViewChildFrame::OnDidNotProduceFrame( support_->DidNotProduceFrame(ack); } +void RenderWidgetHostViewChildFrame::ProcessFrameSwappedCallbacks() { + std::vector process_callbacks; + // Swap the vectors to avoid re-entrancy issues due to calls to + // RegisterFrameSwappedCallback() while running the OnceClosures. + process_callbacks.swap(frame_swapped_callbacks_); + for (base::OnceClosure& callback : process_callbacks) + std::move(callback).Run(); +} + void RenderWidgetHostViewChildFrame::TransformPointToRootSurface( gfx::PointF* point) { // This function is called by RenderWidgetHostInputEventRouter only for @@ -842,6 +852,11 @@ void RenderWidgetHostViewChildFrame::ShowDefinitionForSelection() { void RenderWidgetHostViewChildFrame::SpeakSelection() {} #endif // defined(OS_MACOSX) +void RenderWidgetHostViewChildFrame::RegisterFrameSwappedCallback( + base::OnceClosure callback) { + frame_swapped_callbacks_.emplace_back(std::move(callback)); +} + void RenderWidgetHostViewChildFrame::CopyFromSurface( const gfx::Rect& src_subrect, const gfx::Size& output_size,