Index: cc/trees/layer_tree_impl.cc |
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc |
index 87d4639119dfa529a083fca5da14c2bcd113434a..8b41a759da3bb227c68148ce4fcc1faa90baaef6 100644 |
--- a/cc/trees/layer_tree_impl.cc |
+++ b/cc/trees/layer_tree_impl.cc |
@@ -51,6 +51,21 @@ |
namespace cc { |
+void LayerTreeLifecycle::AdvanceTo(LifecycleState next_state) { |
+ switch (next_state) { |
+ case (kNotSyncing): |
+ DCHECK_EQ(state_, kLastSyncState); |
+ break; |
+ case (kBeginningSync): |
+ case (kSyncedPropertyTrees): |
+ case (kSyncedLayerProperties): |
+ // Only allow tree synchronization states to be transitioned in order. |
+ DCHECK_EQ(state_ + 1, next_state); |
+ break; |
+ } |
+ state_ = next_state; |
+} |
+ |
LayerTreeImpl::LayerTreeImpl( |
LayerTreeHostImpl* layer_tree_host_impl, |
scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, |
@@ -162,6 +177,7 @@ bool LayerTreeImpl::IsViewportLayerId(int id) const { |
void LayerTreeImpl::DidUpdateScrollOffset(int layer_id) { |
DidUpdateScrollState(layer_id); |
+ DCHECK(lifecycle().AllowsPropertyTreeAccess()); |
TransformTree& transform_tree = property_trees()->transform_tree; |
ScrollTree& scroll_tree = property_trees()->scroll_tree; |
int transform_id = TransformTree::kInvalidNodeId; |
@@ -199,6 +215,10 @@ void LayerTreeImpl::DidUpdateScrollState(int layer_id) { |
if (!IsActiveTree()) |
return; |
+ // The scroll_clip_layer Layer properties should be up-to-date. |
+ // TODO(pdr): This DCHECK fails on existing tests but should be enabled. |
+ // DCHECK(lifecycle().AllowsLayerPropertyAccess()); |
+ |
if (layer_id == Layer::INVALID_ID) |
return; |
@@ -382,9 +402,17 @@ void LayerTreeImpl::SetPropertyTrees(PropertyTrees* property_trees) { |
property_trees_.transform_tree.set_source_to_parent_updates_allowed(false); |
} |
-void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { |
- // The request queue should have been processed and does not require a push. |
- DCHECK_EQ(ui_resource_request_queue_.size(), 0u); |
+void LayerTreeImpl::PushPropertyTreesTo(LayerTreeImpl* target_tree) { |
+ // Property trees may store damage status. We preserve the active tree |
+ // damage status by pushing the damage status from active tree property |
+ // trees to pending tree property trees or by moving it onto the layers. |
+ if (target_tree->property_trees()->changed) { |
+ if (property_trees()->sequence_number == |
+ target_tree->property_trees()->sequence_number) |
+ target_tree->property_trees()->PushChangeTrackingTo(property_trees()); |
+ else |
+ target_tree->MoveChangeTrackingToLayers(); |
+ } |
// To maintain the current scrolling node we need to use element ids which |
// are stable across the property tree update in SetPropertyTrees. |
@@ -400,6 +428,11 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { |
scrolling_node = scroll_tree.FindNodeFromElementId(scrolling_element_id); |
} |
target_tree->SetCurrentlyScrollingNode(scrolling_node); |
+} |
+ |
+void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { |
+ // The request queue should have been processed and does not require a push. |
+ DCHECK_EQ(ui_resource_request_queue_.size(), 0u); |
target_tree->property_trees()->scroll_tree.PushScrollUpdatesFromPendingTree( |
&property_trees_, target_tree); |
@@ -763,6 +796,7 @@ void LayerTreeImpl::UpdatePropertyTreeScrollingAndAnimationFromMainThread( |
void LayerTreeImpl::SetPageScaleOnActiveTree(float active_page_scale) { |
DCHECK(IsActiveTree()); |
+ DCHECK(lifecycle().AllowsPropertyTreeAccess()); |
if (page_scale_factor()->SetCurrent( |
ClampPageScaleFactorToLimits(active_page_scale))) { |
DidUpdatePageScale(); |
@@ -813,6 +847,7 @@ void LayerTreeImpl::PushPageScaleFactorAndLimits(const float* page_scale_factor, |
if (changed_page_scale) |
DidUpdatePageScale(); |
+ DCHECK(lifecycle().AllowsPropertyTreeAccess()); |
if (page_scale_factor) { |
if (PageScaleLayer()) { |
draw_property_utils::UpdatePageScaleFactor( |
@@ -989,6 +1024,11 @@ void LayerTreeImpl::ClearViewportLayers() { |
} |
void LayerTreeImpl::UpdateViewportLayerTypes() { |
+ // The scroll_clip_layer Layer properties should be up-to-date. |
+ // TODO(pdr): Enable this DCHECK by not calling this function unnecessarily |
+ // from LayerImpl::SetScrollClipLayer. |
+ // DCHECK(lifecycle().AllowsLayerPropertyAccess()); |
+ |
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()) |