| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/renderer/render_widget.h" | 5 #include "content/renderer/render_widget.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "base/debug/trace_event_synthetic_delay.h" | 10 #include "base/debug/trace_event_synthetic_delay.h" |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 | 179 |
| 180 // The following methods alter handlers' behavior for messages related to | 180 // The following methods alter handlers' behavior for messages related to |
| 181 // widget size and position. | 181 // widget size and position. |
| 182 void OnResizeMessage(const ViewMsg_Resize_Params& params); | 182 void OnResizeMessage(const ViewMsg_Resize_Params& params); |
| 183 void OnUpdateScreenRectsMessage(const gfx::Rect& view_screen_rect, | 183 void OnUpdateScreenRectsMessage(const gfx::Rect& view_screen_rect, |
| 184 const gfx::Rect& window_screen_rect); | 184 const gfx::Rect& window_screen_rect); |
| 185 void OnShowContextMenu(ContextMenuParams* params); | 185 void OnShowContextMenu(ContextMenuParams* params); |
| 186 | 186 |
| 187 private: | 187 private: |
| 188 void Reapply(); | 188 void Reapply(); |
| 189 void Apply(float overdraw_bottom_height, | 189 void Apply(float overdraw_bottom_height, int visible_viewport_height, |
| 190 gfx::Rect resizer_rect, bool is_fullscreen); | 190 gfx::Rect resizer_rect, bool is_fullscreen); |
| 191 | 191 |
| 192 RenderWidget* widget_; | 192 RenderWidget* widget_; |
| 193 | 193 |
| 194 // Parameters as passed by RenderWidget::EnableScreenMetricsEmulation. | 194 // Parameters as passed by RenderWidget::EnableScreenMetricsEmulation. |
| 195 WebDeviceEmulationParams params_; | 195 WebDeviceEmulationParams params_; |
| 196 | 196 |
| 197 // The computed scale and offset used to fit widget into browser window. | 197 // The computed scale and offset used to fit widget into browser window. |
| 198 float scale_; | 198 float scale_; |
| 199 gfx::Point offset_; | 199 gfx::Point offset_; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 213 RenderWidget* widget, | 213 RenderWidget* widget, |
| 214 const WebDeviceEmulationParams& params) | 214 const WebDeviceEmulationParams& params) |
| 215 : widget_(widget), | 215 : widget_(widget), |
| 216 params_(params), | 216 params_(params), |
| 217 scale_(1.f) { | 217 scale_(1.f) { |
| 218 original_size_ = widget_->size_; | 218 original_size_ = widget_->size_; |
| 219 original_physical_backing_size_ = widget_->physical_backing_size_; | 219 original_physical_backing_size_ = widget_->physical_backing_size_; |
| 220 original_screen_info_ = widget_->screen_info_; | 220 original_screen_info_ = widget_->screen_info_; |
| 221 original_view_screen_rect_ = widget_->view_screen_rect_; | 221 original_view_screen_rect_ = widget_->view_screen_rect_; |
| 222 original_window_screen_rect_ = widget_->window_screen_rect_; | 222 original_window_screen_rect_ = widget_->window_screen_rect_; |
| 223 Apply(widget_->overdraw_bottom_height_, | 223 Apply(widget_->overdraw_bottom_height_, widget_->visible_viewport_height_, |
| 224 widget_->resizer_rect_, widget_->is_fullscreen_); | 224 widget_->resizer_rect_, widget_->is_fullscreen_); |
| 225 } | 225 } |
| 226 | 226 |
| 227 RenderWidget::ScreenMetricsEmulator::~ScreenMetricsEmulator() { | 227 RenderWidget::ScreenMetricsEmulator::~ScreenMetricsEmulator() { |
| 228 widget_->screen_info_ = original_screen_info_; | 228 widget_->screen_info_ = original_screen_info_; |
| 229 | 229 |
| 230 widget_->SetDeviceScaleFactor(original_screen_info_.deviceScaleFactor); | 230 widget_->SetDeviceScaleFactor(original_screen_info_.deviceScaleFactor); |
| 231 widget_->SetScreenMetricsEmulationParameters(0.f, gfx::Point(), 1.f); | 231 widget_->SetScreenMetricsEmulationParameters(0.f, gfx::Point(), 1.f); |
| 232 widget_->view_screen_rect_ = original_view_screen_rect_; | 232 widget_->view_screen_rect_ = original_view_screen_rect_; |
| 233 widget_->window_screen_rect_ = original_window_screen_rect_; | 233 widget_->window_screen_rect_ = original_window_screen_rect_; |
| 234 widget_->Resize(original_size_, original_physical_backing_size_, | 234 widget_->Resize(original_size_, original_physical_backing_size_, |
| 235 widget_->overdraw_bottom_height_, widget_->resizer_rect_, | 235 widget_->overdraw_bottom_height_, widget_->visible_viewport_height_, |
| 236 widget_->is_fullscreen_, NO_RESIZE_ACK); | 236 widget_->resizer_rect_, widget_->is_fullscreen_, NO_RESIZE_ACK); |
| 237 } | 237 } |
| 238 | 238 |
| 239 void RenderWidget::ScreenMetricsEmulator::ChangeEmulationParams( | 239 void RenderWidget::ScreenMetricsEmulator::ChangeEmulationParams( |
| 240 const WebDeviceEmulationParams& params) { | 240 const WebDeviceEmulationParams& params) { |
| 241 params_ = params; | 241 params_ = params; |
| 242 Reapply(); | 242 Reapply(); |
| 243 } | 243 } |
| 244 | 244 |
| 245 void RenderWidget::ScreenMetricsEmulator::Reapply() { | 245 void RenderWidget::ScreenMetricsEmulator::Reapply() { |
| 246 Apply(widget_->overdraw_bottom_height_, | 246 Apply(widget_->overdraw_bottom_height_, widget_->visible_viewport_height_, |
| 247 widget_->resizer_rect_, widget_->is_fullscreen_); | 247 widget_->resizer_rect_, widget_->is_fullscreen_); |
| 248 } | 248 } |
| 249 | 249 |
| 250 void RenderWidget::ScreenMetricsEmulator::Apply( | 250 void RenderWidget::ScreenMetricsEmulator::Apply( |
| 251 float overdraw_bottom_height, gfx::Rect resizer_rect, bool is_fullscreen) { | 251 float overdraw_bottom_height, int visible_viewport_height, |
| 252 gfx::Rect resizer_rect, bool is_fullscreen) { |
| 252 applied_widget_rect_.set_size(params_.viewSize.isEmpty() ? | 253 applied_widget_rect_.set_size(params_.viewSize.isEmpty() ? |
| 253 original_size_ : gfx::Size(params_.viewSize)); | 254 original_size_ : gfx::Size(params_.viewSize)); |
| 254 | 255 |
| 255 if (params_.fitToView) { | 256 if (params_.fitToView) { |
| 256 DCHECK(!original_size_.IsEmpty()); | 257 DCHECK(!original_size_.IsEmpty()); |
| 257 | 258 |
| 258 int width_with_gutter = | 259 int width_with_gutter = |
| 259 std::max(original_size_.width() - 2 * params_.viewInsets.width, 1); | 260 std::max(original_size_.width() - 2 * params_.viewInsets.width, 1); |
| 260 int height_with_gutter = | 261 int height_with_gutter = |
| 261 std::max(original_size_.height() - 2 * params_.viewInsets.height, 1); | 262 std::max(original_size_.height() - 2 * params_.viewInsets.height, 1); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 // root layer. | 300 // root layer. |
| 300 widget_->SetScreenMetricsEmulationParameters( | 301 widget_->SetScreenMetricsEmulationParameters( |
| 301 original_screen_info_.deviceScaleFactor, offset_, scale_); | 302 original_screen_info_.deviceScaleFactor, offset_, scale_); |
| 302 | 303 |
| 303 widget_->SetDeviceScaleFactor(applied_device_scale_factor); | 304 widget_->SetDeviceScaleFactor(applied_device_scale_factor); |
| 304 widget_->view_screen_rect_ = applied_widget_rect_; | 305 widget_->view_screen_rect_ = applied_widget_rect_; |
| 305 | 306 |
| 306 gfx::Size physical_backing_size = gfx::ToCeiledSize(gfx::ScaleSize( | 307 gfx::Size physical_backing_size = gfx::ToCeiledSize(gfx::ScaleSize( |
| 307 original_size_, original_screen_info_.deviceScaleFactor)); | 308 original_size_, original_screen_info_.deviceScaleFactor)); |
| 308 widget_->Resize(applied_widget_rect_.size(), physical_backing_size, | 309 widget_->Resize(applied_widget_rect_.size(), physical_backing_size, |
| 309 overdraw_bottom_height, resizer_rect, is_fullscreen, NO_RESIZE_ACK); | 310 overdraw_bottom_height, visible_viewport_height, resizer_rect, |
| 311 is_fullscreen, NO_RESIZE_ACK); |
| 310 } | 312 } |
| 311 | 313 |
| 312 void RenderWidget::ScreenMetricsEmulator::OnResizeMessage( | 314 void RenderWidget::ScreenMetricsEmulator::OnResizeMessage( |
| 313 const ViewMsg_Resize_Params& params) { | 315 const ViewMsg_Resize_Params& params) { |
| 314 bool need_ack = params.new_size != original_size_ && | 316 bool need_ack = params.new_size != original_size_ && |
| 315 !params.new_size.IsEmpty() && !params.physical_backing_size.IsEmpty(); | 317 !params.new_size.IsEmpty() && !params.physical_backing_size.IsEmpty(); |
| 316 original_size_ = params.new_size; | 318 original_size_ = params.new_size; |
| 317 original_physical_backing_size_ = params.physical_backing_size; | 319 original_physical_backing_size_ = params.physical_backing_size; |
| 318 original_screen_info_ = params.screen_info; | 320 original_screen_info_ = params.screen_info; |
| 319 Apply(params.overdraw_bottom_height, params.resizer_rect, | 321 Apply(params.overdraw_bottom_height, params.visible_viewport_height, |
| 320 params.is_fullscreen); | 322 params.resizer_rect, params.is_fullscreen); |
| 321 | 323 |
| 322 if (need_ack) { | 324 if (need_ack) { |
| 323 widget_->set_next_paint_is_resize_ack(); | 325 widget_->set_next_paint_is_resize_ack(); |
| 324 if (widget_->compositor_) | 326 if (widget_->compositor_) |
| 325 widget_->compositor_->SetNeedsRedrawRect(gfx::Rect(widget_->size_)); | 327 widget_->compositor_->SetNeedsRedrawRect(gfx::Rect(widget_->size_)); |
| 326 } | 328 } |
| 327 } | 329 } |
| 328 | 330 |
| 329 void RenderWidget::ScreenMetricsEmulator::OnUpdateScreenRectsMessage( | 331 void RenderWidget::ScreenMetricsEmulator::OnUpdateScreenRectsMessage( |
| 330 const gfx::Rect& view_screen_rect, | 332 const gfx::Rect& view_screen_rect, |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 638 // If given a messsage without a routing ID, then assign our routing ID. | 640 // If given a messsage without a routing ID, then assign our routing ID. |
| 639 if (message->routing_id() == MSG_ROUTING_NONE) | 641 if (message->routing_id() == MSG_ROUTING_NONE) |
| 640 message->set_routing_id(routing_id_); | 642 message->set_routing_id(routing_id_); |
| 641 | 643 |
| 642 return RenderThread::Get()->Send(message); | 644 return RenderThread::Get()->Send(message); |
| 643 } | 645 } |
| 644 | 646 |
| 645 void RenderWidget::Resize(const gfx::Size& new_size, | 647 void RenderWidget::Resize(const gfx::Size& new_size, |
| 646 const gfx::Size& physical_backing_size, | 648 const gfx::Size& physical_backing_size, |
| 647 float overdraw_bottom_height, | 649 float overdraw_bottom_height, |
| 650 int visible_viewport_height, |
| 648 const gfx::Rect& resizer_rect, | 651 const gfx::Rect& resizer_rect, |
| 649 bool is_fullscreen, | 652 bool is_fullscreen, |
| 650 ResizeAck resize_ack) { | 653 ResizeAck resize_ack) { |
| 651 if (resizing_mode_selector_->NeverUsesSynchronousResize()) { | 654 if (resizing_mode_selector_->NeverUsesSynchronousResize()) { |
| 652 // A resize ack shouldn't be requested if we have not ACK'd the previous | 655 // A resize ack shouldn't be requested if we have not ACK'd the previous |
| 653 // one. | 656 // one. |
| 654 DCHECK(resize_ack != SEND_RESIZE_ACK || !next_paint_is_resize_ack()); | 657 DCHECK(resize_ack != SEND_RESIZE_ACK || !next_paint_is_resize_ack()); |
| 655 DCHECK(resize_ack == SEND_RESIZE_ACK || resize_ack == NO_RESIZE_ACK); | 658 DCHECK(resize_ack == SEND_RESIZE_ACK || resize_ack == NO_RESIZE_ACK); |
| 656 } | 659 } |
| 657 | 660 |
| 658 // Ignore this during shutdown. | 661 // Ignore this during shutdown. |
| 659 if (!webwidget_) | 662 if (!webwidget_) |
| 660 return; | 663 return; |
| 661 | 664 |
| 662 if (compositor_) { | 665 if (compositor_) { |
| 663 compositor_->setViewportSize(new_size, physical_backing_size); | 666 compositor_->setViewportSize(new_size, physical_backing_size); |
| 664 compositor_->SetOverdrawBottomHeight(overdraw_bottom_height); | 667 compositor_->SetOverdrawBottomHeight(overdraw_bottom_height); |
| 668 gfx::Size pinch_viewport_size(new_size.width(), visible_viewport_height); |
| 669 webwidget()->resizePinchViewport(pinch_viewport_size); |
| 665 } | 670 } |
| 666 | 671 |
| 667 physical_backing_size_ = physical_backing_size; | 672 physical_backing_size_ = physical_backing_size; |
| 668 overdraw_bottom_height_ = overdraw_bottom_height; | 673 overdraw_bottom_height_ = overdraw_bottom_height; |
| 669 resizer_rect_ = resizer_rect; | 674 resizer_rect_ = resizer_rect; |
| 670 | 675 |
| 671 // NOTE: We may have entered fullscreen mode without changing our size. | 676 // NOTE: We may have entered fullscreen mode without changing our size. |
| 672 bool fullscreen_change = is_fullscreen_ != is_fullscreen; | 677 bool fullscreen_change = is_fullscreen_ != is_fullscreen; |
| 673 if (fullscreen_change) | 678 if (fullscreen_change) |
| 674 WillToggleFullscreen(); | 679 WillToggleFullscreen(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 if (fullscreen_change) | 714 if (fullscreen_change) |
| 710 DidToggleFullscreen(); | 715 DidToggleFullscreen(); |
| 711 | 716 |
| 712 // If a resize ack is requested and it isn't set-up, then no more resizes will | 717 // If a resize ack is requested and it isn't set-up, then no more resizes will |
| 713 // come in and in general things will go wrong. | 718 // come in and in general things will go wrong. |
| 714 DCHECK(resize_ack != SEND_RESIZE_ACK || next_paint_is_resize_ack()); | 719 DCHECK(resize_ack != SEND_RESIZE_ACK || next_paint_is_resize_ack()); |
| 715 } | 720 } |
| 716 | 721 |
| 717 void RenderWidget::ResizeSynchronously(const gfx::Rect& new_position) { | 722 void RenderWidget::ResizeSynchronously(const gfx::Rect& new_position) { |
| 718 Resize(new_position.size(), new_position.size(), overdraw_bottom_height_, | 723 Resize(new_position.size(), new_position.size(), overdraw_bottom_height_, |
| 719 gfx::Rect(), is_fullscreen_, NO_RESIZE_ACK); | 724 visible_viewport_height_, gfx::Rect(), is_fullscreen_, NO_RESIZE_ACK); |
| 720 view_screen_rect_ = new_position; | 725 view_screen_rect_ = new_position; |
| 721 window_screen_rect_ = new_position; | 726 window_screen_rect_ = new_position; |
| 722 if (!did_show_) | 727 if (!did_show_) |
| 723 initial_pos_ = new_position; | 728 initial_pos_ = new_position; |
| 724 } | 729 } |
| 725 | 730 |
| 726 void RenderWidget::OnClose() { | 731 void RenderWidget::OnClose() { |
| 727 if (closing_) | 732 if (closing_) |
| 728 return; | 733 return; |
| 729 closing_ = true; | 734 closing_ = true; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 759 return; | 764 return; |
| 760 | 765 |
| 761 if (screen_metrics_emulator_) { | 766 if (screen_metrics_emulator_) { |
| 762 screen_metrics_emulator_->OnResizeMessage(params); | 767 screen_metrics_emulator_->OnResizeMessage(params); |
| 763 return; | 768 return; |
| 764 } | 769 } |
| 765 | 770 |
| 766 screen_info_ = params.screen_info; | 771 screen_info_ = params.screen_info; |
| 767 SetDeviceScaleFactor(screen_info_.deviceScaleFactor); | 772 SetDeviceScaleFactor(screen_info_.deviceScaleFactor); |
| 768 Resize(params.new_size, params.physical_backing_size, | 773 Resize(params.new_size, params.physical_backing_size, |
| 769 params.overdraw_bottom_height, params.resizer_rect, | 774 params.overdraw_bottom_height, params.visible_viewport_height, |
| 770 params.is_fullscreen, SEND_RESIZE_ACK); | 775 params.resizer_rect, params.is_fullscreen, SEND_RESIZE_ACK); |
| 771 } | 776 } |
| 772 | 777 |
| 773 void RenderWidget::OnChangeResizeRect(const gfx::Rect& resizer_rect) { | 778 void RenderWidget::OnChangeResizeRect(const gfx::Rect& resizer_rect) { |
| 774 if (resizer_rect_ != resizer_rect) { | 779 if (resizer_rect_ != resizer_rect) { |
| 775 gfx::Rect view_rect(size_); | 780 gfx::Rect view_rect(size_); |
| 776 | 781 |
| 777 gfx::Rect old_damage_rect = gfx::IntersectRects(view_rect, resizer_rect_); | 782 gfx::Rect old_damage_rect = gfx::IntersectRects(view_rect, resizer_rect_); |
| 778 if (!old_damage_rect.IsEmpty()) | 783 if (!old_damage_rect.IsEmpty()) |
| 779 has_frame_pending_ = true; | 784 has_frame_pending_ = true; |
| 780 | 785 |
| (...skipping 1709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2490 | 2495 |
| 2491 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2496 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { |
| 2492 swapped_out_frames_.AddObserver(frame); | 2497 swapped_out_frames_.AddObserver(frame); |
| 2493 } | 2498 } |
| 2494 | 2499 |
| 2495 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2500 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { |
| 2496 swapped_out_frames_.RemoveObserver(frame); | 2501 swapped_out_frames_.RemoveObserver(frame); |
| 2497 } | 2502 } |
| 2498 | 2503 |
| 2499 } // namespace content | 2504 } // namespace content |
| OLD | NEW |