| 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);
|
|
|