Index: cc/trees/property_tree_builder.cc |
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc |
index a27bd3c8bf6e0d2575138592243cdb29d565bcf1..76758a839d1379cc2e4f2cdceda693fd02081ba5 100644 |
--- a/cc/trees/property_tree_builder.cc |
+++ b/cc/trees/property_tree_builder.cc |
@@ -31,11 +31,13 @@ struct DataForRecursion { |
TransformTree* transform_tree; |
ClipTree* clip_tree; |
EffectTree* effect_tree; |
+ ScrollTree* scroll_tree; |
LayerType* transform_tree_parent; |
LayerType* transform_fixed_parent; |
int render_target; |
int clip_tree_parent; |
int effect_tree_parent; |
+ int scroll_tree_parent; |
const LayerType* page_scale_layer; |
const LayerType* inner_viewport_scroll_layer; |
const LayerType* outer_viewport_scroll_layer; |
@@ -48,6 +50,8 @@ struct DataForRecursion { |
bool should_flatten; |
bool target_is_clipped; |
bool is_hidden; |
+ bool scroll_tree_parent_created_by_uninheritable_criteria; |
+ ScrollBlocksOn accumulated_scroll_blocks_on; |
const gfx::Transform* device_transform; |
gfx::Vector2dF scroll_compensation_adjustment; |
gfx::Transform compound_transform_since_render_target; |
@@ -77,7 +81,7 @@ static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, |
template <typename LayerType> |
static ClipNode* GetClipParent(const DataForRecursion<LayerType>& data, |
LayerType* layer) { |
- const bool inherits_clip = !layer->parent() || !layer->clip_parent(); |
+ const bool inherits_clip = !layer->clip_parent(); |
const int id = inherits_clip ? data.clip_tree_parent |
: layer->clip_parent()->clip_tree_index(); |
return data.clip_tree->Node(id); |
@@ -89,6 +93,15 @@ static bool LayerClipsSubtree(LayerType* layer) { |
} |
template <typename LayerType> |
+static int GetScrollParentId(const DataForRecursion<LayerType>& data, |
+ LayerType* layer) { |
+ const bool inherits_scroll = !layer->scroll_parent(); |
+ const int id = inherits_scroll ? data.scroll_tree_parent |
+ : layer->scroll_parent()->scroll_tree_index(); |
+ return id; |
+} |
+ |
+template <typename LayerType> |
void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor, |
LayerType* layer, |
bool created_render_surface, |
@@ -620,6 +633,56 @@ bool AddEffectNodeIfNeeded( |
} |
template <typename LayerType> |
+void AddScrollNodeIfNeeded( |
+ const DataForRecursion<LayerType>& data_from_ancestor, |
+ LayerType* layer, |
+ DataForRecursion<LayerType>* data_for_children) { |
+ int parent_id = GetScrollParentId(data_from_ancestor, layer); |
+ |
+ bool is_root = !layer->parent(); |
+ bool scrollable = layer->scrollable(); |
+ ScrollBlocksOn scroll_blocks_on = layer->scroll_blocks_on(); |
+ ScrollBlocksOn accumulated_scroll_blocks_on = |
+ data_from_ancestor.accumulated_scroll_blocks_on; |
+ bool contains_non_fast_scrollable_region = |
+ !layer->non_fast_scrollable_region().IsEmpty(); |
+ bool should_scroll_on_main_thread = layer->should_scroll_on_main_thread(); |
+ |
+ bool scroll_node_uninheritable_criteria = |
+ is_root || scrollable || |
+ (scroll_blocks_on | accumulated_scroll_blocks_on) != |
+ accumulated_scroll_blocks_on || |
+ contains_non_fast_scrollable_region; |
+ bool requires_node = |
+ scroll_node_uninheritable_criteria || |
+ (should_scroll_on_main_thread && |
+ data_from_ancestor.scroll_tree_parent_created_by_uninheritable_criteria); |
+ |
+ if (!requires_node) { |
+ data_for_children->scroll_tree_parent = parent_id; |
+ } else { |
+ ScrollNode node; |
+ node.owner_id = layer->id(); |
+ node.data.scrollable = scrollable; |
+ node.data.should_scroll_on_main_thread = should_scroll_on_main_thread; |
+ node.data.scroll_blocks_on = |
+ scroll_blocks_on | accumulated_scroll_blocks_on; |
+ node.data.contains_non_fast_scrollable_region = |
+ contains_non_fast_scrollable_region; |
+ node.data.transform_id = |
+ data_for_children->transform_tree_parent->transform_tree_index(); |
+ data_for_children->scroll_tree_parent = |
+ data_for_children->scroll_tree->Insert(node, parent_id); |
+ data_for_children->scroll_tree_parent_created_by_uninheritable_criteria = |
+ scroll_node_uninheritable_criteria; |
+ data_for_children->accumulated_scroll_blocks_on = |
+ node.data.scroll_blocks_on; |
+ } |
+ |
+ layer->SetScrollTreeIndex(data_for_children->scroll_tree_parent); |
+} |
+ |
+template <typename LayerType> |
void BuildPropertyTreesInternal( |
LayerType* layer, |
const DataForRecursion<LayerType>& data_from_parent, |
@@ -646,6 +709,8 @@ void BuildPropertyTreesInternal( |
AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, |
created_transform_node, &data_for_children); |
+ AddScrollNodeIfNeeded(data_from_parent, layer, &data_for_children); |
+ |
data_for_children.is_hidden = |
layer->hide_layer_and_subtree() || data_from_parent.is_hidden; |
layer->set_is_hidden_from_property_trees(data_for_children.is_hidden); |
@@ -727,11 +792,13 @@ void BuildPropertyTreesTopLevelInternal( |
data_for_recursion.transform_tree = &property_trees->transform_tree; |
data_for_recursion.clip_tree = &property_trees->clip_tree; |
data_for_recursion.effect_tree = &property_trees->effect_tree; |
+ data_for_recursion.scroll_tree = &property_trees->scroll_tree; |
data_for_recursion.transform_tree_parent = nullptr; |
data_for_recursion.transform_fixed_parent = nullptr; |
data_for_recursion.render_target = kRootPropertyTreeNodeId; |
data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; |
data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; |
+ data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId; |
data_for_recursion.page_scale_layer = page_scale_layer; |
data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; |
data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; |
@@ -744,11 +811,15 @@ void BuildPropertyTreesTopLevelInternal( |
data_for_recursion.should_flatten = false; |
data_for_recursion.target_is_clipped = false; |
data_for_recursion.is_hidden = false; |
+ data_for_recursion.scroll_tree_parent_created_by_uninheritable_criteria = |
+ true; |
+ data_for_recursion.accumulated_scroll_blocks_on = SCROLL_BLOCKS_ON_NONE; |
data_for_recursion.device_transform = &device_transform; |
data_for_recursion.transform_tree->clear(); |
data_for_recursion.clip_tree->clear(); |
data_for_recursion.effect_tree->clear(); |
+ data_for_recursion.scroll_tree->clear(); |
data_for_recursion.compound_transform_since_render_target = gfx::Transform(); |
data_for_recursion.axis_align_since_render_target = true; |
data_for_recursion.sequence_number = property_trees->sequence_number; |
@@ -773,6 +844,7 @@ void BuildPropertyTreesTopLevelInternal( |
property_trees->transform_tree.set_needs_update(false); |
property_trees->clip_tree.set_needs_update(true); |
property_trees->effect_tree.set_needs_update(false); |
+ property_trees->scroll_tree.set_needs_update(false); |
} |
void PropertyTreeBuilder::BuildPropertyTrees( |