// Copyright 2018 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 "third_party/blink/renderer/core/page/touch_adjustment.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/widget/screen_info.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" namespace blink { namespace { class FakeChromeClient : public RenderingTestChromeClient { public: FakeChromeClient() = default; void SetDeviceScaleFactor(float device_scale_factor) { screen_info_.device_scale_factor = device_scale_factor; } const ScreenInfo& GetScreenInfo(LocalFrame&) const override { return screen_info_; } private: ScreenInfo screen_info_; }; } // namespace class TouchAdjustmentTest : public RenderingTest { protected: TouchAdjustmentTest() : RenderingTest(MakeGarbageCollected()), chrome_client_(MakeGarbageCollected()) {} LocalFrame& GetFrame() const { return *GetDocument().GetFrame(); } FakeChromeClient& GetChromeClient() const override { return *chrome_client_; } void SetZoomAndScale(float device_scale_factor, float browser_zoom_factor, float page_scale_factor) { device_scale_factor_ = device_scale_factor; page_scale_factor_ = page_scale_factor; GetChromeClient().SetDeviceScaleFactor(device_scale_factor); GetFrame().SetPageZoomFactor(device_scale_factor * browser_zoom_factor); GetPage().SetPageScaleFactor(page_scale_factor); } const LayoutSize max_touch_area_dip_unscaled = LayoutSize(32, 32); const LayoutSize min_touch_area_dip_unscaled = LayoutSize(20, 20); private: Persistent chrome_client_; float device_scale_factor_; float page_scale_factor_; }; TEST_F(TouchAdjustmentTest, AdjustmentRangeUpperboundScale) { // touch_area is set to always exceed the upper bound so we are really // checking the upper bound behavior below. LayoutSize touch_area(100, 100); LayoutSize result; // adjustment range is shrunk to default upper bound (32, 32) // when there is no zoom or scale. SetZoomAndScale(1 /* dsf */, 1 /* browser_zoom */, 1 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, max_touch_area_dip_unscaled); // Browser zoom without dsf change is not changing the upper bound. SetZoomAndScale(1 /* dsf */, 2 /* browser_zoom */, 1 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, max_touch_area_dip_unscaled); SetZoomAndScale(1 /* dsf */, 0.5, /* browser_zoom */ 1 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, max_touch_area_dip_unscaled); // When has page scale factor, upper bound is scaled. SetZoomAndScale(1 /* dsf */, 1 /* browser_zoom */, 2 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, max_touch_area_dip_unscaled * (1.f / 2)); // touch_area is in physical pixel, should change with dsf change. SetZoomAndScale(2 /* dsf */, 1 /* browser_zoom */, 1 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, max_touch_area_dip_unscaled * 2.f); SetZoomAndScale(0.5 /* dsf */, 1 /* browser_zoom */, 1 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, max_touch_area_dip_unscaled * 0.5f); // When DeviceScaleFactorDeprecated() is not 1, zoom-for-dsf is disabled, // touch_area should be in dip. SetZoomAndScale(2 /* dsf */, 1 /* browser_zoom */, 1 /* page_scale */); GetPage().SetDeviceScaleFactorDeprecated(0.5); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, max_touch_area_dip_unscaled); } TEST_F(TouchAdjustmentTest, AdjustmentRangeLowerboundScale) { // touch_area is set to 0 to always lower than minimal range. LayoutSize touch_area(0, 0); LayoutSize result; // Browser zoom without dsf change is not changing the size. SetZoomAndScale(1 /* dsf */, 2 /* browser_zoom */, 1 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, min_touch_area_dip_unscaled); // touch_area is in physical pixel, should change with dsf change. SetZoomAndScale(2 /* dsf */, 1 /* browser_zoom */, 1 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, min_touch_area_dip_unscaled * 2.f); // Adjustment range is changed with page scale. SetZoomAndScale(1 /* dsf */, 1 /* browser_zoom */, 2 /* page_scale */); result = GetHitTestRectForAdjustment(GetFrame(), touch_area); EXPECT_EQ(result, min_touch_area_dip_unscaled * (1.f / 2)); } } // namespace blink