WebKit Bugzilla
Attachment 356503 Details for
Bug 172917
: [Mac] Implement basic hit testing in the scrolling tree
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Temporary patch to set parentRelativeScrollableRect on scrolling nodes (applies on top of bug 192358)
0002-Temporary-patch-to-set-parentRelativeScrollableRect-.patch (text/plain), 10.03 KB, created by
Frédéric Wang (:fredw)
on 2018-12-04 09:15:29 PST
(
hide
)
Description:
Temporary patch to set parentRelativeScrollableRect on scrolling nodes (applies on top of bug 192358)
Filename:
MIME Type:
Creator:
Frédéric Wang (:fredw)
Created:
2018-12-04 09:15:29 PST
Size:
10.03 KB
patch
obsolete
>From 66f343af8027e4609e32dd78619a219e03af3cb3 Mon Sep 17 00:00:00 2001 >From: Frederic Wang <fwang@igalia.com> >Date: Thu, 29 Nov 2018 10:13:54 +0100 >Subject: [PATCH xserver 2/5] Temporary patch to set > parentRelativeScrollableRect on scrolling nodes. > >--- > .../rendering/RenderLayerCompositor.cpp | 62 +++++++++++-------- > .../WebCore/rendering/RenderLayerCompositor.h | 9 ++- > 2 files changed, 45 insertions(+), 26 deletions(-) > >diff --git a/Source/WebCore/rendering/RenderLayerCompositor.cpp b/Source/WebCore/rendering/RenderLayerCompositor.cpp >index ec2f5a0539d..8391d762e5b 100644 >--- a/Source/WebCore/rendering/RenderLayerCompositor.cpp >+++ b/Source/WebCore/rendering/RenderLayerCompositor.cpp >@@ -3749,36 +3749,47 @@ StickyPositionViewportConstraints RenderLayerCompositor::computeStickyViewportCo > return constraints; > } > >-static ScrollingNodeID enclosingScrollingNodeID(RenderLayer& layer, IncludeSelfOrNot includeSelf) >+RenderLayerCompositor::EnclosingNodeData RenderLayerCompositor::findEnclosingScrollingNode(RenderLayer& layer, IncludeSelfOrNot includeSelf) > { > auto* currLayer = includeSelf == IncludeSelf ? &layer : layer.parent(); >+ EnclosingNodeData result; >+ >+ // FIXME: This does not take transforms into account: >+ // - Async scrolling should not be performed when there are non-axis-aligned transforms. >+ // - parentRelativeScrollableRect should be resized if there are scale transforms. > while (currLayer) { > if (auto* backing = currLayer->backing()) { >- if (ScrollingNodeID nodeID = backing->scrollingNodeIDForChildren()) >- return nodeID; >+ if (ScrollingNodeID nodeID = backing->scrollingNodeIDForChildren()) { >+ result.nodeID = nodeID; >+ if (auto* box = layer.renderBox()) { >+ result.parentRelativeScrollableRect = box->contentBoxRect(); >+ result.parentRelativeScrollableRect.setLocation(layer.convertToLayerCoords(currLayer, result.parentRelativeScrollableRect.location())); >+ } >+ return result; >+ } > } > currLayer = currLayer->parent(); > } > >- return 0; >+ return result; > } > >-static ScrollingNodeID scrollCoordinatedAncestorInParentOfFrame(Frame& frame) >+std::optional<RenderLayerCompositor::EnclosingNodeData> RenderLayerCompositor::scrollCoordinatedAncestorInParentOfFrame(Frame& frame) > { > if (!frame.document() || !frame.view()) >- return 0; >+ return std::nullopt; > > // Find the frame's enclosing layer in our render tree. > auto* ownerElement = frame.document()->ownerElement(); > auto* frameRenderer = ownerElement ? ownerElement->renderer() : nullptr; > if (!frameRenderer) >- return 0; >+ return std::nullopt; > > auto* layerInParentDocument = frameRenderer->enclosingLayer(); > if (!layerInParentDocument) >- return 0; >+ return std::nullopt; > >- return enclosingScrollingNodeID(*layerInParentDocument, IncludeSelf); >+ return findEnclosingScrollingNode(*layerInParentDocument, IncludeSelf); > } > > void RenderLayerCompositor::reattachSubframeScrollLayers() >@@ -3800,11 +3811,11 @@ void RenderLayerCompositor::reattachSubframeScrollLayers() > if (!frameScrollingNodeID) > continue; > >- ScrollingNodeID parentNodeID = scrollCoordinatedAncestorInParentOfFrame(*child); >- if (!parentNodeID) >+ std::optional<EnclosingNodeData> parentNodeData = scrollCoordinatedAncestorInParentOfFrame(*child); >+ if (!parentNodeData) > continue; > >- scrollingCoordinator->attachToStateTree(child->isMainFrame() ? MainFrameScrollingNode : SubframeScrollingNode, frameScrollingNodeID, parentNodeID); >+ scrollingCoordinator->attachToStateTree(child->isMainFrame() ? MainFrameScrollingNode : SubframeScrollingNode, frameScrollingNodeID, parentNodeData->nodeID); > } > } > >@@ -3866,15 +3877,16 @@ void RenderLayerCompositor::detachScrollCoordinatedLayer(RenderLayer& layer, Opt > backing->detachFromScrollingCoordinator(roles); > } > >-void RenderLayerCompositor::updateScrollCoordinationForThisFrame(ScrollingNodeID parentNodeID) >+void RenderLayerCompositor::updateScrollCoordinationForThisFrame(const EnclosingNodeData& parentNodeData) > { > auto* scrollingCoordinator = this->scrollingCoordinator(); > FrameView& frameView = m_renderView.frameView(); > ASSERT(scrollingCoordinator->coordinatesScrollingForFrameView(frameView)); > >- ScrollingNodeID nodeID = attachScrollingNode(*m_renderView.layer(), m_renderView.frame().isMainFrame() ? MainFrameScrollingNode : SubframeScrollingNode, parentNodeID); >+ ScrollingNodeID nodeID = attachScrollingNode(*m_renderView.layer(), m_renderView.frame().isMainFrame() ? MainFrameScrollingNode : SubframeScrollingNode, parentNodeData.nodeID); > ScrollingCoordinator::ScrollingGeometry scrollingGeometry; > // FIXME(https://webkit.org/b/172917): Pass parentRelativeScrollableRect? >+ scrollingGeometry.parentRelativeScrollableRect = parentNodeData.parentRelativeScrollableRect; > scrollingGeometry.scrollOrigin = frameView.scrollOrigin(); > scrollingGeometry.scrollableAreaSize = frameView.visibleContentRect().size(); > scrollingGeometry.contentSize = frameView.totalContentsSize(); >@@ -3898,17 +3910,17 @@ void RenderLayerCompositor::updateScrollCoordinatedLayer(RenderLayer& layer, Opt > return; > > if (!m_renderView.frame().isMainFrame()) { >- ScrollingNodeID parentDocumentHostingNodeID = scrollCoordinatedAncestorInParentOfFrame(m_renderView.frame()); >- if (!parentDocumentHostingNodeID) >+ std::optional<EnclosingNodeData> parentDocumentHostingNodeData = scrollCoordinatedAncestorInParentOfFrame(m_renderView.frame()); >+ if (!parentDocumentHostingNodeData) > return; > >- updateScrollCoordinationForThisFrame(parentDocumentHostingNodeID); >+ updateScrollCoordinationForThisFrame(*parentDocumentHostingNodeData); > if (!(reasons & ViewportConstrained) && isRenderViewLayer) > return; > } > >- ScrollingNodeID parentNodeID = enclosingScrollingNodeID(layer, ExcludeSelf); >- if (!parentNodeID && !isRenderViewLayer) >+ EnclosingNodeData parentNodeData = findEnclosingScrollingNode(layer, ExcludeSelf); >+ if (!parentNodeData.nodeID && !isRenderViewLayer) > return; > > auto* backing = layer.backing(); >@@ -3924,11 +3936,11 @@ void RenderLayerCompositor::updateScrollCoordinatedLayer(RenderLayer& layer, Opt > else > ASSERT_NOT_REACHED(); > >- ScrollingNodeID nodeID = attachScrollingNode(layer, nodeType, parentNodeID); >+ ScrollingNodeID nodeID = attachScrollingNode(layer, nodeType, parentNodeData.nodeID); > if (!nodeID) > return; > >- LOG_WITH_STREAM(Compositing, stream << "Registering ViewportConstrained " << nodeType << " node " << nodeID << " (layer " << backing->graphicsLayer()->primaryLayerID() << ") as child of " << parentNodeID); >+ LOG_WITH_STREAM(Compositing, stream << "Registering ViewportConstrained " << nodeType << " node " << nodeID << " (layer " << backing->graphicsLayer()->primaryLayerID() << ") as child of " << parentNodeData.nodeID); > > if (changes & ScrollingNodeChangeFlags::Layer) > scrollingCoordinator->updateNodeLayer(nodeID, backing->graphicsLayer()); >@@ -3948,16 +3960,16 @@ void RenderLayerCompositor::updateScrollCoordinatedLayer(RenderLayer& layer, Opt > } > } > >- parentNodeID = nodeID; >+ parentNodeData.nodeID = nodeID; > } else > detachScrollCoordinatedLayer(layer, ViewportConstrained); > > if (reasons & Scrolling) { > if (isRenderViewLayer) >- updateScrollCoordinationForThisFrame(parentNodeID); >+ updateScrollCoordinationForThisFrame(parentNodeData); > else { > ScrollingNodeType nodeType = OverflowScrollingNode; >- ScrollingNodeID nodeID = attachScrollingNode(layer, nodeType, parentNodeID); >+ ScrollingNodeID nodeID = attachScrollingNode(layer, nodeType, parentNodeData.nodeID); > if (!nodeID) > return; > >@@ -3981,7 +3993,7 @@ void RenderLayerCompositor::updateScrollCoordinatedLayer(RenderLayer& layer, Opt > scrollingGeometry.currentVerticalSnapPointIndex = layer.currentVerticalSnapPointIndex(); > #endif > >- LOG(Compositing, "Registering Scrolling scrolling node %" PRIu64 " (layer %" PRIu64 ") as child of %" PRIu64, nodeID, backing->graphicsLayer()->primaryLayerID(), parentNodeID); >+ LOG(Compositing, "Registering Scrolling scrolling node %" PRIu64 " (layer %" PRIu64 ") as child of %" PRIu64, nodeID, backing->graphicsLayer()->primaryLayerID(), parentNodeData.nodeID); > > scrollingCoordinator->updateOverflowScrollingNode(nodeID, backing->scrollingLayer(), backing->scrollingContentsLayer(), scrollingGeometry); > } >diff --git a/Source/WebCore/rendering/RenderLayerCompositor.h b/Source/WebCore/rendering/RenderLayerCompositor.h >index 70dde532e9e..742b8060cc1 100644 >--- a/Source/WebCore/rendering/RenderLayerCompositor.h >+++ b/Source/WebCore/rendering/RenderLayerCompositor.h >@@ -31,6 +31,7 @@ > #include "RenderLayer.h" > #include <wtf/HashMap.h> > #include <wtf/OptionSet.h> >+#include <wtf/Optional.h> > > namespace WebCore { > >@@ -444,7 +445,13 @@ private: > > void updateCustomLayersAfterFlush(); > >- void updateScrollCoordinationForThisFrame(ScrollingNodeID); >+ struct EnclosingNodeData { >+ ScrollingNodeID nodeID { 0 }; >+ LayoutRect parentRelativeScrollableRect; >+ }; >+ EnclosingNodeData findEnclosingScrollingNode(RenderLayer&, IncludeSelfOrNot); >+ std::optional<EnclosingNodeData> scrollCoordinatedAncestorInParentOfFrame(Frame&); >+ void updateScrollCoordinationForThisFrame(const EnclosingNodeData&); > ScrollingNodeID attachScrollingNode(RenderLayer&, ScrollingNodeType, ScrollingNodeID parentNodeID); > void updateScrollCoordinatedLayer(RenderLayer&, OptionSet<LayerScrollCoordinationRole>, OptionSet<ScrollingNodeChangeFlags>); > void detachScrollCoordinatedLayer(RenderLayer&, OptionSet<LayerScrollCoordinationRole>); >-- >2.19.1 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 172917
:
312007
|
312321
|
320274
|
320548
|
320627
|
320631
|
320652
|
320752
|
320919
|
355486
|
355637
|
355639
|
355640
|
355641
|
355642
|
355986
|
356005
|
356149
|
356503
|
358490
|
358491
|
358703
|
360651
|
360657
|
360668
|
360677
|
360689
|
360691