Index: third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp |
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp |
index 088dab8095f3d033b4794e52939a16c00ca8eae9..05d7a0d4baae54a1888fcb380fdcb74d00ebb976 100644 |
--- a/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp |
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp |
@@ -16,6 +16,7 @@ |
#include "platform/graphics/paint/GeometryMapper.h" |
#include "platform/graphics/paint/ScrollPaintPropertyNode.h" |
#include "platform/graphics/paint/TransformPaintPropertyNode.h" |
+#include "public/platform/WebLayerScrollClient.h" |
namespace blink { |
@@ -264,12 +265,6 @@ int PropertyTreeManager::ensureCompositorScrollNode( |
int id = scrollTree().Insert(cc::ScrollNode(), parentId); |
cc::ScrollNode& compositorNode = *scrollTree().Node(id); |
- // TODO(wkorman): Fix owning layer id to reference a layer id rather than a |
- // scroll node index. |
- compositorNode.owning_layer_id = parentId; |
- m_propertyTrees |
- .layer_id_to_scroll_node_index[compositorNode.owning_layer_id] = id; |
- |
compositorNode.scrollable = true; |
compositorNode.scroll_clip_layer_bounds.SetSize(scrollNode->clip().width(), |
@@ -319,7 +314,41 @@ void PropertyTreeManager::updateScrollAndScrollTranslationNodes( |
compositorTransformNode.local.MakeIdentity(); |
compositorTransformNode.scrolls = true; |
transformTree().set_needs_update(true); |
- // TODO(pdr): The scroll tree's scroll offset will need to be set here. |
+ // TODO(pdr): Because of a layer dependancy, the scroll tree scroll offset is |
+ // set in updateLayerScrollMapping but that should occur here. |
+} |
+ |
+void PropertyTreeManager::updateLayerScrollMapping( |
+ cc::Layer* layer, |
+ const TransformPaintPropertyNode* transform) { |
+ auto* enclosingScrollNode = transform->findEnclosingScrollNode(); |
+ int scrollNodeId = ensureCompositorScrollNode(enclosingScrollNode); |
+ layer->SetScrollTreeIndex(scrollNodeId); |
+ int layerId = layer->id(); |
+ m_propertyTrees.layer_id_to_scroll_node_index[layerId] = scrollNodeId; |
+ |
+ if (!transform->isScrollTranslation()) |
+ return; |
+ |
+ auto& compositorScrollNode = *scrollTree().Node(scrollNodeId); |
+ |
+ // TODO(pdr): Remove the scroll node's owning_layer_id. This approach of |
+ // setting owning_layer_id only when it is not set lets us maintain a 1:1 |
+ // mapping from layer to scroll node. |
+ if (compositorScrollNode.owning_layer_id == cc::Layer::INVALID_ID) { |
+ compositorScrollNode.owning_layer_id = layerId; |
+ auto& compositorTransformNode = |
+ *transformTree().Node(compositorScrollNode.transform_id); |
+ // TODO(pdr): Set this in updateScrollAndScrollTranslationNodes once the |
+ // layer id is no longer needed. |
+ scrollTree().SetScrollOffset(layerId, |
+ compositorTransformNode.scroll_offset); |
+ if (auto* scrollClient = enclosingScrollNode->scrollClient()) { |
+ layer->set_did_scroll_callback( |
+ base::Bind(&blink::WebLayerScrollClient::didScroll, |
+ base::Unretained(scrollClient))); |
+ } |
+ } |
} |
int PropertyTreeManager::switchToEffectNode( |