| Index: content/renderer/render_widget.cc
|
| diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
|
| index 4cdae0478d9d6254d52379cd0c2edd39c7b72159..5f0f7c70022f48affb4a8b7350ba49bb8cbce527 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());
|
|
|