summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgozman@chromium.org <dgozman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-03 15:01:43 +0000
committerdgozman@chromium.org <dgozman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-03 15:01:43 +0000
commit1919368fa865d491aaf512da9b8916e0b39ead32 (patch)
tree24b310b50786da77e6002a52c33ccef333b117fb
parentd750863162ce24440e3384a50b5e49ce012750ce (diff)
downloadchromium_src-1919368fa865d491aaf512da9b8916e0b39ead32.zip
chromium_src-1919368fa865d491aaf512da9b8916e0b39ead32.tar.gz
chromium_src-1919368fa865d491aaf512da9b8916e0b39ead32.tar.bz2
[DevTools] Migrate device emulation to WebDeviceEmulationParams.
BUG=327641 Review URL: https://codereview.chromium.org/220263003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@261394 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/renderer/devtools/devtools_agent.cc17
-rw-r--r--content/renderer/devtools/devtools_agent.h2
-rw-r--r--content/renderer/render_widget.cc126
-rw-r--r--content/renderer/render_widget.h6
4 files changed, 70 insertions, 81 deletions
diff --git a/content/renderer/devtools/devtools_agent.cc b/content/renderer/devtools/devtools_agent.cc
index 0783dda..eb33fbe 100644
--- a/content/renderer/devtools/devtools_agent.cc
+++ b/content/renderer/devtools/devtools_agent.cc
@@ -24,6 +24,7 @@
#include "third_party/WebKit/public/web/WebConsoleMessage.h"
#include "third_party/WebKit/public/web/WebConsoleMessage.h"
#include "third_party/WebKit/public/web/WebDevToolsAgent.h"
+#include "third_party/WebKit/public/web/WebDeviceEmulationParams.h"
#include "third_party/WebKit/public/web/WebFrame.h"
#include "third_party/WebKit/public/web/WebSettings.h"
#include "third_party/WebKit/public/web/WebView.h"
@@ -223,10 +224,22 @@ void DevToolsAgent::enableDeviceEmulation(
const blink::WebRect& view_rect,
float device_scale_factor,
bool fit_to_view) {
+ blink::WebDeviceEmulationParams params;
+ params.screenPosition = device_rect.isEmpty() ?
+ blink::WebDeviceEmulationParams::Desktop :
+ blink::WebDeviceEmulationParams::Mobile;
+ params.deviceScaleFactor = device_scale_factor;
+ params.viewSize = blink::WebSize(view_rect.width, view_rect.height);
+ params.fitToView = fit_to_view;
+ params.viewInsets = blink::WebSize(device_rect.x, device_rect.y);
+ enableDeviceEmulation(params);
+}
+
+void DevToolsAgent::enableDeviceEmulation(
+ const blink::WebDeviceEmulationParams& params) {
RenderViewImpl* impl = static_cast<RenderViewImpl*>(render_view());
impl->webview()->settings()->setForceCompositingMode(true);
- impl->EnableScreenMetricsEmulation(gfx::Rect(device_rect),
- gfx::Rect(view_rect), device_scale_factor, fit_to_view);
+ impl->EnableScreenMetricsEmulation(params);
}
void DevToolsAgent::disableDeviceEmulation() {
diff --git a/content/renderer/devtools/devtools_agent.h b/content/renderer/devtools/devtools_agent.h
index 745f436..fed4a68 100644
--- a/content/renderer/devtools/devtools_agent.h
+++ b/content/renderer/devtools/devtools_agent.h
@@ -73,6 +73,8 @@ class DevToolsAgent : public RenderViewObserver,
const blink::WebRect& device_rect,
const blink::WebRect& view_rect, float device_scale_factor,
bool fit_to_view);
+ virtual void enableDeviceEmulation(
+ const blink::WebDeviceEmulationParams& params);
virtual void disableDeviceEmulation();
void OnAttach();
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 4cdae04..5f0f7c7 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -54,6 +54,7 @@
#include "third_party/WebKit/public/platform/WebScreenInfo.h"
#include "third_party/WebKit/public/platform/WebSize.h"
#include "third_party/WebKit/public/platform/WebString.h"
+#include "third_party/WebKit/public/web/WebDeviceEmulationParams.h"
#include "third_party/WebKit/public/web/WebPagePopup.h"
#include "third_party/WebKit/public/web/WebPopupMenu.h"
#include "third_party/WebKit/public/web/WebPopupMenuInfo.h"
@@ -84,6 +85,7 @@
using blink::WebCompositionUnderline;
using blink::WebCursorInfo;
+using blink::WebDeviceEmulationParams;
using blink::WebGestureEvent;
using blink::WebInputEvent;
using blink::WebKeyboardEvent;
@@ -161,23 +163,19 @@ class RenderWidget::ScreenMetricsEmulator {
public:
ScreenMetricsEmulator(
RenderWidget* widget,
- const gfx::Rect& device_rect,
- const gfx::Rect& widget_rect,
- float device_scale_factor,
- bool fit_to_view);
+ const WebDeviceEmulationParams& params);
virtual ~ScreenMetricsEmulator();
+ // Scale and offset used to convert between host coordinates
+ // and webwidget coordinates.
float scale() { return scale_; }
gfx::Point offset() { return offset_; }
- gfx::Rect widget_rect() const { return widget_rect_; }
+ 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 gfx::Rect& device_rect,
- const gfx::Rect& widget_rect,
- float device_scale_factor,
- bool fit_to_view);
+ const WebDeviceEmulationParams& params);
// The following methods alter handlers' behavior for messages related to
// widget size and position.
@@ -187,22 +185,22 @@ class RenderWidget::ScreenMetricsEmulator {
void OnShowContextMenu(ContextMenuParams* params);
private:
- void CalculateScaleAndOffset();
+ void Reapply();
void Apply(float overdraw_bottom_height,
gfx::Rect resizer_rect, bool is_fullscreen);
RenderWidget* widget_;
// Parameters as passed by RenderWidget::EnableScreenMetricsEmulation.
- gfx::Rect device_rect_;
- gfx::Rect widget_rect_;
- float device_scale_factor_;
- bool fit_to_view_;
+ WebDeviceEmulationParams params_;
// The computed scale and offset used to fit widget into browser window.
float scale_;
gfx::Point 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_;
@@ -213,15 +211,9 @@ class RenderWidget::ScreenMetricsEmulator {
RenderWidget::ScreenMetricsEmulator::ScreenMetricsEmulator(
RenderWidget* widget,
- const gfx::Rect& device_rect,
- const gfx::Rect& widget_rect,
- float device_scale_factor,
- bool fit_to_view)
+ const WebDeviceEmulationParams& params)
: widget_(widget),
- device_rect_(device_rect),
- widget_rect_(widget_rect),
- device_scale_factor_(device_scale_factor),
- fit_to_view_(fit_to_view),
+ params_(params),
scale_(1.f) {
original_size_ = widget_->size_;
original_physical_backing_size_ = widget_->physical_backing_size_;
@@ -245,67 +237,59 @@ RenderWidget::ScreenMetricsEmulator::~ScreenMetricsEmulator() {
}
void RenderWidget::ScreenMetricsEmulator::ChangeEmulationParams(
- const gfx::Rect& device_rect,
- const gfx::Rect& widget_rect,
- float device_scale_factor,
- bool fit_to_view) {
- device_rect_ = device_rect;
- widget_rect_ = widget_rect;
- device_scale_factor_ = device_scale_factor;
- fit_to_view_ = fit_to_view;
+ const WebDeviceEmulationParams& params) {
+ params_ = params;
+ Reapply();
+}
+
+void RenderWidget::ScreenMetricsEmulator::Reapply() {
Apply(widget_->overdraw_bottom_height_,
widget_->resizer_rect_, widget_->is_fullscreen_);
}
-void RenderWidget::ScreenMetricsEmulator::CalculateScaleAndOffset() {
- if (fit_to_view_) {
+void RenderWidget::ScreenMetricsEmulator::Apply(
+ float overdraw_bottom_height, gfx::Rect resizer_rect, bool is_fullscreen) {
+ applied_widget_rect_.set_size(params_.viewSize.isEmpty() ?
+ original_size_ : gfx::Size(params_.viewSize));
+
+ if (params_.fitToView) {
DCHECK(!original_size_.IsEmpty());
int width_with_gutter =
- std::max(original_size_.width() - 2 * device_rect_.x(), 1);
+ std::max(original_size_.width() - 2 * params_.viewInsets.width, 1);
int height_with_gutter =
- std::max(original_size_.height() - 2 * device_rect_.y(), 1);
+ std::max(original_size_.height() - 2 * params_.viewInsets.height, 1);
float width_ratio =
- static_cast<float>(widget_rect_.width()) / width_with_gutter;
+ static_cast<float>(applied_widget_rect_.width()) / width_with_gutter;
float height_ratio =
- static_cast<float>(widget_rect_.height()) / height_with_gutter;
+ static_cast<float>(applied_widget_rect_.height()) / height_with_gutter;
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_ * widget_rect_.width()) / 2);
+ offset_.set_x(
+ (original_size_.width() - scale_ * applied_widget_rect_.width()) / 2);
offset_.set_y(
- (original_size_.height() - scale_ * widget_rect_.height()) / 2);
+ (original_size_.height() - scale_ * applied_widget_rect_.height()) / 2);
} else {
scale_ = 1.f;
offset_.SetPoint(0, 0);
}
-}
-void RenderWidget::ScreenMetricsEmulator::Apply(
- float overdraw_bottom_height, gfx::Rect resizer_rect, bool is_fullscreen) {
- gfx::Rect applied_widget_rect = widget_rect_;
- if (widget_rect_.size().IsEmpty()) {
- scale_ = 1.f;
- offset_.SetPoint(0, 0);
- applied_widget_rect =
- gfx::Rect(original_view_screen_rect_.origin(), original_size_);
- } else {
- CalculateScaleAndOffset();
- }
-
- if (device_rect_.size().IsEmpty()) {
+ 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 {
- widget_->screen_info_.rect = gfx::Rect(device_rect_.size());
- widget_->screen_info_.availableRect = gfx::Rect(device_rect_.size());
- widget_->window_screen_rect_ = widget_->screen_info_.availableRect;
+ applied_widget_rect_.set_origin(gfx::Point(0, 0));
+ widget_->screen_info_.rect = applied_widget_rect_;
+ widget_->screen_info_.availableRect = applied_widget_rect_;
+ widget_->window_screen_rect_ = applied_widget_rect_;
}
- float applied_device_scale_factor = device_scale_factor_ ?
- device_scale_factor_ : original_screen_info_.deviceScaleFactor;
+ 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:
@@ -317,11 +301,11 @@ void RenderWidget::ScreenMetricsEmulator::Apply(
original_screen_info_.deviceScaleFactor, offset_, scale_);
widget_->SetDeviceScaleFactor(applied_device_scale_factor);
- widget_->view_screen_rect_ = applied_widget_rect;
+ widget_->view_screen_rect_ = applied_widget_rect_;
gfx::Size physical_backing_size = gfx::ToCeiledSize(gfx::ScaleSize(
original_size_, original_screen_info_.deviceScaleFactor));
- widget_->Resize(applied_widget_rect.size(), physical_backing_size,
+ widget_->Resize(applied_widget_rect_.size(), physical_backing_size,
overdraw_bottom_height, resizer_rect, is_fullscreen, NO_RESIZE_ACK);
}
@@ -347,10 +331,8 @@ void RenderWidget::ScreenMetricsEmulator::OnUpdateScreenRectsMessage(
const gfx::Rect& window_screen_rect) {
original_view_screen_rect_ = view_screen_rect;
original_window_screen_rect_ = window_screen_rect;
- if (device_rect_.size().IsEmpty())
- widget_->window_screen_rect_ = window_screen_rect;
- if (widget_rect_.size().IsEmpty())
- widget_->view_screen_rect_ = view_screen_rect;
+ if (params_.screenPosition == WebDeviceEmulationParams::Desktop)
+ Reapply();
}
void RenderWidget::ScreenMetricsEmulator::OnShowContextMenu(
@@ -548,17 +530,11 @@ bool RenderWidget::UsingSynchronousRendererCompositor() const {
}
void RenderWidget::EnableScreenMetricsEmulation(
- const gfx::Rect& device_rect,
- const gfx::Rect& widget_rect,
- float device_scale_factor,
- bool fit_to_view) {
- if (!screen_metrics_emulator_) {
- screen_metrics_emulator_.reset(new ScreenMetricsEmulator(this,
- device_rect, widget_rect, device_scale_factor, fit_to_view));
- } else {
- screen_metrics_emulator_->ChangeEmulationParams(device_rect,
- widget_rect, device_scale_factor, fit_to_view);
- }
+ const WebDeviceEmulationParams& params) {
+ if (!screen_metrics_emulator_)
+ screen_metrics_emulator_.reset(new ScreenMetricsEmulator(this, params));
+ else
+ screen_metrics_emulator_->ChangeEmulationParams(params);
}
void RenderWidget::DisableScreenMetricsEmulation() {
@@ -568,7 +544,7 @@ void RenderWidget::DisableScreenMetricsEmulation() {
void RenderWidget::SetPopupOriginAdjustmentsForEmulation(
ScreenMetricsEmulator* emulator) {
popup_origin_scale_for_emulation_ = emulator->scale();
- popup_view_origin_for_emulation_ = emulator->widget_rect().origin();
+ popup_view_origin_for_emulation_ = emulator->applied_widget_rect().origin();
popup_screen_origin_for_emulation_ = gfx::Point(
emulator->original_screen_rect().origin().x() + emulator->offset().x(),
emulator->original_screen_rect().origin().y() + emulator->offset().y());
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 25d929f..411d102 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -51,6 +51,7 @@ class SyncMessage;
}
namespace blink {
+struct WebDeviceEmulationParams;
class WebGestureEvent;
class WebInputEvent;
class WebKeyboardEvent;
@@ -208,10 +209,7 @@ class CONTENT_EXPORT RenderWidget
// Emulates screen and widget metrics. Supplied values override everything
// coming from host.
void EnableScreenMetricsEmulation(
- const gfx::Rect& device_rect,
- const gfx::Rect& widget_rect,
- float device_scale_factor,
- bool fit_to_view);
+ const blink::WebDeviceEmulationParams& params);
void DisableScreenMetricsEmulation();
void SetPopupOriginAdjustmentsForEmulation(ScreenMetricsEmulator* emulator);