| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #include "chrome/browser/renderer_host/render_widget_host.h" | 5 #include "chrome/browser/renderer_host/render_widget_host.h" |
| 6 | 6 |
| 7 #include "app/keyboard_codes.h" | 7 #include "app/keyboard_codes.h" |
| 8 #include "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process, | 70 RenderWidgetHost::RenderWidgetHost(RenderProcessHost* process, |
| 71 int routing_id) | 71 int routing_id) |
| 72 : renderer_initialized_(false), | 72 : renderer_initialized_(false), |
| 73 renderer_accessible_(false), | 73 renderer_accessible_(false), |
| 74 view_(NULL), | 74 view_(NULL), |
| 75 process_(process), | 75 process_(process), |
| 76 painting_observer_(NULL), | 76 painting_observer_(NULL), |
| 77 routing_id_(routing_id), | 77 routing_id_(routing_id), |
| 78 is_loading_(false), | 78 is_loading_(false), |
| 79 is_hidden_(false), | 79 is_hidden_(false), |
| 80 is_gpu_rendering_active_(false), | 80 is_accelerated_compositing_active_(false), |
| 81 repaint_ack_pending_(false), | 81 repaint_ack_pending_(false), |
| 82 resize_ack_pending_(false), | 82 resize_ack_pending_(false), |
| 83 mouse_move_pending_(false), | 83 mouse_move_pending_(false), |
| 84 mouse_wheel_pending_(false), | 84 mouse_wheel_pending_(false), |
| 85 needs_repainting_on_restore_(false), | 85 needs_repainting_on_restore_(false), |
| 86 is_unresponsive_(false), | 86 is_unresponsive_(false), |
| 87 in_get_backing_store_(false), | 87 in_get_backing_store_(false), |
| 88 view_being_painted_(false), | 88 view_being_painted_(false), |
| 89 ignore_input_events_(false), | 89 ignore_input_events_(false), |
| 90 text_direction_updated_(false), | 90 text_direction_updated_(false), |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 IPC_MESSAGE_HANDLER(ViewHostMsg_PaintAtSize_ACK, OnMsgPaintAtSizeAck) | 150 IPC_MESSAGE_HANDLER(ViewHostMsg_PaintAtSize_ACK, OnMsgPaintAtSizeAck) |
| 151 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnMsgUpdateRect) | 151 IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateRect, OnMsgUpdateRect) |
| 152 IPC_MESSAGE_HANDLER(ViewHostMsg_HandleInputEvent_ACK, OnMsgInputEventAck) | 152 IPC_MESSAGE_HANDLER(ViewHostMsg_HandleInputEvent_ACK, OnMsgInputEventAck) |
| 153 IPC_MESSAGE_HANDLER(ViewHostMsg_Focus, OnMsgFocus) | 153 IPC_MESSAGE_HANDLER(ViewHostMsg_Focus, OnMsgFocus) |
| 154 IPC_MESSAGE_HANDLER(ViewHostMsg_Blur, OnMsgBlur) | 154 IPC_MESSAGE_HANDLER(ViewHostMsg_Blur, OnMsgBlur) |
| 155 IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnMsgSetCursor) | 155 IPC_MESSAGE_HANDLER(ViewHostMsg_SetCursor, OnMsgSetCursor) |
| 156 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeUpdateTextInputState, | 156 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeUpdateTextInputState, |
| 157 OnMsgImeUpdateTextInputState) | 157 OnMsgImeUpdateTextInputState) |
| 158 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCancelComposition, | 158 IPC_MESSAGE_HANDLER(ViewHostMsg_ImeCancelComposition, |
| 159 OnMsgImeCancelComposition) | 159 OnMsgImeCancelComposition) |
| 160 IPC_MESSAGE_HANDLER(ViewHostMsg_GpuRenderingActivated, | 160 IPC_MESSAGE_HANDLER(ViewHostMsg_DidActivateAcceleratedCompositing, |
| 161 OnMsgGpuRenderingActivated) | 161 OnMsgDidActivateAcceleratedCompositing) |
| 162 #if defined(OS_MACOSX) | 162 #if defined(OS_MACOSX) |
| 163 IPC_MESSAGE_HANDLER(ViewHostMsg_GetScreenInfo, OnMsgGetScreenInfo) | 163 IPC_MESSAGE_HANDLER(ViewHostMsg_GetScreenInfo, OnMsgGetScreenInfo) |
| 164 IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowRect, OnMsgGetWindowRect) | 164 IPC_MESSAGE_HANDLER(ViewHostMsg_GetWindowRect, OnMsgGetWindowRect) |
| 165 IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowRect, OnMsgGetRootWindowRect) | 165 IPC_MESSAGE_HANDLER(ViewHostMsg_GetRootWindowRect, OnMsgGetRootWindowRect) |
| 166 IPC_MESSAGE_HANDLER(ViewHostMsg_SetPluginImeEnabled, | 166 IPC_MESSAGE_HANDLER(ViewHostMsg_SetPluginImeEnabled, |
| 167 OnMsgSetPluginImeEnabled) | 167 OnMsgSetPluginImeEnabled) |
| 168 IPC_MESSAGE_HANDLER(ViewHostMsg_AllocateFakePluginWindowHandle, | 168 IPC_MESSAGE_HANDLER(ViewHostMsg_AllocateFakePluginWindowHandle, |
| 169 OnAllocateFakePluginWindowHandle) | 169 OnAllocateFakePluginWindowHandle) |
| 170 IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyFakePluginWindowHandle, | 170 IPC_MESSAGE_HANDLER(ViewHostMsg_DestroyFakePluginWindowHandle, |
| 171 OnDestroyFakePluginWindowHandle) | 171 OnDestroyFakePluginWindowHandle) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 return; | 225 return; |
| 226 is_hidden_ = false; | 226 is_hidden_ = false; |
| 227 | 227 |
| 228 BackingStore* backing_store = BackingStoreManager::Lookup(this); | 228 BackingStore* backing_store = BackingStoreManager::Lookup(this); |
| 229 // If we already have a backing store for this widget, then we don't need to | 229 // If we already have a backing store for this widget, then we don't need to |
| 230 // repaint on restore _unless_ we know that our backing store is invalid. | 230 // repaint on restore _unless_ we know that our backing store is invalid. |
| 231 // When accelerated compositing is on, we must always repaint, even when | 231 // When accelerated compositing is on, we must always repaint, even when |
| 232 // the backing store exists. | 232 // the backing store exists. |
| 233 bool needs_repainting; | 233 bool needs_repainting; |
| 234 if (needs_repainting_on_restore_ || !backing_store || | 234 if (needs_repainting_on_restore_ || !backing_store || |
| 235 is_gpu_rendering_active()) { | 235 is_accelerated_compositing_active()) { |
| 236 needs_repainting = true; | 236 needs_repainting = true; |
| 237 needs_repainting_on_restore_ = false; | 237 needs_repainting_on_restore_ = false; |
| 238 } else { | 238 } else { |
| 239 needs_repainting = false; | 239 needs_repainting = false; |
| 240 } | 240 } |
| 241 Send(new ViewMsg_WasRestored(routing_id_, needs_repainting)); | 241 Send(new ViewMsg_WasRestored(routing_id_, needs_repainting)); |
| 242 | 242 |
| 243 process_->WidgetRestored(); | 243 process_->WidgetRestored(); |
| 244 | 244 |
| 245 bool is_visible = true; | 245 bool is_visible = true; |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 if (!view_) | 395 if (!view_) |
| 396 return NULL; | 396 return NULL; |
| 397 return view_->AllocBackingStore(size); | 397 return view_->AllocBackingStore(size); |
| 398 } | 398 } |
| 399 | 399 |
| 400 void RenderWidgetHost::DonePaintingToBackingStore() { | 400 void RenderWidgetHost::DonePaintingToBackingStore() { |
| 401 Send(new ViewMsg_UpdateRect_ACK(routing_id())); | 401 Send(new ViewMsg_UpdateRect_ACK(routing_id())); |
| 402 } | 402 } |
| 403 | 403 |
| 404 void RenderWidgetHost::ScheduleComposite() { | 404 void RenderWidgetHost::ScheduleComposite() { |
| 405 DCHECK(!is_hidden_ || !is_gpu_rendering_active_) << | 405 if (is_hidden_ || !is_accelerated_compositing_active_) { |
| 406 "ScheduleCompositeAndSync called while hidden!"; | 406 return; |
| 407 } |
| 407 | 408 |
| 408 // Send out a request to the renderer to paint the view if required. | 409 // Send out a request to the renderer to paint the view if required. |
| 409 if (!repaint_ack_pending_ && !resize_ack_pending_ && !view_being_painted_) { | 410 if (!repaint_ack_pending_ && !resize_ack_pending_ && !view_being_painted_) { |
| 410 repaint_start_time_ = TimeTicks::Now(); | 411 repaint_start_time_ = TimeTicks::Now(); |
| 411 repaint_ack_pending_ = true; | 412 repaint_ack_pending_ = true; |
| 412 Send(new ViewMsg_Repaint(routing_id_, current_size_)); | 413 Send(new ViewMsg_Repaint(routing_id_, current_size_)); |
| 413 } | 414 } |
| 414 | 415 |
| 415 // When we have asked the RenderWidget to resize, and we are still waiting on | 416 // When we have asked the RenderWidget to resize, and we are still waiting on |
| 416 // a response, block for a little while to see if we can't get a response. | 417 // a response, block for a little while to see if we can't get a response. |
| (...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 651 | 652 |
| 652 // Reset some fields in preparation for recovering from a crash. | 653 // Reset some fields in preparation for recovering from a crash. |
| 653 resize_ack_pending_ = false; | 654 resize_ack_pending_ = false; |
| 654 repaint_ack_pending_ = false; | 655 repaint_ack_pending_ = false; |
| 655 | 656 |
| 656 in_flight_size_.SetSize(0, 0); | 657 in_flight_size_.SetSize(0, 0); |
| 657 in_flight_reserved_rect_.SetRect(0, 0, 0, 0); | 658 in_flight_reserved_rect_.SetRect(0, 0, 0, 0); |
| 658 current_size_.SetSize(0, 0); | 659 current_size_.SetSize(0, 0); |
| 659 current_reserved_rect_.SetRect(0, 0, 0, 0); | 660 current_reserved_rect_.SetRect(0, 0, 0, 0); |
| 660 is_hidden_ = false; | 661 is_hidden_ = false; |
| 661 is_gpu_rendering_active_ = false; | 662 is_accelerated_compositing_active_ = false; |
| 662 | 663 |
| 663 if (view_) { | 664 if (view_) { |
| 664 view_->RenderViewGone(); | 665 view_->RenderViewGone(); |
| 665 view_ = NULL; // The View should be deleted by RenderViewGone. | 666 view_ = NULL; // The View should be deleted by RenderViewGone. |
| 666 } | 667 } |
| 667 | 668 |
| 668 BackingStoreManager::RemoveBackingStore(this); | 669 BackingStoreManager::RemoveBackingStore(this); |
| 669 } | 670 } |
| 670 | 671 |
| 671 void RenderWidgetHost::UpdateTextDirection(WebTextDirection direction) { | 672 void RenderWidgetHost::UpdateTextDirection(WebTextDirection direction) { |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 825 ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags); | 826 ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags); |
| 826 if (is_repaint_ack) { | 827 if (is_repaint_ack) { |
| 827 repaint_ack_pending_ = false; | 828 repaint_ack_pending_ = false; |
| 828 TimeDelta delta = TimeTicks::Now() - repaint_start_time_; | 829 TimeDelta delta = TimeTicks::Now() - repaint_start_time_; |
| 829 UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta); | 830 UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta); |
| 830 } | 831 } |
| 831 | 832 |
| 832 DCHECK(!params.bitmap_rect.IsEmpty()); | 833 DCHECK(!params.bitmap_rect.IsEmpty()); |
| 833 DCHECK(!params.view_size.IsEmpty()); | 834 DCHECK(!params.view_size.IsEmpty()); |
| 834 | 835 |
| 835 if (!is_gpu_rendering_active_) { | 836 if (!is_accelerated_compositing_active_) { |
| 836 const size_t size = params.bitmap_rect.height() * | 837 const size_t size = params.bitmap_rect.height() * |
| 837 params.bitmap_rect.width() * 4; | 838 params.bitmap_rect.width() * 4; |
| 838 TransportDIB* dib = process_->GetTransportDIB(params.bitmap); | 839 TransportDIB* dib = process_->GetTransportDIB(params.bitmap); |
| 839 | 840 |
| 840 // If gpu process does painting, scroll_rect and copy_rects are always empty | 841 // If gpu process does painting, scroll_rect and copy_rects are always empty |
| 841 // and backing store is never used. | 842 // and backing store is never used. |
| 842 if (dib) { | 843 if (dib) { |
| 843 if (dib->size() < size) { | 844 if (dib->size() < size) { |
| 844 DLOG(WARNING) << "Transport DIB too small for given rectangle"; | 845 DLOG(WARNING) << "Transport DIB too small for given rectangle"; |
| 845 process()->ReceivedBadMessage(ViewHostMsg_UpdateRect__ID); | 846 process()->ReceivedBadMessage(ViewHostMsg_UpdateRect__ID); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 872 if (is_hidden_) | 873 if (is_hidden_) |
| 873 return; | 874 return; |
| 874 | 875 |
| 875 // Now paint the view. Watch out: it might be destroyed already. | 876 // Now paint the view. Watch out: it might be destroyed already. |
| 876 if (view_) { | 877 if (view_) { |
| 877 view_->MovePluginWindows(params.plugin_window_moves); | 878 view_->MovePluginWindows(params.plugin_window_moves); |
| 878 // The view_ pointer could be destroyed in the context of MovePluginWindows | 879 // The view_ pointer could be destroyed in the context of MovePluginWindows |
| 879 // which attempts to move the plugin windows and in the process could | 880 // which attempts to move the plugin windows and in the process could |
| 880 // dispatch other window messages which could cause the view to be | 881 // dispatch other window messages which could cause the view to be |
| 881 // destroyed. | 882 // destroyed. |
| 882 if (view_ && !is_gpu_rendering_active_) { | 883 if (view_ && !is_accelerated_compositing_active_) { |
| 883 view_being_painted_ = true; | 884 view_being_painted_ = true; |
| 884 view_->DidUpdateBackingStore(params.scroll_rect, params.dx, params.dy, | 885 view_->DidUpdateBackingStore(params.scroll_rect, params.dx, params.dy, |
| 885 params.copy_rects); | 886 params.copy_rects); |
| 886 view_being_painted_ = false; | 887 view_being_painted_ = false; |
| 887 } | 888 } |
| 888 } | 889 } |
| 889 | 890 |
| 890 if (paint_observer_.get()) | 891 if (paint_observer_.get()) |
| 891 paint_observer_->RenderWidgetHostDidPaint(this); | 892 paint_observer_->RenderWidgetHostDidPaint(this); |
| 892 | 893 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 970 const gfx::Rect& caret_rect) { | 971 const gfx::Rect& caret_rect) { |
| 971 if (view_) | 972 if (view_) |
| 972 view_->ImeUpdateTextInputState(type, caret_rect); | 973 view_->ImeUpdateTextInputState(type, caret_rect); |
| 973 } | 974 } |
| 974 | 975 |
| 975 void RenderWidgetHost::OnMsgImeCancelComposition() { | 976 void RenderWidgetHost::OnMsgImeCancelComposition() { |
| 976 if (view_) | 977 if (view_) |
| 977 view_->ImeCancelComposition(); | 978 view_->ImeCancelComposition(); |
| 978 } | 979 } |
| 979 | 980 |
| 980 void RenderWidgetHost::OnMsgGpuRenderingActivated(bool activated) { | 981 void RenderWidgetHost::OnMsgDidActivateAcceleratedCompositing(bool activated) { |
| 981 #if defined(OS_MACOSX) | 982 #if defined(OS_MACOSX) |
| 982 bool old_state = is_gpu_rendering_active_; | 983 bool old_state = is_accelerated_compositing_active_; |
| 983 #endif | 984 #endif |
| 984 is_gpu_rendering_active_ = activated; | 985 is_accelerated_compositing_active_ = activated; |
| 985 #if defined(OS_MACOSX) | 986 #if defined(OS_MACOSX) |
| 986 if (old_state != is_gpu_rendering_active_ && view_) | 987 if (old_state != is_accelerated_compositing_active_ && view_) |
| 987 view_->GpuRenderingStateDidChange(); | 988 view_->GpuRenderingStateDidChange(); |
| 989 #elif defined(OS_WIN) |
| 990 view_->ShowCompositorHostWindow(is_accelerated_compositing_active_); |
| 988 #elif defined(TOOLKIT_USES_GTK) | 991 #elif defined(TOOLKIT_USES_GTK) |
| 989 view_->AcceleratedCompositingActivated(activated); | 992 view_->AcceleratedCompositingActivated(activated); |
| 990 #endif | 993 #endif |
| 991 } | 994 } |
| 992 | 995 |
| 993 #if defined(OS_MACOSX) | 996 #if defined(OS_MACOSX) |
| 994 | 997 |
| 995 void RenderWidgetHost::OnMsgGetScreenInfo(gfx::NativeViewId view, | 998 void RenderWidgetHost::OnMsgGetScreenInfo(gfx::NativeViewId view, |
| 996 WebScreenInfo* results) { | 999 WebScreenInfo* results) { |
| 997 gfx::NativeView native_view = view_ ? view_->GetNativeView() : NULL; | 1000 gfx::NativeView native_view = view_ ? view_->GetNativeView() : NULL; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 } | 1085 } |
| 1083 } | 1086 } |
| 1084 | 1087 |
| 1085 void RenderWidgetHost::OnMsgDestroyPluginContainer(gfx::PluginWindowHandle id) { | 1088 void RenderWidgetHost::OnMsgDestroyPluginContainer(gfx::PluginWindowHandle id) { |
| 1086 if (view_) { | 1089 if (view_) { |
| 1087 view_->DestroyPluginContainer(id); | 1090 view_->DestroyPluginContainer(id); |
| 1088 } else { | 1091 } else { |
| 1089 NOTIMPLEMENTED(); | 1092 NOTIMPLEMENTED(); |
| 1090 } | 1093 } |
| 1091 } | 1094 } |
| 1092 | |
| 1093 #endif | 1095 #endif |
| 1094 | 1096 |
| 1095 void RenderWidgetHost::PaintBackingStoreRect( | 1097 void RenderWidgetHost::PaintBackingStoreRect( |
| 1096 TransportDIB::Id bitmap, | 1098 TransportDIB::Id bitmap, |
| 1097 const gfx::Rect& bitmap_rect, | 1099 const gfx::Rect& bitmap_rect, |
| 1098 const std::vector<gfx::Rect>& copy_rects, | 1100 const std::vector<gfx::Rect>& copy_rects, |
| 1099 const gfx::Size& view_size) { | 1101 const gfx::Size& view_size) { |
| 1100 // The view may be destroyed already. | 1102 // The view may be destroyed already. |
| 1101 if (!view_) | 1103 if (!view_) |
| 1102 return; | 1104 return; |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1207 // of this key event. | 1209 // of this key event. |
| 1208 if (!processed && !is_hidden_ && !front_item.skip_in_browser) { | 1210 if (!processed && !is_hidden_ && !front_item.skip_in_browser) { |
| 1209 UnhandledKeyboardEvent(front_item); | 1211 UnhandledKeyboardEvent(front_item); |
| 1210 | 1212 |
| 1211 // WARNING: This RenderWidgetHost can be deallocated at this point | 1213 // WARNING: This RenderWidgetHost can be deallocated at this point |
| 1212 // (i.e. in the case of Ctrl+W, where the call to | 1214 // (i.e. in the case of Ctrl+W, where the call to |
| 1213 // UnhandledKeyboardEvent destroys this RenderWidgetHost). | 1215 // UnhandledKeyboardEvent destroys this RenderWidgetHost). |
| 1214 } | 1216 } |
| 1215 } | 1217 } |
| 1216 } | 1218 } |
| OLD | NEW |