OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 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 WEBKIT_TOOLS_TEST_SHELL_WEBWIDGET_HOST_H_ | |
6 #define WEBKIT_TOOLS_TEST_SHELL_WEBWIDGET_HOST_H_ | |
7 | |
8 #include "base/basictypes.h" | |
9 #include "base/memory/scoped_ptr.h" | |
10 #include "base/memory/weak_ptr.h" | |
11 #include "skia/ext/platform_canvas.h" | |
12 #include "ui/gfx/native_widget_types.h" | |
13 #include "ui/gfx/rect.h" | |
14 | |
15 namespace gfx { | |
16 class Size; | |
17 } | |
18 | |
19 namespace WebKit { | |
20 class WebWidget; | |
21 class WebWidgetClient; | |
22 struct WebScreenInfo; | |
23 } | |
24 | |
25 #if defined(OS_MACOSX) | |
26 #ifdef __OBJC__ | |
27 @class NSEvent; | |
28 #else | |
29 class NSEvent; | |
30 #endif | |
31 #endif | |
32 | |
33 // This class is a simple NativeView-based host for a WebWidget | |
34 class WebWidgetHost { | |
35 public: | |
36 // The new instance is deleted once the associated NativeView is destroyed. | |
37 // The newly created window should be resized after it is created, using the | |
38 // MoveWindow (or equivalent) function. | |
39 static WebWidgetHost* Create(gfx::NativeView parent_view, | |
40 WebKit::WebWidgetClient* client); | |
41 | |
42 #if defined(OS_MACOSX) | |
43 static void HandleEvent(gfx::NativeView view, NSEvent* event); | |
44 #endif | |
45 | |
46 gfx::NativeView view_handle() const { return view_; } | |
47 WebKit::WebWidget* webwidget() const { return webwidget_; } | |
48 | |
49 void DidInvalidateRect(const gfx::Rect& rect); | |
50 void DidScrollRect(int dx, int dy, const gfx::Rect& clip_rect); | |
51 void ScheduleComposite(); | |
52 void ScheduleAnimation(); | |
53 #if defined(OS_WIN) | |
54 void SetCursor(HCURSOR cursor); | |
55 #endif | |
56 | |
57 void DiscardBackingStore(); | |
58 // Allow clients to update the paint rect. For example, if we get a gdk | |
59 // expose or WM_PAINT event, we need to update the paint rect. | |
60 void UpdatePaintRect(const gfx::Rect& rect); | |
61 void Paint(); | |
62 | |
63 skia::PlatformCanvas* canvas() const { return canvas_.get(); } | |
64 | |
65 WebKit::WebScreenInfo GetScreenInfo(); | |
66 | |
67 // Paints the entire canvas a semi-transparent black (grayish). This is used | |
68 // by the layout tests in fast/repaint. The alpha value matches upstream. | |
69 void DisplayRepaintMask() { | |
70 canvas()->drawARGB(167, 0, 0, 0); | |
71 } | |
72 | |
73 void PaintRect(const gfx::Rect& rect); | |
74 | |
75 protected: | |
76 WebWidgetHost(); | |
77 ~WebWidgetHost(); | |
78 | |
79 #if defined(OS_WIN) | |
80 // Per-class wndproc. Returns true if the event should be swallowed. | |
81 virtual bool WndProc(UINT message, WPARAM wparam, LPARAM lparam); | |
82 | |
83 void Resize(LPARAM lparam); | |
84 void MouseEvent(UINT message, WPARAM wparam, LPARAM lparam); | |
85 void WheelEvent(WPARAM wparam, LPARAM lparam); | |
86 void KeyEvent(UINT message, WPARAM wparam, LPARAM lparam); | |
87 void CaptureLostEvent(); | |
88 void SetFocus(bool enable); | |
89 | |
90 static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); | |
91 #elif defined(OS_MACOSX) | |
92 // These need to be called from a non-subclass, so they need to be public. | |
93 public: | |
94 void Resize(const gfx::Rect& rect); | |
95 void MouseEvent(NSEvent *); | |
96 void WheelEvent(NSEvent *); | |
97 void KeyEvent(NSEvent *); | |
98 void SetFocus(bool enable); | |
99 protected: | |
100 #elif defined(TOOLKIT_GTK) | |
101 public: | |
102 // --------------------------------------------------------------------------- | |
103 // This is needed on Linux because the GtkWidget creation is the same between | |
104 // both web view hosts and web widget hosts. The Windows code manages this by | |
105 // reusing the WndProc function (static, above). However, GTK doesn't use a | |
106 // single big callback function like that so we have a static function that | |
107 // sets up a GtkWidget correctly. | |
108 // parent: a GtkBox to pack the new widget at the end of | |
109 // host: a pointer to a WebWidgetHost (or subclass thereof) | |
110 // --------------------------------------------------------------------------- | |
111 static gfx::NativeView CreateWidget(gfx::NativeView parent_view, | |
112 WebWidgetHost* host); | |
113 void WindowDestroyed(); | |
114 void Resize(const gfx::Size& size); | |
115 #endif | |
116 | |
117 #if defined(OS_WIN) | |
118 void TrackMouseLeave(bool enable); | |
119 #endif | |
120 | |
121 void ResetScrollRect(); | |
122 | |
123 void set_painting(bool value) { | |
124 #ifndef NDEBUG | |
125 painting_ = value; | |
126 #endif | |
127 } | |
128 | |
129 gfx::NativeView view_; | |
130 WebKit::WebWidget* webwidget_; | |
131 scoped_ptr<skia::PlatformCanvas> canvas_; | |
132 | |
133 // specifies the portion of the webwidget that needs painting | |
134 gfx::Rect paint_rect_; | |
135 | |
136 // specifies the portion of the webwidget that needs scrolling | |
137 gfx::Rect scroll_rect_; | |
138 int scroll_dx_; | |
139 int scroll_dy_; | |
140 | |
141 #if defined(OS_WIN) | |
142 bool track_mouse_leave_; | |
143 #endif | |
144 | |
145 #if defined(TOOLKIT_GTK) | |
146 // Since GtkWindow resize is asynchronous, we have to stash the dimensions, | |
147 // so that the backing store doesn't have to wait for sizing to take place. | |
148 gfx::Size logical_size_; | |
149 #endif | |
150 | |
151 #ifndef NDEBUG | |
152 bool painting_; | |
153 #endif | |
154 | |
155 private: | |
156 base::WeakPtrFactory<WebWidgetHost> weak_factory_; | |
157 }; | |
158 | |
159 #endif // WEBKIT_TOOLS_TEST_SHELL_WEBWIDGET_HOST_H_ | |
OLD | NEW |