Index: content/browser/renderer_host/render_widget_host_impl.cc |
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc |
index 9a1d709a2ef00f024c3194de5ec841498afcfc3b..e88295ae134acb3c7067019996f637f2f6a0a49d 100644 |
--- a/content/browser/renderer_host/render_widget_host_impl.cc |
+++ b/content/browser/renderer_host/render_widget_host_impl.cc |
@@ -167,12 +167,10 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, |
surface_id_(0), |
is_loading_(false), |
is_hidden_(hidden), |
- is_fullscreen_(false), |
repaint_ack_pending_(false), |
resize_ack_pending_(false), |
screen_info_out_of_date_(false), |
- top_controls_layout_height_(0.f), |
- should_auto_resize_(false), |
+ auto_resize_enabled_(false), |
waiting_for_screen_rects_ack_(false), |
needs_repainting_on_restore_(false), |
is_unresponsive_(false), |
@@ -362,7 +360,8 @@ void RenderWidgetHostImpl::ResetSizeAndRepaintPendingFlags() { |
"renderer_host", "RenderWidgetHostImpl::repaint_ack_pending_", this); |
} |
repaint_ack_pending_ = false; |
- last_requested_size_.SetSize(0, 0); |
+ if (old_resize_params_) |
+ old_resize_params_->new_size = gfx::Size(); |
} |
void RenderWidgetHostImpl::SendScreenRects() { |
@@ -564,61 +563,80 @@ void RenderWidgetHostImpl::WasShown(const ui::LatencyInfo& latency_info) { |
WasResized(); |
} |
+void RenderWidgetHostImpl::GetResizeParams( |
+ ViewMsg_Resize_Params* resize_params) { |
+ *resize_params = ViewMsg_Resize_Params(); |
+ |
+ if (!screen_info_) { |
+ screen_info_.reset(new blink::WebScreenInfo); |
+ GetWebScreenInfo(screen_info_.get()); |
+ } |
+ resize_params->screen_info = *screen_info_; |
+ resize_params->resizer_rect = GetRootWindowResizerRect(); |
+ |
+ if (view_) { |
+ resize_params->new_size = view_->GetRequestedRendererSize(); |
+ resize_params->physical_backing_size = view_->GetPhysicalBackingSize(); |
+ resize_params->top_controls_layout_height = |
+ view_->GetTopControlsLayoutHeight(); |
+ resize_params->visible_viewport_size = view_->GetVisibleViewportSize(); |
+ resize_params->is_fullscreen = IsFullscreen(); |
+ } |
+} |
+ |
+void RenderWidgetHostImpl::SetInitialRenderSizeParams( |
+ const ViewMsg_Resize_Params& resize_params) { |
+ // We don't expect to receive an ACK when the requested size or the physical |
+ // backing size is empty, or when the main viewport size didn't change. |
+ if (!resize_params.new_size.IsEmpty() && |
+ !resize_params.physical_backing_size.IsEmpty()) { |
+ resize_ack_pending_ = g_check_for_pending_resize_ack; |
+ } |
+ |
+ old_resize_params_ = |
+ make_scoped_ptr(new ViewMsg_Resize_Params(resize_params)); |
+} |
+ |
void RenderWidgetHostImpl::WasResized() { |
// Skip if the |delegate_| has already been detached because |
// it's web contents is being deleted. |
if (resize_ack_pending_ || !process_->HasConnection() || !view_ || |
- !renderer_initialized_ || should_auto_resize_ || !delegate_) { |
+ !renderer_initialized_ || auto_resize_enabled_ || !delegate_) { |
return; |
} |
- gfx::Size new_size(view_->GetRequestedRendererSize()); |
- |
- gfx::Size old_physical_backing_size = physical_backing_size_; |
- physical_backing_size_ = view_->GetPhysicalBackingSize(); |
- bool was_fullscreen = is_fullscreen_; |
- is_fullscreen_ = IsFullscreen(); |
- float old_top_controls_layout_height = |
- top_controls_layout_height_; |
- top_controls_layout_height_ = |
- view_->GetTopControlsLayoutHeight(); |
- gfx::Size old_visible_viewport_size = visible_viewport_size_; |
- visible_viewport_size_ = view_->GetVisibleViewportSize(); |
- |
- bool size_changed = new_size != last_requested_size_; |
- bool side_payload_changed = |
- screen_info_out_of_date_ || |
- old_physical_backing_size != physical_backing_size_ || |
- was_fullscreen != is_fullscreen_ || |
- old_top_controls_layout_height != |
- top_controls_layout_height_ || |
- old_visible_viewport_size != visible_viewport_size_; |
+ bool size_changed = true; |
+ bool side_payload_changed = screen_info_out_of_date_; |
+ scoped_ptr<ViewMsg_Resize_Params> params(new ViewMsg_Resize_Params); |
+ |
+ GetResizeParams(params.get()); |
+ if (old_resize_params_) { |
+ size_changed = old_resize_params_->new_size != params->new_size; |
+ side_payload_changed = |
+ side_payload_changed || |
+ old_resize_params_->physical_backing_size != |
+ params->physical_backing_size || |
+ old_resize_params_->is_fullscreen != params->is_fullscreen || |
+ old_resize_params_->top_controls_layout_height != |
+ params->top_controls_layout_height || |
+ old_resize_params_->visible_viewport_size != |
+ params->visible_viewport_size; |
+ } |
if (!size_changed && !side_payload_changed) |
return; |
- if (!screen_info_) { |
- screen_info_.reset(new blink::WebScreenInfo); |
- GetWebScreenInfo(screen_info_.get()); |
- } |
- |
// We don't expect to receive an ACK when the requested size or the physical |
// backing size is empty, or when the main viewport size didn't change. |
- if (!new_size.IsEmpty() && !physical_backing_size_.IsEmpty() && size_changed) |
+ if (!params->new_size.IsEmpty() && !params->physical_backing_size.IsEmpty() && |
+ size_changed) { |
resize_ack_pending_ = g_check_for_pending_resize_ack; |
+ } |
- ViewMsg_Resize_Params params; |
- params.screen_info = *screen_info_; |
- params.new_size = new_size; |
- params.physical_backing_size = physical_backing_size_; |
- params.top_controls_layout_height = top_controls_layout_height_; |
- params.visible_viewport_size = visible_viewport_size_; |
- params.resizer_rect = GetRootWindowResizerRect(); |
- params.is_fullscreen = is_fullscreen_; |
- if (!Send(new ViewMsg_Resize(routing_id_, params))) { |
+ if (!Send(new ViewMsg_Resize(routing_id_, *params))) { |
resize_ack_pending_ = false; |
} else { |
- last_requested_size_ = new_size; |
+ old_resize_params_.swap(params); |
} |
} |
@@ -746,7 +764,7 @@ void RenderWidgetHostImpl::WaitForSurface() { |
// size of the view_. (For auto-sized views, current_size_ is updated during |
// UpdateRect messages.) |
gfx::Size view_size = current_size_; |
- if (!should_auto_resize_) { |
+ if (!auto_resize_enabled_) { |
// Get the desired size from the current view bounds. |
gfx::Rect view_rect = view_->GetViewBounds(); |
if (view_rect.IsEmpty()) |
@@ -800,7 +818,7 @@ void RenderWidgetHostImpl::WaitForSurface() { |
// For auto-resized views, current_size_ determines the view_size and it |
// may have changed during the handling of an UpdateRect message. |
- if (should_auto_resize_) |
+ if (auto_resize_enabled_) |
view_size = current_size_; |
// Break now if we got a backing store or accelerated surface of the |
@@ -1380,8 +1398,12 @@ bool RenderWidgetHostImpl::IsFullscreen() const { |
return false; |
} |
-void RenderWidgetHostImpl::SetShouldAutoResize(bool enable) { |
- should_auto_resize_ = enable; |
+void RenderWidgetHostImpl::SetAutoResize(bool enable, |
+ const gfx::Size& min_size, |
+ const gfx::Size& max_size) { |
+ auto_resize_enabled_ = enable; |
+ min_size_for_auto_resize_ = min_size; |
+ max_size_for_auto_resize_ = max_size; |
} |
void RenderWidgetHostImpl::Destroy() { |
@@ -1581,7 +1603,7 @@ void RenderWidgetHostImpl::OnUpdateRect( |
DidUpdateBackingStore(params, paint_start); |
- if (should_auto_resize_) { |
+ if (auto_resize_enabled_) { |
bool post_callback = new_auto_size_.IsEmpty(); |
new_auto_size_ = params.view_size; |
if (post_callback) { |
@@ -2073,7 +2095,7 @@ void RenderWidgetHostImpl::DelayedAutoResized() { |
// indicate that no callback is in progress (i.e. without this line |
// DelayedAutoResized will not get called again). |
new_auto_size_.SetSize(0, 0); |
- if (!should_auto_resize_) |
+ if (!auto_resize_enabled_) |
return; |
OnRenderAutoResized(new_size); |