| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef HEADLESS_PUBLIC_UTIL_COMPOSITOR_CONTROLLER_H_ |
| #define HEADLESS_PUBLIC_UTIL_COMPOSITOR_CONTROLLER_H_ |
| |
| #include "base/callback.h" |
| #include "base/cancelable_callback.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/sequenced_task_runner.h" |
| #include "base/time/time.h" |
| #include "headless/public/devtools/domains/headless_experimental.h" |
| #include "headless/public/headless_devtools_client.h" |
| |
| namespace headless { |
| |
| class VirtualTimeController; |
| |
| // Issues BeginFrames (Chromium's vsync signal) while virtual time advances and |
| // and takes screenshots. |
| class HEADLESS_EXPORT CompositorController |
| : public headless_experimental::ExperimentalObserver { |
| public: |
| using BeginFrameResult = headless_experimental::BeginFrameResult; |
| using NeedsBeginFramesChangedParams = |
| headless_experimental::NeedsBeginFramesChangedParams; |
| using ScreenshotParams = headless_experimental::ScreenshotParams; |
| using ScreenshotParamsFormat = headless_experimental::ScreenshotParamsFormat; |
| |
| // |animation_begin_frame_interval| specifies the virtual time between |
| // individual BeginFrames while virtual time advances. |
| // If |update_display_for_animations| is false, animation BeginFrames will not |
| // commit or draw visual updates to the display. This can be used to reduce |
| // the overhead of such BeginFrames in the common case that screenshots will |
| // be taken from separate BeginFrames. |
| CompositorController( |
| scoped_refptr<base::SequencedTaskRunner> task_runner, |
| HeadlessDevToolsClient* devtools_client, |
| VirtualTimeController* virtual_time_controller, |
| base::TimeDelta animation_begin_frame_interval, |
| bool update_display_for_animations = true); |
| ~CompositorController() override; |
| |
| // Executes |idle_callback| when no BeginFrames are in flight. |
| void WaitUntilIdle(base::OnceClosure idle_callback); |
| |
| // Captures a screenshot by issuing a BeginFrame. |quality| is only valid for |
| // jpeg format screenshots, in range 0..100. Should not be called again until |
| // |screenshot_captured_callback| was run. Should only be called while no |
| // other BeginFrame is in flight and after the compositor is ready. |
| void CaptureScreenshot(ScreenshotParamsFormat format, |
| int quality, |
| base::OnceCallback<void(const std::string&)> |
| screenshot_captured_callback); |
| |
| private: |
| class AnimationBeginFrameTask; |
| |
| // headless_experimental_::Observer implementation: |
| void OnNeedsBeginFramesChanged( |
| const NeedsBeginFramesChangedParams& params) override; |
| |
| // Posts a BeginFrame as a new task to avoid nesting it inside the current |
| // callstack, which can upset the compositor. |
| void PostBeginFrame( |
| base::OnceCallback<void(std::unique_ptr<BeginFrameResult>)> |
| begin_frame_complete_callback, |
| bool no_display_updates = false, |
| std::unique_ptr<ScreenshotParams> screenshot = nullptr); |
| // Issues a BeginFrame synchronously and runs |begin_frame_complete_callback| |
| // when done. Should not be called again until |begin_frame_complete_callback| |
| // was run. |
| void BeginFrame(base::OnceCallback<void(std::unique_ptr<BeginFrameResult>)> |
| begin_frame_complete_callback, |
| bool no_display_updates = false, |
| std::unique_ptr<ScreenshotParams> screenshot = nullptr); |
| // Runs the |begin_frame_complete_callback_| and the |idle_callback_| if set. |
| void BeginFrameComplete(std::unique_ptr<BeginFrameResult>); |
| |
| void CaptureScreenshotBeginFrameComplete( |
| std::unique_ptr<BeginFrameResult> result); |
| |
| scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| HeadlessDevToolsClient* devtools_client_; // NOT OWNED |
| VirtualTimeController* virtual_time_controller_; // NOT OWNED |
| std::unique_ptr<AnimationBeginFrameTask> animation_task_; |
| base::OnceClosure idle_callback_; |
| base::OnceCallback<void(const std::string&)> screenshot_captured_callback_; |
| base::OnceCallback<void(std::unique_ptr<BeginFrameResult>)> |
| begin_frame_complete_callback_; |
| base::TimeDelta animation_begin_frame_interval_; |
| bool update_display_for_animations_; |
| bool needs_begin_frames_ = false; |
| base::Time last_begin_frame_time_ = base::Time::UnixEpoch(); |
| base::WeakPtrFactory<CompositorController> weak_ptr_factory_; |
| }; |
| |
| } // namespace headless |
| |
| #endif // HEADLESS_PUBLIC_UTIL_COMPOSITOR_CONTROLLER_H_ |