Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: chrome/browser/renderer_host/render_widget_host.cc

Issue 3547008: Handle resize corner layout entirely in the platform BrowserWindow*/BrowserView* code... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 Source<RenderWidgetHost>(this), 252 Source<RenderWidgetHost>(this),
253 Details<bool>(&is_visible)); 253 Details<bool>(&is_visible));
254 } 254 }
255 255
256 void RenderWidgetHost::WasResized() { 256 void RenderWidgetHost::WasResized() {
257 if (resize_ack_pending_ || !process_->HasConnection() || !view_ || 257 if (resize_ack_pending_ || !process_->HasConnection() || !view_ ||
258 !renderer_initialized_) { 258 !renderer_initialized_) {
259 return; 259 return;
260 } 260 }
261 261
262 gfx::Rect view_bounds = view_->GetViewBounds(); 262 gfx::Size new_size = view_->GetViewBounds().size();
263 gfx::Size new_size(view_bounds.width(), view_bounds.height()); 263 gfx::Rect reserved_rect = view_->reserved_contents_rect();
264 264
265 // Avoid asking the RenderWidget to resize to its current size, since it 265 // Avoid asking the RenderWidget to resize to its current size, since it
266 // won't send us a PaintRect message in that case. 266 // won't send us a PaintRect message in that case, unless reserved area is
267 if (new_size == current_size_) 267 // changed, but even in this case PaintRect message won't be sent.
268 if (new_size == current_size_ && reserved_rect == current_reserved_rect_)
268 return; 269 return;
269 270
270 if (in_flight_size_ != gfx::Size() && new_size == in_flight_size_) 271 if (in_flight_size_ != gfx::Size() && new_size == in_flight_size_ &&
272 in_flight_reserved_rect_ == reserved_rect) {
271 return; 273 return;
274 }
272 275
273 // We don't expect to receive an ACK when the requested size is empty. 276 // We don't expect to receive an ACK when the requested size is empty or
274 if (!new_size.IsEmpty()) 277 // only reserved area is changed.
275 resize_ack_pending_ = true; 278 resize_ack_pending_ = !new_size.IsEmpty() && new_size != current_size_;
276 279
277 if (!Send(new ViewMsg_Resize(routing_id_, new_size, 280 if (!Send(new ViewMsg_Resize(routing_id_, new_size, reserved_rect))) {
278 GetRootWindowResizerRect())))
279 resize_ack_pending_ = false; 281 resize_ack_pending_ = false;
280 else 282 } else {
281 in_flight_size_ = new_size; 283 if (resize_ack_pending_) {
284 in_flight_size_ = new_size;
285 in_flight_reserved_rect_ = reserved_rect;
286 } else {
287 // Message was sent successfully, but we do not expect to receive an ACK,
288 // so update current values right away.
289 current_size_ = new_size;
290 current_reserved_rect_ = reserved_rect;
291 }
292 }
282 } 293 }
283 294
284 void RenderWidgetHost::GotFocus() { 295 void RenderWidgetHost::GotFocus() {
285 Focus(); 296 Focus();
286 } 297 }
287 298
288 void RenderWidgetHost::Focus() { 299 void RenderWidgetHost::Focus() {
289 Send(new ViewMsg_SetFocus(routing_id_, true)); 300 Send(new ViewMsg_SetFocus(routing_id_, true));
290 } 301 }
291 302
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 625
615 // Must reset these to ensure that keyboard events work with a new renderer. 626 // Must reset these to ensure that keyboard events work with a new renderer.
616 key_queue_.clear(); 627 key_queue_.clear();
617 suppress_next_char_events_ = false; 628 suppress_next_char_events_ = false;
618 629
619 // Reset some fields in preparation for recovering from a crash. 630 // Reset some fields in preparation for recovering from a crash.
620 resize_ack_pending_ = false; 631 resize_ack_pending_ = false;
621 repaint_ack_pending_ = false; 632 repaint_ack_pending_ = false;
622 633
623 in_flight_size_.SetSize(0, 0); 634 in_flight_size_.SetSize(0, 0);
635 in_flight_reserved_rect_.SetRect(0, 0, 0, 0);
624 current_size_.SetSize(0, 0); 636 current_size_.SetSize(0, 0);
637 current_reserved_rect_.SetRect(0, 0, 0, 0);
625 is_hidden_ = false; 638 is_hidden_ = false;
626 639
627 if (view_) { 640 if (view_) {
628 view_->RenderViewGone(); 641 view_->RenderViewGone();
629 view_ = NULL; // The View should be deleted by RenderViewGone. 642 view_ = NULL; // The View should be deleted by RenderViewGone.
630 } 643 }
631 644
632 BackingStoreManager::RemoveBackingStore(this); 645 BackingStoreManager::RemoveBackingStore(this);
633 } 646 }
634 647
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 685
673 void RenderWidgetHost::ImeConfirmComposition() { 686 void RenderWidgetHost::ImeConfirmComposition() {
674 Send(new ViewMsg_ImeConfirmComposition(routing_id())); 687 Send(new ViewMsg_ImeConfirmComposition(routing_id()));
675 } 688 }
676 689
677 void RenderWidgetHost::ImeCancelComposition() { 690 void RenderWidgetHost::ImeCancelComposition() {
678 Send(new ViewMsg_ImeSetComposition(routing_id(), string16(), 691 Send(new ViewMsg_ImeSetComposition(routing_id(), string16(),
679 std::vector<WebKit::WebCompositionUnderline>(), 0, 0)); 692 std::vector<WebKit::WebCompositionUnderline>(), 0, 0));
680 } 693 }
681 694
682 gfx::Rect RenderWidgetHost::GetRootWindowResizerRect() const {
683 return gfx::Rect();
684 }
685
686 void RenderWidgetHost::SetActive(bool active) { 695 void RenderWidgetHost::SetActive(bool active) {
687 Send(new ViewMsg_SetActive(routing_id(), active)); 696 Send(new ViewMsg_SetActive(routing_id(), active));
688 } 697 }
689 698
690 void RenderWidgetHost::Destroy() { 699 void RenderWidgetHost::Destroy() {
691 NotificationService::current()->Notify( 700 NotificationService::current()->Notify(
692 NotificationType::RENDER_WIDGET_HOST_DESTROYED, 701 NotificationType::RENDER_WIDGET_HOST_DESTROYED,
693 Source<RenderWidgetHost>(this), 702 Source<RenderWidgetHost>(this),
694 NotificationService::NoDetails()); 703 NotificationService::NoDetails());
695 704
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 771
763 void RenderWidgetHost::OnMsgUpdateRect( 772 void RenderWidgetHost::OnMsgUpdateRect(
764 const ViewHostMsg_UpdateRect_Params& params) { 773 const ViewHostMsg_UpdateRect_Params& params) {
765 TimeTicks paint_start = TimeTicks::Now(); 774 TimeTicks paint_start = TimeTicks::Now();
766 775
767 if (paint_observer_.get()) 776 if (paint_observer_.get())
768 paint_observer_->RenderWidgetHostWillPaint(this); 777 paint_observer_->RenderWidgetHostWillPaint(this);
769 778
770 // Update our knowledge of the RenderWidget's size. 779 // Update our knowledge of the RenderWidget's size.
771 current_size_ = params.view_size; 780 current_size_ = params.view_size;
781 current_reserved_rect_ = params.resizer_rect;
772 782
773 bool is_resize_ack = 783 bool is_resize_ack =
774 ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags); 784 ViewHostMsg_UpdateRect_Flags::is_resize_ack(params.flags);
775 785
776 // resize_ack_pending_ needs to be cleared before we call DidPaintRect, since 786 // resize_ack_pending_ needs to be cleared before we call DidPaintRect, since
777 // that will end up reaching GetBackingStore. 787 // that will end up reaching GetBackingStore.
778 if (is_resize_ack) { 788 if (is_resize_ack) {
779 DCHECK(resize_ack_pending_); 789 DCHECK(resize_ack_pending_);
780 resize_ack_pending_ = false; 790 resize_ack_pending_ = false;
781 in_flight_size_.SetSize(0, 0); 791 in_flight_size_.SetSize(0, 0);
792 in_flight_reserved_rect_.SetRect(0, 0, 0, 0);
782 } 793 }
783 794
784 bool is_repaint_ack = 795 bool is_repaint_ack =
785 ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags); 796 ViewHostMsg_UpdateRect_Flags::is_repaint_ack(params.flags);
786 if (is_repaint_ack) { 797 if (is_repaint_ack) {
787 repaint_ack_pending_ = false; 798 repaint_ack_pending_ = false;
788 TimeDelta delta = TimeTicks::Now() - repaint_start_time_; 799 TimeDelta delta = TimeTicks::Now() - repaint_start_time_;
789 UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta); 800 UMA_HISTOGRAM_TIMES("MPArch.RWH_RepaintDelta", delta);
790 } 801 }
791 802
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 params.copy_rects); 860 params.copy_rects);
850 view_being_painted_ = false; 861 view_being_painted_ = false;
851 } 862 }
852 } 863 }
853 864
854 if (paint_observer_.get()) 865 if (paint_observer_.get())
855 paint_observer_->RenderWidgetHostDidPaint(this); 866 paint_observer_->RenderWidgetHostDidPaint(this);
856 867
857 // If we got a resize ack, then perhaps we have another resize to send? 868 // If we got a resize ack, then perhaps we have another resize to send?
858 if (is_resize_ack && view_) { 869 if (is_resize_ack && view_) {
859 gfx::Rect view_bounds = view_->GetViewBounds(); 870 // WasResized checks the current size and sends the resize update only
860 if (current_size_.width() != view_bounds.width() || 871 // when something was actually changed.
861 current_size_.height() != view_bounds.height()) { 872 WasResized();
862 WasResized();
863 }
864 } 873 }
865 874
866 if (painting_observer_) 875 if (painting_observer_)
867 painting_observer_->WidgetDidUpdateBackingStore(this); 876 painting_observer_->WidgetDidUpdateBackingStore(this);
868 877
869 // Log the time delta for processing a paint message. 878 // Log the time delta for processing a paint message.
870 TimeDelta delta = TimeTicks::Now() - paint_start; 879 TimeDelta delta = TimeTicks::Now() - paint_start;
871 UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgUpdateRect", delta); 880 UMA_HISTOGRAM_TIMES("MPArch.RWH_OnMsgUpdateRect", delta);
872 } 881 }
873 882
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 // of this key event. 1223 // of this key event.
1215 if (!processed && !is_hidden_ && !front_item.skip_in_browser) { 1224 if (!processed && !is_hidden_ && !front_item.skip_in_browser) {
1216 UnhandledKeyboardEvent(front_item); 1225 UnhandledKeyboardEvent(front_item);
1217 1226
1218 // WARNING: This RenderWidgetHost can be deallocated at this point 1227 // WARNING: This RenderWidgetHost can be deallocated at this point
1219 // (i.e. in the case of Ctrl+W, where the call to 1228 // (i.e. in the case of Ctrl+W, where the call to
1220 // UnhandledKeyboardEvent destroys this RenderWidgetHost). 1229 // UnhandledKeyboardEvent destroys this RenderWidgetHost).
1221 } 1230 }
1222 } 1231 }
1223 } 1232 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698