Implement backing-sharing in compositing layers, allowing overlap layers to paint...
[WebKit-https.git] / Source / WebCore / ChangeLog
index b4f0ce7..14147c5 100644 (file)
@@ -1,3 +1,174 @@
+2019-05-08  Simon Fraser  <simon.fraser@apple.com>
+
+        Implement backing-sharing in compositing layers, allowing overlap layers to paint into the backing store of another layer
+        https://bugs.webkit.org/show_bug.cgi?id=197561
+        <rdar://problem/50445998>
+
+        Reviewed by Antti Koivisto.
+
+        This change introduces the concept of layers that share backing store for compositing. A layer
+        which is sharing its backing store first paints itself, and then some set of layers which come
+        later in paint order in the same stacking context. This reduces the composited layer count in
+        some overflow scrolling scenarios, thereby also simplifying the scrolling tree.
+        
+        A backing-shared layer stores a vector of "sharing" RenderLayer* in its RenderLayerBacking. At
+        paint time, the owning layer is painted, then the sharing layers, setting the owning layer as the
+        painting root so that positioning and clipping just work.
+        
+        Sharing layer relationships are constructed in RenderLayerCompositor::computeCompositingRequirements().
+        We track the last layer which was composited in paint order as a shared candidate. If a later layer
+        would composite for overlap (and no other reasons), then we allow it to share with the candidate
+        if the candidate is in its ancestor containing block chain. Sharing is currently limited to layers
+        in the same stacking context.
+        
+        isComposited() returns false for sharing layers, but they are like composited layers in that
+        they behave as painting boundaries, so RenderLayer::paintLayer() needs to stop at them,
+        and repaints in shared layers have to be directed to their shared layer, hence
+        changes to RenderLayer::clippingRootForPainting() and RenderLayer::enclosingCompositingLayerForRepaint().
+        
+        The clipping boundary logic in RenderLayer::backgroundClipRect() needed to be generalized so that
+        all calls to RenderLayer::parentClipRects() check for crossing painting boundaries and use
+        TemporaryClipRects in that case.
+
+        Tests: compositing/shared-backing/overflow-scroll/absolute-in-stacking-relative-in-scroller.html
+               compositing/shared-backing/overflow-scroll/composited-absolute-in-absolute-in-relative-in-scroller.html
+               compositing/shared-backing/overflow-scroll/nested-absolute-with-clipping-in-stacking-overflow.html
+               compositing/shared-backing/overflow-scroll/previous-sibling-prevents-inclusiveness.html
+               compositing/shared-backing/overflow-scroll/relative-in-clipping-in-scroller-in-clipping.html
+               compositing/shared-backing/overflow-scroll/relative-in-clipping-in-scroller-in-relative-clipping.html
+               compositing/shared-backing/overflow-scroll/relative-in-div-in-overflow-scroll.html
+               compositing/shared-backing/overflow-scroll/scrolled-contents-has-painted-content.html
+               compositing/shared-backing/overflow-scroll/scrolled-contents-unconstrained-clip.html
+               compositing/shared-backing/overflow-scroll/shared-layer-clipping.html
+               compositing/shared-backing/overflow-scroll/shared-layer-composited-bounds.html
+               compositing/shared-backing/overflow-scroll/shared-layer-nested-relative-stacking.html
+               compositing/shared-backing/overflow-scroll/shared-layer-repaint.html
+               compositing/shared-backing/partial-compositing-update.html
+               compositing/shared-backing/partial-compositing-update2.html
+               compositing/shared-backing/remove-sharing-layer.html
+               compositing/shared-backing/sharing-cached-clip-rects.html
+
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::~RenderLayer):
+        (WebCore::RenderLayer::ancestorLayerIsInContainingBlockChain const):
+        (WebCore::RenderLayer::setBackingProviderLayer):
+        (WebCore::RenderLayer::disconnectFromBackingProviderLayer):
+        (WebCore::RenderLayer::enclosingCompositingLayerForRepaint const):
+        (WebCore::RenderLayer::clippingRootForPainting const):
+        (WebCore::RenderLayer::clipToRect):
+        (WebCore::RenderLayer::paintLayer):
+        (WebCore::RenderLayer::updateClipRects):
+        (WebCore::RenderLayer::clipCrossesPaintingBoundary const):
+        (WebCore::RenderLayer::calculateClipRects const):
+        (WebCore::outputPaintOrderTreeLegend):
+        (WebCore::outputPaintOrderTreeRecursive):
+        (WebCore::inContainingBlockChain): Deleted.
+        * rendering/RenderLayer.h:
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::willBeDestroyed):
+        (WebCore::clearBackingSharingLayerProviders):
+        (WebCore::RenderLayerBacking::setBackingSharingLayers):
+        (WebCore::RenderLayerBacking::removeBackingSharingLayer):
+        (WebCore::RenderLayerBacking::clearBackingSharingLayers):
+        (WebCore::RenderLayerBacking::updateCompositedBounds):
+        (WebCore::RenderLayerBacking::updateDrawsContent):
+        (WebCore::RenderLayerBacking::isSimpleContainerCompositingLayer const):
+        (WebCore::RenderLayerBacking::paintIntoLayer):
+        (WebCore::RenderLayerBacking::paintContents):
+        * rendering/RenderLayerBacking.h:
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::RenderLayerCompositor::CompositingState::stateForPaintOrderChildren const):
+        (WebCore::RenderLayerCompositor::CompositingState::propagateStateFromChildren):
+        (WebCore::RenderLayerCompositor::CompositingState::propagateStateFromChildrenForUnchangedSubtree):
+        (WebCore::RenderLayerCompositor::BackingSharingState::resetBackingProviderCandidate):
+        (WebCore::RenderLayerCompositor::updateCompositingLayers):
+        (WebCore::backingProviderLayerCanIncludeLayer):
+        (WebCore::RenderLayerCompositor::computeCompositingRequirements):
+        (WebCore::RenderLayerCompositor::traverseUnchangedSubtree):
+        (WebCore::RenderLayerCompositor::updateBacking):
+        (WebCore::RenderLayerCompositor::layerWillBeRemoved):
+        (WebCore::RenderLayerCompositor::requiresCompositingForIndirectReason const):
+        * rendering/RenderLayerCompositor.h:
+        * rendering/RenderTreeAsText.cpp:
+
+2019-05-08  Brent Fulgham  <bfulgham@apple.com>
+
+        Correct delayed load event handling
+        https://bugs.webkit.org/show_bug.cgi?id=197679
+        <rdar://problem/50423334>
+
+        Reviewed by Alex Christensen.
+
+        We need to properly account for the fact that JavaScript might run
+        while performing loads.
+
+        * dom/Document.cpp:
+        (WebCore::Document::loadEventDelayTimerFired):
+
+2019-05-08  Philippe Normand  <pnormand@igalia.com>
+
+        REGRESSION(r243197): [GStreamer] Error playing redirected streams
+        https://bugs.webkit.org/show_bug.cgi?id=197410
+
+        Reviewed by Carlos Garcia Campos.
+
+        Revert the change introduced in r243197 that was checking the
+        redirected URI instead of the original URI. Non-main URIs should
+        be ignored only when they are HLS (or similar) fragments.
+
+        Test http/tests/security/canvas-remote-read-remote-video-hls.html still passes.
+
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::MediaPlayerPrivateGStreamer::handleMessage):
+
+2019-05-08  Rob Buis  <rbuis@igalia.com>
+
+        Link prefetch not useful for top-level navigation
+        https://bugs.webkit.org/show_bug.cgi?id=195623
+
+        Reviewed by Youenn Fablet.
+
+        Cache cross-domain top-level prefetches in a dedicated cache and not in the
+        memory cache.
+
+        Tests: http/tests/cache/link-prefetch-main-resource-iframe.html
+               http/tests/cache/link-prefetch-main-resource.html
+               http/tests/contentextensions/prefetch-blocked.html
+
+        * loader/LinkLoader.cpp:
+        (WebCore::LinkLoader::prefetchIfNeeded):
+        * loader/ResourceLoadInfo.cpp:
+        (WebCore::toResourceType):
+
+2019-05-07  Don Olmstead  <don.olmstead@sony.com>
+
+        Fix !HAVE(ACCESSIBILITY) build
+        https://bugs.webkit.org/show_bug.cgi?id=197680
+
+        Reviewed by Fujii Hironori.
+
+        * accessibility/AXObjectCache.h:
+        (WebCore::AXObjectCache::focusedUIElementForPage):
+        Update declaration for !HAVE(ACCESSIBILITY)
+        * accessibility/AccessibilityObject.h:
+        Add wrapper implementation for !HAVE(ACCESSIBILITY)
+        * accessibility/AccessibilityProgressIndicator.cpp:
+        (WebCore::AccessibilityProgressIndicator::roleValue const):
+        Add ENABLE(METER_ELEMENT) guard.
+
+2019-05-07  Ryan Haddad  <ryanhaddad@apple.com>
+
+        Unreviewed, rolling out r245038.
+
+        Breaks internal builds.
+
+        Reverted changeset:
+
+        "Add SPI to set a list of hosts to which to send custom header
+        fields cross-origin"
+        https://bugs.webkit.org/show_bug.cgi?id=197397
+        https://trac.webkit.org/changeset/245038
+
 2019-05-07  Jiewen Tan  <jiewen_tan@apple.com>
 
         [WebAuthN] A new request should always suppress the pending request if any