summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/common/content_switches_internal.h3
-rw-r--r--content/renderer/devtools/render_widget_screen_metrics_emulator.cc1
-rw-r--r--content/renderer/devtools/render_widget_screen_metrics_emulator.h4
-rw-r--r--content/renderer/gpu/render_widget_compositor.h2
-rw-r--r--content/renderer/render_view_browsertest.cc127
-rw-r--r--content/renderer/render_view_impl.h5
-rw-r--r--content/renderer/render_widget.cc33
-rw-r--r--content/renderer/render_widget.h4
-rw-r--r--third_party/WebKit/Source/core/inspector/DevToolsHost.cpp14
-rw-r--r--third_party/WebKit/Source/core/inspector/DevToolsHost.idl2
-rw-r--r--third_party/WebKit/Source/devtools/front_end/devtools.js8
-rw-r--r--third_party/WebKit/Source/devtools/front_end/externs.js6
-rw-r--r--third_party/WebKit/Source/web/WebViewImpl.cpp17
13 files changed, 151 insertions, 75 deletions
diff --git a/content/common/content_switches_internal.h b/content/common/content_switches_internal.h
index 990070c..1a829ea 100644
--- a/content/common/content_switches_internal.h
+++ b/content/common/content_switches_internal.h
@@ -6,6 +6,7 @@
#define CONTENT_COMMON_CONTENT_SWITCHES_INTERNAL_H_
#include "build/build_config.h"
+#include "content/common/content_export.h"
#include "content/public/common/web_preferences.h"
namespace content {
@@ -20,7 +21,7 @@ bool IsWin32kRendererLockdownEnabled();
#endif
V8CacheOptions GetV8CacheOptions();
-bool IsUseZoomForDSFEnabled();
+CONTENT_EXPORT bool IsUseZoomForDSFEnabled();
} // namespace content
diff --git a/content/renderer/devtools/render_widget_screen_metrics_emulator.cc b/content/renderer/devtools/render_widget_screen_metrics_emulator.cc
index 1022c27..b92d637 100644
--- a/content/renderer/devtools/render_widget_screen_metrics_emulator.cc
+++ b/content/renderer/devtools/render_widget_screen_metrics_emulator.cc
@@ -22,7 +22,6 @@ RenderWidgetScreenMetricsEmulator::RenderWidgetScreenMetricsEmulator(
original_resize_params_(resize_params),
original_view_screen_rect_(view_screen_rect),
original_window_screen_rect_(window_screen_rect) {
- Apply();
}
RenderWidgetScreenMetricsEmulator::~RenderWidgetScreenMetricsEmulator() {
diff --git a/content/renderer/devtools/render_widget_screen_metrics_emulator.h b/content/renderer/devtools/render_widget_screen_metrics_emulator.h
index 8288dfa..dbe1f33 100644
--- a/content/renderer/devtools/render_widget_screen_metrics_emulator.h
+++ b/content/renderer/devtools/render_widget_screen_metrics_emulator.h
@@ -59,10 +59,10 @@ class RenderWidgetScreenMetricsEmulator {
void OnShowContextMenu(ContextMenuParams* params);
gfx::Rect AdjustValidationMessageAnchor(const gfx::Rect& anchor);
- private:
- // Apply original_resize_params_
+ // Apply parameters to the render widget.
void Apply();
+ private:
RenderWidgetScreenMetricsEmulatorDelegate* const delegate_;
// Parameters as passed by RenderWidget::EnableScreenMetricsEmulation.
diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h
index ab2c72d..aacbfac 100644
--- a/content/renderer/gpu/render_widget_compositor.h
+++ b/content/renderer/gpu/render_widget_compositor.h
@@ -192,6 +192,8 @@ class CONTENT_EXPORT RenderWidgetCompositor
};
protected:
+ friend class RenderViewImplScaleFactorTest;
+
RenderWidgetCompositor(RenderWidgetCompositorDelegate* delegate,
CompositorDependencies* compositor_deps);
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 19b5637..3a49f70 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -17,8 +17,10 @@
#include "base/time/time.h"
#include "base/win/windows_version.h"
#include "build/build_config.h"
+#include "cc/trees/layer_tree_host.h"
#include "content/child/request_extra_data.h"
#include "content/child/service_worker/service_worker_network_provider.h"
+#include "content/common/content_switches_internal.h"
#include "content/common/frame_messages.h"
#include "content/common/frame_replication_state.h"
#include "content/common/site_isolation_policy.h"
@@ -42,6 +44,7 @@
#include "content/public/test/test_utils.h"
#include "content/renderer/accessibility/renderer_accessibility.h"
#include "content/renderer/devtools/devtools_agent.h"
+#include "content/renderer/gpu/render_widget_compositor.h"
#include "content/renderer/history_controller.h"
#include "content/renderer/history_serialization.h"
#include "content/renderer/navigation_state_impl.h"
@@ -421,7 +424,7 @@ class RenderViewImplBlinkSettingsTest : public RenderViewImplTest {
};
class RenderViewImplScaleFactorTest : public RenderViewImplBlinkSettingsTest {
- public:
+ protected:
void SetDeviceScaleFactor(float dsf) {
ResizeParams params;
params.screen_info.deviceScaleFactor = dsf;
@@ -432,6 +435,33 @@ class RenderViewImplScaleFactorTest : public RenderViewImplBlinkSettingsTest {
view()->OnResize(params);
ASSERT_EQ(dsf, view()->device_scale_factor_);
}
+
+ void TestEmulatedSizeDprDsf(int width, int height, float dpr,
+ float compositor_dsf) {
+ static base::string16 get_width =
+ base::ASCIIToUTF16("Number(window.innerWidth)");
+ static base::string16 get_height =
+ base::ASCIIToUTF16("Number(window.innerHeight)");
+ static base::string16 get_dpr =
+ base::ASCIIToUTF16("Number(window.devicePixelRatio * 10)");
+
+ int emulated_width, emulated_height;
+ int emulated_dpr;
+ blink::WebDeviceEmulationParams params;
+ params.viewSize.width = width;
+ params.viewSize.height = height;
+ params.deviceScaleFactor = dpr;
+ view()->OnEnableDeviceEmulation(params);
+ EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_width, &emulated_width));
+ EXPECT_EQ(width, emulated_width);
+ EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_height,
+ &emulated_height));
+ EXPECT_EQ(height, emulated_height);
+ EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_dpr, &emulated_dpr));
+ EXPECT_EQ(static_cast<int>(dpr * 10), emulated_dpr);
+ EXPECT_EQ(compositor_dsf,
+ view()->compositor()->layer_tree_host()->device_scale_factor());
+ }
};
// Ensure that the main RenderFrame is deleted and cleared from the RenderView
@@ -2456,36 +2486,6 @@ TEST_F(RenderViewImplTest, OnSetAccessibilityMode) {
ASSERT_NE((RendererAccessibility*) NULL, frame()->renderer_accessibility());
}
-TEST_F(RenderViewImplTest, ScreenMetricsEmulation) {
- LoadHTML("<body style='min-height:1000px;'></body>");
-
- blink::WebDeviceEmulationParams params;
- base::string16 get_width = base::ASCIIToUTF16("Number(window.innerWidth)");
- base::string16 get_height = base::ASCIIToUTF16("Number(window.innerHeight)");
- int width, height;
-
- params.viewSize.width = 327;
- params.viewSize.height = 415;
- view()->OnEnableDeviceEmulation(params);
- EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_width, &width));
- EXPECT_EQ(params.viewSize.width, width);
- EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_height, &height));
- EXPECT_EQ(params.viewSize.height, height);
-
- params.viewSize.width = 1005;
- params.viewSize.height = 1102;
- view()->OnEnableDeviceEmulation(params);
- EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_width, &width));
- EXPECT_EQ(params.viewSize.width, width);
- EXPECT_TRUE(ExecuteJavaScriptAndReturnIntValue(get_height, &height));
- EXPECT_EQ(params.viewSize.height, height);
-
- view()->OnDisableDeviceEmulation();
-
- view()->OnEnableDeviceEmulation(params);
- // Don't disable here to test that emulation is being shutdown properly.
-}
-
// Sanity check for the Navigation Timing API |navigationStart| override. We
// are asserting only most basic constraints, as TimeTicks (passed as the
// override) are not comparable with the wall time (returned by the Blink API).
@@ -2654,10 +2654,10 @@ TEST_F(RenderViewImplBlinkSettingsTest, Negative) {
EXPECT_TRUE(settings()->viewportEnabled());
}
-#if !defined(OS_CHROMEOS)
-// UseZoomForDSF is enabled on ChromeOS.
TEST_F(RenderViewImplScaleFactorTest, ConverViewportToWindowWithoutZoomForDSF) {
DoSetUp();
+ if (IsUseZoomForDSFEnabled())
+ return;
SetDeviceScaleFactor(2.f);
blink::WebRect rect(20, 10, 200, 100);
view()->convertViewportToWindow(&rect);
@@ -2666,7 +2666,66 @@ TEST_F(RenderViewImplScaleFactorTest, ConverViewportToWindowWithoutZoomForDSF) {
EXPECT_EQ(200, rect.width);
EXPECT_EQ(100, rect.height);
}
-#endif
+
+TEST_F(RenderViewImplScaleFactorTest, ScreenMetricsEmulationWithOriginalDSF1) {
+ DoSetUp();
+ SetDeviceScaleFactor(1.f);
+
+ LoadHTML("<body style='min-height:1000px;'></body>");
+ {
+ SCOPED_TRACE("327x415 1dpr");
+ TestEmulatedSizeDprDsf(327, 415, 1.f, 1.f);
+ }
+ {
+ SCOPED_TRACE("327x415 1.5dpr");
+ TestEmulatedSizeDprDsf(327, 415, 1.5f, 1.f);
+ }
+ {
+ SCOPED_TRACE("1005x1102 2dpr");
+ TestEmulatedSizeDprDsf(1005, 1102, 2.f, 1.f);
+ }
+ {
+ SCOPED_TRACE("1005x1102 3dpr");
+ TestEmulatedSizeDprDsf(1005, 1102, 3.f, 1.f);
+ }
+
+ view()->OnDisableDeviceEmulation();
+
+ blink::WebDeviceEmulationParams params;
+ view()->OnEnableDeviceEmulation(params);
+ // Don't disable here to test that emulation is being shutdown properly.
+}
+
+TEST_F(RenderViewImplScaleFactorTest, ScreenMetricsEmulationWithOriginalDSF2) {
+ DoSetUp();
+ SetDeviceScaleFactor(2.f);
+ float compositor_dsf =
+ IsUseZoomForDSFEnabled() ? 1.f : 2.f;
+
+ LoadHTML("<body style='min-height:1000px;'></body>");
+ {
+ SCOPED_TRACE("327x415 1dpr");
+ TestEmulatedSizeDprDsf(327, 415, 1.f, compositor_dsf);
+ }
+ {
+ SCOPED_TRACE("327x415 1.5dpr");
+ TestEmulatedSizeDprDsf(327, 415, 1.5f, compositor_dsf);
+ }
+ {
+ SCOPED_TRACE("1005x1102 2dpr");
+ TestEmulatedSizeDprDsf(1005, 1102, 2.f, compositor_dsf);
+ }
+ {
+ SCOPED_TRACE("1005x1102 3dpr");
+ TestEmulatedSizeDprDsf(1005, 1102, 3.f, compositor_dsf);
+ }
+
+ view()->OnDisableDeviceEmulation();
+
+ blink::WebDeviceEmulationParams params;
+ view()->OnEnableDeviceEmulation(params);
+ // Don't disable here to test that emulation is being shutdown properly.
+}
TEST_F(RenderViewImplScaleFactorTest, ConverViewportToWindowWithZoomForDSF) {
base::CommandLine::ForCurrentProcess()->AppendSwitch(
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index bdab858..5c10262 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -547,7 +547,10 @@ class CONTENT_EXPORT RenderViewImpl
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest,
GetCompositionCharacterBoundsTest);
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnNavigationHttpPost);
- FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, ScreenMetricsEmulation);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewImplScaleFactorTest,
+ ScreenMetricsEmulationWithOriginalDSF1);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewImplScaleFactorTest,
+ ScreenMetricsEmulationWithOriginalDSF2);
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest,
DecideNavigationPolicyHandlesAllTopLevel);
#if defined(OS_MACOSX)
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 548d676..b3abd80 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -591,6 +591,7 @@ void RenderWidget::OnEnableDeviceEmulation(
resize_params.display_mode = display_mode_;
screen_metrics_emulator_.reset(new RenderWidgetScreenMetricsEmulator(
this, params, resize_params, view_screen_rect_, window_screen_rect_));
+ screen_metrics_emulator_->Apply();
} else {
screen_metrics_emulator_->ChangeEmulationParams(params);
}
@@ -1102,8 +1103,11 @@ void RenderWidget::Resize(const ResizeParams& params) {
top_controls_shrink_blink_size_);
if (resized) {
- gfx::Size new_widget_size =
- IsUseZoomForDSFEnabled() ? physical_backing_size_ : size_;
+ gfx::Size new_widget_size = size_;
+ if (IsUseZoomForDSFEnabled()) {
+ new_widget_size = gfx::ScaleToCeiledSize(new_widget_size,
+ GetOriginalDeviceScaleFactor());
+ }
// 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.
@@ -1112,8 +1116,9 @@ void RenderWidget::Resize(const ResizeParams& params) {
WebSize visual_viewport_size;
if (IsUseZoomForDSFEnabled()) {
- visual_viewport_size = gfx::ScaleToCeiledSize(params.visible_viewport_size,
- device_scale_factor_);
+ visual_viewport_size = gfx::ScaleToCeiledSize(
+ params.visible_viewport_size,
+ GetOriginalDeviceScaleFactor());
} else {
visual_viewport_size = visible_viewport_size_;
}
@@ -1480,9 +1485,8 @@ void RenderWidget::OnImeConfirmComposition(const base::string16& text,
void RenderWidget::OnDeviceScaleFactorChanged() {
if (!compositor_)
return;
-
if (IsUseZoomForDSFEnabled())
- compositor_->SetPaintedDeviceScaleFactor(device_scale_factor_);
+ compositor_->SetPaintedDeviceScaleFactor(GetOriginalDeviceScaleFactor());
else
compositor_->setDeviceScaleFactor(device_scale_factor_);
}
@@ -1573,7 +1577,7 @@ void RenderWidget::UpdateCompositionInfo(bool should_update_range) {
void RenderWidget::convertViewportToWindow(blink::WebRect* rect) {
if (IsUseZoomForDSFEnabled()) {
- float reverse = 1 / device_scale_factor_;
+ float reverse = 1 / GetOriginalDeviceScaleFactor();
// TODO(oshima): We may need to allow pixel precision here as the the
// anchor element can be placed at half pixel.
gfx::Rect window_rect =
@@ -1587,10 +1591,10 @@ void RenderWidget::convertViewportToWindow(blink::WebRect* rect) {
void RenderWidget::convertWindowToViewport(blink::WebFloatRect* rect) {
if (IsUseZoomForDSFEnabled()) {
- rect->x *= device_scale_factor_;
- rect->y *= device_scale_factor_;
- rect->width *= device_scale_factor_;
- rect->height *= device_scale_factor_;
+ rect->x *= GetOriginalDeviceScaleFactor();
+ rect->y *= GetOriginalDeviceScaleFactor();
+ rect->width *= GetOriginalDeviceScaleFactor();
+ rect->height *= GetOriginalDeviceScaleFactor();
}
}
@@ -2130,4 +2134,11 @@ void RenderWidget::OnWaitNextFrameForTests(int routing_id) {
MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE);
}
+float RenderWidget::GetOriginalDeviceScaleFactor() const {
+ return
+ screen_metrics_emulator_ ?
+ screen_metrics_emulator_->original_screen_info().deviceScaleFactor :
+ device_scale_factor_;
+}
+
} // namespace content
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 4830733..59da240 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -780,6 +780,10 @@ class CONTENT_EXPORT RenderWidget
scoped_ptr<scheduler::RenderWidgetSchedulingState>
render_widget_scheduling_state_;
+ private:
+ // When emulated, this returns original device scale factor.
+ float GetOriginalDeviceScaleFactor() const;
+
DISALLOW_COPY_AND_ASSIGN(RenderWidget);
};
diff --git a/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp b/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp
index 9854ebc..6bf5d94 100644
--- a/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp
+++ b/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp
@@ -164,16 +164,14 @@ void DevToolsHost::disconnectClient()
float DevToolsHost::zoomFactor()
{
- return m_frontendFrame ? m_frontendFrame->pageZoomFactor() : 1;
-}
-
-float DevToolsHost::convertLengthForEmbedder(float length)
-{
if (!m_frontendFrame)
- return length;
+ return 1;
+ float zoomFactor = m_frontendFrame->pageZoomFactor();
+ // Cancel the device scale factor applied to the zoom factor in
+ // use-zoom-for-dsf mode.
const HostWindow* hostWindow = m_frontendFrame->view()->hostWindow();
- IntRect screen = hostWindow->viewportToScreen(IntRect(0, 0, length, 0));
- return screen.width();
+ float windowToViewportRatio = hostWindow->windowToViewportScalar(1.0f);
+ return zoomFactor / windowToViewportRatio;
}
void DevToolsHost::setInjectedScriptForOrigin(const String& origin, const String& script)
diff --git a/third_party/WebKit/Source/core/inspector/DevToolsHost.idl b/third_party/WebKit/Source/core/inspector/DevToolsHost.idl
index c2846c0..096fd64 100644
--- a/third_party/WebKit/Source/core/inspector/DevToolsHost.idl
+++ b/third_party/WebKit/Source/core/inspector/DevToolsHost.idl
@@ -36,8 +36,6 @@
] interface DevToolsHost {
float zoomFactor();
- float convertLengthForEmbedder(float length);
-
void setInjectedScriptForOrigin(DOMString origin, DOMString script);
void copyText(DOMString text);
diff --git a/third_party/WebKit/Source/devtools/front_end/devtools.js b/third_party/WebKit/Source/devtools/front_end/devtools.js
index 9cb6bf2..9da8325 100644
--- a/third_party/WebKit/Source/devtools/front_end/devtools.js
+++ b/third_party/WebKit/Source/devtools/front_end/devtools.js
@@ -400,13 +400,7 @@ InspectorFrontendHostImpl.prototype = {
*/
setInspectedPageBounds: function(bounds)
{
- var converted = {
- x: Math.round(DevToolsHost.convertLengthForEmbedder(bounds.x)),
- y: Math.round(DevToolsHost.convertLengthForEmbedder(bounds.y)),
- width: Math.round(DevToolsHost.convertLengthForEmbedder(bounds.width)),
- height: Math.round(DevToolsHost.convertLengthForEmbedder(bounds.height))
- };
- DevToolsAPI.sendMessageToEmbedder("setInspectedPageBounds", [converted], null);
+ DevToolsAPI.sendMessageToEmbedder("setInspectedPageBounds", [bounds], null);
},
/**
diff --git a/third_party/WebKit/Source/devtools/front_end/externs.js b/third_party/WebKit/Source/devtools/front_end/externs.js
index 20df2fc..3ba37ff 100644
--- a/third_party/WebKit/Source/devtools/front_end/externs.js
+++ b/third_party/WebKit/Source/devtools/front_end/externs.js
@@ -213,12 +213,6 @@ DevToolsHost.ContextMenuDescriptor;
DevToolsHost.zoomFactor = function() { }
/**
- * @param {number} length
- * @return {number}
- */
-DevToolsHost.convertLengthForEmbedder = function(length) { }
-
-/**
* @param {string} origin
* @param {string} script
*/
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp
index 0a2b40e..325d608 100644
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -410,7 +410,7 @@ WebViewImpl::WebViewImpl(WebViewClient* client)
, m_zoomLevel(0)
, m_minimumZoomLevel(zoomFactorToZoomLevel(minTextSizeMultiplier))
, m_maximumZoomLevel(zoomFactorToZoomLevel(maxTextSizeMultiplier))
- , m_zoomFactorForDeviceScaleFactor(1.f)
+ , m_zoomFactorForDeviceScaleFactor(0.f)
, m_maximumLegibleScale(1)
, m_doubleTapZoomPageScaleFactor(0)
, m_doubleTapZoomPending(false)
@@ -3055,7 +3055,16 @@ double WebViewImpl::setZoomLevel(double zoomLevel)
LocalFrame* frame = mainFrameImpl()->frame();
if (!WebLocalFrameImpl::pluginContainerFromFrame(frame)) {
float zoomFactor = m_zoomFactorOverride ? m_zoomFactorOverride : static_cast<float>(zoomLevelToZoomFactor(m_zoomLevel));
- zoomFactor *= m_zoomFactorForDeviceScaleFactor;
+ if (m_zoomFactorForDeviceScaleFactor) {
+ if (m_compositorDeviceScaleFactorOverride) {
+ // Adjust the page's DSF so that DevicePixelRatio becomes m_zoomFactorForDeviceScaleFactor.
+ page()->setDeviceScaleFactor(m_zoomFactorForDeviceScaleFactor / m_compositorDeviceScaleFactorOverride);
+ zoomFactor *= m_compositorDeviceScaleFactorOverride;
+ } else {
+ page()->setDeviceScaleFactor(1.f);
+ zoomFactor *= m_zoomFactorForDeviceScaleFactor;
+ }
+ }
frame->setPageZoomFactor(zoomFactor);
}
@@ -3772,6 +3781,10 @@ void WebViewImpl::setCompositorDeviceScaleFactorOverride(float deviceScaleFactor
if (m_compositorDeviceScaleFactorOverride == deviceScaleFactor)
return;
m_compositorDeviceScaleFactorOverride = deviceScaleFactor;
+ if (m_zoomFactorForDeviceScaleFactor) {
+ setZoomLevel(zoomLevel());
+ return;
+ }
if (page() && m_layerTreeView)
updateLayerTreeDeviceScaleFactor();
}