| 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 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 bool fit_to_view); | 178 bool fit_to_view); |
| 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 CalculateScaleAndOffset(); |
| 188 void Apply(float overdraw_bottom_height, | 189 void Apply(float overdraw_bottom_height, |
| 189 gfx::Rect resizer_rect, bool is_fullscreen); | 190 gfx::Rect resizer_rect, bool is_fullscreen); |
| 190 | 191 |
| 191 RenderWidget* widget_; | 192 RenderWidget* widget_; |
| 192 | 193 |
| 193 // Parameters as passed by RenderWidget::EnableScreenMetricsEmulation. | 194 // Parameters as passed by RenderWidget::EnableScreenMetricsEmulation. |
| 194 gfx::Rect device_rect_; | 195 gfx::Rect device_rect_; |
| 195 gfx::Rect widget_rect_; | 196 gfx::Rect widget_rect_; |
| 196 float device_scale_factor_; | 197 float device_scale_factor_; |
| 197 bool fit_to_view_; | 198 bool fit_to_view_; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 float device_scale_factor, | 248 float device_scale_factor, |
| 248 bool fit_to_view) { | 249 bool fit_to_view) { |
| 249 device_rect_ = device_rect; | 250 device_rect_ = device_rect; |
| 250 widget_rect_ = widget_rect; | 251 widget_rect_ = widget_rect; |
| 251 device_scale_factor_ = device_scale_factor; | 252 device_scale_factor_ = device_scale_factor; |
| 252 fit_to_view_ = fit_to_view; | 253 fit_to_view_ = fit_to_view; |
| 253 Apply(widget_->overdraw_bottom_height_, | 254 Apply(widget_->overdraw_bottom_height_, |
| 254 widget_->resizer_rect_, widget_->is_fullscreen_); | 255 widget_->resizer_rect_, widget_->is_fullscreen_); |
| 255 } | 256 } |
| 256 | 257 |
| 257 void RenderWidget::ScreenMetricsEmulator::Apply( | 258 void RenderWidget::ScreenMetricsEmulator::CalculateScaleAndOffset() { |
| 258 float overdraw_bottom_height, gfx::Rect resizer_rect, bool is_fullscreen) { | |
| 259 if (fit_to_view_) { | 259 if (fit_to_view_) { |
| 260 DCHECK(!original_size_.IsEmpty()); | 260 DCHECK(!original_size_.IsEmpty()); |
| 261 | 261 |
| 262 int width_with_gutter = | 262 int width_with_gutter = |
| 263 std::max(original_size_.width() - 2 * device_rect_.x(), 1); | 263 std::max(original_size_.width() - 2 * device_rect_.x(), 1); |
| 264 int height_with_gutter = | 264 int height_with_gutter = |
| 265 std::max(original_size_.height() - 2 * device_rect_.y(), 1); | 265 std::max(original_size_.height() - 2 * device_rect_.y(), 1); |
| 266 float width_ratio = | 266 float width_ratio = |
| 267 static_cast<float>(widget_rect_.width()) / width_with_gutter; | 267 static_cast<float>(widget_rect_.width()) / width_with_gutter; |
| 268 float height_ratio = | 268 float height_ratio = |
| 269 static_cast<float>(widget_rect_.height()) / height_with_gutter; | 269 static_cast<float>(widget_rect_.height()) / height_with_gutter; |
| 270 float ratio = std::max(1.0f, std::max(width_ratio, height_ratio)); | 270 float ratio = std::max(1.0f, std::max(width_ratio, height_ratio)); |
| 271 scale_ = 1.f / ratio; | 271 scale_ = 1.f / ratio; |
| 272 |
| 273 // Center emulated view inside available view space. |
| 274 offset_.set_x((original_size_.width() - scale_ * widget_rect_.width()) / 2); |
| 275 offset_.set_y( |
| 276 (original_size_.height() - scale_ * widget_rect_.height()) / 2); |
| 272 } else { | 277 } else { |
| 273 scale_ = 1.f; | 278 scale_ = 1.f; |
| 279 offset_.SetPoint(0, 0); |
| 280 } |
| 281 } |
| 282 |
| 283 void RenderWidget::ScreenMetricsEmulator::Apply( |
| 284 float overdraw_bottom_height, gfx::Rect resizer_rect, bool is_fullscreen) { |
| 285 gfx::Rect applied_widget_rect = widget_rect_; |
| 286 if (widget_rect_.size().IsEmpty()) { |
| 287 scale_ = 1.f; |
| 288 offset_.SetPoint(0, 0); |
| 289 applied_widget_rect = |
| 290 gfx::Rect(original_view_screen_rect_.origin(), original_size_); |
| 291 } else { |
| 292 CalculateScaleAndOffset(); |
| 274 } | 293 } |
| 275 | 294 |
| 276 // Center emulated view inside available view space. | 295 if (device_rect_.size().IsEmpty()) { |
| 277 offset_.set_x((original_size_.width() - scale_ * widget_rect_.width()) / 2); | 296 widget_->screen_info_.rect = original_screen_info_.rect; |
| 278 offset_.set_y((original_size_.height() - scale_ * widget_rect_.height()) / 2); | 297 widget_->screen_info_.availableRect = original_screen_info_.availableRect; |
| 298 widget_->window_screen_rect_ = original_window_screen_rect_; |
| 299 } else { |
| 300 widget_->screen_info_.rect = gfx::Rect(device_rect_.size()); |
| 301 widget_->screen_info_.availableRect = gfx::Rect(device_rect_.size()); |
| 302 widget_->window_screen_rect_ = widget_->screen_info_.availableRect; |
| 303 } |
| 279 | 304 |
| 280 widget_->screen_info_.rect = gfx::Rect(device_rect_.size()); | 305 float applied_device_scale_factor = device_scale_factor_ ? |
| 281 widget_->screen_info_.availableRect = gfx::Rect(device_rect_.size()); | 306 device_scale_factor_ : original_screen_info_.deviceScaleFactor; |
| 282 widget_->screen_info_.deviceScaleFactor = device_scale_factor_; | 307 widget_->screen_info_.deviceScaleFactor = applied_device_scale_factor; |
| 283 | 308 |
| 284 // Pass three emulation parameters to the blink side: | 309 // Pass three emulation parameters to the blink side: |
| 285 // - we keep the real device scale factor in compositor to produce sharp image | 310 // - we keep the real device scale factor in compositor to produce sharp image |
| 286 // even when emulating different scale factor; | 311 // even when emulating different scale factor; |
| 287 // - in order to fit into view, WebView applies offset and scale to the | 312 // - in order to fit into view, WebView applies offset and scale to the |
| 288 // root layer. | 313 // root layer. |
| 289 widget_->SetScreenMetricsEmulationParameters( | 314 widget_->SetScreenMetricsEmulationParameters( |
| 290 original_screen_info_.deviceScaleFactor, offset_, scale_); | 315 original_screen_info_.deviceScaleFactor, offset_, scale_); |
| 291 | 316 |
| 292 widget_->SetDeviceScaleFactor(device_scale_factor_); | 317 widget_->SetDeviceScaleFactor(applied_device_scale_factor); |
| 293 widget_->view_screen_rect_ = widget_rect_; | 318 widget_->view_screen_rect_ = applied_widget_rect; |
| 294 widget_->window_screen_rect_ = widget_->screen_info_.availableRect; | |
| 295 | 319 |
| 296 gfx::Size physical_backing_size = gfx::ToCeiledSize(gfx::ScaleSize( | 320 gfx::Size physical_backing_size = gfx::ToCeiledSize(gfx::ScaleSize( |
| 297 original_size_, original_screen_info_.deviceScaleFactor)); | 321 original_size_, original_screen_info_.deviceScaleFactor)); |
| 298 widget_->Resize(widget_rect_.size(), physical_backing_size, | 322 widget_->Resize(applied_widget_rect.size(), physical_backing_size, |
| 299 overdraw_bottom_height, resizer_rect, is_fullscreen, NO_RESIZE_ACK); | 323 overdraw_bottom_height, resizer_rect, is_fullscreen, NO_RESIZE_ACK); |
| 300 } | 324 } |
| 301 | 325 |
| 302 void RenderWidget::ScreenMetricsEmulator::OnResizeMessage( | 326 void RenderWidget::ScreenMetricsEmulator::OnResizeMessage( |
| 303 const ViewMsg_Resize_Params& params) { | 327 const ViewMsg_Resize_Params& params) { |
| 304 bool need_ack = params.new_size != original_size_ && | 328 bool need_ack = params.new_size != original_size_ && |
| 305 !params.new_size.IsEmpty() && !params.physical_backing_size.IsEmpty(); | 329 !params.new_size.IsEmpty() && !params.physical_backing_size.IsEmpty(); |
| 306 original_size_ = params.new_size; | 330 original_size_ = params.new_size; |
| 307 original_physical_backing_size_ = params.physical_backing_size; | 331 original_physical_backing_size_ = params.physical_backing_size; |
| 308 original_screen_info_ = params.screen_info; | 332 original_screen_info_ = params.screen_info; |
| 309 Apply(params.overdraw_bottom_height, params.resizer_rect, | 333 Apply(params.overdraw_bottom_height, params.resizer_rect, |
| 310 params.is_fullscreen); | 334 params.is_fullscreen); |
| 311 | 335 |
| 312 if (need_ack) { | 336 if (need_ack) { |
| 313 widget_->set_next_paint_is_resize_ack(); | 337 widget_->set_next_paint_is_resize_ack(); |
| 314 if (widget_->compositor_) | 338 if (widget_->compositor_) |
| 315 widget_->compositor_->SetNeedsRedrawRect(gfx::Rect(widget_->size_)); | 339 widget_->compositor_->SetNeedsRedrawRect(gfx::Rect(widget_->size_)); |
| 316 } | 340 } |
| 317 } | 341 } |
| 318 | 342 |
| 319 void RenderWidget::ScreenMetricsEmulator::OnUpdateScreenRectsMessage( | 343 void RenderWidget::ScreenMetricsEmulator::OnUpdateScreenRectsMessage( |
| 320 const gfx::Rect& view_screen_rect, | 344 const gfx::Rect& view_screen_rect, |
| 321 const gfx::Rect& window_screen_rect) { | 345 const gfx::Rect& window_screen_rect) { |
| 322 original_view_screen_rect_ = view_screen_rect; | 346 original_view_screen_rect_ = view_screen_rect; |
| 323 original_window_screen_rect_ = window_screen_rect; | 347 original_window_screen_rect_ = window_screen_rect; |
| 348 if (device_rect_.size().IsEmpty()) |
| 349 widget_->window_screen_rect_ = window_screen_rect; |
| 350 if (widget_rect_.size().IsEmpty()) |
| 351 widget_->view_screen_rect_ = view_screen_rect; |
| 324 } | 352 } |
| 325 | 353 |
| 326 void RenderWidget::ScreenMetricsEmulator::OnShowContextMenu( | 354 void RenderWidget::ScreenMetricsEmulator::OnShowContextMenu( |
| 327 ContextMenuParams* params) { | 355 ContextMenuParams* params) { |
| 328 params->x *= scale_; | 356 params->x *= scale_; |
| 329 params->x += offset_.x(); | 357 params->x += offset_.x(); |
| 330 params->y *= scale_; | 358 params->y *= scale_; |
| 331 params->y += offset_.y(); | 359 params->y += offset_.y(); |
| 332 } | 360 } |
| 333 | 361 |
| (...skipping 2499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2833 | 2861 |
| 2834 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2862 void RenderWidget::RegisterSwappedOutChildFrame(RenderFrameImpl* frame) { |
| 2835 swapped_out_frames_.AddObserver(frame); | 2863 swapped_out_frames_.AddObserver(frame); |
| 2836 } | 2864 } |
| 2837 | 2865 |
| 2838 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { | 2866 void RenderWidget::UnregisterSwappedOutChildFrame(RenderFrameImpl* frame) { |
| 2839 swapped_out_frames_.RemoveObserver(frame); | 2867 swapped_out_frames_.RemoveObserver(frame); |
| 2840 } | 2868 } |
| 2841 | 2869 |
| 2842 } // namespace content | 2870 } // namespace content |
| OLD | NEW |