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 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 Source<RenderWidgetHost>(this), | 248 Source<RenderWidgetHost>(this), |
249 Details<bool>(&is_visible)); | 249 Details<bool>(&is_visible)); |
250 } | 250 } |
251 | 251 |
252 void RenderWidgetHost::WasResized() { | 252 void RenderWidgetHost::WasResized() { |
253 if (resize_ack_pending_ || !process_->HasConnection() || !view_ || | 253 if (resize_ack_pending_ || !process_->HasConnection() || !view_ || |
254 !renderer_initialized_) { | 254 !renderer_initialized_) { |
255 return; | 255 return; |
256 } | 256 } |
257 | 257 |
258 gfx::Rect view_bounds = view_->GetViewBounds(); | 258 gfx::Size new_size = view_->GetViewBounds().size(); |
259 gfx::Size new_size(view_bounds.width(), view_bounds.height()); | 259 gfx::Rect reserved_rect = view_->reserved_contents_rect(); |
260 | 260 |
261 // Avoid asking the RenderWidget to resize to its current size, since it | 261 // Avoid asking the RenderWidget to resize to its current size, since it |
262 // won't send us a PaintRect message in that case. | 262 // won't send us a PaintRect message in that case, unless reserved area is |
263 if (new_size == current_size_) | 263 // changed, but even in this case PaintRect message won't be sent. |
| 264 if (new_size == current_size_ && reserved_rect == current_reserved_rect_) |
264 return; | 265 return; |
265 | 266 |
266 if (in_flight_size_ != gfx::Size() && new_size == in_flight_size_) | 267 if (in_flight_size_ != gfx::Size() && new_size == in_flight_size_ && |
| 268 in_flight_reserved_rect_ == reserved_rect) { |
267 return; | 269 return; |
| 270 } |
268 | 271 |
269 // We don't expect to receive an ACK when the requested size is empty. | 272 // We don't expect to receive an ACK when the requested size is empty or |
270 if (!new_size.IsEmpty()) | 273 // only reserved area is changed. |
271 resize_ack_pending_ = true; | 274 resize_ack_pending_ = !new_size.IsEmpty() && new_size != current_size_; |
272 | 275 |
273 if (!Send(new ViewMsg_Resize(routing_id_, new_size, | 276 if (!Send(new ViewMsg_Resize(routing_id_, new_size, reserved_rect))) { |
274 GetRootWindowResizerRect()))) | |
275 resize_ack_pending_ = false; | 277 resize_ack_pending_ = false; |
276 else | 278 } else { |
277 in_flight_size_ = new_size; | 279 if (resize_ack_pending_) { |
| 280 in_flight_size_ = new_size; |
| 281 in_flight_reserved_rect_ = reserved_rect; |
| 282 } else { |
| 283 // Message was sent successfully, but we do not expect to receive an ACK, |
| 284 // so update current values right away. |
| 285 current_size_ = new_size; |
| 286 current_reserved_rect_ = reserved_rect; |
| 287 } |
| 288 } |
278 } | 289 } |
279 | 290 |
280 void RenderWidgetHost::GotFocus() { | 291 void RenderWidgetHost::GotFocus() { |
281 Focus(); | 292 Focus(); |
282 } | 293 } |
283 | 294 |
284 void RenderWidgetHost::Focus() { | 295 void RenderWidgetHost::Focus() { |
285 Send(new ViewMsg_SetFocus(routing_id_, true)); | 296 Send(new ViewMsg_SetFocus(routing_id_, true)); |
286 } | 297 } |
287 | 298 |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 | 621 |
611 // Must reset these to ensure that keyboard events work with a new renderer. | 622 // Must reset these to ensure that keyboard events work with a new renderer. |
612 key_queue_.clear(); | 623 key_queue_.clear(); |
613 suppress_next_char_events_ = false; | 624 suppress_next_char_events_ = false; |
614 | 625 |
615 // Reset some fields in preparation for recovering from a crash. | 626 // Reset some fields in preparation for recovering from a crash. |
616 resize_ack_pending_ = false; | 627 resize_ack_pending_ = false; |
617 repaint_ack_pending_ = false; | 628 repaint_ack_pending_ = false; |
618 | 629 |
619 in_flight_size_.SetSize(0, 0); | 630 in_flight_size_.SetSize(0, 0); |
| 631 in_flight_reserved_rect_.SetRect(0, 0, 0, 0); |
620 current_size_.SetSize(0, 0); | 632 current_size_.SetSize(0, 0); |
| 633 current_reserved_rect_.SetRect(0, 0, 0, 0); |
621 is_hidden_ = false; | 634 is_hidden_ = false; |
622 | 635 |
623 if (view_) { | 636 if (view_) { |
624 view_->RenderViewGone(); | 637 view_->RenderViewGone(); |
625 view_ = NULL; // The View should be deleted by RenderViewGone. | 638 view_ = NULL; // The View should be deleted by RenderViewGone. |
626 } | 639 } |
627 | 640 |
628 BackingStoreManager::RemoveBackingStore(this); | 641 BackingStoreManager::RemoveBackingStore(this); |
629 } | 642 } |
630 | 643 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 | 681 |
669 void RenderWidgetHost::ImeConfirmComposition() { | 682 void RenderWidgetHost::ImeConfirmComposition() { |
670 Send(new ViewMsg_ImeConfirmComposition(routing_id())); | 683 Send(new ViewMsg_ImeConfirmComposition(routing_id())); |
671 } | 684 } |
672 | 685 |
673 void RenderWidgetHost::ImeCancelComposition() { | 686 void RenderWidgetHost::ImeCancelComposition() { |
674 Send(new ViewMsg_ImeSetComposition(routing_id(), string16(), | 687 Send(new ViewMsg_ImeSetComposition(routing_id(), string16(), |
675 std::vector<WebKit::WebCompositionUnderline>(), 0, 0)); | 688 std::vector<WebKit::WebCompositionUnderline>(), 0, 0)); |
676 } | 689 } |
677 | 690 |
678 gfx::Rect RenderWidgetHost::GetRootWindowResizerRect() const { | |
679 return gfx::Rect(); | |
680 } | |
681 | |
682 void RenderWidgetHost::SetActive(bool active) { | 691 void RenderWidgetHost::SetActive(bool active) { |
683 Send(new ViewMsg_SetActive(routing_id(), active)); | 692 Send(new ViewMsg_SetActive(routing_id(), active)); |
684 } | 693 } |
685 | 694 |
686 void RenderWidgetHost::Destroy() { | 695 void RenderWidgetHost::Destroy() { |
687 NotificationService::current()->Notify( | 696 NotificationService::current()->Notify( |
688 NotificationType::RENDER_WIDGET_HOST_DESTROYED, | 697 NotificationType::RENDER_WIDGET_HOST_DESTROYED, |
689 Source<RenderWidgetHost>(this), | 698 Source<RenderWidgetHost>(this), |
690 NotificationService::NoDetails()); | 699 NotificationService::NoDetails()); |
691 | 700 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 | 767 |
759 void RenderWidgetHost::OnMsgUpdateRect( | 768 void RenderWidgetHost::OnMsgUpdateRect( |
760 const ViewHostMsg_UpdateRect_Params& params) { | 769 const ViewHostMsg_UpdateRect_Params& params) { |
761 TimeTicks paint_start = TimeTicks::Now(); | 770 TimeTicks paint_start = TimeTicks::Now(); |
762 | 771 |
763 if (paint_observer_.get()) | 772 if (paint_observer_.get()) |
764 paint_observer_->RenderWidgetHostWillPaint(this); | 773 paint_observer_->RenderWidgetHostWillPaint(this); |
765 | 774 |
766 // Update our knowledge of the RenderWidget's size. | 775 // Update our knowledge of the RenderWidget's size. |
767 current_size_ = params.view_size; | 776 current_size_ = params.view_size; |
| 777 current_reserved_rect_ = params.resizer_rect; |
768 | 778 |
769 bool is_resize_ack = | 779 bool is_resize_ack = |
770 ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); | 780 ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); |
771 | 781 |
772 // resize_ack_pending_ needs to be cleared before we call DidPaintRect, since | 782 // resize_ack_pending_ needs to be cleared before we call DidPaintRect, since |
773 // that will end up reaching GetBackingStore. | 783 // that will end up reaching GetBackingStore. |
774 if (is_resize_ack) { | 784 if (is_resize_ack) { |
775 DCHECK(resize_ack_pending_); | 785 DCHECK(resize_ack_pending_); |
776 resize_ack_pending_ = false; | 786 resize_ack_pending_ = false; |
777 in_flight_size_.SetSize(0, 0); | 787 in_flight_size_.SetSize(0, 0); |
| 788 in_flight_reserved_rect_.SetRect(0, 0, 0, 0); |
778 } | 789 } |
779 | 790 |
780 bool is_repaint_ack = | 791 bool is_repaint_ack = |
781 ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags); | 792 ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags); |
782 if (is_repaint_ack) { | 793 if (is_repaint_ack) { |
783 repaint_ack_pending_ = false; | 794 repaint_ack_pending_ = false; |
784 TimeDelta delta = TimeTicks::Now() - repaint_start_time_; | 795 TimeDelta delta = TimeTicks::Now() - repaint_start_time_; |
785 UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta); | 796 UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta); |
786 } | 797 } |
787 | 798 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 params.copy_rects); | 852 params.copy_rects); |
842 view_being_painted_ = false; | 853 view_being_painted_ = false; |
843 } | 854 } |
844 } | 855 } |
845 | 856 |
846 if (paint_observer_.get()) | 857 if (paint_observer_.get()) |
847 paint_observer_->RenderWidgetHostDidPaint(this); | 858 paint_observer_->RenderWidgetHostDidPaint(this); |
848 | 859 |
849 // If we got a resize ack, then perhaps we have another resize to send? | 860 // If we got a resize ack, then perhaps we have another resize to send? |
850 if (is_resize_ack && view_) { | 861 if (is_resize_ack && view_) { |
851 gfx::Rect view_bounds = view_->GetViewBounds(); | 862 // WasResized checks the current size and sends the resize update only |
852 if (current_size_.width() != view_bounds.width() || | 863 // when something was actually changed. |
853 current_size_.height() != view_bounds.height()) { | 864 WasResized(); |
854 WasResized(); | |
855 } | |
856 } | 865 } |
857 | 866 |
858 if (painting_observer_) | 867 if (painting_observer_) |
859 painting_observer_->WidgetDidUpdateBackingStore(this); | 868 painting_observer_->WidgetDidUpdateBackingStore(this); |
860 | 869 |
861 // Log the time delta for processing a paint message. | 870 // Log the time delta for processing a paint message. |
862 TimeDelta delta = TimeTicks::Now() - paint_start; | 871 TimeDelta delta = TimeTicks::Now() - paint_start; |
863 UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgUpdateRect", delta); | 872 UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgUpdateRect", delta); |
864 } | 873 } |
865 | 874 |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1159 // of this key event. | 1168 // of this key event. |
1160 if (!processed && !is_hidden_ && !front_item.skip_in_browser) { | 1169 if (!processed && !is_hidden_ && !front_item.skip_in_browser) { |
1161 UnhandledKeyboardEvent(front_item); | 1170 UnhandledKeyboardEvent(front_item); |
1162 | 1171 |
1163 // WARNING: This RenderWidgetHost can be deallocated at this point | 1172 // WARNING: This RenderWidgetHost can be deallocated at this point |
1164 // (i.e. in the case of Ctrl+W, where the call to | 1173 // (i.e. in the case of Ctrl+W, where the call to |
1165 // UnhandledKeyboardEvent destroys this RenderWidgetHost). | 1174 // UnhandledKeyboardEvent destroys this RenderWidgetHost). |
1166 } | 1175 } |
1167 } | 1176 } |
1168 } | 1177 } |
OLD | NEW |