Changeset 187054 in webkit


Ignore:
Timestamp:
Jul 20, 2015 7:00:56 PM (9 years ago)
Author:
Simon Fraser
Message:

Facebook in tiled fullscreen is slow
https://bugs.webkit.org/show_bug.cgi?id=147134
rdar://problem/21823349

Reviewed by Tim Horton.

TiledCoreAnimationDrawingArea::scaleViewToFitDocumentIfNeeded() could cause a page to toggle
between two fixed layout sizes differing by a pixel, because of rounding. This would cause
lots of extra layouts and painting.

This happened because the the fixed layout size was computed using ceil(m_webPage.size().width() / viewScale)

  • WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:

(WebKit::TiledCoreAnimationDrawingArea::scaleViewToFitDocumentIfNeeded):

Location:
trunk/Source/WebKit2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r187050 r187054  
     12015-07-20  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Facebook in tiled fullscreen is slow
     4        https://bugs.webkit.org/show_bug.cgi?id=147134
     5        rdar://problem/21823349
     6
     7        Reviewed by Tim Horton.
     8       
     9        TiledCoreAnimationDrawingArea::scaleViewToFitDocumentIfNeeded() could cause a page to toggle
     10        between two fixed layout sizes differing by a pixel, because of rounding. This would cause
     11        lots of extra layouts and painting.
     12       
     13        This happened because the the fixed layout size was computed using ceil(m_webPage.size().width() / viewScale)
     14
     15        * WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm:
     16        (WebKit::TiledCoreAnimationDrawingArea::scaleViewToFitDocumentIfNeeded):
     17
    1182015-07-20  Wenson Hsieh  <wenson_hsieh@apple.com>
    219
  • trunk/Source/WebKit2/WebProcess/WebPage/mac/TiledCoreAnimationDrawingArea.mm

    r187001 r187054  
    284284
    285285    int viewWidth = m_webPage.size().width();
    286     bool documentWidthChangedOrInvalidated = m_webPage.mainFrame()->view()->needsLayout() || (m_lastDocumentSizeForScaleToFit.width() != m_webPage.mainFrameView()->renderView()->unscaledDocumentRect().width());
     286    int documentWidth = m_webPage.mainFrameView()->renderView()->unscaledDocumentRect().width();
     287
     288    bool documentWidthChanged = m_lastDocumentSizeForScaleToFit.width() != documentWidth;
    287289    bool viewWidthChanged = m_lastViewSizeForScaleToFit.width() != viewWidth;
    288290
    289     if (!documentWidthChangedOrInvalidated && !viewWidthChanged)
     291    if (!documentWidthChanged && !viewWidthChanged)
    290292        return;
    291293
     
    296298    // Our current understanding of the document width is still up to date, and we're in scaling mode.
    297299    // Update the viewScale without doing an extra layout to re-determine the document width.
    298     if (m_isScalingViewToFitDocument && !documentWidthChangedOrInvalidated) {
     300    if (m_isScalingViewToFitDocument && !documentWidthChanged) {
     301        m_lastViewSizeForScaleToFit = m_webPage.size();
    299302        float viewScale = (float)viewWidth / (float)m_lastDocumentSizeForScaleToFit.width();
    300         m_lastViewSizeForScaleToFit = m_webPage.size();
    301         viewScale = std::max(viewScale, minimumViewScale);
     303        if (viewScale < minimumViewScale) {
     304            viewScale = minimumViewScale;
     305            documentWidth = std::ceil(viewWidth / viewScale);
     306        }
     307        IntSize fixedLayoutSize(documentWidth, std::ceil((m_webPage.size().height() - m_webPage.corePage()->topContentInset()) / viewScale));
     308        m_webPage.setFixedLayoutSize(fixedLayoutSize);
    302309        m_webPage.scaleView(viewScale);
    303 
    304         IntSize fixedLayoutSize(std::ceil(m_webPage.size().width() / viewScale), std::ceil((m_webPage.size().height() - m_webPage.corePage()->topContentInset()) / viewScale));
    305         m_webPage.setFixedLayoutSize(fixedLayoutSize);
    306310        return;
    307311    }
     
    315319    m_lastDocumentSizeForScaleToFit = documentSize;
    316320
    317     int documentWidth = documentSize.width();
     321    documentWidth = documentSize.width();
    318322
    319323    float viewScale = 1;
     
    326330        m_webPage.setUseFixedLayout(true);
    327331        viewScale = (float)viewWidth / (float)documentWidth;
    328         viewScale = std::max(viewScale, minimumViewScale);
    329         IntSize fixedLayoutSize(std::ceil(m_webPage.size().width() / viewScale), std::ceil((m_webPage.size().height() - m_webPage.corePage()->topContentInset()) / viewScale));
     332        if (viewScale < minimumViewScale) {
     333            viewScale = minimumViewScale;
     334            documentWidth = std::ceil(viewWidth / viewScale);
     335        }
     336        IntSize fixedLayoutSize(documentWidth, std::ceil((m_webPage.size().height() - m_webPage.corePage()->topContentInset()) / viewScale));
    330337        m_webPage.setFixedLayoutSize(fixedLayoutSize);
    331338    }
Note: See TracChangeset for help on using the changeset viewer.