blob: c120c989ac95a7a96ef6bc2f648d07ff0946a35a [file] [log] [blame]
dgozman1137e622017-04-17 19:49:121// Copyright 2014 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
5#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_EYE_DROPPER_H_
6#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_EYE_DROPPER_H_
7
8#include "base/callback.h"
9#include "base/macros.h"
Saman Samid2dc25f2018-05-24 20:41:0710#include "components/viz/host/client_frame_sink_video_capturer.h"
dgozman1137e622017-04-17 19:49:1211#include "content/public/browser/render_widget_host.h"
12#include "content/public/browser/web_contents_observer.h"
Saman Sami2acabd12018-03-10 00:51:0913#include "media/renderers/paint_canvas_video_renderer.h"
14#include "mojo/public/cpp/bindings/binding.h"
dgozman1137e622017-04-17 19:49:1215#include "third_party/skia/include/core/SkBitmap.h"
16
17namespace blink {
18class WebMouseEvent;
19}
20
Saman Sami2acabd12018-03-10 00:51:0921class DevToolsEyeDropper : public content::WebContentsObserver,
22 public viz::mojom::FrameSinkVideoConsumer {
dgozman1137e622017-04-17 19:49:1223 public:
24 typedef base::Callback<void(int, int, int, int)> EyeDropperCallback;
25
26 DevToolsEyeDropper(content::WebContents* web_contents,
27 EyeDropperCallback callback);
28 ~DevToolsEyeDropper() override;
29
30 private:
31 void AttachToHost(content::RenderWidgetHost* host);
32 void DetachFromHost();
33
34 // content::WebContentsObserver.
35 void DidReceiveCompositorFrame() override;
36 void RenderViewCreated(content::RenderViewHost* host) override;
37 void RenderViewDeleted(content::RenderViewHost* host) override;
38 void RenderViewHostChanged(content::RenderViewHost* old_host,
39 content::RenderViewHost* new_host) override;
40
41 void UpdateFrame();
42 void ResetFrame();
Yuri Wiitala6a4443f02018-02-27 22:29:2743 void FrameUpdated(const SkBitmap&);
dgozman1137e622017-04-17 19:49:1244 bool HandleMouseEvent(const blink::WebMouseEvent& event);
45 void UpdateCursor();
46
Saman Sami2acabd12018-03-10 00:51:0947 // viz::mojom::FrameSinkVideoConsumer implementation.
48 void OnFrameCaptured(
49 mojo::ScopedSharedBufferHandle buffer,
50 uint32_t buffer_size,
51 ::media::mojom::VideoFrameInfoPtr info,
52 const gfx::Rect& update_rect,
53 const gfx::Rect& content_rect,
54 viz::mojom::FrameSinkVideoConsumerFrameCallbacksPtr callbacks) override;
55 void OnTargetLost(const viz::FrameSinkId& frame_sink_id) override;
56 void OnStopped() override;
57
Saman Sami00d35442018-03-20 20:22:3958 // This object keeps the shared memory that backs |frame_| mapped.
59 mojo::ScopedSharedBufferMapping shared_memory_mapping_;
60
61 // This object prevents FrameSinkVideoCapturer from recycling the shared
62 // memory that backs |frame_|.
63 viz::mojom::FrameSinkVideoConsumerFrameCallbacksPtr shared_memory_releaser_;
64
dgozman1137e622017-04-17 19:49:1265 EyeDropperCallback callback_;
66 SkBitmap frame_;
67 int last_cursor_x_;
68 int last_cursor_y_;
69 content::RenderWidgetHost::MouseEventCallback mouse_event_callback_;
70 content::RenderWidgetHost* host_;
Saman Samid2dc25f2018-05-24 20:41:0771 std::unique_ptr<viz::ClientFrameSinkVideoCapturer> video_capturer_;
Saman Samid81a0e642018-03-19 04:51:1572 const bool use_video_capture_api_;
Saman Sami2acabd12018-03-10 00:51:0973 media::PaintCanvasVideoRenderer video_renderer_;
dgozman1137e622017-04-17 19:49:1274 base::WeakPtrFactory<DevToolsEyeDropper> weak_factory_;
75
76 DISALLOW_COPY_AND_ASSIGN(DevToolsEyeDropper);
77};
78
79#endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_EYE_DROPPER_H_