player_compositor_delegate.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef COMPONENTS_PAINT_PREVIEW_PLAYER_PLAYER_COMPOSITOR_DELEGATE_H_
  5. #define COMPONENTS_PAINT_PREVIEW_PLAYER_PLAYER_COMPOSITOR_DELEGATE_H_
  6. #include "base/callback.h"
  7. #include "base/cancelable_callback.h"
  8. #include "base/containers/flat_map.h"
  9. #include "base/containers/queue.h"
  10. #include "base/memory/memory_pressure_listener.h"
  11. #include "base/memory/raw_ptr.h"
  12. #include "base/memory/weak_ptr.h"
  13. #include "base/unguessable_token.h"
  14. #include "components/paint_preview/browser/hit_tester.h"
  15. #include "components/paint_preview/browser/paint_preview_base_service.h"
  16. #include "components/paint_preview/player/bitmap_request.h"
  17. #include "components/paint_preview/player/compositor_status.h"
  18. #include "components/paint_preview/public/paint_preview_compositor_client.h"
  19. #include "components/paint_preview/public/paint_preview_compositor_service.h"
  20. #include "components/services/paint_preview_compositor/public/mojom/paint_preview_compositor.mojom.h"
  21. #include "mojo/public/cpp/bindings/remote.h"
  22. #include "third_party/abseil-cpp/absl/types/optional.h"
  23. namespace base {
  24. class MemoryPressureMonitor;
  25. } // namespace base
  26. namespace gfx {
  27. class Rect;
  28. } // namespace gfx
  29. class SkBitmap;
  30. namespace paint_preview {
  31. class DirectoryKey;
  32. // Class to facilitate a player creating and communicating with an instance of
  33. // PaintPreviewCompositor.
  34. class PlayerCompositorDelegate {
  35. public:
  36. enum PressureLevelCount : size_t {
  37. kLevels = base::MemoryPressureListener::kMaxValue + 1,
  38. };
  39. PlayerCompositorDelegate();
  40. virtual ~PlayerCompositorDelegate();
  41. PlayerCompositorDelegate(const PlayerCompositorDelegate&) = delete;
  42. PlayerCompositorDelegate& operator=(const PlayerCompositorDelegate&) = delete;
  43. // Callback used for compositor error
  44. using CompositorErrorCallback = base::OnceCallback<void(int32_t)>;
  45. // Initializes the compositor.
  46. void Initialize(
  47. PaintPreviewBaseService* paint_preview_service,
  48. const GURL& url,
  49. const DirectoryKey& key,
  50. bool main_frame_mode,
  51. CompositorErrorCallback compositor_error,
  52. base::TimeDelta timeout_duration,
  53. std::array<size_t, PressureLevelCount::kLevels> max_requests_map);
  54. // Returns whether initialization has happened.
  55. bool IsInitialized() const { return paint_preview_service_; }
  56. void SetCaptureResult(std::unique_ptr<CaptureResult> capture_result);
  57. // Overrides whether to compress the directory when the player is closed. By
  58. // default compression will happen.
  59. void SetCompressOnClose(bool compress) { compress_on_close_ = compress; }
  60. // Implementations should override this to handle alternative compositor ready
  61. // situations.
  62. virtual void OnCompositorReady(
  63. CompositorStatus compositor_status,
  64. mojom::PaintPreviewBeginCompositeResponsePtr composite_response,
  65. float page_scale_factor,
  66. std::unique_ptr<ui::AXTreeUpdate> update) {}
  67. // Called when there is a request for a new bitmap. When the bitmap
  68. // is ready, it will be passed to callback. Returns an ID for the request.
  69. // Pass this ID to `CancelBitmapRequest(int32_t)` to cancel the request if it
  70. // hasn't already been sent.
  71. int32_t RequestBitmap(
  72. const absl::optional<base::UnguessableToken>& frame_guid,
  73. const gfx::Rect& clip_rect,
  74. float scale_factor,
  75. base::OnceCallback<void(mojom::PaintPreviewCompositor::BitmapStatus,
  76. const SkBitmap&)> callback,
  77. bool run_callback_on_default_task_runner = true);
  78. // Cancels the bitmap request associated with `request_id` if possible.
  79. // Returns true on success.
  80. bool CancelBitmapRequest(int32_t request_id);
  81. // Cancels all pending bitmap requests.
  82. void CancelAllBitmapRequests();
  83. // Called on touch event on a frame.
  84. std::vector<const GURL*> OnClick(const base::UnguessableToken& frame_guid,
  85. const gfx::Rect& rect);
  86. // Called when under memory pressure. The default implementation kills the
  87. // compositor service and client under critical pressure.
  88. virtual void OnMemoryPressure(
  89. base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
  90. gfx::Point GetRootFrameOffsets() const { return root_frame_offsets_; }
  91. // Test methods:
  92. // Initializes the compositor without a real service for testing purposes.
  93. void InitializeWithFakeServiceForTest(
  94. PaintPreviewBaseService* paint_preview_service,
  95. const GURL& expected_url,
  96. const DirectoryKey& key,
  97. bool main_frame_mode,
  98. CompositorErrorCallback compositor_error,
  99. base::TimeDelta timeout_duration,
  100. std::array<size_t, PressureLevelCount::kLevels> max_requests_map,
  101. std::unique_ptr<PaintPreviewCompositorService, base::OnTaskRunnerDeleter>
  102. fake_compositor_service);
  103. PaintPreviewCompositorService* GetCompositorServiceForTest() {
  104. return paint_preview_compositor_service_.get();
  105. }
  106. PaintPreviewCompositorClient* GetClientForTest() {
  107. return paint_preview_compositor_client_.get();
  108. }
  109. protected:
  110. CompositorErrorCallback compositor_error_;
  111. virtual base::MemoryPressureMonitor* memory_pressure_monitor();
  112. private:
  113. void InitializeInternal(
  114. PaintPreviewBaseService* paint_preview_service,
  115. const GURL& expected_url,
  116. const DirectoryKey& key,
  117. bool main_frame_mode,
  118. CompositorErrorCallback compositor_error,
  119. base::TimeDelta timeout_duration,
  120. std::array<size_t, PressureLevelCount::kLevels> max_requests_map);
  121. void ValidateProtoAndLoadAXTree(const GURL& expected_url);
  122. void OnAXTreeUpdateAvailable(std::unique_ptr<ui::AXTreeUpdate> update);
  123. void OnCompositorReadyStatusAdapter(
  124. mojom::PaintPreviewCompositor::BeginCompositeStatus status,
  125. mojom::PaintPreviewBeginCompositeResponsePtr composite_response);
  126. void OnHitTestersBuilt(
  127. std::unique_ptr<base::flat_map<base::UnguessableToken,
  128. std::unique_ptr<HitTester>>> hit_testers);
  129. void OnCompositorServiceDisconnected();
  130. void OnCompositorClientCreated(const GURL& expected_url,
  131. const DirectoryKey& key);
  132. void OnCompositorClientDisconnected();
  133. void OnCompositorTimeout();
  134. void OnProtoAvailable(const GURL& expected_url,
  135. PaintPreviewFileMixin::ProtoReadStatus proto_status,
  136. std::unique_ptr<PaintPreviewProto> proto);
  137. void SendCompositeRequest(
  138. mojom::PaintPreviewBeginCompositeRequestPtr begin_composite_request);
  139. void ProcessBitmapRequestsFromQueue();
  140. void AfterBitmapRequestCallback();
  141. raw_ptr<PaintPreviewBaseService> paint_preview_service_{nullptr};
  142. DirectoryKey key_;
  143. bool compress_on_close_{true};
  144. std::unique_ptr<base::MemoryPressureListener> memory_pressure_;
  145. std::unique_ptr<PaintPreviewCompositorService, base::OnTaskRunnerDeleter>
  146. paint_preview_compositor_service_;
  147. std::unique_ptr<PaintPreviewCompositorClient, base::OnTaskRunnerDeleter>
  148. paint_preview_compositor_client_;
  149. base::CancelableOnceClosure timeout_;
  150. int max_requests_{1};
  151. std::array<size_t, PressureLevelCount::kLevels> max_requests_map_{1, 1, 1};
  152. bool main_frame_mode_{false};
  153. std::unique_ptr<
  154. base::flat_map<base::UnguessableToken, std::unique_ptr<HitTester>>>
  155. hit_testers_;
  156. std::unique_ptr<PaintPreviewProto> proto_copy_;
  157. std::unique_ptr<CaptureResult> capture_result_;
  158. float page_scale_factor_;
  159. std::unique_ptr<ui::AXTreeUpdate> ax_tree_update_;
  160. int active_requests_{0};
  161. int32_t next_request_id_{0};
  162. base::queue<int32_t> bitmap_request_queue_;
  163. std::map<int32_t, BitmapRequest> pending_bitmap_requests_;
  164. gfx::Point root_frame_offsets_;
  165. base::WeakPtrFactory<PlayerCompositorDelegate> weak_factory_{this};
  166. };
  167. } // namespace paint_preview
  168. #endif // COMPONENTS_PAINT_PREVIEW_PLAYER_PLAYER_COMPOSITOR_DELEGATE_H_