Index: cc/trees/layer_tree_impl.cc |
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc |
index 33e17df36dbcd6eccc72e0f565d7195437c20185..260ce711a3537727afd7a4b7c2d85ec534bf39ea 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; |
+#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. |