| 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(
|
|
|