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 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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, |
190 gfx::Rect resizer_rect, bool is_fullscreen); | 190 const gfx::Size& visible_viewport_size, |
| 191 gfx::Rect resizer_rect, |
| 192 bool is_fullscreen); |
191 | 193 |
192 RenderWidget* widget_; | 194 RenderWidget* widget_; |
193 | 195 |
194 // Parameters as passed by RenderWidget::EnableScreenMetricsEmulation. | 196 // Parameters as passed by RenderWidget::EnableScreenMetricsEmulation. |
195 WebDeviceEmulationParams params_; | 197 WebDeviceEmulationParams params_; |
196 | 198 |
197 // The computed scale and offset used to fit widget into browser window. | 199 // The computed scale and offset used to fit widget into browser window. |
198 float scale_; | 200 float scale_; |
199 gfx::Point offset_; | 201 gfx::Point offset_; |
200 | 202 |
(...skipping 12 matching lines...) Expand all Loading... |
213 RenderWidget* widget, | 215 RenderWidget* widget, |
214 const WebDeviceEmulationParams& params) | 216 const WebDeviceEmulationParams& params) |
215 : widget_(widget), | 217 : widget_(widget), |
216 params_(params), | 218 params_(params), |
217 scale_(1.f) { | 219 scale_(1.f) { |
218 original_size_ = widget_->size_; | 220 original_size_ = widget_->size_; |
219 original_physical_backing_size_ = widget_->physical_backing_size_; | 221 original_physical_backing_size_ = widget_->physical_backing_size_; |
220 original_screen_info_ = widget_->screen_info_; | 222 original_screen_info_ = widget_->screen_info_; |
221 original_view_screen_rect_ = widget_->view_screen_rect_; | 223 original_view_screen_rect_ = widget_->view_screen_rect_; |
222 original_window_screen_rect_ = widget_->window_screen_rect_; | 224 original_window_screen_rect_ = widget_->window_screen_rect_; |
223 Apply(widget_->overdraw_bottom_height_, | 225 Apply(widget_->overdraw_bottom_height_, widget_->visible_viewport_size_, |
224 widget_->resizer_rect_, widget_->is_fullscreen_); | 226 widget_->resizer_rect_, widget_->is_fullscreen_); |
225 } | 227 } |
226 | 228 |
227 RenderWidget::ScreenMetricsEmulator::~ScreenMetricsEmulator() { | 229 RenderWidget::ScreenMetricsEmulator::~ScreenMetricsEmulator() { |
228 widget_->screen_info_ = original_screen_info_; | 230 widget_->screen_info_ = original_screen_info_; |
229 | 231 |
230 widget_->SetDeviceScaleFactor(original_screen_info_.deviceScaleFactor); | 232 widget_->SetDeviceScaleFactor(original_screen_info_.deviceScaleFactor); |
231 widget_->SetScreenMetricsEmulationParameters(0.f, gfx::Point(), 1.f); | 233 widget_->SetScreenMetricsEmulationParameters(0.f, gfx::Point(), 1.f); |
232 widget_->view_screen_rect_ = original_view_screen_rect_; | 234 widget_->view_screen_rect_ = original_view_screen_rect_; |
233 widget_->window_screen_rect_ = original_window_screen_rect_; | 235 widget_->window_screen_rect_ = original_window_screen_rect_; |
234 widget_->Resize(original_size_, original_physical_backing_size_, | 236 widget_->Resize(original_size_, original_physical_backing_size_, |
235 widget_->overdraw_bottom_height_, widget_->resizer_rect_, | 237 widget_->overdraw_bottom_height_, widget_->visible_viewport_size_, |
236 widget_->is_fullscreen_, NO_RESIZE_ACK); | 238 widget_->resizer_rect_, widget_->is_fullscreen_, NO_RESIZE_ACK); |
237 } | 239 } |
238 | 240 |
239 void RenderWidget::ScreenMetricsEmulator::ChangeEmulationParams( | 241 void RenderWidget::ScreenMetricsEmulator::ChangeEmulationParams( |
240 const WebDeviceEmulationParams& params) { | 242 const WebDeviceEmulationParams& params) { |
241 params_ = params; | 243 params_ = params; |
242 Reapply(); | 244 Reapply(); |
243 } | 245 } |
244 | 246 |
245 void RenderWidget::ScreenMetricsEmulator::Reapply() { | 247 void RenderWidget::ScreenMetricsEmulator::Reapply() { |
246 Apply(widget_->overdraw_bottom_height_, | 248 Apply(widget_->overdraw_bottom_height_, widget_->visible_viewport_size_, |
247 widget_->resizer_rect_, widget_->is_fullscreen_); | 249 widget_->resizer_rect_, widget_->is_fullscreen_); |
248 } | 250 } |
249 | 251 |
250 void RenderWidget::ScreenMetricsEmulator::Apply( | 252 void RenderWidget::ScreenMetricsEmulator::Apply( |
251 float overdraw_bottom_height, gfx::Rect resizer_rect, bool is_fullscreen) { | 253 float overdraw_bottom_height, |
| 254 const gfx::Size& visible_viewport_size, |
| 255 gfx::Rect resizer_rect, |
| 256 bool is_fullscreen) { |
252 applied_widget_rect_.set_size(params_.viewSize.isEmpty() ? | 257 applied_widget_rect_.set_size(params_.viewSize.isEmpty() ? |
253 original_size_ : gfx::Size(params_.viewSize)); | 258 original_size_ : gfx::Size(params_.viewSize)); |
254 | 259 |
255 if (params_.fitToView) { | 260 if (params_.fitToView) { |
256 DCHECK(!original_size_.IsEmpty()); | 261 DCHECK(!original_size_.IsEmpty()); |
257 | 262 |
258 int width_with_gutter = | 263 int width_with_gutter = |
259 std::max(original_size_.width() - 2 * params_.viewInsets.width, 1); | 264 std::max(original_size_.width() - 2 * params_.viewInsets.width, 1); |
260 int height_with_gutter = | 265 int height_with_gutter = |
261 std::max(original_size_.height() - 2 * params_.viewInsets.height, 1); | 266 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. | 304 // root layer. |
300 widget_->SetScreenMetricsEmulationParameters( | 305 widget_->SetScreenMetricsEmulationParameters( |
301 original_screen_info_.deviceScaleFactor, offset_, scale_); | 306 original_screen_info_.deviceScaleFactor, offset_, scale_); |
302 | 307 |
303 widget_->SetDeviceScaleFactor(applied_device_scale_factor); | 308 widget_->SetDeviceScaleFactor(applied_device_scale_factor); |
304 widget_->view_screen_rect_ = applied_widget_rect_; | 309 widget_->view_screen_rect_ = applied_widget_rect_; |
305 | 310 |
306 gfx::Size physical_backing_size = gfx::ToCeiledSize(gfx::ScaleSize( | 311 gfx::Size physical_backing_size = gfx::ToCeiledSize(gfx::ScaleSize( |
307 original_size_, original_screen_info_.deviceScaleFactor)); | 312 original_size_, original_screen_info_.deviceScaleFactor)); |
308 widget_->Resize(applied_widget_rect_.size(), physical_backing_size, | 313 widget_->Resize(applied_widget_rect_.size(), physical_backing_size, |
309 overdraw_bottom_height, resizer_rect, is_fullscreen, NO_RESIZE_ACK); | 314 overdraw_bottom_height, visible_viewport_size, resizer_rect, |
| 315 is_fullscreen, NO_RESIZE_ACK); |
310 } | 316 } |
311 | 317 |
312 void RenderWidget::ScreenMetricsEmulator::OnResizeMessage( | 318 void RenderWidget::ScreenMetricsEmulator::OnResizeMessage( |
313 const ViewMsg_Resize_Params& params) { | 319 const ViewMsg_Resize_Params& params) { |
314 bool need_ack = params.new_size != original_size_ && | 320 bool need_ack = params.new_size != original_size_ && |
315 !params.new_size.IsEmpty() && !params.physical_backing_size.IsEmpty(); | 321 !params.new_size.IsEmpty() && !params.physical_backing_size.IsEmpty(); |
316 original_size_ = params.new_size; | 322 original_size_ = params.new_size; |
317 original_physical_backing_size_ = params.physical_backing_size; | 323 original_physical_backing_size_ = params.physical_backing_size; |
318 original_screen_info_ = params.screen_info; | 324 original_screen_info_ = params.screen_info; |
319 Apply(params.overdraw_bottom_height, params.resizer_rect, | 325 Apply(params.overdraw_bottom_height, params.visible_viewport_size, |
320 params.is_fullscreen); | 326 params.resizer_rect, params.is_fullscreen); |
321 | 327 |
322 if (need_ack) { | 328 if (need_ack) { |
323 widget_->set_next_paint_is_resize_ack(); | 329 widget_->set_next_paint_is_resize_ack(); |
324 if (widget_->compositor_) | 330 if (widget_->compositor_) |
325 widget_->compositor_->SetNeedsRedrawRect(gfx::Rect(widget_->size_)); | 331 widget_->compositor_->SetNeedsRedrawRect(gfx::Rect(widget_->size_)); |
326 } | 332 } |
327 } | 333 } |
328 | 334 |
329 void RenderWidget::ScreenMetricsEmulator::OnUpdateScreenRectsMessage( | 335 void RenderWidget::ScreenMetricsEmulator::OnUpdateScreenRectsMessage( |
330 const gfx::Rect& view_screen_rect, | 336 const gfx::Rect& view_screen_rect, |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 // If given a messsage without a routing ID, then assign our routing ID. | 629 // If given a messsage without a routing ID, then assign our routing ID. |
624 if (message->routing_id() == MSG_ROUTING_NONE) | 630 if (message->routing_id() == MSG_ROUTING_NONE) |
625 message->set_routing_id(routing_id_); | 631 message->set_routing_id(routing_id_); |
626 | 632 |
627 return RenderThread::Get()->Send(message); | 633 return RenderThread::Get()->Send(message); |
628 } | 634 } |
629 | 635 |
630 void RenderWidget::Resize(const gfx::Size& new_size, | 636 void RenderWidget::Resize(const gfx::Size& new_size, |
631 const gfx::Size& physical_backing_size, | 637 const gfx::Size& physical_backing_size, |
632 float overdraw_bottom_height, | 638 float overdraw_bottom_height, |
| 639 const gfx::Size& visible_viewport_size, |
633 const gfx::Rect& resizer_rect, | 640 const gfx::Rect& resizer_rect, |
634 bool is_fullscreen, | 641 bool is_fullscreen, |
635 ResizeAck resize_ack) { | 642 ResizeAck resize_ack) { |
636 if (resizing_mode_selector_->NeverUsesSynchronousResize()) { | 643 if (resizing_mode_selector_->NeverUsesSynchronousResize()) { |
637 // A resize ack shouldn't be requested if we have not ACK'd the previous | 644 // A resize ack shouldn't be requested if we have not ACK'd the previous |
638 // one. | 645 // one. |
639 DCHECK(resize_ack != SEND_RESIZE_ACK || !next_paint_is_resize_ack()); | 646 DCHECK(resize_ack != SEND_RESIZE_ACK || !next_paint_is_resize_ack()); |
640 DCHECK(resize_ack == SEND_RESIZE_ACK || resize_ack == NO_RESIZE_ACK); | 647 DCHECK(resize_ack == SEND_RESIZE_ACK || resize_ack == NO_RESIZE_ACK); |
641 } | 648 } |
642 | 649 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
674 | 681 |
675 if (resizing_mode_selector_->NeverUsesSynchronousResize()) { | 682 if (resizing_mode_selector_->NeverUsesSynchronousResize()) { |
676 // Resize should have caused an invalidation of the entire view. | 683 // Resize should have caused an invalidation of the entire view. |
677 DCHECK(new_size.IsEmpty() || is_accelerated_compositing_active_ || | 684 DCHECK(new_size.IsEmpty() || is_accelerated_compositing_active_ || |
678 has_frame_pending_); | 685 has_frame_pending_); |
679 } | 686 } |
680 } else if (!resizing_mode_selector_->is_synchronous_mode()) { | 687 } else if (!resizing_mode_selector_->is_synchronous_mode()) { |
681 resize_ack = NO_RESIZE_ACK; | 688 resize_ack = NO_RESIZE_ACK; |
682 } | 689 } |
683 | 690 |
| 691 webwidget()->resizePinchViewport(gfx::Size( |
| 692 visible_viewport_size.width(), |
| 693 visible_viewport_size.height())); |
| 694 |
684 if (new_size.IsEmpty() || physical_backing_size.IsEmpty()) { | 695 if (new_size.IsEmpty() || physical_backing_size.IsEmpty()) { |
685 // For empty size or empty physical_backing_size, there is no next paint | 696 // For empty size or empty physical_backing_size, there is no next paint |
686 // (along with which to send the ack) until they are set to non-empty. | 697 // (along with which to send the ack) until they are set to non-empty. |
687 resize_ack = NO_RESIZE_ACK; | 698 resize_ack = NO_RESIZE_ACK; |
688 } | 699 } |
689 | 700 |
690 // Send the Resize_ACK flag once we paint again if requested. | 701 // Send the Resize_ACK flag once we paint again if requested. |
691 if (resize_ack == SEND_RESIZE_ACK) | 702 if (resize_ack == SEND_RESIZE_ACK) |
692 set_next_paint_is_resize_ack(); | 703 set_next_paint_is_resize_ack(); |
693 | 704 |
694 if (fullscreen_change) | 705 if (fullscreen_change) |
695 DidToggleFullscreen(); | 706 DidToggleFullscreen(); |
696 | 707 |
697 // If a resize ack is requested and it isn't set-up, then no more resizes will | 708 // If a resize ack is requested and it isn't set-up, then no more resizes will |
698 // come in and in general things will go wrong. | 709 // come in and in general things will go wrong. |
699 DCHECK(resize_ack != SEND_RESIZE_ACK || next_paint_is_resize_ack()); | 710 DCHECK(resize_ack != SEND_RESIZE_ACK || next_paint_is_resize_ack()); |
700 } | 711 } |
701 | 712 |
702 void RenderWidget::ResizeSynchronously(const gfx::Rect& new_position) { | 713 void RenderWidget::ResizeSynchronously(const gfx::Rect& new_position) { |
703 Resize(new_position.size(), new_position.size(), overdraw_bottom_height_, | 714 Resize(new_position.size(), new_position.size(), overdraw_bottom_height_, |
704 gfx::Rect(), is_fullscreen_, NO_RESIZE_ACK); | 715 visible_viewport_size_, gfx::Rect(), is_fullscreen_, NO_RESIZE_ACK); |
705 view_screen_rect_ = new_position; | 716 view_screen_rect_ = new_position; |
706 window_screen_rect_ = new_position; | 717 window_screen_rect_ = new_position; |
707 if (!did_show_) | 718 if (!did_show_) |
708 initial_pos_ = new_position; | 719 initial_pos_ = new_position; |
709 } | 720 } |
710 | 721 |
711 void RenderWidget::OnClose() { | 722 void RenderWidget::OnClose() { |
712 if (closing_) | 723 if (closing_) |
713 return; | 724 return; |
714 closing_ = true; | 725 closing_ = true; |
(...skipping 29 matching lines...) Expand all Loading... |
744 return; | 755 return; |
745 | 756 |
746 if (screen_metrics_emulator_) { | 757 if (screen_metrics_emulator_) { |
747 screen_metrics_emulator_->OnResizeMessage(params); | 758 screen_metrics_emulator_->OnResizeMessage(params); |
748 return; | 759 return; |
749 } | 760 } |
750 | 761 |
751 screen_info_ = params.screen_info; | 762 screen_info_ = params.screen_info; |
752 SetDeviceScaleFactor(screen_info_.deviceScaleFactor); | 763 SetDeviceScaleFactor(screen_info_.deviceScaleFactor); |
753 Resize(params.new_size, params.physical_backing_size, | 764 Resize(params.new_size, params.physical_backing_size, |
754 params.overdraw_bottom_height, params.resizer_rect, | 765 params.overdraw_bottom_height, params.visible_viewport_size, |
755 params.is_fullscreen, SEND_RESIZE_ACK); | 766 params.resizer_rect, params.is_fullscreen, SEND_RESIZE_ACK); |
756 } | 767 } |
757 | 768 |
758 void RenderWidget::OnChangeResizeRect(const gfx::Rect& resizer_rect) { | 769 void RenderWidget::OnChangeResizeRect(const gfx::Rect& resizer_rect) { |
759 if (resizer_rect_ != resizer_rect) { | 770 if (resizer_rect_ != resizer_rect) { |
760 gfx::Rect view_rect(size_); | 771 gfx::Rect view_rect(size_); |
761 | 772 |
762 gfx::Rect old_damage_rect = gfx::IntersectRects(view_rect, resizer_rect_); | 773 gfx::Rect old_damage_rect = gfx::IntersectRects(view_rect, resizer_rect_); |
763 if (!old_damage_rect.IsEmpty()) | 774 if (!old_damage_rect.IsEmpty()) |
764 has_frame_pending_ = true; | 775 has_frame_pending_ = true; |
765 | 776 |
(...skipping 1562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2328 | 2339 |
2329 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2340 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { |
2330 swapped_out_frames_.AddObserver(frame); | 2341 swapped_out_frames_.AddObserver(frame); |
2331 } | 2342 } |
2332 | 2343 |
2333 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2344 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { |
2334 swapped_out_frames_.RemoveObserver(frame); | 2345 swapped_out_frames_.RemoveObserver(frame); |
2335 } | 2346 } |
2336 | 2347 |
2337 } // namespace content | 2348 } // namespace content |
OLD | NEW |