Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(367)

Side by Side Diff: content/renderer/render_widget.cc

Issue 207553003: [DevTools] Allow partial device metrics emulation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698