[iOS] Changing view scale sometimes does not zoom the page to the new initial scale...
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 Nov 2018 19:12:38 +0000 (19:12 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 Nov 2018 19:12:38 +0000 (19:12 +0000)
commita56d7bfae93e64e4194d6ffad86bcc50f78e1c0d
tree3eb41d915ac1d6b9e5355f89bfab36ba83c36b1d
parentcd0c4e92501f0bf45bd18c3168748c0a2b070f0a
[iOS] Changing view scale sometimes does not zoom the page to the new initial scale when the page is zoomed in when ignoring meta viewport
https://bugs.webkit.org/show_bug.cgi?id=191226
<rdar://problem/45781765>

Reviewed by Tim Horton.

Source/WebCore:

When `_setViewScale:` SPI is used to adjust the layout scale factor of the page, we multiply minimum, initial
and maximum scales by the given layout scale factor to adjust for a larger or smaller minimum layout size.
However, in the case where the layout size scale factor is greater than 1 and we're also forcing the viewport to
be scalable, we override the default minimum scale with 1 (i.e. `forceAlwaysUserScalableMinimumScale`). This
means that the might be off by a small margin due to rounding error when computing the content width and view
width (see: r237743).

This means that in the case where (1) the viewport is forced to be user-scalable, and (2) we're ignoring meta
viewport parameters, and (3) `_viewScale` exceeds 1, we may end up computing a slightly different minimum scale
than the default minimum scale multiplied by the layout size scale factor; subsequently, the page scale factor
will be slightly different from initial scale, such that we'll no longer zoom to the new initial scale when
changing view scale.

This patch adjusts `forceAlwaysUserScalableMinimumScale` and `forceAlwaysUserScalableMaximumScale` to take the
current layout scale factor into account when computing min and max scales when the viewport is forced to be
always scalable.

Test: fast/viewport/ios/minimum-scale-after-changing-view-scale.html

* page/ViewportConfiguration.cpp:
(WebCore::ViewportConfiguration::minimumScale const):
* page/ViewportConfiguration.h:
(WebCore::ViewportConfiguration::maximumScale const):
(WebCore::ViewportConfiguration::forceAlwaysUserScalableMaximumScale const):
(WebCore::ViewportConfiguration::forceAlwaysUserScalableMinimumScale const):

Turn these from constant values to const functions on ViewportConfiguration, which factor in the current
viewport layout size scale factor.

Tools:

Add a missing check for `shouldIgnoreMetaViewport` when comparing TestOptions, to ensure that "ignore meta
viewport" state doesn't unexpectedly persist after running a layout test that ignores meta viewport.

* WebKitTestRunner/TestOptions.h:
(WTR::TestOptions::hasSameInitializationOptions const):

LayoutTests:

Add a new layout test that sets the view scale to several values greater than or equal to 1 and verifies that
the minimum scale and resulting scroll view scale are exactly the same as the view scale, when (1) the "ignores
meta viewport" preference is enabled, and (2) the viewport is forced to be always scalable.

* fast/viewport/ios/minimum-scale-after-changing-view-scale-expected.txt: Added.
* fast/viewport/ios/minimum-scale-after-changing-view-scale.html: Added.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@237818 268f45cc-cd09-0410-ab3c-d52691b4dbfc
LayoutTests/ChangeLog
LayoutTests/fast/viewport/ios/minimum-scale-after-changing-view-scale-expected.txt [new file with mode: 0644]
LayoutTests/fast/viewport/ios/minimum-scale-after-changing-view-scale.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/page/ViewportConfiguration.cpp
Source/WebCore/page/ViewportConfiguration.h
Tools/ChangeLog
Tools/WebKitTestRunner/TestOptions.h