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 5825f9515121..2d2faa456e66 100644 --- content/browser/renderer_host/render_widget_host_view_child_frame.cc +++ content/browser/renderer_host/render_widget_host_view_child_frame.cc @@ -641,6 +641,7 @@ void RenderWidgetHostViewChildFrame::SubmitCompositorFrame( "RenderWidgetHostViewChildFrame::OnSwapCompositorFrame"); support_->SubmitCompositorFrame(local_surface_id, std::move(frame), std::move(hit_test_region_list)); + ProcessFrameSwappedCallbacks(); } void RenderWidgetHostViewChildFrame::OnDidNotProduceFrame( @@ -649,6 +650,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 @@ -834,6 +844,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,