Changeset 147682 in webkit


Ignore:
Timestamp:
Apr 4, 2013 4:57:33 PM (11 years ago)
Author:
Simon Fraser
Message:

Page content missing when flipping from an empty layer to a tiled layer
https://bugs.webkit.org/show_bug.cgi?id=113977
<rdar://problem/13444219>

Source/WebCore:

Reviewed by Tim Horton.

Some articles on USA Today were missing content on load, when a large GraphicsLayer
which did not draw content needed to draw content (and become tiled in the process).

The bug was an ordering dependency in GraphicsLayerCA::commitLayerChangesBeforeSublayers().
swapFromOrToTiledLayer() sets some dirty flags, but for some properties which have
already been committed in the current flush cycle.

Fix by moving the swapFromOrToTiledLayer() to the top of the commit, which is
safe since it only consults GraphicsLayer properties, not CALayer properties.

Test: compositing/tiling/empty-to-tiled.html

  • platform/graphics/ca/GraphicsLayerCA.cpp:

(WebCore::GraphicsLayerCA::commitLayerChangesBeforeSublayers):
(WebCore::GraphicsLayerCA::updateGeometry):
(WebCore::GraphicsLayerCA::updateLayerDrawsContent):
(WebCore::GraphicsLayerCA::updateContentsScale):

  • platform/graphics/ca/GraphicsLayerCA.h:

(GraphicsLayerCA):

LayoutTests:

Reviewed by Tim Horton.

Ref test that adds visible content to a larger layer.

  • compositing/tiling/empty-to-tiled-expected.html: Added.
  • compositing/tiling/empty-to-tiled.html: Added.
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r147679 r147682  
     12013-04-04  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Page content missing when flipping from an empty layer to a tiled layer
     4        https://bugs.webkit.org/show_bug.cgi?id=113977
     5        <rdar://problem/13444219>
     6
     7        Reviewed by Tim Horton.
     8       
     9        Ref test that adds visible content to a larger layer.
     10
     11        * compositing/tiling/empty-to-tiled-expected.html: Added.
     12        * compositing/tiling/empty-to-tiled.html: Added.
     13
    1142013-04-04  Eric Carlson  <eric.carlson@apple.com>
    215
  • trunk/Source/WebCore/ChangeLog

    r147681 r147682  
     12013-04-04  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Page content missing when flipping from an empty layer to a tiled layer
     4        https://bugs.webkit.org/show_bug.cgi?id=113977
     5        <rdar://problem/13444219>
     6
     7        Reviewed by Tim Horton.
     8       
     9        Some articles on USA Today were missing content on load, when a large GraphicsLayer
     10        which did not draw content needed to draw content (and become tiled in the process).
     11       
     12        The bug was an ordering dependency in GraphicsLayerCA::commitLayerChangesBeforeSublayers().
     13        swapFromOrToTiledLayer() sets some dirty flags, but for some properties which have
     14        already been committed in the current flush cycle.
     15       
     16        Fix by moving the swapFromOrToTiledLayer() to the top of the commit, which is
     17        safe since it only consults GraphicsLayer properties, not CALayer properties.
     18
     19        Test: compositing/tiling/empty-to-tiled.html
     20
     21        * platform/graphics/ca/GraphicsLayerCA.cpp:
     22        (WebCore::GraphicsLayerCA::commitLayerChangesBeforeSublayers):
     23        (WebCore::GraphicsLayerCA::updateGeometry):
     24        (WebCore::GraphicsLayerCA::updateLayerDrawsContent):
     25        (WebCore::GraphicsLayerCA::updateContentsScale):
     26        * platform/graphics/ca/GraphicsLayerCA.h:
     27        (GraphicsLayerCA):
     28
    1292013-04-04  Christophe Dumez  <ch.dumez@sisa.samsung.com>
    230
  • trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.cpp

    r147186 r147682  
    11261126        return;
    11271127
     1128    bool needTiledLayer = requiresTiledLayer(pageScaleFactor);
     1129    if (needTiledLayer != m_usingTiledBacking)
     1130        swapFromOrToTiledLayer(needTiledLayer);
     1131
    11281132    // Need to handle Preserves3DChanged first, because it affects which layers subsequent properties are applied to
    11291133    if (m_uncommittedChanges & (Preserves3DChanged | ReplicatedLayerChanged))
     
    11341138
    11351139    if (m_uncommittedChanges & DrawsContentChanged)
    1136         updateLayerDrawsContent(pageScaleFactor);
     1140        updateLayerDrawsContent();
    11371141
    11381142    if (m_uncommittedChanges & NameChanged)
     
    12971301    FloatSize pixelAlignmentOffset;
    12981302    computePixelAlignment(pageScaleFactor, positionRelativeToBase, scaledPosition, scaledSize, scaledAnchorPoint, pixelAlignmentOffset);
    1299 
    1300     bool needTiledLayer = requiresTiledLayer(pageScaleFactor);
    1301     if (needTiledLayer != m_usingTiledBacking)
    1302         swapFromOrToTiledLayer(needTiledLayer);
    13031303
    13041304    FloatSize usedSize = m_usingTiledBacking ? constrainedSize() : scaledSize;
     
    15681568}
    15691569
    1570 void GraphicsLayerCA::updateLayerDrawsContent(float pageScaleFactor)
    1571 {
    1572     bool needTiledLayer = requiresTiledLayer(pageScaleFactor);
    1573     if (needTiledLayer != m_usingTiledBacking)
    1574         swapFromOrToTiledLayer(needTiledLayer);
    1575 
     1570void GraphicsLayerCA::updateLayerDrawsContent()
     1571{
    15761572    if (m_drawsContent)
    15771573        m_layer->setNeedsDisplay();
     
    25682564void GraphicsLayerCA::updateContentsScale(float pageScaleFactor)
    25692565{
    2570     bool needTiledLayer = requiresTiledLayer(pageScaleFactor);
    2571     if (needTiledLayer != m_usingTiledBacking)
    2572         swapFromOrToTiledLayer(needTiledLayer);
    2573 
    25742566    float contentsScale = clampedContentsScaleForScale(pageScaleFactor * deviceScaleFactor());
    25752567   
  • trunk/Source/WebCore/platform/graphics/ca/GraphicsLayerCA.h

    r147186 r147682  
    330330    void updateBackfaceVisibility();
    331331    void updateStructuralLayer();
    332     void updateLayerDrawsContent(float pixelAlignmentScale);
     332    void updateLayerDrawsContent();
    333333    void updateBackgroundColor();
    334334
Note: See TracChangeset for help on using the changeset viewer.