Chromium Code Reviews| Index: cc/trees/layer_tree_impl.cc |
| diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc |
| index 1fe5871b8a0bc4da2f26728082415c94c7f2dd51..3be9697d152c355ac50d96c76049364621ae5c83 100644 |
| --- a/cc/trees/layer_tree_impl.cc |
| +++ b/cc/trees/layer_tree_impl.cc |
| @@ -139,16 +139,24 @@ void LayerTreeImpl::RecreateTileResources() { |
| } |
| bool LayerTreeImpl::IsViewportLayerId(int id) const { |
| - if (id == inner_viewport_scroll_layer_id_ || |
| - id == outer_viewport_scroll_layer_id_) |
| - return true; |
|
jaydasika
2017/05/09 05:54:22
Since we want to avoid calling LayerById whenever
pdr.
2017/05/09 22:20:07
I'm a little torn on this because I don't know the
jaydasika
2017/05/09 22:55:11
Sounds good. lets commit this and see the perf gra
|
| +#if DCHECK_IS_ON() |
| + // Ensure the LayerImpl viewport layer types correspond to the LayerTreeImpl's |
| + // viewport layers. |
| + if (id == inner_viewport_scroll_layer_id_) |
| + DCHECK(LayerById(id)->viewport_layer_type() == INNER_VIEWPORT_SCROLL); |
| + if (id == outer_viewport_scroll_layer_id_) |
| + DCHECK(LayerById(id)->viewport_layer_type() == OUTER_VIEWPORT_SCROLL); |
| if (InnerViewportContainerLayer() && |
| id == InnerViewportContainerLayer()->id()) |
| - return true; |
| + DCHECK(InnerViewportContainerLayer()->viewport_layer_type() == |
| + INNER_VIEWPORT_CONTAINER); |
| if (OuterViewportContainerLayer() && |
| id == OuterViewportContainerLayer()->id()) |
| - return true; |
| - |
| + DCHECK(OuterViewportContainerLayer()->viewport_layer_type() == |
| + OUTER_VIEWPORT_CONTAINER); |
| +#endif |
| + if (auto* layer = LayerById(id)) |
| + return layer->viewport_layer_type() != NOT_VIEWPORT_LAYER; |
| return false; |
| } |
| @@ -410,6 +418,12 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { |
| target_tree->set_bottom_controls_height(bottom_controls_height_); |
| target_tree->PushBrowserControls(nullptr); |
| + // The page scale factor update can affect scrolling which requires that |
| + // these ids are set, so this must be before PushPageScaleFactorAndLimits. |
| + target_tree->SetViewportLayersFromIds( |
| + overscroll_elasticity_layer_id_, page_scale_layer_id_, |
| + inner_viewport_scroll_layer_id_, outer_viewport_scroll_layer_id_); |
| + |
| // Active tree already shares the page_scale_factor object with pending |
| // tree so only the limits need to be provided. |
| target_tree->PushPageScaleFactorAndLimits(nullptr, min_page_scale_factor(), |
| @@ -426,10 +440,6 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { |
| target_tree->pending_page_scale_animation_ = |
| std::move(pending_page_scale_animation_); |
| - target_tree->SetViewportLayersFromIds( |
| - overscroll_elasticity_layer_id_, page_scale_layer_id_, |
| - inner_viewport_scroll_layer_id_, outer_viewport_scroll_layer_id_); |
| - |
| target_tree->RegisterSelection(selection_); |
| // This should match the property synchronization in |
| @@ -974,13 +984,26 @@ void LayerTreeImpl::SetViewportLayersFromIds( |
| page_scale_layer_id_ = page_scale_layer_id; |
| inner_viewport_scroll_layer_id_ = inner_viewport_scroll_layer_id; |
| outer_viewport_scroll_layer_id_ = outer_viewport_scroll_layer_id; |
| + |
| + UpdateViewportLayerTypes(); |
| } |
| void LayerTreeImpl::ClearViewportLayers() { |
| - overscroll_elasticity_layer_id_ = Layer::INVALID_ID; |
| - page_scale_layer_id_ = Layer::INVALID_ID; |
| - inner_viewport_scroll_layer_id_ = Layer::INVALID_ID; |
| - outer_viewport_scroll_layer_id_ = Layer::INVALID_ID; |
| + SetViewportLayersFromIds(Layer::INVALID_ID, Layer::INVALID_ID, |
| + Layer::INVALID_ID, Layer::INVALID_ID); |
| +} |
| + |
| +void LayerTreeImpl::UpdateViewportLayerTypes() { |
| + if (auto* inner_scroll = LayerById(inner_viewport_scroll_layer_id_)) { |
| + inner_scroll->SetViewportLayerType(INNER_VIEWPORT_SCROLL); |
| + if (auto* inner_container = inner_scroll->scroll_clip_layer()) |
| + inner_container->SetViewportLayerType(INNER_VIEWPORT_CONTAINER); |
| + } |
| + if (auto* outer_scroll = LayerById(outer_viewport_scroll_layer_id_)) { |
| + outer_scroll->SetViewportLayerType(OUTER_VIEWPORT_SCROLL); |
| + if (auto* outer_container = outer_scroll->scroll_clip_layer()) |
| + outer_container->SetViewportLayerType(OUTER_VIEWPORT_CONTAINER); |
| + } |
| } |
| // For unit tests, we use the layer's id as its element id. |