Changeset 102292 in webkit


Ignore:
Timestamp:
Dec 7, 2011 5:53:42 PM (12 years ago)
Author:
commit-queue@webkit.org
Message:

[chromium] Preserve original pageScale limits in WebViewImpl
https://bugs.webkit.org/show_bug.cgi?id=72983

Patch by Alexandre Elias <aelias@google.com> on 2011-12-07
Reviewed by Darin Fisher.

Preserve the originally viewport-tag specified page scale limits, and
compute the final ones in a new private method
computePageScaleFactorLimits(). This is then called when contents
size change (which can affect the minimum).

Also clean up several minor bugs, namely clamping issues (reorder
clampNegativeToZero to avoid negative scroll offsets, and force max to
be greater than min), and incorrect behavior in the presence of
"solid" scrollbars.

  • src/ChromeClientImpl.cpp:

(WebKit::ChromeClientImpl::contentsSizeChanged):

  • src/WebViewImpl.cpp:

(WebKit::WebViewImpl::WebViewImpl):
(WebKit::WebViewImpl::clampPageScaleFactorToLimits):
(WebKit::WebViewImpl::clampOffsetAtScale):
(WebKit::WebViewImpl::setPageScaleFactorPreservingScrollOffset):
(WebKit::WebViewImpl::setPageScaleFactor):
(WebKit::WebViewImpl::setPageScaleFactorLimits):
(WebKit::WebViewImpl::computePageScaleFactorLimits):
(WebKit::WebViewImpl::didChangeContentsSize):

  • src/WebViewImpl.h:
Location:
trunk/Source/WebKit/chromium
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/chromium/ChangeLog

    r102283 r102292  
     12011-12-07  Alexandre Elias  <aelias@google.com>
     2
     3        [chromium] Preserve original pageScale limits in WebViewImpl
     4        https://bugs.webkit.org/show_bug.cgi?id=72983
     5
     6        Reviewed by Darin Fisher.
     7
     8        Preserve the originally viewport-tag specified page scale limits, and
     9        compute the final ones in a new private method
     10        computePageScaleFactorLimits().  This is then called when contents
     11        size change (which can affect the minimum).
     12
     13        Also clean up several minor bugs, namely clamping issues (reorder
     14        clampNegativeToZero to avoid negative scroll offsets, and force max to
     15        be greater than min), and incorrect behavior in the presence of
     16        "solid" scrollbars.
     17
     18        * src/ChromeClientImpl.cpp:
     19        (WebKit::ChromeClientImpl::contentsSizeChanged):
     20        * src/WebViewImpl.cpp:
     21        (WebKit::WebViewImpl::WebViewImpl):
     22        (WebKit::WebViewImpl::clampPageScaleFactorToLimits):
     23        (WebKit::WebViewImpl::clampOffsetAtScale):
     24        (WebKit::WebViewImpl::setPageScaleFactorPreservingScrollOffset):
     25        (WebKit::WebViewImpl::setPageScaleFactor):
     26        (WebKit::WebViewImpl::setPageScaleFactorLimits):
     27        (WebKit::WebViewImpl::computePageScaleFactorLimits):
     28        (WebKit::WebViewImpl::didChangeContentsSize):
     29        * src/WebViewImpl.h:
     30
    1312011-12-07  Chris Sharp  <csharp@chromium.org>
    232       
  • trunk/Source/WebKit/chromium/src/ChromeClientImpl.cpp

    r102044 r102292  
    551551void ChromeClientImpl::contentsSizeChanged(Frame* frame, const IntSize& size) const
    552552{
     553    m_webView->didChangeContentsSize();
     554
    553555    WebFrameImpl* webframe = WebFrameImpl::fromFrame(frame);
    554556    if (webframe->client())
  • trunk/Source/WebKit/chromium/src/WebViewImpl.cpp

    r102181 r102292  
    344344    , m_minimumZoomLevel(zoomFactorToZoomLevel(minTextSizeMultiplier))
    345345    , m_maximumZoomLevel(zoomFactorToZoomLevel(maxTextSizeMultiplier))
     346    , m_pageDefinedMinimumPageScaleFactor(-1)
     347    , m_pageDefinedMaximumPageScaleFactor(-1)
    346348    , m_minimumPageScaleFactor(minPageScaleFactor)
    347349    , m_maximumPageScaleFactor(maxPageScaleFactor)
     
    19541956}
    19551957
    1956 float WebViewImpl::computePageScaleFactorWithinLimits(float scaleFactor)
     1958float WebViewImpl::clampPageScaleFactorToLimits(float scaleFactor)
    19571959{
    19581960    return min(max(scaleFactor, m_minimumPageScaleFactor), m_maximumPageScaleFactor);
     
    19711973    // Enforce the maximum and minimum scroll positions at the new scale.
    19721974    IntPoint clampedOffset = offset;
     1975    clampedOffset = clampedOffset.shrunkTo(IntPoint(docWidthAtNewScale - viewWidth, docHeightAtNewScale - viewHeight));
    19731976    clampedOffset.clampNegativeToZero();
    1974     clampedOffset = clampedOffset.shrunkTo(IntPoint(docWidthAtNewScale - viewWidth, docHeightAtNewScale - viewHeight));
    19751977    return clampedOffset;
    19761978}
     
    19791981{
    19801982    // Pick a scale factor that is within the expected limits
    1981     scaleFactor = computePageScaleFactorWithinLimits(scaleFactor);
     1983    scaleFactor = clampPageScaleFactorToLimits(scaleFactor);
    19821984    if (scaleFactor == pageScaleFactor())
    19831985        return;
     
    19992001        scaleFactor = 1;
    20002002
    2001     scaleFactor = computePageScaleFactorWithinLimits(scaleFactor);
     2003    scaleFactor = clampPageScaleFactorToLimits(scaleFactor);
    20022004    WebPoint clampedOrigin = clampOffsetAtScale(origin, scaleFactor);
    20032005    page()->setPageScaleFactor(scaleFactor, clampedOrigin);
     
    20652067void WebViewImpl::setPageScaleFactorLimits(float minPageScale, float maxPageScale)
    20662068{
    2067     m_minimumPageScaleFactor = min(max(minPageScale, minPageScaleFactor), maxPageScaleFactor) * deviceScaleFactor();
    2068     m_maximumPageScaleFactor = max(min(maxPageScale, maxPageScaleFactor), minPageScaleFactor) * deviceScaleFactor();
    2069 
    2070     if (m_size.width && mainFrame() && mainFrame()->contentsSize().width) {
     2069    m_pageDefinedMinimumPageScaleFactor = minPageScale;
     2070    m_pageDefinedMaximumPageScaleFactor = maxPageScale;
     2071    computePageScaleFactorLimits();
     2072}
     2073
     2074bool WebViewImpl::computePageScaleFactorLimits()
     2075{
     2076    if (m_pageDefinedMinimumPageScaleFactor == -1 || m_pageDefinedMaximumPageScaleFactor == -1)
     2077        return false;
     2078
     2079    if (!mainFrame() || !page() || !page()->mainFrame() || !page()->mainFrame()->view())
     2080        return false;
     2081
     2082    m_minimumPageScaleFactor = min(max(m_pageDefinedMinimumPageScaleFactor, minPageScaleFactor), maxPageScaleFactor) * deviceScaleFactor();
     2083    m_maximumPageScaleFactor = max(min(m_pageDefinedMaximumPageScaleFactor, maxPageScaleFactor), minPageScaleFactor) * deviceScaleFactor();
     2084
     2085    int viewWidthNotIncludingScrollbars = page()->mainFrame()->view()->visibleContentRect(false).width();
     2086    int contentsWidth = mainFrame()->contentsSize().width;
     2087    if (viewWidthNotIncludingScrollbars && contentsWidth) {
    20712088        // Limit page scaling down to the document width.
    2072         int viewWidth = m_size.width;
    2073         int unscaledContentWidth = mainFrame()->contentsSize().width / pageScaleFactor();
    2074         m_minimumPageScaleFactor = max(m_minimumPageScaleFactor, static_cast<float>(viewWidth) / unscaledContentWidth);
    2075     }
    2076     ASSERT(minPageScale <= maxPageScale);
     2089        int unscaledContentWidth = contentsWidth / pageScaleFactor();
     2090        m_minimumPageScaleFactor = max(m_minimumPageScaleFactor, static_cast<float>(viewWidthNotIncludingScrollbars) / unscaledContentWidth);
     2091        m_maximumPageScaleFactor = max(m_minimumPageScaleFactor, m_maximumPageScaleFactor);
     2092    }
     2093    ASSERT(m_minimumPageScaleFactor <= m_maximumPageScaleFactor);
    20772094#if USE(ACCELERATED_COMPOSITING)
    20782095    if (m_layerTreeHost)
     
    20802097#endif
    20812098
    2082     float clampedScale = computePageScaleFactorWithinLimits(pageScaleFactor());
    2083     if (clampedScale != pageScaleFactor())
     2099    float clampedScale = clampPageScaleFactorToLimits(pageScaleFactor());
     2100    if (clampedScale != pageScaleFactor()) {
    20842101        setPageScaleFactorPreservingScrollOffset(clampedScale);
     2102        return true;
     2103    }
     2104
     2105    return false;
    20852106}
    20862107
     
    25922613}
    25932614
     2615void WebViewImpl::didChangeContentsSize()
     2616{
     2617    bool didClampScale = computePageScaleFactorLimits();
     2618
     2619    if (!didClampScale)
     2620        return;
     2621
     2622    if (!mainFrameImpl())
     2623        return;
     2624
     2625    FrameView* view = mainFrameImpl()->frameView();
     2626    if (view && view->needsLayout())
     2627        view->layout();
     2628}
     2629
    25942630bool WebViewImpl::useExternalPopupMenus()
    25952631{
  • trunk/Source/WebKit/chromium/src/WebViewImpl.h

    r102044 r102292  
    336336    void layoutUpdated(WebFrameImpl*);
    337337
     338    void didChangeContentsSize();
     339
    338340    // Returns true if popup menus should be rendered by the browser, false if
    339341    // they should be rendered by WebKit (which is the default).
     
    462464
    463465private:
    464     float computePageScaleFactorWithinLimits(float scale);
     466    bool computePageScaleFactorLimits();
     467    float clampPageScaleFactorToLimits(float scale);
    465468    WebPoint clampOffsetAtScale(const WebPoint& offset, float scale);
    466469
     
    569572    double m_maximumZoomLevel;
    570573
     574    float m_pageDefinedMinimumPageScaleFactor;
     575    float m_pageDefinedMaximumPageScaleFactor;
    571576    float m_minimumPageScaleFactor;
    572 
    573577    float m_maximumPageScaleFactor;
    574578
Note: See TracChangeset for help on using the changeset viewer.