OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_H_ | 5 #ifndef CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_H_ |
6 #define CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_H_ | 6 #define CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <deque> | 9 // TODO(jam): remove this file when all files have been converted. |
10 #include <string> | 10 #include "content/browser/renderer_host/render_widget_host.h" |
11 #include <vector> | |
12 | |
13 #include "app/surface/transport_dib.h" | |
14 #include "base/gtest_prod_util.h" | |
15 #include "base/process_util.h" | |
16 #include "base/scoped_ptr.h" | |
17 #include "base/string16.h" | |
18 #include "base/timer.h" | |
19 #include "chrome/common/edit_command.h" | |
20 #include "chrome/common/native_web_keyboard_event.h" | |
21 #include "chrome/common/property_bag.h" | |
22 #include "ipc/ipc_channel.h" | |
23 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" | |
24 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextDirection.h" | |
25 #include "third_party/WebKit/Source/WebKit/chromium/public/WebTextInputType.h" | |
26 #include "ui/gfx/native_widget_types.h" | |
27 #include "ui/gfx/rect.h" | |
28 #include "ui/gfx/size.h" | |
29 | |
30 namespace gfx { | |
31 class Rect; | |
32 } | |
33 | |
34 namespace WebKit { | |
35 class WebInputEvent; | |
36 class WebMouseEvent; | |
37 struct WebCompositionUnderline; | |
38 struct WebScreenInfo; | |
39 } | |
40 | |
41 class BackingStore; | |
42 class PaintObserver; | |
43 class RenderProcessHost; | |
44 class RenderWidgetHostView; | |
45 class TransportDIB; | |
46 class WebCursor; | |
47 struct ViewHostMsg_UpdateRect_Params; | |
48 | |
49 // This class manages the browser side of a browser<->renderer HWND connection. | |
50 // The HWND lives in the browser process, and windows events are sent over | |
51 // IPC to the corresponding object in the renderer. The renderer paints into | |
52 // shared memory, which we transfer to a backing store and blit to the screen | |
53 // when Windows sends us a WM_PAINT message. | |
54 // | |
55 // How Shutdown Works | |
56 // | |
57 // There are two situations in which this object, a RenderWidgetHost, can be | |
58 // instantiated: | |
59 // | |
60 // 1. By a TabContents as the communication conduit for a rendered web page. | |
61 // The TabContents instantiates a derived class: RenderViewHost. | |
62 // 2. By a TabContents as the communication conduit for a select widget. The | |
63 // TabContents instantiates the RenderWidgetHost directly. | |
64 // | |
65 // For every TabContents there are several objects in play that need to be | |
66 // properly destroyed or cleaned up when certain events occur. | |
67 // | |
68 // - TabContents - the TabContents itself, and its associated HWND. | |
69 // - RenderViewHost - representing the communication conduit with the child | |
70 // process. | |
71 // - RenderWidgetHostView - the view of the web page content, message handler, | |
72 // and plugin root. | |
73 // | |
74 // Normally, the TabContents contains a child RenderWidgetHostView that renders | |
75 // the contents of the loaded page. It has a WS_CLIPCHILDREN style so that it | |
76 // does no painting of its own. | |
77 // | |
78 // The lifetime of the RenderWidgetHostView is tied to the render process. If | |
79 // the render process dies, the RenderWidgetHostView goes away and all | |
80 // references to it must become NULL. If the TabContents finds itself without a | |
81 // RenderWidgetHostView, it paints Sad Tab instead. | |
82 // | |
83 // RenderViewHost (a RenderWidgetHost subclass) is the conduit used to | |
84 // communicate with the RenderView and is owned by the TabContents. If the | |
85 // render process crashes, the RenderViewHost remains and restarts the render | |
86 // process if needed to continue navigation. | |
87 // | |
88 // The TabContents is itself owned by the NavigationController in which it | |
89 // resides. | |
90 // | |
91 // Some examples of how shutdown works: | |
92 // | |
93 // When a tab is closed (either by the user, the web page calling window.close, | |
94 // etc) the TabStrip destroys the associated NavigationController, which calls | |
95 // Destroy on each TabContents it owns. | |
96 // | |
97 // For a TabContents, its Destroy method tells the RenderViewHost to | |
98 // shut down the render process and die. | |
99 // | |
100 // When the render process is destroyed it destroys the View: the | |
101 // RenderWidgetHostView, which destroys its HWND and deletes that object. | |
102 // | |
103 // For select popups, the situation is a little different. The RenderWidgetHost | |
104 // associated with the select popup owns the view and itself (is responsible | |
105 // for destroying itself when the view is closed). The TabContents's only | |
106 // responsibility is to select popups is to create them when it is told to. When | |
107 // the View is destroyed via an IPC message (for when WebCore destroys the | |
108 // popup, e.g. if the user selects one of the options), or because | |
109 // WM_CANCELMODE is received by the view, the View schedules the destruction of | |
110 // the render process. However in this case since there's no TabContents | |
111 // container, when the render process is destroyed, the RenderWidgetHost just | |
112 // deletes itself, which is safe because no one else should have any references | |
113 // to it (the TabContents does not). | |
114 // | |
115 // It should be noted that the RenderViewHost, not the RenderWidgetHost, | |
116 // handles IPC messages relating to the render process going away, since the | |
117 // way a RenderViewHost (TabContents) handles the process dying is different to | |
118 // the way a select popup does. As such the RenderWidgetHostView handles these | |
119 // messages for select popups. This placement is more out of convenience than | |
120 // anything else. When the view is live, these messages are forwarded to it by | |
121 // the RenderWidgetHost's IPC message map. | |
122 // | |
123 class RenderWidgetHost : public IPC::Channel::Listener, | |
124 public IPC::Channel::Sender { | |
125 public: | |
126 // Used as the details object for a | |
127 // RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK notification. | |
128 struct PaintAtSizeAckDetails { | |
129 // The tag that was passed to the PaintAtSize() call that triggered this | |
130 // ack. | |
131 int tag; | |
132 gfx::Size size; | |
133 }; | |
134 | |
135 // routing_id can be MSG_ROUTING_NONE, in which case the next available | |
136 // routing id is taken from the RenderProcessHost. | |
137 RenderWidgetHost(RenderProcessHost* process, int routing_id); | |
138 virtual ~RenderWidgetHost(); | |
139 | |
140 // Gets/Sets the View of this RenderWidgetHost. Can be NULL, e.g. if the | |
141 // RenderWidget is being destroyed or the render process crashed. You should | |
142 // never cache this pointer since it can become NULL if the renderer crashes, | |
143 // instead you should always ask for it using the accessor. | |
144 void set_view(RenderWidgetHostView* view) { view_ = view; } | |
145 RenderWidgetHostView* view() const { return view_; } | |
146 | |
147 RenderProcessHost* process() const { return process_; } | |
148 int routing_id() const { return routing_id_; } | |
149 bool renderer_accessible() { return renderer_accessible_; } | |
150 | |
151 // Returns the property bag for this widget, where callers can add extra data | |
152 // they may wish to associate with it. Returns a pointer rather than a | |
153 // reference since the PropertyAccessors expect this. | |
154 const PropertyBag* property_bag() const { return &property_bag_; } | |
155 PropertyBag* property_bag() { return &property_bag_; } | |
156 | |
157 // Called when a renderer object already been created for this host, and we | |
158 // just need to be attached to it. Used for window.open, <select> dropdown | |
159 // menus, and other times when the renderer initiates creating an object. | |
160 void Init(); | |
161 | |
162 // Tells the renderer to die and then calls Destroy(). | |
163 virtual void Shutdown(); | |
164 | |
165 // Manual RTTI FTW. We are not hosting a web page. | |
166 virtual bool IsRenderView() const; | |
167 | |
168 // IPC::Channel::Listener | |
169 virtual bool OnMessageReceived(const IPC::Message& msg); | |
170 | |
171 // Sends a message to the corresponding object in the renderer. | |
172 virtual bool Send(IPC::Message* msg); | |
173 | |
174 // Called to notify the RenderWidget that it has been hidden or restored from | |
175 // having been hidden. | |
176 void WasHidden(); | |
177 void WasRestored(); | |
178 | |
179 // Called to notify the RenderWidget that it has been resized. | |
180 void WasResized(); | |
181 | |
182 // Called to notify the RenderWidget that its associated native window got | |
183 // focused. | |
184 virtual void GotFocus(); | |
185 | |
186 // Tells the renderer it got/lost focus. | |
187 void Focus(); | |
188 void Blur(); | |
189 virtual void LostCapture(); | |
190 | |
191 // Tells us whether the page is rendered directly via the GPU process. | |
192 bool is_accelerated_compositing_active() { | |
193 return is_accelerated_compositing_active_; | |
194 } | |
195 | |
196 // Notifies the RenderWidgetHost that the View was destroyed. | |
197 void ViewDestroyed(); | |
198 | |
199 // Indicates if the page has finished loading. | |
200 void SetIsLoading(bool is_loading); | |
201 | |
202 // This tells the renderer to paint into a bitmap and return it, | |
203 // regardless of whether the tab is hidden or not. It resizes the | |
204 // web widget to match the |page_size| and then returns the bitmap | |
205 // scaled so it matches the |desired_size|, so that the scaling | |
206 // happens on the rendering thread. When the bitmap is ready, the | |
207 // renderer sends a PaintAtSizeACK to this host, and a | |
208 // RENDER_WIDGET_HOST_DID_RECEIVE_PAINT_AT_SIZE_ACK notification is issued. | |
209 // Note that this bypasses most of the update logic that is normally invoked, | |
210 // and doesn't put the results into the backing store. | |
211 void PaintAtSize(TransportDIB::Handle dib_handle, | |
212 int tag, | |
213 const gfx::Size& page_size, | |
214 const gfx::Size& desired_size); | |
215 | |
216 // Get access to the widget's backing store. If a resize is in progress, | |
217 // then the current size of the backing store may be less than the size of | |
218 // the widget's view. If you pass |force_create| as true, then the backing | |
219 // store will be created if it doesn't exist. Otherwise, NULL will be returned | |
220 // if the backing store doesn't already exist. It will also return NULL if the | |
221 // backing store could not be created. | |
222 BackingStore* GetBackingStore(bool force_create); | |
223 | |
224 // Allocate a new backing store of the given size. Returns NULL on failure | |
225 // (for example, if we don't currently have a RenderWidgetHostView.) | |
226 BackingStore* AllocBackingStore(const gfx::Size& size); | |
227 | |
228 // When a backing store does asynchronous painting, it will call this function | |
229 // when it is done with the DIB. We will then forward a message to the | |
230 // renderer to send another paint. | |
231 void DonePaintingToBackingStore(); | |
232 | |
233 // GPU accelerated version of GetBackingStore function. This will | |
234 // trigger a re-composite to the view. If a resize is pending, it will | |
235 // block briefly waiting for an ack from the renderer. | |
236 void ScheduleComposite(); | |
237 | |
238 // Starts a hang monitor timeout. If there's already a hang monitor timeout | |
239 // the new one will only fire if it has a shorter delay than the time | |
240 // left on the existing timeouts. | |
241 void StartHangMonitorTimeout(base::TimeDelta delay); | |
242 | |
243 // Restart the active hang monitor timeout. Clears all existing timeouts and | |
244 // starts with a new one. This can be because the renderer has become | |
245 // active, the tab is being hidden, or the user has chosen to wait some more | |
246 // to give the tab a chance to become active and we don't want to display a | |
247 // warning too soon. | |
248 void RestartHangMonitorTimeout(); | |
249 | |
250 // Stops all existing hang monitor timeouts and assumes the renderer is | |
251 // responsive. | |
252 void StopHangMonitorTimeout(); | |
253 | |
254 // Called when the system theme changes. At this time all existing native | |
255 // theme handles are invalid and the renderer must obtain new ones and | |
256 // repaint. | |
257 void SystemThemeChanged(); | |
258 | |
259 // Forwards the given message to the renderer. These are called by the view | |
260 // when it has received a message. | |
261 virtual void ForwardMouseEvent(const WebKit::WebMouseEvent& mouse_event); | |
262 // Called when a mouse click activates the renderer. | |
263 virtual void OnMouseActivate(); | |
264 void ForwardWheelEvent(const WebKit::WebMouseWheelEvent& wheel_event); | |
265 virtual void ForwardKeyboardEvent(const NativeWebKeyboardEvent& key_event); | |
266 virtual void ForwardEditCommand(const std::string& name, | |
267 const std::string& value); | |
268 virtual void ForwardEditCommandsForNextKeyEvent( | |
269 const EditCommands& edit_commands); | |
270 #if defined(TOUCH_UI) | |
271 virtual void ForwardTouchEvent(const WebKit::WebTouchEvent& touch_event); | |
272 #endif | |
273 | |
274 | |
275 // Update the text direction of the focused input element and notify it to a | |
276 // renderer process. | |
277 // These functions have two usage scenarios: changing the text direction | |
278 // from a menu (as Safari does), and; changing the text direction when a user | |
279 // presses a set of keys (as IE and Firefox do). | |
280 // 1. Change the text direction from a menu. | |
281 // In this scenario, we receive a menu event only once and we should update | |
282 // the text direction immediately when a user chooses a menu item. So, we | |
283 // should call both functions at once as listed in the following snippet. | |
284 // void RenderViewHost::SetTextDirection(WebTextDirection direction) { | |
285 // UpdateTextDirection(direction); | |
286 // NotifyTextDirection(); | |
287 // } | |
288 // 2. Change the text direction when pressing a set of keys. | |
289 // Because of auto-repeat, we may receive the same key-press event many | |
290 // times while we presses the keys and it is nonsense to send the same IPC | |
291 // message every time when we receive a key-press event. | |
292 // To suppress the number of IPC messages, we just update the text direction | |
293 // when receiving a key-press event and send an IPC message when we release | |
294 // the keys as listed in the following snippet. | |
295 // if (key_event.type == WebKeyboardEvent::KEY_DOWN) { | |
296 // if (key_event.windows_key_code == 'A' && | |
297 // key_event.modifiers == WebKeyboardEvent::CTRL_KEY) { | |
298 // UpdateTextDirection(dir); | |
299 // } else { | |
300 // CancelUpdateTextDirection(); | |
301 // } | |
302 // } else if (key_event.type == WebKeyboardEvent::KEY_UP) { | |
303 // NotifyTextDirection(); | |
304 // } | |
305 // Once we cancel updating the text direction, we have to ignore all | |
306 // succeeding UpdateTextDirection() requests until calling | |
307 // NotifyTextDirection(). (We may receive keydown events even after we | |
308 // canceled updating the text direction because of auto-repeat.) | |
309 // Note: we cannot undo this change for compatibility with Firefox and IE. | |
310 void UpdateTextDirection(WebKit::WebTextDirection direction); | |
311 void CancelUpdateTextDirection(); | |
312 void NotifyTextDirection(); | |
313 | |
314 // Notifies the renderer whether or not the input method attached to this | |
315 // process is activated. | |
316 // When the input method is activated, a renderer process sends IPC messages | |
317 // to notify the status of its composition node. (This message is mainly used | |
318 // for notifying the position of the input cursor so that the browser can | |
319 // display input method windows under the cursor.) | |
320 void SetInputMethodActive(bool activate); | |
321 | |
322 // Update the composition node of the renderer (or WebKit). | |
323 // WebKit has a special node (a composition node) for input method to change | |
324 // its text without affecting any other DOM nodes. When the input method | |
325 // (attached to the browser) updates its text, the browser sends IPC messages | |
326 // to update the composition node of the renderer. | |
327 // (Read the comments of each function for its detail.) | |
328 | |
329 // Sets the text of the composition node. | |
330 // This function can also update the cursor position and mark the specified | |
331 // range in the composition node. | |
332 // A browser should call this function: | |
333 // * when it receives a WM_IME_COMPOSITION message with a GCS_COMPSTR flag | |
334 // (on Windows); | |
335 // * when it receives a "preedit_changed" signal of GtkIMContext (on Linux); | |
336 // * when markedText of NSTextInput is called (on Mac). | |
337 void ImeSetComposition( | |
338 const string16& text, | |
339 const std::vector<WebKit::WebCompositionUnderline>& underlines, | |
340 int selection_start, | |
341 int selection_end); | |
342 | |
343 // Finishes an ongoing composition with the specified text. | |
344 // A browser should call this function: | |
345 // * when it receives a WM_IME_COMPOSITION message with a GCS_RESULTSTR flag | |
346 // (on Windows); | |
347 // * when it receives a "commit" signal of GtkIMContext (on Linux); | |
348 // * when insertText of NSTextInput is called (on Mac). | |
349 void ImeConfirmComposition(const string16& text); | |
350 | |
351 // Finishes an ongoing composition with the composition text set by last | |
352 // SetComposition() call. | |
353 void ImeConfirmComposition(); | |
354 | |
355 // Cancels an ongoing composition. | |
356 void ImeCancelComposition(); | |
357 | |
358 // Makes an IPC call to toggle the spelling panel. | |
359 void ToggleSpellPanel(bool is_currently_visible); | |
360 | |
361 // Makes an IPC call to tell webkit to replace the currently selected word | |
362 // or a word around the cursor. | |
363 void Replace(const string16& word); | |
364 | |
365 // Makes an IPC call to tell webkit to advance to the next misspelling. | |
366 void AdvanceToNextMisspelling(); | |
367 | |
368 // Enable renderer accessibility. This should only be called when a | |
369 // screenreader is detected. | |
370 void EnableRendererAccessibility(); | |
371 | |
372 // Relays a request from assistive technology to set focus to the | |
373 // node with this accessibility object id. | |
374 void SetAccessibilityFocus(int acc_obj_id); | |
375 | |
376 // Relays a request from assistive technology to perform the default action | |
377 // on a node with this accessibility object id. | |
378 void AccessibilityDoDefaultAction(int acc_obj_id); | |
379 | |
380 // Acknowledges a ViewHostMsg_AccessibilityNotifications message. | |
381 void AccessibilityNotificationsAck(); | |
382 | |
383 // Sets the active state (i.e., control tints). | |
384 virtual void SetActive(bool active); | |
385 | |
386 void set_ignore_input_events(bool ignore_input_events) { | |
387 ignore_input_events_ = ignore_input_events; | |
388 } | |
389 bool ignore_input_events() const { | |
390 return ignore_input_events_; | |
391 } | |
392 | |
393 // Activate deferred plugin handles. | |
394 void ActivateDeferredPluginHandles(); | |
395 | |
396 const gfx::Point& last_scroll_offset() const { return last_scroll_offset_; } | |
397 | |
398 protected: | |
399 // Internal implementation of the public Forward*Event() methods. | |
400 void ForwardInputEvent(const WebKit::WebInputEvent& input_event, | |
401 int event_size, bool is_keyboard_shortcut); | |
402 | |
403 // Called when we receive a notification indicating that the renderer | |
404 // process has gone. This will reset our state so that our state will be | |
405 // consistent if a new renderer is created. | |
406 void RendererExited(base::TerminationStatus status, int exit_code); | |
407 | |
408 // Retrieves an id the renderer can use to refer to its view. | |
409 // This is used for various IPC messages, including plugins. | |
410 gfx::NativeViewId GetNativeViewId(); | |
411 | |
412 // Called to handled a keyboard event before sending it to the renderer. | |
413 // This is overridden by RenderView to send upwards to its delegate. | |
414 // Returns true if the event was handled, and then the keyboard event will | |
415 // not be sent to the renderer anymore. Otherwise, if the |event| would | |
416 // be handled in HandleKeyboardEvent() method as a normal keyboard shortcut, | |
417 // |*is_keyboard_shortcut| should be set to true. | |
418 virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, | |
419 bool* is_keyboard_shortcut); | |
420 | |
421 // Called when a keyboard event was not processed by the renderer. This is | |
422 // overridden by RenderView to send upwards to its delegate. | |
423 virtual void UnhandledKeyboardEvent(const NativeWebKeyboardEvent& event) {} | |
424 | |
425 // Notification that the user has made some kind of input that could | |
426 // perform an action. The render view host overrides this to forward the | |
427 // information to its delegate (see corresponding function in | |
428 // RenderViewHostDelegate). The gestures that count are 1) any mouse down | |
429 // event and 2) enter or space key presses. | |
430 virtual void OnUserGesture() {} | |
431 | |
432 // Callbacks for notification when the renderer becomes unresponsive to user | |
433 // input events, and subsequently responsive again. RenderViewHost overrides | |
434 // these to tell its delegate to show the user a warning. | |
435 virtual void NotifyRendererUnresponsive() {} | |
436 virtual void NotifyRendererResponsive() {} | |
437 | |
438 protected: | |
439 // true if a renderer has once been valid. We use this flag to display a sad | |
440 // tab only when we lose our renderer and not if a paint occurs during | |
441 // initialization. | |
442 bool renderer_initialized_; | |
443 | |
444 private: | |
445 FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, Resize); | |
446 FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, ResizeThenCrash); | |
447 FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, HiddenPaint); | |
448 FRIEND_TEST_ALL_PREFIXES(RenderWidgetHostTest, PaintAtSize); | |
449 | |
450 // Tell this object to destroy itself. | |
451 void Destroy(); | |
452 | |
453 // Checks whether the renderer is hung and calls NotifyRendererUnresponsive | |
454 // if it is. | |
455 void CheckRendererIsUnresponsive(); | |
456 | |
457 // Called if we know the renderer is responsive. When we currently think the | |
458 // renderer is unresponsive, this will clear that state and call | |
459 // NotifyRendererResponsive. | |
460 void RendererIsResponsive(); | |
461 | |
462 // IPC message handlers | |
463 void OnMsgRenderViewReady(); | |
464 void OnMsgRenderViewGone(int status, int error_code); | |
465 void OnMsgClose(); | |
466 void OnMsgRequestMove(const gfx::Rect& pos); | |
467 void OnMsgPaintAtSizeAck(int tag, const gfx::Size& size); | |
468 void OnMsgUpdateRect(const ViewHostMsg_UpdateRect_Params& params); | |
469 void OnMsgInputEventAck(const IPC::Message& message); | |
470 virtual void OnMsgFocus(); | |
471 virtual void OnMsgBlur(); | |
472 | |
473 void OnMsgSetCursor(const WebCursor& cursor); | |
474 void OnMsgImeUpdateTextInputState(WebKit::WebTextInputType type, | |
475 const gfx::Rect& caret_rect); | |
476 void OnMsgImeCancelComposition(); | |
477 | |
478 void OnMsgDidActivateAcceleratedCompositing(bool activated); | |
479 | |
480 #if defined(OS_MACOSX) | |
481 void OnMsgGetScreenInfo(gfx::NativeViewId view, | |
482 WebKit::WebScreenInfo* results); | |
483 void OnMsgGetWindowRect(gfx::NativeViewId window_id, gfx::Rect* results); | |
484 void OnMsgGetRootWindowRect(gfx::NativeViewId window_id, gfx::Rect* results); | |
485 void OnMsgPluginFocusChanged(bool focused, int plugin_id); | |
486 void OnMsgStartPluginIme(); | |
487 void OnAllocateFakePluginWindowHandle(bool opaque, | |
488 bool root, | |
489 gfx::PluginWindowHandle* id); | |
490 void OnDestroyFakePluginWindowHandle(gfx::PluginWindowHandle id); | |
491 void OnAcceleratedSurfaceSetIOSurface(gfx::PluginWindowHandle window, | |
492 int32 width, | |
493 int32 height, | |
494 uint64 mach_port); | |
495 void OnAcceleratedSurfaceSetTransportDIB(gfx::PluginWindowHandle window, | |
496 int32 width, | |
497 int32 height, | |
498 TransportDIB::Handle transport_dib); | |
499 void OnAcceleratedSurfaceBuffersSwapped(gfx::PluginWindowHandle window, | |
500 uint64 surface_id); | |
501 #elif defined(OS_POSIX) | |
502 void OnMsgCreatePluginContainer(gfx::PluginWindowHandle id); | |
503 void OnMsgDestroyPluginContainer(gfx::PluginWindowHandle id); | |
504 #endif | |
505 | |
506 // Paints the given bitmap to the current backing store at the given location. | |
507 void PaintBackingStoreRect(TransportDIB::Id bitmap, | |
508 const gfx::Rect& bitmap_rect, | |
509 const std::vector<gfx::Rect>& copy_rects, | |
510 const gfx::Size& view_size); | |
511 | |
512 // Scrolls the given |clip_rect| in the backing by the given dx/dy amount. The | |
513 // |dib| and its corresponding location |bitmap_rect| in the backing store | |
514 // is the newly painted pixels by the renderer. | |
515 void ScrollBackingStoreRect(int dx, int dy, const gfx::Rect& clip_rect, | |
516 const gfx::Size& view_size); | |
517 | |
518 // Called by OnMsgInputEventAck() to process a keyboard event ack message. | |
519 void ProcessKeyboardEventAck(int type, bool processed); | |
520 | |
521 // Called by OnMsgInputEventAck() to process a wheel event ack message. | |
522 // This could result in a task being posted to allow additional wheel | |
523 // input messages to be coalesced. | |
524 void ProcessWheelAck(); | |
525 | |
526 // True if renderer accessibility is enabled. This should only be set when a | |
527 // screenreader is detected as it can potentially slow down Chrome. | |
528 bool renderer_accessible_; | |
529 | |
530 // The View associated with the RenderViewHost. The lifetime of this object | |
531 // is associated with the lifetime of the Render process. If the Renderer | |
532 // crashes, its View is destroyed and this pointer becomes NULL, even though | |
533 // render_view_host_ lives on to load another URL (creating a new View while | |
534 // doing so). | |
535 RenderWidgetHostView* view_; | |
536 | |
537 // Created during construction but initialized during Init*(). Therefore, it | |
538 // is guaranteed never to be NULL, but its channel may be NULL if the | |
539 // renderer crashed, so you must always check that. | |
540 RenderProcessHost* process_; | |
541 | |
542 // Stores random bits of data for others to associate with this object. | |
543 PropertyBag property_bag_; | |
544 | |
545 // The ID of the corresponding object in the Renderer Instance. | |
546 int routing_id_; | |
547 | |
548 // Indicates whether a page is loading or not. | |
549 bool is_loading_; | |
550 | |
551 // Indicates whether a page is hidden or not. | |
552 bool is_hidden_; | |
553 | |
554 // True when a page is rendered directly via the GPU process. | |
555 bool is_accelerated_compositing_active_; | |
556 | |
557 // Set if we are waiting for a repaint ack for the view. | |
558 bool repaint_ack_pending_; | |
559 | |
560 // True when waiting for RESIZE_ACK. | |
561 bool resize_ack_pending_; | |
562 | |
563 // The current size of the RenderWidget. | |
564 gfx::Size current_size_; | |
565 | |
566 // The current reserved area of the RenderWidget where contents should not be | |
567 // rendered to draw the resize corner, sidebar mini tabs etc. | |
568 gfx::Rect current_reserved_rect_; | |
569 | |
570 // The size we last sent as requested size to the renderer. |current_size_| | |
571 // is only updated once the resize message has been ack'd. This on the other | |
572 // hand is updated when the resize message is sent. This is very similar to | |
573 // |resize_ack_pending_|, but the latter is not set if the new size has width | |
574 // or height zero, which is why we need this too. | |
575 gfx::Size in_flight_size_; | |
576 | |
577 // The reserved area we last sent to the renderer. |current_reserved_rect_| | |
578 // is only updated once the resize message has been ack'd. This on the other | |
579 // hand is updated when the resize message is sent. | |
580 gfx::Rect in_flight_reserved_rect_; | |
581 | |
582 // True if a mouse move event was sent to the render view and we are waiting | |
583 // for a corresponding ViewHostMsg_HandleInputEvent_ACK message. | |
584 bool mouse_move_pending_; | |
585 | |
586 // The next mouse move event to send (only non-null while mouse_move_pending_ | |
587 // is true). | |
588 scoped_ptr<WebKit::WebMouseEvent> next_mouse_move_; | |
589 | |
590 // (Similar to |mouse_move_pending_|.) True if a mouse wheel event was sent | |
591 // and we are waiting for a corresponding ack. | |
592 bool mouse_wheel_pending_; | |
593 | |
594 typedef std::deque<WebKit::WebMouseWheelEvent> WheelEventQueue; | |
595 | |
596 // (Similar to |next_mouse_move_|.) The next mouse wheel events to send. | |
597 // Unlike mouse moves, mouse wheel events received while one is pending are | |
598 // coalesced (by accumulating deltas) if they match the previous event in | |
599 // modifiers. On the Mac, in particular, mouse wheel events are received at a | |
600 // high rate; not waiting for the ack results in jankiness, and using the same | |
601 // mechanism as for mouse moves (just dropping old events when multiple ones | |
602 // would be queued) results in very slow scrolling. | |
603 WheelEventQueue coalesced_mouse_wheel_events_; | |
604 | |
605 // The time when an input event was sent to the RenderWidget. | |
606 base::TimeTicks input_event_start_time_; | |
607 | |
608 // If true, then we should repaint when restoring even if we have a | |
609 // backingstore. This flag is set to true if we receive a paint message | |
610 // while is_hidden_ to true. Even though we tell the render widget to hide | |
611 // itself, a paint message could already be in flight at that point. | |
612 bool needs_repainting_on_restore_; | |
613 | |
614 // This is true if the renderer is currently unresponsive. | |
615 bool is_unresponsive_; | |
616 | |
617 // The following value indicates a time in the future when we would consider | |
618 // the renderer hung if it does not generate an appropriate response message. | |
619 base::Time time_when_considered_hung_; | |
620 | |
621 // This timer runs to check if time_when_considered_hung_ has past. | |
622 base::OneShotTimer<RenderWidgetHost> hung_renderer_timer_; | |
623 | |
624 // Flag to detect recursive calls to GetBackingStore(). | |
625 bool in_get_backing_store_; | |
626 | |
627 // Set when we call DidPaintRect/DidScrollRect on the view. | |
628 bool view_being_painted_; | |
629 | |
630 // Used for UMA histogram logging to measure the time for a repaint view | |
631 // operation to finish. | |
632 base::TimeTicks repaint_start_time_; | |
633 | |
634 // Queue of keyboard events that we need to track. | |
635 typedef std::deque<NativeWebKeyboardEvent> KeyQueue; | |
636 | |
637 // A queue of keyboard events. We can't trust data from the renderer so we | |
638 // stuff key events into a queue and pop them out on ACK, feeding our copy | |
639 // back to whatever unhandled handler instead of the returned version. | |
640 KeyQueue key_queue_; | |
641 | |
642 // Set to true if we shouldn't send input events from the render widget. | |
643 bool ignore_input_events_; | |
644 | |
645 // Set when we update the text direction of the selected input element. | |
646 bool text_direction_updated_; | |
647 WebKit::WebTextDirection text_direction_; | |
648 | |
649 // Set when we cancel updating the text direction. | |
650 // This flag also ignores succeeding update requests until we call | |
651 // NotifyTextDirection(). | |
652 bool text_direction_canceled_; | |
653 | |
654 // Indicates if the next sequence of Char events should be suppressed or not. | |
655 // System may translate a RawKeyDown event into zero or more Char events, | |
656 // usually we send them to the renderer directly in sequence. However, If a | |
657 // RawKeyDown event was not handled by the renderer but was handled by | |
658 // our UnhandledKeyboardEvent() method, e.g. as an accelerator key, then we | |
659 // shall not send the following sequence of Char events, which was generated | |
660 // by this RawKeyDown event, to the renderer. Otherwise the renderer may | |
661 // handle the Char events and cause unexpected behavior. | |
662 // For example, pressing alt-2 may let the browser switch to the second tab, | |
663 // but the Char event generated by alt-2 may also activate a HTML element | |
664 // if its accesskey happens to be "2", then the user may get confused when | |
665 // switching back to the original tab, because the content may already be | |
666 // changed. | |
667 bool suppress_next_char_events_; | |
668 | |
669 std::vector<gfx::PluginWindowHandle> deferred_plugin_handles_; | |
670 | |
671 // The last scroll offset of the render widget. | |
672 gfx::Point last_scroll_offset_; | |
673 | |
674 DISALLOW_COPY_AND_ASSIGN(RenderWidgetHost); | |
675 }; | |
676 | 11 |
677 #endif // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_H_ | 12 #endif // CHROME_BROWSER_RENDERER_HOST_RENDER_WIDGET_HOST_H_ |
OLD | NEW |