summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpfeldman <pfeldman@chromium.org>2016-02-11 17:26:21 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-12 01:27:21 +0000
commitac854a1529eee3fdd9cec118e9516596fa5cb0c6 (patch)
tree56538bff3c715320d95fdb99ef93997c760118c9
parentdcf93f069636d8d4f8ab84b300c7cc2e9bce97ab (diff)
downloadchromium_src-ac854a1529eee3fdd9cec118e9516596fa5cb0c6.zip
chromium_src-ac854a1529eee3fdd9cec118e9516596fa5cb0c6.tar.gz
chromium_src-ac854a1529eee3fdd9cec118e9516596fa5cb0c6.tar.bz2
Revert of Decouple ScreenMetricsEmulator From RenderWidget (patchset #9 id:160001 of https://codereview.chromium.org/1675783002/ )
Reason for revert: speculative revert: http://test-results.appspot.com/dashboards/flakiness_dashboard.html#tests=inspector/elements/styles-4/styles-update-links.html Original issue's description: > Decouple ScreenMetricsEmulator From RenderWidget > > This is part of the ongoing effort to thin down RenderWidget to be just IPC transport. > Started in http://crrev.com/1599583002 > > BUG=577321 TBR=dgozman@chromium.org,fsamuel@chromium.org,jam@chromium.org,mfomitchev@chromium.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=577321 Review URL: https://codereview.chromium.org/1692083003 Cr-Commit-Position: refs/heads/master@{#375078}
-rw-r--r--content/content_renderer.gypi2
-rw-r--r--content/renderer/devtools/render_widget_screen_metrics_emulator.cc162
-rw-r--r--content/renderer/devtools/render_widget_screen_metrics_emulator.h88
-rw-r--r--content/renderer/devtools/render_widget_screen_metrics_emulator_delegate.h44
-rw-r--r--content/renderer/render_view_impl.cc21
-rw-r--r--content/renderer/render_widget.cc490
-rw-r--r--content/renderer/render_widget.h40
7 files changed, 386 insertions, 461 deletions
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi
index 75c3c86..9b7a00f 100644
--- a/content/content_renderer.gypi
+++ b/content/content_renderer.gypi
@@ -170,8 +170,6 @@
'renderer/devtools/devtools_cpu_throttler.cc',
'renderer/devtools/devtools_cpu_throttler.h',
'renderer/devtools/lock_free_circular_queue.h',
- 'renderer/devtools/render_widget_screen_metrics_emulator.cc',
- 'renderer/devtools/render_widget_screen_metrics_emulator.h',
'renderer/devtools/v8_sampling_profiler.cc',
'renderer/devtools/v8_sampling_profiler.h',
'renderer/disambiguation_popup_helper.cc',
diff --git a/content/renderer/devtools/render_widget_screen_metrics_emulator.cc b/content/renderer/devtools/render_widget_screen_metrics_emulator.cc
deleted file mode 100644
index 5843379..0000000
--- a/content/renderer/devtools/render_widget_screen_metrics_emulator.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/devtools/render_widget_screen_metrics_emulator.h"
-
-#include "content/common/resize_params.h"
-#include "content/public/common/context_menu_params.h"
-#include "content/renderer/devtools/render_widget_screen_metrics_emulator_delegate.h"
-
-namespace content {
-
-RenderWidgetScreenMetricsEmulator::RenderWidgetScreenMetricsEmulator(
- RenderWidgetScreenMetricsEmulatorDelegate* delegate,
- const blink::WebDeviceEmulationParams& params,
- const ResizeParams& resize_params,
- const gfx::Rect& view_screen_rect,
- const gfx::Rect& window_screen_rect)
- : delegate_(delegate),
- emulation_params_(params),
- scale_(1.f),
- original_resize_params_(resize_params),
- original_view_screen_rect_(view_screen_rect),
- original_window_screen_rect_(window_screen_rect) {
- Apply();
-}
-
-RenderWidgetScreenMetricsEmulator::~RenderWidgetScreenMetricsEmulator() {
- delegate_->SetScreenMetricsEmulationParameters(false, emulation_params_);
- delegate_->SetScreenRects(original_view_screen_rect_,
- original_window_screen_rect_);
- delegate_->Resize(original_resize_params_);
-}
-
-void RenderWidgetScreenMetricsEmulator::ChangeEmulationParams(
- const blink::WebDeviceEmulationParams& params) {
- emulation_params_ = params;
- Apply();
-}
-
-void RenderWidgetScreenMetricsEmulator::Apply() {
- ResizeParams modified_resize_params = original_resize_params_;
- applied_widget_rect_.set_size(gfx::Size(emulation_params_.viewSize));
-
- if (!applied_widget_rect_.width())
- applied_widget_rect_.set_width(original_size().width());
-
- if (!applied_widget_rect_.height())
- applied_widget_rect_.set_height(original_size().height());
-
- if (emulation_params_.fitToView && !original_size().IsEmpty()) {
- int original_width = std::max(original_size().width(), 1);
- int original_height = std::max(original_size().height(), 1);
- float width_ratio =
- static_cast<float>(applied_widget_rect_.width()) / original_width;
- float height_ratio =
- static_cast<float>(applied_widget_rect_.height()) / original_height;
- float ratio = std::max(1.0f, std::max(width_ratio, height_ratio));
- scale_ = 1.f / ratio;
-
- // Center emulated view inside available view space.
- offset_.set_x(
- (original_size().width() - scale_ * applied_widget_rect_.width()) / 2);
- offset_.set_y(
- (original_size().height() - scale_ * applied_widget_rect_.height()) /
- 2);
- } else {
- scale_ = emulation_params_.scale;
- offset_.SetPoint(emulation_params_.offset.x, emulation_params_.offset.y);
- if (!emulation_params_.viewSize.width &&
- !emulation_params_.viewSize.height && scale_) {
- applied_widget_rect_.set_size(
- gfx::ScaleToRoundedSize(original_size(), 1.f / scale_));
- }
- }
-
- gfx::Rect window_screen_rect;
- if (emulation_params_.screenPosition ==
- blink::WebDeviceEmulationParams::Desktop) {
- applied_widget_rect_.set_origin(original_view_screen_rect_.origin());
- modified_resize_params.screen_info.rect = original_screen_info().rect;
- modified_resize_params.screen_info.availableRect =
- original_screen_info().availableRect;
- window_screen_rect = original_window_screen_rect_;
- } else {
- applied_widget_rect_.set_origin(emulation_params_.viewPosition);
- gfx::Rect screen_rect = applied_widget_rect_;
- if (!emulation_params_.screenSize.isEmpty()) {
- screen_rect = gfx::Rect(0, 0, emulation_params_.screenSize.width,
- emulation_params_.screenSize.height);
- }
- modified_resize_params.screen_info.rect = screen_rect;
- modified_resize_params.screen_info.availableRect = screen_rect;
- window_screen_rect = applied_widget_rect_;
- }
-
- modified_resize_params.screen_info.deviceScaleFactor =
- emulation_params_.deviceScaleFactor
- ? emulation_params_.deviceScaleFactor
- : original_screen_info().deviceScaleFactor;
-
- // Pass three emulation parameters to the blink side:
- // - we keep the real device scale factor in compositor to produce sharp image
- // even when emulating different scale factor;
- // - in order to fit into view, WebView applies offset and scale to the
- // root layer.
- blink::WebDeviceEmulationParams modified_emulation_params = emulation_params_;
- modified_emulation_params.deviceScaleFactor =
- original_screen_info().deviceScaleFactor;
- modified_emulation_params.offset =
- blink::WebFloatPoint(offset_.x(), offset_.y());
- modified_emulation_params.scale = scale_;
- delegate_->SetScreenMetricsEmulationParameters(true,
- modified_emulation_params);
-
- delegate_->SetScreenRects(applied_widget_rect_, window_screen_rect);
-
- modified_resize_params.physical_backing_size =
- gfx::ScaleToCeiledSize(original_resize_params_.new_size,
- original_screen_info().deviceScaleFactor);
- modified_resize_params.new_size = applied_widget_rect_.size();
- modified_resize_params.visible_viewport_size = applied_widget_rect_.size();
- modified_resize_params.needs_resize_ack = false;
- delegate_->Resize(modified_resize_params);
-}
-
-void RenderWidgetScreenMetricsEmulator::OnResize(const ResizeParams& params) {
- original_resize_params_ = params;
- Apply();
-
- if (params.needs_resize_ack)
- delegate_->Redraw();
-}
-
-void RenderWidgetScreenMetricsEmulator::OnUpdateScreenRects(
- const gfx::Rect& view_screen_rect,
- const gfx::Rect& window_screen_rect) {
- original_view_screen_rect_ = view_screen_rect;
- original_window_screen_rect_ = window_screen_rect;
- if (emulation_params_.screenPosition ==
- blink::WebDeviceEmulationParams::Desktop) {
- Apply();
- }
-}
-
-void RenderWidgetScreenMetricsEmulator::OnShowContextMenu(
- ContextMenuParams* params) {
- params->x *= scale_;
- params->x += offset_.x();
- params->y *= scale_;
- params->y += offset_.y();
-}
-
-gfx::Rect RenderWidgetScreenMetricsEmulator::AdjustValidationMessageAnchor(
- const gfx::Rect& anchor) {
- gfx::Rect scaled = gfx::ScaleToEnclosedRect(anchor, scale_);
- scaled.set_x(scaled.x() + offset_.x());
- scaled.set_y(scaled.y() + offset_.y());
- return scaled;
-}
-
-} // namespace content
diff --git a/content/renderer/devtools/render_widget_screen_metrics_emulator.h b/content/renderer/devtools/render_widget_screen_metrics_emulator.h
deleted file mode 100644
index 8288dfa..0000000
--- a/content/renderer/devtools/render_widget_screen_metrics_emulator.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_DEVTOOLS_RENDER_WIDGET_SCREEN_METRICS_EMULATOR_H_
-#define CONTENT_RENDERER_DEVTOOLS_RENDER_WIDGET_SCREEN_METRICS_EMULATOR_H_
-
-#include "base/memory/scoped_ptr.h"
-#include "content/common/resize_params.h"
-#include "third_party/WebKit/public/web/WebDeviceEmulationParams.h"
-
-namespace gfx {
-class PointF;
-class Rect;
-}
-
-namespace content {
-
-class RenderWidgetScreenMetricsEmulatorDelegate;
-struct ContextMenuParams;
-
-// RenderWidgetScreenMetricsEmulator class manages screen emulation inside a
-// RenderWidget. This includes resizing, placing view on the screen at desired
-// position, changing device scale factor, and scaling down the whole
-// widget if required to fit into the browser window.
-class RenderWidgetScreenMetricsEmulator {
- public:
- RenderWidgetScreenMetricsEmulator(
- RenderWidgetScreenMetricsEmulatorDelegate* delegate,
- const blink::WebDeviceEmulationParams& params,
- const ResizeParams& resize_params,
- const gfx::Rect& view_screen_rect,
- const gfx::Rect& window_screen_rect);
- virtual ~RenderWidgetScreenMetricsEmulator();
-
- // Scale and offset used to convert between host coordinates
- // and webwidget coordinates.
- const gfx::Size& original_size() const {
- return original_resize_params_.new_size;
- }
-
- float scale() const { return scale_; }
- const gfx::PointF& offset() const { return offset_; }
- const gfx::Rect& applied_widget_rect() const { return applied_widget_rect_; }
- const blink::WebScreenInfo& original_screen_info() const {
- return original_resize_params_.screen_info;
- }
- const gfx::Rect& original_screen_rect() const {
- return original_view_screen_rect_;
- }
-
- void ChangeEmulationParams(const blink::WebDeviceEmulationParams& params);
-
- // The following methods alter handlers' behavior for messages related to
- // widget size and position.
- void OnResize(const ResizeParams& params);
- void OnUpdateScreenRects(const gfx::Rect& view_screen_rect,
- const gfx::Rect& window_screen_rect);
- void OnShowContextMenu(ContextMenuParams* params);
- gfx::Rect AdjustValidationMessageAnchor(const gfx::Rect& anchor);
-
- private:
- // Apply original_resize_params_
- void Apply();
-
- RenderWidgetScreenMetricsEmulatorDelegate* const delegate_;
-
- // Parameters as passed by RenderWidget::EnableScreenMetricsEmulation.
- blink::WebDeviceEmulationParams emulation_params_;
-
- // The computed scale and offset used to fit widget into browser window.
- float scale_;
- gfx::PointF offset_;
-
- // Widget rect as passed to webwidget.
- gfx::Rect applied_widget_rect_;
-
- // Original values to restore back after emulation ends.
- ResizeParams original_resize_params_;
- gfx::Rect original_view_screen_rect_;
- gfx::Rect original_window_screen_rect_;
-
- DISALLOW_COPY_AND_ASSIGN(RenderWidgetScreenMetricsEmulator);
-};
-
-} // namespace content
-
-#endif // CONTENT_RENDERER_DEVTOOLS_RENDER_WIDGET_SCREEN_METRICS_EMULATOR_H_
diff --git a/content/renderer/devtools/render_widget_screen_metrics_emulator_delegate.h b/content/renderer/devtools/render_widget_screen_metrics_emulator_delegate.h
deleted file mode 100644
index af79f19..0000000
--- a/content/renderer/devtools/render_widget_screen_metrics_emulator_delegate.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_DEVTOOLS_RENDER_WIDGET_SCREEN_METRICS_EMULATOR_DELEGATE_H_
-#define CONTENT_RENDERER_DEVTOOLS_RENDER_WIDGET_SCREEN_METRICS_EMULATOR_DELEGATE_H_
-
-#include "content/common/content_export.h"
-
-namespace blink {
-struct WebDeviceEmulationParams;
-}
-
-namespace content {
-
-struct ResizeParams;
-
-// Consumers of RenderWidgetScreenMetricsEmulatorDelegate implement this
-// delegate in order to transport emulation information across processes.
-class CONTENT_EXPORT RenderWidgetScreenMetricsEmulatorDelegate {
- public:
- // Requests a full redraw of the contents of the renderer.
- virtual void Redraw() = 0;
-
- // Resizes the Widget with the provided |resize_params|.
- virtual void Resize(const ResizeParams& resize_params) = 0;
-
- // Passes device emulation parameters to the delegate.
- virtual void SetScreenMetricsEmulationParameters(
- bool enabled,
- const blink::WebDeviceEmulationParams& params) = 0;
-
- // Passes new view bounds and window bounds in screen coordinates to the
- // delegate.
- virtual void SetScreenRects(const gfx::Rect& view_screen_rect,
- const gfx::Rect& window_screen_rect) = 0;
-
- protected:
- virtual ~RenderWidgetScreenMetricsEmulatorDelegate() {}
-};
-
-} // namespace content
-
-#endif // CONTENT_RENDERER_DEVTOOLS_RENDER_WIDGET_SCREEN_METRICS_EMULATOR_DELEGATE_H_
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index e2e7603..dc17687 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -2533,18 +2533,15 @@ void RenderViewImpl::OnDisableAutoResize(const gfx::Size& new_size) {
webview()->disableAutoResizeMode();
if (!new_size.IsEmpty()) {
- ResizeParams resize_params;
- resize_params.new_size = new_size;
- resize_params.physical_backing_size = physical_backing_size_;
- resize_params.top_controls_shrink_blink_size =
- top_controls_shrink_blink_size_;
- resize_params.top_controls_height = top_controls_height_;
- resize_params.visible_viewport_size = visible_viewport_size_;
- resize_params.resizer_rect = resizer_rect_;
- resize_params.is_fullscreen_granted = is_fullscreen_granted();
- resize_params.display_mode = display_mode_;
- resize_params.needs_resize_ack = false;
- Resize(resize_params);
+ Resize(new_size,
+ physical_backing_size_,
+ top_controls_shrink_blink_size_,
+ top_controls_height_,
+ visible_viewport_size_,
+ resizer_rect_,
+ is_fullscreen_granted_,
+ display_mode_,
+ NO_RESIZE_ACK);
}
}
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index d3d5433..592a57c 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -41,7 +41,6 @@
#include "content/public/common/content_switches.h"
#include "content/public/common/context_menu_params.h"
#include "content/renderer/cursor_utils.h"
-#include "content/renderer/devtools/render_widget_screen_metrics_emulator.h"
#include "content/renderer/external_popup_menu.h"
#include "content/renderer/gpu/compositor_output_surface.h"
#include "content/renderer/gpu/delegated_compositor_output_surface.h"
@@ -203,6 +202,244 @@ content::RenderWidgetInputHandlerDelegate* GetRenderWidgetInputHandlerDelegate(
namespace content {
+// RenderWidget::ScreenMetricsEmulator ----------------------------------------
+
+class RenderWidget::ScreenMetricsEmulator {
+ public:
+ ScreenMetricsEmulator(
+ RenderWidget* widget,
+ const WebDeviceEmulationParams& params);
+ virtual ~ScreenMetricsEmulator();
+
+ // Scale and offset used to convert between host coordinates
+ // and webwidget coordinates.
+ float scale() { return scale_; }
+ gfx::PointF offset() { return offset_; }
+ gfx::Rect applied_widget_rect() const { return applied_widget_rect_; }
+ gfx::Rect original_screen_rect() const { return original_view_screen_rect_; }
+ const WebScreenInfo& original_screen_info() { return original_screen_info_; }
+
+ void ChangeEmulationParams(
+ const WebDeviceEmulationParams& params);
+
+ // The following methods alter handlers' behavior for messages related to
+ // widget size and position.
+ void OnResizeMessage(const ResizeParams& params);
+ void OnUpdateScreenRectsMessage(const gfx::Rect& view_screen_rect,
+ const gfx::Rect& window_screen_rect);
+ void OnShowContextMenu(ContextMenuParams* params);
+ gfx::Rect AdjustValidationMessageAnchor(const gfx::Rect& anchor);
+
+ private:
+ void Reapply();
+ void Apply(bool top_controls_shrink_blink_size,
+ float top_controls_height,
+ gfx::Rect resizer_rect,
+ bool is_fullscreen_granted,
+ blink::WebDisplayMode display_mode);
+
+ RenderWidget* widget_;
+
+ // Parameters as passed by RenderWidget::EnableScreenMetricsEmulation.
+ WebDeviceEmulationParams params_;
+
+ // The computed scale and offset used to fit widget into browser window.
+ float scale_;
+ gfx::PointF offset_;
+
+ // Widget rect as passed to webwidget.
+ gfx::Rect applied_widget_rect_;
+
+ // Original values to restore back after emulation ends.
+ gfx::Size original_size_;
+ gfx::Size original_physical_backing_size_;
+ gfx::Size original_visible_viewport_size_;
+ blink::WebScreenInfo original_screen_info_;
+ gfx::Rect original_view_screen_rect_;
+ gfx::Rect original_window_screen_rect_;
+};
+
+RenderWidget::ScreenMetricsEmulator::ScreenMetricsEmulator(
+ RenderWidget* widget,
+ const WebDeviceEmulationParams& params)
+ : widget_(widget),
+ params_(params),
+ scale_(1.f) {
+ original_size_ = widget_->size_;
+ original_physical_backing_size_ = widget_->physical_backing_size_;
+ original_visible_viewport_size_ = widget_->visible_viewport_size_;
+ original_screen_info_ = widget_->screen_info_;
+ original_view_screen_rect_ = widget_->view_screen_rect_;
+ original_window_screen_rect_ = widget_->window_screen_rect_;
+ Apply(widget_->top_controls_shrink_blink_size_,
+ widget_->top_controls_height_,
+ widget_->resizer_rect_,
+ widget_->is_fullscreen_granted_,
+ widget_->display_mode_);
+}
+
+RenderWidget::ScreenMetricsEmulator::~ScreenMetricsEmulator() {
+ widget_->screen_info_ = original_screen_info_;
+
+ widget_->SetDeviceScaleFactor(original_screen_info_.deviceScaleFactor);
+ widget_->SetScreenMetricsEmulationParameters(false, params_);
+ widget_->view_screen_rect_ = original_view_screen_rect_;
+ widget_->window_screen_rect_ = original_window_screen_rect_;
+ widget_->Resize(original_size_,
+ original_physical_backing_size_,
+ widget_->top_controls_shrink_blink_size_,
+ widget_->top_controls_height_,
+ original_visible_viewport_size_,
+ widget_->resizer_rect_,
+ widget_->is_fullscreen_granted_,
+ widget_->display_mode_,
+ NO_RESIZE_ACK);
+}
+
+void RenderWidget::ScreenMetricsEmulator::ChangeEmulationParams(
+ const WebDeviceEmulationParams& params) {
+ params_ = params;
+ Reapply();
+}
+
+void RenderWidget::ScreenMetricsEmulator::Reapply() {
+ Apply(widget_->top_controls_shrink_blink_size_,
+ widget_->top_controls_height_,
+ widget_->resizer_rect_,
+ widget_->is_fullscreen_granted_,
+ widget_->display_mode_);
+}
+
+void RenderWidget::ScreenMetricsEmulator::Apply(
+ bool top_controls_shrink_blink_size,
+ float top_controls_height,
+ gfx::Rect resizer_rect,
+ bool is_fullscreen_granted,
+ blink::WebDisplayMode display_mode) {
+ applied_widget_rect_.set_size(gfx::Size(params_.viewSize));
+ if (!applied_widget_rect_.width())
+ applied_widget_rect_.set_width(original_size_.width());
+ if (!applied_widget_rect_.height())
+ applied_widget_rect_.set_height(original_size_.height());
+
+ if (params_.fitToView && !original_size_.IsEmpty()) {
+ int original_width = std::max(original_size_.width(), 1);
+ int original_height = std::max(original_size_.height(), 1);
+ float width_ratio =
+ static_cast<float>(applied_widget_rect_.width()) / original_width;
+ float height_ratio =
+ static_cast<float>(applied_widget_rect_.height()) / original_height;
+ float ratio = std::max(1.0f, std::max(width_ratio, height_ratio));
+ scale_ = 1.f / ratio;
+
+ // Center emulated view inside available view space.
+ offset_.set_x(
+ (original_size_.width() - scale_ * applied_widget_rect_.width()) / 2);
+ offset_.set_y(
+ (original_size_.height() - scale_ * applied_widget_rect_.height()) / 2);
+ } else {
+ scale_ = params_.scale;
+ offset_.SetPoint(params_.offset.x, params_.offset.y);
+ if (!params_.viewSize.width && !params_.viewSize.height && scale_) {
+ applied_widget_rect_.set_size(gfx::ScaleToRoundedSize(
+ original_size_, 1.f / scale_));
+ }
+ }
+
+ if (params_.screenPosition == WebDeviceEmulationParams::Desktop) {
+ applied_widget_rect_.set_origin(original_view_screen_rect_.origin());
+ widget_->screen_info_.rect = original_screen_info_.rect;
+ widget_->screen_info_.availableRect = original_screen_info_.availableRect;
+ widget_->window_screen_rect_ = original_window_screen_rect_;
+ } else {
+ applied_widget_rect_.set_origin(params_.viewPosition);
+ gfx::Rect screen_rect = applied_widget_rect_;
+ if (!params_.screenSize.isEmpty()) {
+ screen_rect =
+ gfx::Rect(0, 0, params_.screenSize.width, params_.screenSize.height);
+ }
+ widget_->screen_info_.rect = screen_rect;
+ widget_->screen_info_.availableRect = screen_rect;
+ widget_->window_screen_rect_ = applied_widget_rect_;
+ }
+
+ float applied_device_scale_factor = params_.deviceScaleFactor ?
+ params_.deviceScaleFactor : original_screen_info_.deviceScaleFactor;
+ widget_->screen_info_.deviceScaleFactor = applied_device_scale_factor;
+
+ // Pass three emulation parameters to the blink side:
+ // - we keep the real device scale factor in compositor to produce sharp image
+ // even when emulating different scale factor;
+ // - in order to fit into view, WebView applies offset and scale to the
+ // root layer.
+ blink::WebDeviceEmulationParams modified_params = params_;
+ modified_params.deviceScaleFactor = original_screen_info_.deviceScaleFactor;
+ modified_params.offset = blink::WebFloatPoint(offset_.x(), offset_.y());
+ modified_params.scale = scale_;
+ widget_->SetScreenMetricsEmulationParameters(true, modified_params);
+
+ widget_->SetDeviceScaleFactor(applied_device_scale_factor);
+ widget_->view_screen_rect_ = applied_widget_rect_;
+
+ gfx::Size physical_backing_size = gfx::ScaleToCeiledSize(
+ original_size_, original_screen_info_.deviceScaleFactor);
+ widget_->Resize(applied_widget_rect_.size(),
+ physical_backing_size,
+ top_controls_shrink_blink_size,
+ top_controls_height,
+ applied_widget_rect_.size(),
+ resizer_rect,
+ is_fullscreen_granted,
+ display_mode,
+ NO_RESIZE_ACK);
+}
+
+void RenderWidget::ScreenMetricsEmulator::OnResizeMessage(
+ const ResizeParams& params) {
+ bool need_ack = params.new_size != original_size_ &&
+ !params.new_size.IsEmpty() && !params.physical_backing_size.IsEmpty();
+ original_size_ = params.new_size;
+ original_physical_backing_size_ = params.physical_backing_size;
+ original_screen_info_ = params.screen_info;
+ original_visible_viewport_size_ = params.visible_viewport_size;
+ Apply(params.top_controls_shrink_blink_size,
+ params.top_controls_height,
+ params.resizer_rect,
+ params.is_fullscreen_granted,
+ params.display_mode);
+
+ if (need_ack) {
+ widget_->set_next_paint_is_resize_ack();
+ if (widget_->compositor_)
+ widget_->compositor_->SetNeedsRedrawRect(gfx::Rect(widget_->size_));
+ }
+}
+
+void RenderWidget::ScreenMetricsEmulator::OnUpdateScreenRectsMessage(
+ const gfx::Rect& view_screen_rect,
+ const gfx::Rect& window_screen_rect) {
+ original_view_screen_rect_ = view_screen_rect;
+ original_window_screen_rect_ = window_screen_rect;
+ if (params_.screenPosition == WebDeviceEmulationParams::Desktop)
+ Reapply();
+}
+
+void RenderWidget::ScreenMetricsEmulator::OnShowContextMenu(
+ ContextMenuParams* params) {
+ params->x *= scale_;
+ params->x += offset_.x();
+ params->y *= scale_;
+ params->y += offset_.y();
+}
+
+gfx::Rect RenderWidget::ScreenMetricsEmulator::AdjustValidationMessageAnchor(
+ const gfx::Rect& anchor) {
+ gfx::Rect scaled = gfx::ScaleToEnclosedRect(anchor, scale_);
+ scaled.set_x(scaled.x() + offset_.x());
+ scaled.set_y(scaled.y() + offset_.y());
+ return scaled;
+}
+
// RenderWidget ---------------------------------------------------------------
RenderWidget::RenderWidget(CompositorDependencies* compositor_deps,
@@ -416,7 +653,7 @@ void RenderWidget::WasSwappedOut() {
}
void RenderWidget::SetPopupOriginAdjustmentsForEmulation(
- RenderWidgetScreenMetricsEmulator* emulator) {
+ ScreenMetricsEmulator* emulator) {
popup_origin_scale_for_emulation_ = emulator->scale();
popup_view_origin_for_emulation_ = emulator->applied_widget_rect().origin();
popup_screen_origin_for_emulation_ = gfx::Point(
@@ -432,10 +669,16 @@ gfx::Rect RenderWidget::AdjustValidationMessageAnchor(const gfx::Rect& anchor) {
return anchor;
}
+void RenderWidget::SetScreenMetricsEmulationParameters(
+ bool enabled,
+ const blink::WebDeviceEmulationParams& params) {
+ // This is only supported in RenderView.
+ NOTREACHED();
+}
+
#if defined(OS_MACOSX) || defined(OS_ANDROID)
void RenderWidget::SetExternalPopupOriginAdjustmentsForEmulation(
- ExternalPopupMenu* popup,
- RenderWidgetScreenMetricsEmulator* emulator) {
+ ExternalPopupMenu* popup, ScreenMetricsEmulator* emulator) {
popup->SetOriginScaleAndOffsetForEmulation(
emulator->scale(), emulator->offset());
}
@@ -502,21 +745,97 @@ bool RenderWidget::Send(IPC::Message* message) {
return RenderThread::Get()->Send(message);
}
+void RenderWidget::Resize(const gfx::Size& new_size,
+ const gfx::Size& physical_backing_size,
+ bool top_controls_shrink_blink_size,
+ float top_controls_height,
+ const gfx::Size& visible_viewport_size,
+ const gfx::Rect& resizer_rect,
+ bool is_fullscreen_granted,
+ blink::WebDisplayMode display_mode,
+ const ResizeAck resize_ack) {
+ if (resizing_mode_selector_->NeverUsesSynchronousResize()) {
+ // A resize ack shouldn't be requested if we have not ACK'd the previous
+ // one.
+ DCHECK(resize_ack != SEND_RESIZE_ACK || !next_paint_is_resize_ack());
+ DCHECK(resize_ack == SEND_RESIZE_ACK || resize_ack == NO_RESIZE_ACK);
+ }
+
+ // Ignore this during shutdown.
+ if (!webwidget_)
+ return;
+
+ if (compositor_)
+ compositor_->setViewportSize(physical_backing_size);
+
+ bool resized = size_ != new_size ||
+ physical_backing_size_ != physical_backing_size;
+
+ size_ = new_size;
+ physical_backing_size_ = physical_backing_size;
+
+ top_controls_shrink_blink_size_ = top_controls_shrink_blink_size;
+ top_controls_height_ = top_controls_height;
+ visible_viewport_size_ = visible_viewport_size;
+ resizer_rect_ = resizer_rect;
+
+ // NOTE: We may have entered fullscreen mode without changing our size.
+ bool fullscreen_change = is_fullscreen_granted_ != is_fullscreen_granted;
+ is_fullscreen_granted_ = is_fullscreen_granted;
+ display_mode_ = display_mode;
+
+ webwidget_->setTopControlsHeight(top_controls_height,
+ top_controls_shrink_blink_size_);
+
+ if (resized) {
+ gfx::Size new_widget_size =
+ IsUseZoomForDSFEnabled() ? physical_backing_size_ : size_;
+ // When resizing, we want to wait to paint before ACK'ing the resize. This
+ // ensures that we only resize as fast as we can paint. We only need to
+ // send an ACK if we are resized to a non-empty rect.
+ webwidget_->resize(new_widget_size);
+ }
+ WebSize visual_viewport_size;
+
+ if (IsUseZoomForDSFEnabled()) {
+ visual_viewport_size =
+ gfx::ScaleToCeiledSize(visible_viewport_size, device_scale_factor_);
+ } else {
+ visual_viewport_size = visible_viewport_size_;
+ }
+
+ webwidget()->resizeVisualViewport(visual_viewport_size);
+
+ if (new_size.IsEmpty() || physical_backing_size.IsEmpty()) {
+ // In this case there is no paint/composite and therefore no
+ // ViewHostMsg_UpdateRect to send the resize ack with. We'd need to send the
+ // ack through a fake ViewHostMsg_UpdateRect or a different message.
+ DCHECK_EQ(resize_ack, NO_RESIZE_ACK);
+ }
+
+ // Send the Resize_ACK flag once we paint again if requested.
+ if (resize_ack == SEND_RESIZE_ACK)
+ set_next_paint_is_resize_ack();
+
+ if (fullscreen_change)
+ DidToggleFullscreen();
+
+ // If a resize ack is requested and it isn't set-up, then no more resizes will
+ // come in and in general things will go wrong.
+ DCHECK(resize_ack != SEND_RESIZE_ACK || next_paint_is_resize_ack());
+}
+
void RenderWidget::SetWindowRectSynchronously(
const gfx::Rect& new_window_rect) {
- ResizeParams params;
- params.new_size = new_window_rect.size();
- params.physical_backing_size =
- gfx::ScaleToCeiledSize(new_window_rect.size(), device_scale_factor_);
- params.top_controls_shrink_blink_size = top_controls_shrink_blink_size_;
- params.top_controls_height = top_controls_height_;
- params.visible_viewport_size = new_window_rect.size();
- params.resizer_rect = gfx::Rect();
- params.is_fullscreen_granted = is_fullscreen_granted_;
- params.display_mode = display_mode_;
- params.needs_resize_ack = false;
- Resize(params);
-
+ Resize(new_window_rect.size(),
+ gfx::ScaleToCeiledSize(new_window_rect.size(), device_scale_factor_),
+ top_controls_shrink_blink_size_,
+ top_controls_height_,
+ new_window_rect.size(),
+ gfx::Rect(),
+ is_fullscreen_granted_,
+ display_mode_,
+ NO_RESIZE_ACK);
view_screen_rect_ = new_window_rect;
window_screen_rect_ = new_window_rect;
if (!did_show_)
@@ -562,14 +881,24 @@ void RenderWidget::OnResize(const ResizeParams& params) {
return;
if (screen_metrics_emulator_) {
- screen_metrics_emulator_->OnResize(params);
+ screen_metrics_emulator_->OnResizeMessage(params);
return;
}
bool orientation_changed =
screen_info_.orientationAngle != params.screen_info.orientationAngle;
- Resize(params);
+ screen_info_ = params.screen_info;
+ SetDeviceScaleFactor(screen_info_.deviceScaleFactor);
+ Resize(params.new_size,
+ params.physical_backing_size,
+ params.top_controls_shrink_blink_size,
+ params.top_controls_height,
+ params.visible_viewport_size,
+ params.resizer_rect,
+ params.is_fullscreen_granted,
+ params.display_mode,
+ params.needs_resize_ack ? SEND_RESIZE_ACK : NO_RESIZE_ACK);
if (orientation_changed)
OnOrientationChange();
@@ -577,23 +906,10 @@ void RenderWidget::OnResize(const ResizeParams& params) {
void RenderWidget::OnEnableDeviceEmulation(
const blink::WebDeviceEmulationParams& params) {
- if (!screen_metrics_emulator_) {
- ResizeParams resize_params;
- resize_params.new_size = size_;
- resize_params.physical_backing_size = physical_backing_size_;
- resize_params.visible_viewport_size = visible_viewport_size_;
- resize_params.screen_info = screen_info_;
- resize_params.top_controls_shrink_blink_size =
- top_controls_shrink_blink_size_;
- resize_params.top_controls_height = top_controls_height_;
- resize_params.resizer_rect = resizer_rect_;
- resize_params.is_fullscreen_granted = is_fullscreen_granted_;
- resize_params.display_mode = display_mode_;
- screen_metrics_emulator_.reset(new RenderWidgetScreenMetricsEmulator(
- this, params, resize_params, view_screen_rect_, window_screen_rect_));
- } else {
+ if (!screen_metrics_emulator_)
+ screen_metrics_emulator_.reset(new ScreenMetricsEmulator(this, params));
+ else
screen_metrics_emulator_->ChangeEmulationParams(params);
- }
}
void RenderWidget::OnDisableDeviceEmulation() {
@@ -1038,103 +1354,6 @@ bool RenderWidget::WillHandleMouseEvent(const blink::WebMouseEvent& event) {
}
///////////////////////////////////////////////////////////////////////////////
-// RenderWidgetScreenMetricsDelegate
-
-void RenderWidget::Redraw() {
- set_next_paint_is_resize_ack();
- if (compositor_)
- compositor_->SetNeedsRedrawRect(gfx::Rect(size_));
-}
-
-void RenderWidget::Resize(const ResizeParams& params) {
- screen_info_ = params.screen_info;
- SetDeviceScaleFactor(screen_info_.deviceScaleFactor);
-
- if (resizing_mode_selector_->NeverUsesSynchronousResize()) {
- // A resize ack shouldn't be requested if we have not ACK'd the previous
- // one.
- DCHECK(!params.needs_resize_ack || !next_paint_is_resize_ack());
- }
-
- // Ignore this during shutdown.
- if (!webwidget_)
- return;
-
- if (compositor_)
- compositor_->setViewportSize(params.physical_backing_size);
-
- bool resized = size_ != params.new_size ||
- physical_backing_size_ != params.physical_backing_size;
-
- size_ = params.new_size;
- physical_backing_size_ = params.physical_backing_size;
-
- top_controls_shrink_blink_size_ = params.top_controls_shrink_blink_size;
- top_controls_height_ = params.top_controls_height;
- visible_viewport_size_ = params.visible_viewport_size;
- resizer_rect_ = params.resizer_rect;
-
- // NOTE: We may have entered fullscreen mode without changing our size.
- bool fullscreen_change =
- is_fullscreen_granted_ != params.is_fullscreen_granted;
- is_fullscreen_granted_ = params.is_fullscreen_granted;
- display_mode_ = params.display_mode;
-
- webwidget_->setTopControlsHeight(params.top_controls_height,
- top_controls_shrink_blink_size_);
-
- if (resized) {
- gfx::Size new_widget_size =
- IsUseZoomForDSFEnabled() ? physical_backing_size_ : size_;
- // When resizing, we want to wait to paint before ACK'ing the resize. This
- // ensures that we only resize as fast as we can paint. We only need to
- // send an ACK if we are resized to a non-empty rect.
- webwidget_->resize(new_widget_size);
- }
- WebSize visual_viewport_size;
-
- if (IsUseZoomForDSFEnabled()) {
- visual_viewport_size = gfx::ScaleToCeiledSize(params.visible_viewport_size,
- device_scale_factor_);
- } else {
- visual_viewport_size = visible_viewport_size_;
- }
-
- webwidget()->resizeVisualViewport(visual_viewport_size);
-
- if (params.new_size.IsEmpty() || params.physical_backing_size.IsEmpty()) {
- // In this case there is no paint/composite and therefore no
- // ViewHostMsg_UpdateRect to send the resize ack with. We'd need to send the
- // ack through a fake ViewHostMsg_UpdateRect or a different message.
- DCHECK(!params.needs_resize_ack);
- }
-
- // Send the Resize_ACK flag once we paint again if requested.
- if (params.needs_resize_ack)
- set_next_paint_is_resize_ack();
-
- if (fullscreen_change)
- DidToggleFullscreen();
-
- // If a resize ack is requested and it isn't set-up, then no more resizes will
- // come in and in general things will go wrong.
- DCHECK(!params.needs_resize_ack || next_paint_is_resize_ack());
-}
-
-void RenderWidget::SetScreenMetricsEmulationParameters(
- bool enabled,
- const blink::WebDeviceEmulationParams& params) {
- // This is only supported in RenderView.
- NOTREACHED();
-}
-
-void RenderWidget::SetScreenRects(const gfx::Rect& view_screen_rect,
- const gfx::Rect& window_screen_rect) {
- view_screen_rect_ = view_screen_rect;
- window_screen_rect_ = window_screen_rect;
-}
-
-///////////////////////////////////////////////////////////////////////////////
// WebWidgetClient
void RenderWidget::didAutoResize(const WebSize& new_size) {
@@ -1498,10 +1717,11 @@ void RenderWidget::OnSetTextDirection(WebTextDirection direction) {
void RenderWidget::OnUpdateScreenRects(const gfx::Rect& view_screen_rect,
const gfx::Rect& window_screen_rect) {
if (screen_metrics_emulator_) {
- screen_metrics_emulator_->OnUpdateScreenRects(view_screen_rect,
- window_screen_rect);
+ screen_metrics_emulator_->OnUpdateScreenRectsMessage(
+ view_screen_rect, window_screen_rect);
} else {
- SetScreenRects(view_screen_rect, window_screen_rect);
+ view_screen_rect_ = view_screen_rect;
+ window_screen_rect_ = window_screen_rect;
}
Send(new ViewHostMsg_UpdateScreenRects_ACK(routing_id()));
}
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 1185fa2b..3f083e7 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -23,7 +23,6 @@
#include "content/common/cursors/webcursor.h"
#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h"
#include "content/common/input/synthetic_gesture_params.h"
-#include "content/renderer/devtools/render_widget_screen_metrics_emulator_delegate.h"
#include "content/renderer/gpu/render_widget_compositor_delegate.h"
#include "content/renderer/input/render_widget_input_handler.h"
#include "content/renderer/input/render_widget_input_handler_delegate.h"
@@ -86,7 +85,6 @@ class ImeEventGuard;
class RenderFrameImpl;
class RenderFrameProxy;
class RenderWidgetCompositor;
-class RenderWidgetScreenMetricsEmulator;
class ResizingModeSelector;
struct ContextMenuParams;
struct DidOverscrollParams;
@@ -107,7 +105,6 @@ class CONTENT_EXPORT RenderWidget
NON_EXPORTED_BASE(virtual public blink::WebWidgetClient),
public RenderWidgetCompositorDelegate,
public RenderWidgetInputHandlerDelegate,
- public RenderWidgetScreenMetricsEmulatorDelegate,
public base::RefCounted<RenderWidget> {
public:
// Creates a new RenderWidget. The opener_id is the routing ID of the
@@ -134,7 +131,7 @@ class CONTENT_EXPORT RenderWidget
CompositorDependencies* compositor_deps() const { return compositor_deps_; }
blink::WebWidget* webwidget() const { return webwidget_; }
- const gfx::Size& size() const { return size_; }
+ gfx::Size size() const { return size_; }
bool is_fullscreen_granted() const { return is_fullscreen_granted_; }
blink::WebDisplayMode display_mode() const { return display_mode_; }
bool is_hidden() const { return is_hidden_; }
@@ -213,15 +210,6 @@ class CONTENT_EXPORT RenderWidget
bool WillHandleGestureEvent(const blink::WebGestureEvent& event) override;
bool WillHandleMouseEvent(const blink::WebMouseEvent& event) override;
- // RenderWidgetScreenMetricsDelegate
- void Redraw() override;
- void Resize(const ResizeParams& resize_params) override;
- void SetScreenMetricsEmulationParameters(
- bool enabled,
- const blink::WebDeviceEmulationParams& params) override;
- void SetScreenRects(const gfx::Rect& view_screen_rect,
- const gfx::Rect& window_screen_rect) override;
-
// blink::WebWidgetClient
void didAutoResize(const blink::WebSize& new_size) override;
void initializeLayerTreeView() override;
@@ -324,9 +312,13 @@ class CONTENT_EXPORT RenderWidget
// Returns whether we currently should handle an IME event.
bool ShouldHandleImeEvent();
- void SetPopupOriginAdjustmentsForEmulation(
- RenderWidgetScreenMetricsEmulator* emulator);
+ // ScreenMetricsEmulator class manages screen emulation inside a render
+ // widget. This includes resizing, placing view on the screen at desired
+ // position, changing device scale factor, and scaling down the whole
+ // widget if required to fit into the browser window.
+ class ScreenMetricsEmulator;
+ void SetPopupOriginAdjustmentsForEmulation(ScreenMetricsEmulator* emulator);
gfx::Rect AdjustValidationMessageAnchor(const gfx::Rect& anchor);
@@ -402,12 +394,24 @@ class CONTENT_EXPORT RenderWidget
// Close the underlying WebWidget.
virtual void Close();
+ // Resizes the render widget.
+ void Resize(const gfx::Size& new_size,
+ const gfx::Size& physical_backing_size,
+ bool top_controls_shrink_blink_size,
+ float top_controls_height,
+ const gfx::Size& visible_viewport_size,
+ const gfx::Rect& resizer_rect,
+ bool is_fullscreen_granted,
+ blink::WebDisplayMode display_mode,
+ ResizeAck resize_ack);
// Used to force the size of a window when running layout tests.
void SetWindowRectSynchronously(const gfx::Rect& new_window_rect);
+ virtual void SetScreenMetricsEmulationParameters(
+ bool enabled,
+ const blink::WebDeviceEmulationParams& params);
#if defined(OS_MACOSX) || defined(OS_ANDROID)
void SetExternalPopupOriginAdjustmentsForEmulation(
- ExternalPopupMenu* popup,
- RenderWidgetScreenMetricsEmulator* emulator);
+ ExternalPopupMenu* popup, ScreenMetricsEmulator* emulator);
#endif
// RenderWidget IPC message handlers
@@ -726,7 +730,7 @@ class CONTENT_EXPORT RenderWidget
std::deque<blink::WebTextInputInfo> text_input_info_history_;
#endif
- scoped_ptr<RenderWidgetScreenMetricsEmulator> screen_metrics_emulator_;
+ scoped_ptr<ScreenMetricsEmulator> screen_metrics_emulator_;
// Popups may be displaced when screen metrics emulation is enabled.
// These values are used to properly adjust popup position.