Make it possible to zoom on pages that claim to lay out to device size and then fail...
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Mar 2015 19:16:20 +0000 (19:16 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 11 Mar 2015 19:16:20 +0000 (19:16 +0000)
https://bugs.webkit.org/show_bug.cgi?id=142549

Reviewed by Simon Fraser.

* page/ViewportConfiguration.cpp:
(WebCore::ViewportConfiguration::ViewportConfiguration):
Rename m_ignoreScalingConstraints to m_canIgnoreScalingConstraints,
because it being true does not guarantee that we will ignore scaling constraints,
but it being false does guarantee that we won't.

(WebCore::ViewportConfiguration::shouldIgnoreScalingConstraints):
Ignore scaling constraints if the page:
    a) claimed to want to lay out to device-width and then laid out too wide
    b) claimed to want to lay out to device-height and then laid out too tall
    c) claimed to want to lay out with initialScale=1 and then laid out too wide

(WebCore::ViewportConfiguration::initialScale):
(WebCore::ViewportConfiguration::minimumScale):
(WebCore::ViewportConfiguration::allowsUserScaling):
Call shouldIgnoreScalingConstraints() instead of looking at the local, so we can
have some more logic here (as above).

(WebCore::ViewportConfiguration::description):
Dump whether we're ignoring scaling constraints.

(WebCore::ViewportConfiguration::dump):
Use WTFLogAlways so that the output goes to various other logging mechanisms
instead of just stderr.

* page/ViewportConfiguration.h:
(WebCore::ViewportConfiguration::setCanIgnoreScalingConstraints):
(WebCore::ViewportConfiguration::setIgnoreScalingConstraints): Deleted.

* Shared/WebPreferencesDefinitions.h:
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::updatePreferences):
Flip the pref on by default.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@181400 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/page/ViewportConfiguration.cpp
Source/WebCore/page/ViewportConfiguration.h
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/WebPreferencesDefinitions.h
Source/WebKit2/WebProcess/WebPage/WebPage.cpp

index d234671..31448fe 100644 (file)
@@ -1,3 +1,39 @@
+2015-03-11  Timothy Horton  <timothy_horton@apple.com>
+
+        Make it possible to zoom on pages that claim to lay out to device size and then fail to do so
+        https://bugs.webkit.org/show_bug.cgi?id=142549
+
+        Reviewed by Simon Fraser.
+
+        * page/ViewportConfiguration.cpp:
+        (WebCore::ViewportConfiguration::ViewportConfiguration):
+        Rename m_ignoreScalingConstraints to m_canIgnoreScalingConstraints,
+        because it being true does not guarantee that we will ignore scaling constraints,
+        but it being false does guarantee that we won't.
+
+        (WebCore::ViewportConfiguration::shouldIgnoreScalingConstraints):
+        Ignore scaling constraints if the page:
+            a) claimed to want to lay out to device-width and then laid out too wide
+            b) claimed to want to lay out to device-height and then laid out too tall
+            c) claimed to want to lay out with initialScale=1 and then laid out too wide
+
+        (WebCore::ViewportConfiguration::initialScale):
+        (WebCore::ViewportConfiguration::minimumScale):
+        (WebCore::ViewportConfiguration::allowsUserScaling):
+        Call shouldIgnoreScalingConstraints() instead of looking at the local, so we can
+        have some more logic here (as above).
+
+        (WebCore::ViewportConfiguration::description):
+        Dump whether we're ignoring scaling constraints.
+
+        (WebCore::ViewportConfiguration::dump):
+        Use WTFLogAlways so that the output goes to various other logging mechanisms
+        instead of just stderr.
+
+        * page/ViewportConfiguration.h:
+        (WebCore::ViewportConfiguration::setCanIgnoreScalingConstraints):
+        (WebCore::ViewportConfiguration::setIgnoreScalingConstraints): Deleted.
+
 2015-03-11  Myles C. Maxfield  <mmaxfield@apple.com>
 
         Use out-of-band messaging for RenderBox::firstLineBaseline() and RenderBox::inlineBlockBaseline()
index 359473d..00c6c3a 100644 (file)
@@ -46,7 +46,7 @@ static bool constraintsAreAllRelative(const ViewportConfiguration::Parameters& c
 
 ViewportConfiguration::ViewportConfiguration()
     : m_minimumLayoutSize(1024, 768)
-    , m_ignoreScalingConstraints(false)
+    , m_canIgnoreScalingConstraints(false)
 {
     // Setup a reasonable default configuration to avoid computing infinite scale/sizes.
     // Those are the original iPhone configuration.
@@ -97,13 +97,32 @@ IntSize ViewportConfiguration::layoutSize() const
     return IntSize(layoutWidth(), layoutHeight());
 }
 
+bool ViewportConfiguration::shouldIgnoreScalingConstraints() const
+{
+    if (!m_canIgnoreScalingConstraints)
+        return false;
+
+    bool laidOutWiderThanViewport = m_contentSize.width() > layoutWidth();
+    if (m_viewportArguments.width == ViewportArguments::ValueDeviceWidth)
+        return laidOutWiderThanViewport;
+
+    bool laidOutTallerThanViewport = m_contentSize.height() > layoutHeight();
+    if (m_viewportArguments.height == ViewportArguments::ValueDeviceHeight)
+        return laidOutTallerThanViewport;
+
+    if (m_configuration.initialScaleIsSet && m_configuration.initialScale == 1)
+        return laidOutWiderThanViewport;
+
+    return false;
+}
+
 double ViewportConfiguration::initialScale() const
 {
     ASSERT(!constraintsAreAllRelative(m_configuration));
 
     // If the document has specified its own initial scale, use it regardless.
     // This is guaranteed to be sanity checked already, so no need for MIN/MAX.
-    if (m_configuration.initialScaleIsSet && !m_ignoreScalingConstraints)
+    if (m_configuration.initialScaleIsSet && !shouldIgnoreScalingConstraints())
         return m_configuration.initialScale;
 
     // If not, it is up to us to determine the initial scale.
@@ -118,13 +137,13 @@ double ViewportConfiguration::initialScale() const
     double height = m_contentSize.height() > 0 ? m_contentSize.height() : layoutHeight();
     if (height > 0 && height * initialScale < minimumLayoutSize.height())
         initialScale = minimumLayoutSize.height() / height;
-    return std::min(std::max(initialScale, m_ignoreScalingConstraints ? m_defaultConfiguration.minimumScale : m_configuration.minimumScale), m_configuration.maximumScale);
+    return std::min(std::max(initialScale, shouldIgnoreScalingConstraints() ? m_defaultConfiguration.minimumScale : m_configuration.minimumScale), m_configuration.maximumScale);
 }
 
 double ViewportConfiguration::minimumScale() const
 {
     // If we scale to fit, then this is our minimum scale as well.
-    if (!m_configuration.initialScaleIsSet || m_ignoreScalingConstraints)
+    if (!m_configuration.initialScaleIsSet || shouldIgnoreScalingConstraints())
         return initialScale();
 
     // If not, we still need to sanity check our value.
@@ -146,7 +165,7 @@ double ViewportConfiguration::minimumScale() const
 
 bool ViewportConfiguration::allowsUserScaling() const
 {
-    return m_ignoreScalingConstraints || m_configuration.allowsUserScaling;
+    return shouldIgnoreScalingConstraints() || m_configuration.allowsUserScaling;
 }
 
 ViewportConfiguration::Parameters ViewportConfiguration::webpageParameters()
@@ -469,7 +488,9 @@ CString ViewportConfiguration::description() const
     ts.writeIndent();
     ts << "(computed minimum scale " << minimumScale() << ")\n";
     ts.writeIndent();
-    ts << "(computed layout size " << layoutSize() << ")";
+    ts << "(computed layout size " << layoutSize() << ")\n";
+    ts.writeIndent();
+    ts << "(ignoring scaling constraints " << (shouldIgnoreScalingConstraints() ? "true" : "false") << ")";
     ts.decreaseIndent();
 
     ts << ")\n";
@@ -479,7 +500,7 @@ CString ViewportConfiguration::description() const
 
 void ViewportConfiguration::dump() const
 {
-    fprintf(stderr, "%s", description().data());
+    WTFLogAlways("%s", description().data());
 }
 
 #endif
index 18ac2c6..97385ac 100644 (file)
@@ -77,7 +77,7 @@ public:
     const ViewportArguments& viewportArguments() const { return m_viewportArguments; }
     WEBCORE_EXPORT void setViewportArguments(const ViewportArguments&);
 
-    void setIgnoreScalingConstraints(bool ignoreScalingConstraints) {m_ignoreScalingConstraints = ignoreScalingConstraints; }
+    void setCanIgnoreScalingConstraints(bool canIgnoreScalingConstraints) { m_canIgnoreScalingConstraints = canIgnoreScalingConstraints; }
 
     WEBCORE_EXPORT IntSize layoutSize() const;
     WEBCORE_EXPORT double initialScale() const;
@@ -101,6 +101,7 @@ private:
     double viewportArgumentsLength(double length) const;
     int layoutWidth() const;
     int layoutHeight() const;
+    bool shouldIgnoreScalingConstraints() const;
 
     Parameters m_configuration;
     Parameters m_defaultConfiguration;
@@ -108,7 +109,7 @@ private:
     FloatSize m_minimumLayoutSize;
     ViewportArguments m_viewportArguments;
 
-    bool m_ignoreScalingConstraints;
+    bool m_canIgnoreScalingConstraints;
 };
 
 } // namespace WebCore
index 00d4043..1d7fce1 100644 (file)
@@ -1,3 +1,15 @@
+2015-03-11  Timothy Horton  <timothy_horton@apple.com>
+
+        Make it possible to zoom on pages that claim to lay out to device size and then fail to do so
+        https://bugs.webkit.org/show_bug.cgi?id=142549
+
+        Reviewed by Simon Fraser.
+
+        * Shared/WebPreferencesDefinitions.h:
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::updatePreferences):
+        Flip the pref on by default.
+
 2015-03-11  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] Do not look for child processes in the UI process binary path
index d75428a..e5821a2 100644 (file)
     macro(SimpleLineLayoutDebugBordersEnabled, simpleLineLayoutDebugBordersEnabled, Bool, bool, false) \
     macro(DeveloperExtrasEnabled, developerExtrasEnabled, Bool, bool, false) \
     macro(LogsPageMessagesToSystemConsoleEnabled, logsPageMessagesToSystemConsoleEnabled, Bool, bool, false) \
-    macro(IgnoreViewportScalingConstraints, ignoreViewportScalingConstraints, Bool, bool, false) \
+    macro(IgnoreViewportScalingConstraints, ignoreViewportScalingConstraints, Bool, bool, true) \
     \
 
 #define FOR_EACH_WEBKIT_DEBUG_UINT32_PREFERENCE(macro) \
index d1b8b7d..e9dc781 100644 (file)
@@ -2853,7 +2853,7 @@ void WebPage::updatePreferences(const WebPreferencesStore& store)
         m_drawingArea->updatePreferences(store);
 
 #if PLATFORM(IOS)
-    m_viewportConfiguration.setIgnoreScalingConstraints(store.getBoolValueForKey(WebPreferencesKey::ignoreViewportScalingConstraintsKey()));
+    m_viewportConfiguration.setCanIgnoreScalingConstraints(store.getBoolValueForKey(WebPreferencesKey::ignoreViewportScalingConstraintsKey()));
 #endif
 }