1// Copyright (c) 2013 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 CONTENT_BROWSER_DEVTOOLS_RENDERER_OVERRIDES_HANDLER_H_
6#define CONTENT_BROWSER_DEVTOOLS_RENDERER_OVERRIDES_HANDLER_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "base/memory/ref_counted_memory.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/memory/weak_ptr.h"
13#include "base/time/time.h"
14#include "cc/output/compositor_frame_metadata.h"
15#include "content/browser/devtools/devtools_protocol.h"
16#include "content/common/content_export.h"
17#include "content/public/browser/render_widget_host.h"
18#include "third_party/skia/include/core/SkBitmap.h"
19
20class SkBitmap;
21
22namespace IPC {
23class Message;
24}
25
26namespace blink {
27class WebMouseEvent;
28}
29
30namespace content {
31
32class DevToolsTracingHandler;
33class RenderViewHostImpl;
34
35// Overrides Inspector commands before they are sent to the renderer.
36// May override the implementation completely, ignore it, or handle
37// additional browser process implementation details.
38class CONTENT_EXPORT RendererOverridesHandler
39    : public DevToolsProtocol::Handler {
40 public:
41  RendererOverridesHandler();
42  virtual ~RendererOverridesHandler();
43
44  void OnClientDetached();
45  void OnSwapCompositorFrame(const cc::CompositorFrameMetadata& frame_metadata);
46  void OnVisibilityChanged(bool visible);
47  void SetRenderViewHost(RenderViewHostImpl* host);
48  void ClearRenderViewHost();
49  void DidAttachInterstitialPage();
50  void DidDetachInterstitialPage();
51
52 private:
53  void InnerSwapCompositorFrame();
54
55  // DOM domain.
56  scoped_refptr<DevToolsProtocol::Response>
57      GrantPermissionsForSetFileInputFiles(
58          scoped_refptr<DevToolsProtocol::Command> command);
59
60  // Network domain.
61  scoped_refptr<DevToolsProtocol::Response> CanEmulateNetworkConditions(
62      scoped_refptr<DevToolsProtocol::Command> command);
63  scoped_refptr<DevToolsProtocol::Response> ClearBrowserCache(
64      scoped_refptr<DevToolsProtocol::Command> command);
65  scoped_refptr<DevToolsProtocol::Response> ClearBrowserCookies(
66      scoped_refptr<DevToolsProtocol::Command> command);
67
68  // Page domain.
69  scoped_refptr<DevToolsProtocol::Response> PageEnable(
70      scoped_refptr<DevToolsProtocol::Command> command);
71  scoped_refptr<DevToolsProtocol::Response> PageDisable(
72      scoped_refptr<DevToolsProtocol::Command> command);
73  scoped_refptr<DevToolsProtocol::Response> PageHandleJavaScriptDialog(
74      scoped_refptr<DevToolsProtocol::Command> command);
75  scoped_refptr<DevToolsProtocol::Response> PageNavigate(
76      scoped_refptr<DevToolsProtocol::Command> command);
77  scoped_refptr<DevToolsProtocol::Response> PageReload(
78      scoped_refptr<DevToolsProtocol::Command> command);
79  scoped_refptr<DevToolsProtocol::Response> PageGetNavigationHistory(
80      scoped_refptr<DevToolsProtocol::Command> command);
81  scoped_refptr<DevToolsProtocol::Response> PageNavigateToHistoryEntry(
82      scoped_refptr<DevToolsProtocol::Command> command);
83  scoped_refptr<DevToolsProtocol::Response> PageSetTouchEmulationEnabled(
84      scoped_refptr<DevToolsProtocol::Command> command);
85  scoped_refptr<DevToolsProtocol::Response> PageCaptureScreenshot(
86      scoped_refptr<DevToolsProtocol::Command> command);
87  scoped_refptr<DevToolsProtocol::Response> PageCanEmulate(
88      scoped_refptr<DevToolsProtocol::Command> command);
89  scoped_refptr<DevToolsProtocol::Response> PageCanScreencast(
90      scoped_refptr<DevToolsProtocol::Command> command);
91  scoped_refptr<DevToolsProtocol::Response> PageStartScreencast(
92      scoped_refptr<DevToolsProtocol::Command> command);
93  scoped_refptr<DevToolsProtocol::Response> PageStopScreencast(
94      scoped_refptr<DevToolsProtocol::Command> command);
95  scoped_refptr<DevToolsProtocol::Response> PageQueryUsageAndQuota(
96      scoped_refptr<DevToolsProtocol::Command>);
97  scoped_refptr<DevToolsProtocol::Response> PageSetColorPickerEnabled(
98      scoped_refptr<DevToolsProtocol::Command>);
99
100  void ScreenshotCaptured(
101      scoped_refptr<DevToolsProtocol::Command> command,
102      const unsigned char* png_data,
103      size_t png_size);
104
105  void ScreencastFrameCaptured(
106      const std::string& format,
107      int quality,
108      const cc::CompositorFrameMetadata& metadata,
109      bool success,
110      const SkBitmap& bitmap);
111
112  void PageQueryUsageAndQuotaCompleted(
113     scoped_refptr<DevToolsProtocol::Command>,
114     scoped_ptr<base::DictionaryValue> response_data);
115
116  void NotifyScreencastVisibility(bool visible);
117  void SetColorPickerEnabled(bool enabled);
118  void UpdateColorPickerFrame();
119  void ResetColorPickerFrame();
120  void ColorPickerFrameUpdated(bool succeeded, const SkBitmap& bitmap);
121  bool HandleMouseEvent(const blink::WebMouseEvent& event);
122  void UpdateColorPickerCursor();
123
124  // Input domain.
125  scoped_refptr<DevToolsProtocol::Response> InputEmulateTouchFromMouseEvent(
126      scoped_refptr<DevToolsProtocol::Command> command);
127
128  void UpdateTouchEventEmulationState();
129
130  RenderViewHostImpl* host_;
131  bool page_domain_enabled_;
132  scoped_refptr<DevToolsProtocol::Command> screencast_command_;
133  bool has_last_compositor_frame_metadata_;
134  cc::CompositorFrameMetadata last_compositor_frame_metadata_;
135  base::TimeTicks last_frame_time_;
136  int capture_retry_count_;
137  bool touch_emulation_enabled_;
138  bool color_picker_enabled_;
139  SkBitmap color_picker_frame_;
140  int last_cursor_x_;
141  int last_cursor_y_;
142  RenderWidgetHost::MouseEventCallback mouse_event_callback_;
143  base::WeakPtrFactory<RendererOverridesHandler> weak_factory_;
144  DISALLOW_COPY_AND_ASSIGN(RendererOverridesHandler);
145};
146
147}  // namespace content
148
149#endif  // CONTENT_BROWSER_DEVTOOLS_RENDERER_OVERRIDES_HANDLER_H_
150