| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 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 "content/browser/renderer_host/render_widget_host.h" | 5 #include "content/browser/renderer_host/render_widget_host.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 : renderer_initialized_(false), | 82 : renderer_initialized_(false), |
| 83 renderer_accessible_(false), | 83 renderer_accessible_(false), |
| 84 view_(NULL), | 84 view_(NULL), |
| 85 process_(process), | 85 process_(process), |
| 86 routing_id_(routing_id), | 86 routing_id_(routing_id), |
| 87 is_loading_(false), | 87 is_loading_(false), |
| 88 is_hidden_(false), | 88 is_hidden_(false), |
| 89 is_accelerated_compositing_active_(false), | 89 is_accelerated_compositing_active_(false), |
| 90 repaint_ack_pending_(false), | 90 repaint_ack_pending_(false), |
| 91 resize_ack_pending_(false), | 91 resize_ack_pending_(false), |
| 92 should_auto_resize_(false), |
| 92 mouse_move_pending_(false), | 93 mouse_move_pending_(false), |
| 93 mouse_wheel_pending_(false), | 94 mouse_wheel_pending_(false), |
| 94 touch_move_pending_(false), | 95 touch_move_pending_(false), |
| 95 touch_event_is_queued_(false), | 96 touch_event_is_queued_(false), |
| 96 needs_repainting_on_restore_(false), | 97 needs_repainting_on_restore_(false), |
| 97 is_unresponsive_(false), | 98 is_unresponsive_(false), |
| 98 in_get_backing_store_(false), | 99 in_get_backing_store_(false), |
| 99 view_being_painted_(false), | 100 view_being_painted_(false), |
| 100 ignore_input_events_(false), | 101 ignore_input_events_(false), |
| 101 text_direction_updated_(false), | 102 text_direction_updated_(false), |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 // | 326 // |
| 326 // TODO: ideally ViewMsg_WasRestored would take a size. This way, the renderer | 327 // TODO: ideally ViewMsg_WasRestored would take a size. This way, the renderer |
| 327 // could handle both the restore and resize at once. This isn't that big a | 328 // could handle both the restore and resize at once. This isn't that big a |
| 328 // deal as RenderWidget::WasRestored delays updating, so that the resize from | 329 // deal as RenderWidget::WasRestored delays updating, so that the resize from |
| 329 // WasResized is usually processed before the renderer is painted. | 330 // WasResized is usually processed before the renderer is painted. |
| 330 WasResized(); | 331 WasResized(); |
| 331 } | 332 } |
| 332 | 333 |
| 333 void RenderWidgetHost::WasResized() { | 334 void RenderWidgetHost::WasResized() { |
| 334 if (resize_ack_pending_ || !process_->HasConnection() || !view_ || | 335 if (resize_ack_pending_ || !process_->HasConnection() || !view_ || |
| 335 !renderer_initialized_) { | 336 !renderer_initialized_ || should_auto_resize_) { |
| 336 return; | 337 return; |
| 337 } | 338 } |
| 338 | 339 |
| 339 #if !defined(OS_MACOSX) | 340 #if !defined(OS_MACOSX) |
| 340 gfx::Size new_size = view_->GetViewBounds().size(); | 341 gfx::Size new_size = view_->GetViewBounds().size(); |
| 341 #else | 342 #else |
| 342 // When UI scaling is enabled on OS X, allocate a smaller bitmap and | 343 // When UI scaling is enabled on OS X, allocate a smaller bitmap and |
| 343 // pixel-scale it up. | 344 // pixel-scale it up. |
| 344 // TODO(thakis): Use pixel size on mac and set UI scale in renderer. | 345 // TODO(thakis): Use pixel size on mac and set UI scale in renderer. |
| 345 // http://crbug.com/31960 | 346 // http://crbug.com/31960 |
| (...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 861 } | 862 } |
| 862 | 863 |
| 863 bool RenderWidgetHost::IsMouseLocked() const { | 864 bool RenderWidgetHost::IsMouseLocked() const { |
| 864 return view_ ? view_->mouse_locked() : false; | 865 return view_ ? view_->mouse_locked() : false; |
| 865 } | 866 } |
| 866 | 867 |
| 867 bool RenderWidgetHost::IsFullscreen() const { | 868 bool RenderWidgetHost::IsFullscreen() const { |
| 868 return false; | 869 return false; |
| 869 } | 870 } |
| 870 | 871 |
| 872 void RenderWidgetHost::SetShouldAutoResize(bool enable) { |
| 873 // Note if this switches from true to false then one has to verify that the |
| 874 // mechanics about all the messaging works. For example, what happens to a |
| 875 // update message rect that was in progress from the render widget. Perhaps, |
| 876 // on a transition to false, this should do a WasResized, but what if that |
| 877 // will not trigger a resize message...etc. Due to these complications it is |
| 878 // fitting that this method doesn't look like a simple set method. |
| 879 DCHECK(enable); |
| 880 |
| 881 // TODO: Change this to enable instead of true when this supports turning |
| 882 // off auto-resize. |
| 883 should_auto_resize_ = true; |
| 884 } |
| 885 |
| 871 void RenderWidgetHost::Destroy() { | 886 void RenderWidgetHost::Destroy() { |
| 872 content::NotificationService::current()->Notify( | 887 content::NotificationService::current()->Notify( |
| 873 content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, | 888 content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, |
| 874 content::Source<RenderWidgetHost>(this), | 889 content::Source<RenderWidgetHost>(this), |
| 875 content::NotificationService::NoDetails()); | 890 content::NotificationService::NoDetails()); |
| 876 | 891 |
| 877 // Tell the view to die. | 892 // Tell the view to die. |
| 878 // Note that in the process of the view shutting down, it can call a ton | 893 // Note that in the process of the view shutting down, it can call a ton |
| 879 // of other messages on us. So if you do any other deinitialization here, | 894 // of other messages on us. So if you do any other deinitialization here, |
| 880 // do it after this call to view_->Destroy(). | 895 // do it after this call to view_->Destroy(). |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 984 // Update our knowledge of the RenderWidget's size. | 999 // Update our knowledge of the RenderWidget's size. |
| 985 current_size_ = params.view_size; | 1000 current_size_ = params.view_size; |
| 986 // Update our knowledge of the RenderWidget's scroll offset. | 1001 // Update our knowledge of the RenderWidget's scroll offset. |
| 987 last_scroll_offset_ = params.scroll_offset; | 1002 last_scroll_offset_ = params.scroll_offset; |
| 988 | 1003 |
| 989 bool is_resize_ack = | 1004 bool is_resize_ack = |
| 990 ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); | 1005 ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); |
| 991 | 1006 |
| 992 // resize_ack_pending_ needs to be cleared before we call DidPaintRect, since | 1007 // resize_ack_pending_ needs to be cleared before we call DidPaintRect, since |
| 993 // that will end up reaching GetBackingStore. | 1008 // that will end up reaching GetBackingStore. |
| 994 if (is_resize_ack) { | 1009 if (is_resize_ack || should_auto_resize_) { |
| 995 DCHECK(resize_ack_pending_); | 1010 if (is_resize_ack) { |
| 996 resize_ack_pending_ = false; | 1011 DCHECK(resize_ack_pending_); |
| 997 in_flight_size_.SetSize(0, 0); | 1012 resize_ack_pending_ = false; |
| 998 in_flight_reserved_rect_.SetRect(0, 0, 0, 0); | 1013 in_flight_size_.SetSize(0, 0); |
| 1014 in_flight_reserved_rect_.SetRect(0, 0, 0, 0); |
| 1015 } |
| 999 // Update our knowledge of the RenderWidget's resizer rect. | 1016 // Update our knowledge of the RenderWidget's resizer rect. |
| 1000 // ViewMsg_Resize is acknowledged only when view size is actually changed, | 1017 // ViewMsg_Resize is acknowledged only when view size is actually changed, |
| 1001 // otherwise current_reserved_rect_ is updated immediately after sending | 1018 // otherwise current_reserved_rect_ is updated immediately after sending |
| 1002 // ViewMsg_Resize to the RenderWidget and can be clobbered by | 1019 // ViewMsg_Resize to the RenderWidget and can be clobbered by |
| 1003 // OnMsgUpdateRect called for a paint that was initiated before the resize | 1020 // OnMsgUpdateRect called for a paint that was initiated before the resize |
| 1004 // message was sent. | 1021 // message was sent. |
| 1005 current_reserved_rect_ = params.resizer_rect; | 1022 current_reserved_rect_ = params.resizer_rect; |
| 1006 } | 1023 } |
| 1007 | 1024 |
| 1008 bool is_repaint_ack = | 1025 bool is_repaint_ack = |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1049 base::Bind(&RenderWidgetHost::DidUpdateBackingStore, | 1066 base::Bind(&RenderWidgetHost::DidUpdateBackingStore, |
| 1050 weak_factory_.GetWeakPtr(), params, paint_start)); | 1067 weak_factory_.GetWeakPtr(), params, paint_start)); |
| 1051 } | 1068 } |
| 1052 } | 1069 } |
| 1053 } | 1070 } |
| 1054 | 1071 |
| 1055 if (!was_async) { | 1072 if (!was_async) { |
| 1056 DidUpdateBackingStore(params, paint_start); | 1073 DidUpdateBackingStore(params, paint_start); |
| 1057 } | 1074 } |
| 1058 | 1075 |
| 1076 if (should_auto_resize_) { |
| 1077 OnRenderAutoResized(params.view_size); |
| 1078 } |
| 1079 |
| 1059 // Log the time delta for processing a paint message. On platforms that don't | 1080 // Log the time delta for processing a paint message. On platforms that don't |
| 1060 // support asynchronous painting, this is equivalent to | 1081 // support asynchronous painting, this is equivalent to |
| 1061 // MPArch.RWH_TotalPaintTime. | 1082 // MPArch.RWH_TotalPaintTime. |
| 1062 TimeDelta delta = TimeTicks::Now() - paint_start; | 1083 TimeDelta delta = TimeTicks::Now() - paint_start; |
| 1063 UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgUpdateRect", delta); | 1084 UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgUpdateRect", delta); |
| 1064 } | 1085 } |
| 1065 | 1086 |
| 1066 void RenderWidgetHost::DidUpdateBackingStore( | 1087 void RenderWidgetHost::DidUpdateBackingStore( |
| 1067 const ViewHostMsg_UpdateRect_Params& params, | 1088 const ViewHostMsg_UpdateRect_Params& params, |
| 1068 const TimeTicks& paint_start) { | 1089 const TimeTicks& paint_start) { |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1517 } | 1538 } |
| 1518 | 1539 |
| 1519 // static | 1540 // static |
| 1520 void RenderWidgetHost::AcknowledgePostSubBuffer(int32 route_id, | 1541 void RenderWidgetHost::AcknowledgePostSubBuffer(int32 route_id, |
| 1521 int gpu_host_id) { | 1542 int gpu_host_id) { |
| 1522 GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id); | 1543 GpuProcessHostUIShim* ui_shim = GpuProcessHostUIShim::FromID(gpu_host_id); |
| 1523 if (ui_shim) | 1544 if (ui_shim) |
| 1524 ui_shim->Send(new AcceleratedSurfaceMsg_PostSubBufferACK(route_id)); | 1545 ui_shim->Send(new AcceleratedSurfaceMsg_PostSubBufferACK(route_id)); |
| 1525 } | 1546 } |
| 1526 #endif | 1547 #endif |
| OLD | NEW |