1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
|
// Copyright (c) 2011 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 CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_H_
#define CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_H_
#pragma once
#if defined(OS_MACOSX)
#include <OpenGL/OpenGL.h>
#endif
#include <string>
#include <vector>
#include "base/process_util.h"
#include "base/callback.h"
#include "content/common/content_export.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColor.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupType.h"
#include "ui/base/ime/text_input_type.h"
#include "ui/base/range/range.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/surface/transport_dib.h"
namespace gfx {
class Rect;
class Size;
}
namespace IPC {
class Message;
}
class BackingStore;
class RenderProcessHost;
class RenderWidgetHost;
class WebCursor;
struct NativeWebKeyboardEvent;
struct ViewHostMsg_AccessibilityNotification_Params;
namespace webkit_glue {
struct WebAccessibility;
}
namespace webkit {
namespace npapi {
struct WebPluginGeometry;
}
}
#if defined(OS_POSIX)
namespace WebKit {
struct WebScreenInfo;
}
#endif
// RenderWidgetHostView is an interface implemented by an object that acts as
// the "View" portion of a RenderWidgetHost. The RenderWidgetHost and its
// associated RenderProcessHost own the "Model" in this case which is the
// child renderer process. The View is responsible for receiving events from
// the surrounding environment and passing them to the RenderWidgetHost, and
// for actually displaying the content of the RenderWidgetHost when it
// changes.
class RenderWidgetHostView {
public:
CONTENT_EXPORT virtual ~RenderWidgetHostView();
// Perform all the initialization steps necessary for this object to represent
// a popup (such as a <select> dropdown), then shows the popup at |pos|.
virtual void InitAsPopup(RenderWidgetHostView* parent_host_view,
const gfx::Rect& pos) = 0;
// Perform all the initialization steps necessary for this object to represent
// a full screen window.
// |reference_host_view| is the view associated with the creating page that
// helps to position the full screen widget on the correct monitor.
virtual void InitAsFullscreen(RenderWidgetHostView* reference_host_view) = 0;
// Returns the associated RenderWidgetHost.
virtual RenderWidgetHost* GetRenderWidgetHost() const = 0;
// Notifies the View that it has become visible.
virtual void DidBecomeSelected() = 0;
// Notifies the View that it has been hidden.
virtual void WasHidden() = 0;
// Tells the View to size itself to the specified size.
virtual void SetSize(const gfx::Size& size) = 0;
// Tells the View to size and move itself to the specified size and point in
// screen space.
virtual void SetBounds(const gfx::Rect& rect) = 0;
// Retrieves the native view used to contain plugins and identify the
// renderer in IPC messages.
virtual gfx::NativeView GetNativeView() const = 0;
virtual gfx::NativeViewId GetNativeViewId() const = 0;
// Moves all plugin windows as described in the given list.
virtual void MovePluginWindows(
const std::vector<webkit::npapi::WebPluginGeometry>& moves) = 0;
// Actually set/take focus to/from the associated View component.
virtual void Focus() = 0;
virtual void Blur() = 0;
// Returns true if the View currently has the focus.
virtual bool HasFocus() = 0;
// Shows/hides the view. These must always be called together in pairs.
// It is not legal to call Hide() multiple times in a row.
virtual void Show() = 0;
virtual void Hide() = 0;
// Whether the view is showing.
virtual bool IsShowing() = 0;
// Retrieve the bounds of the View, in screen coordinates.
virtual gfx::Rect GetViewBounds() const = 0;
// Sets the cursor to the one associated with the specified cursor_type
virtual void UpdateCursor(const WebCursor& cursor) = 0;
// Indicates whether the page has finished loading.
virtual void SetIsLoading(bool is_loading) = 0;
// Updates the state of the input method attached to the view.
virtual void ImeUpdateTextInputState(ui::TextInputType type,
bool can_compose_inline,
const gfx::Rect& caret_rect) = 0;
// Cancel the ongoing composition of the input method attached to the view.
virtual void ImeCancelComposition() = 0;
// Updates the range of the marked text in an IME composition.
virtual void ImeCompositionRangeChanged(const ui::Range& range) {}
// Informs the view that a portion of the widget's backing store was scrolled
// and/or painted. The view should ensure this gets copied to the screen.
//
// If the scroll_rect is non-empty, then a portion of the widget's backing
// store was scrolled by dx pixels horizontally and dy pixels vertically.
// The exposed rect from the scroll operation is included in copy_rects.
//
// There are subtle performance implications here. The RenderWidget gets sent
// a paint ack after this returns, so if the view only ever invalidates in
// response to this, then on Windows, where WM_PAINT has lower priority than
// events which can cause renderer resizes/paint rect updates, e.g.
// drag-resizing can starve painting; this function thus provides the view its
// main chance to ensure it stays painted and not just invalidated. On the
// other hand, if this always blindly paints, then if we're already in the
// midst of a paint on the callstack, we can double-paint unnecessarily.
// (Worse, we might recursively call RenderWidgetHost::GetBackingStore().)
// Thus implementers should generally paint as much of |rect| as possible
// synchronously with as little overpainting as possible.
virtual void DidUpdateBackingStore(
const gfx::Rect& scroll_rect, int scroll_dx, int scroll_dy,
const std::vector<gfx::Rect>& copy_rects) = 0;
// Notifies the View that the renderer has ceased to exist.
virtual void RenderViewGone(base::TerminationStatus status,
int error_code) = 0;
// Tells the View to destroy itself.
virtual void Destroy() = 0;
// Tells the View that the tooltip text for the current mouse position over
// the page has changed.
virtual void SetTooltipText(const string16& tooltip_text) = 0;
// Notifies the View that the renderer text selection has changed. |start|
// and |end| are the visual end points of the selection in the coordinate
// system of the render view.
virtual void SelectionChanged(const std::string& text,
const ui::Range& range,
const gfx::Point& start,
const gfx::Point& end) {}
// Tells the View whether the context menu is showing. This is used on Linux
// to suppress updates to webkit focus for the duration of the show.
virtual void ShowingContextMenu(bool showing) {}
// Allocate a backing store for this view
virtual BackingStore* AllocBackingStore(const gfx::Size& size) = 0;
#if defined(OS_MACOSX)
// Tells the view whether or not to accept first responder status. If |flag|
// is true, the view does not accept first responder status and instead
// manually becomes first responder when it receives a mouse down event. If
// |flag| is false, the view participates in the key-view chain as normal.
virtual void SetTakesFocusOnlyOnMouseDown(bool flag) = 0;
// Retrieve the bounds of the view, in cocoa view coordinates.
// If the UI scale factor is 2, |GetViewBounds()| will return a size of e.g.
// (400, 300) in pixels, while this method will return (200, 150).
// Even though this returns an gfx::Rect, the result is NOT IN PIXELS.
virtual gfx::Rect GetViewCocoaBounds() const = 0;
// Set the view's active state (i.e., tint state of controls).
virtual void SetActive(bool active) = 0;
// Notifies the view that its enclosing window has changed visibility
// (minimized/unminimized, app hidden/unhidden, etc).
// TODO(stuartmorgan): This is a temporary plugin-specific workaround for
// <http://crbug.com/34266>. Once that is fixed, this (and the corresponding
// message and renderer-side handling) can be removed in favor of using
// WasHidden/DidBecomeSelected.
virtual void SetWindowVisibility(bool visible) = 0;
// Informs the view that its containing window's frame changed.
virtual void WindowFrameChanged() = 0;
// Informs the view that a plugin gained or lost focus.
virtual void PluginFocusChanged(bool focused, int plugin_id) = 0;
// Start plugin IME.
virtual void StartPluginIme() = 0;
// Does any event handling necessary for plugin IME; should be called after
// the plugin has already had a chance to process the event. If plugin IME is
// not enabled, this is a no-op, so it is always safe to call.
// Returns true if the event was handled by IME.
virtual bool PostProcessEventForPluginIme(
const NativeWebKeyboardEvent& event) = 0;
// Methods associated with GPU-accelerated plug-in instances.
virtual gfx::PluginWindowHandle AllocateFakePluginWindowHandle(
bool opaque, bool root) = 0;
virtual void DestroyFakePluginWindowHandle(
gfx::PluginWindowHandle window) = 0;
virtual void AcceleratedSurfaceSetIOSurface(
gfx::PluginWindowHandle window,
int32 width,
int32 height,
uint64 io_surface_identifier) = 0;
virtual void AcceleratedSurfaceSetTransportDIB(
gfx::PluginWindowHandle window,
int32 width,
int32 height,
TransportDIB::Handle transport_dib) = 0;
// |window| and |surface_id| indicate which accelerated surface's
// buffers swapped. |renderer_id| and |route_id| are used to formulate
// a reply to the GPU process to prevent it from getting too far ahead.
// They may all be zero, in which case no flow control is enforced;
// this case is currently used for accelerated plugins.
virtual void AcceleratedSurfaceBuffersSwapped(
gfx::PluginWindowHandle window,
uint64 surface_id,
int renderer_id,
int32 route_id,
int gpu_host_id) = 0;
virtual void GpuRenderingStateDidChange() = 0;
#endif
#if defined(TOUCH_UI)
virtual void AcceleratedSurfaceNew(
int32 width,
int32 height,
uint64* surface_id,
TransportDIB::Handle* surface_handle) = 0;
virtual void AcceleratedSurfaceBuffersSwapped(
uint64 surface_id,
int32 route_id,
int gpu_host_id) = 0;
virtual void AcceleratedSurfaceRelease(uint64 surface_id) = 0;
#endif
#if defined(TOOLKIT_USES_GTK)
virtual void CreatePluginContainer(gfx::PluginWindowHandle id) = 0;
virtual void DestroyPluginContainer(gfx::PluginWindowHandle id) = 0;
virtual void AcceleratedCompositingActivated(bool activated) = 0;
#endif
#if defined(OS_WIN)
virtual void WillWmDestroy() = 0;
virtual void ShowCompositorHostWindow(bool show) = 0;
#endif
#if defined(OS_POSIX)
static void GetDefaultScreenInfo(WebKit::WebScreenInfo* results);
virtual void GetScreenInfo(WebKit::WebScreenInfo* results) = 0;
virtual gfx::Rect GetRootWindowBounds() = 0;
#endif
virtual gfx::PluginWindowHandle GetCompositingSurface() = 0;
// Toggles visual muting of the render view area. This is on when a
// constrained window is showing, for example. |color| is the shade of
// the overlay that covers the render view. If |animate| is true, the overlay
// gradually fades in; otherwise it takes effect immediately. To remove the
// fade effect, pass a NULL value for |color|. In this case, |animate| is
// ignored.
virtual void SetVisuallyDeemphasized(const SkColor* color, bool animate) = 0;
virtual void UnhandledWheelEvent(const WebKit::WebMouseWheelEvent& event) = 0;
virtual void SetHasHorizontalScrollbar(bool has_horizontal_scrollbar) = 0;
virtual void SetScrollOffsetPinning(
bool is_pinned_to_left, bool is_pinned_to_right) = 0;
// Return value indicates whether the mouse is locked successfully or not.
virtual bool LockMouse() = 0;
virtual void UnlockMouse() = 0;
void set_popup_type(WebKit::WebPopupType popup_type) {
popup_type_ = popup_type;
}
WebKit::WebPopupType popup_type() const { return popup_type_; }
// Subclasses should override this method to do what is appropriate to set
// the custom background for their platform.
CONTENT_EXPORT virtual void SetBackground(const SkBitmap& background);
const SkBitmap& background() const { return background_; }
virtual void OnAccessibilityNotifications(
const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params) {
}
gfx::Rect reserved_contents_rect() const {
return reserved_rect_;
}
void set_reserved_contents_rect(const gfx::Rect& reserved_rect) {
reserved_rect_ = reserved_rect;
}
bool mouse_locked() const { return mouse_locked_; }
protected:
// Interface class only, do not construct.
CONTENT_EXPORT RenderWidgetHostView();
// Whether this view is a popup and what kind of popup it is (select,
// autofill...).
WebKit::WebPopupType popup_type_;
// A custom background to paint behind the web content. This will be tiled
// horizontally. Can be null, in which case we fall back to painting white.
SkBitmap background_;
// The current reserved area in view coordinates where contents should not be
// rendered to draw the resize corner, sidebar mini tabs etc.
gfx::Rect reserved_rect_;
// While the mouse is locked, the cursor is hidden from the user. Mouse events
// are still generated. However, the position they report is the last known
// mouse position just as mouse lock was entered; the movement they report
// indicates what the change in position of the mouse would be had it not been
// locked.
bool mouse_locked_;
private:
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostView);
};
#endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_VIEW_H_
|