diff options
-rw-r--r-- | content/common/content_switches_internal.h | 3 | ||||
-rw-r--r-- | content/renderer/devtools/render_widget_screen_metrics_emulator.cc | 1 | ||||
-rw-r--r-- | content/renderer/devtools/render_widget_screen_metrics_emulator.h | 4 | ||||
-rw-r--r-- | content/renderer/gpu/render_widget_compositor.h | 2 | ||||
-rw-r--r-- | content/renderer/render_view_browsertest.cc | 127 | ||||
-rw-r--r-- | content/renderer/render_view_impl.h | 5 | ||||
-rw-r--r-- | content/renderer/render_widget.cc | 33 | ||||
-rw-r--r-- | content/renderer/render_widget.h | 4 | ||||
-rw-r--r-- | third_party/WebKit/Source/core/inspector/DevToolsHost.cpp | 14 | ||||
-rw-r--r-- | third_party/WebKit/Source/core/inspector/DevToolsHost.idl | 2 | ||||
-rw-r--r-- | third_party/WebKit/Source/devtools/front_end/devtools.js | 8 | ||||
-rw-r--r-- | third_party/WebKit/Source/devtools/front_end/externs.js | 6 | ||||
-rw-r--r-- | third_party/WebKit/Source/web/WebViewImpl.cpp | 17 |
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(); } |