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 |