Chromium Code Reviews| Index: cc/trees/layer_tree_host.cc | 
| diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc | 
| index f1fdb93e69be774e545d24be6791d62316f9b182..962ecf1d0914396105e005e70c6281abfd870b81 100644 | 
| --- a/cc/trees/layer_tree_host.cc | 
| +++ b/cc/trees/layer_tree_host.cc | 
| @@ -1268,6 +1268,16 @@ Layer* LayerTreeHost::LayerById(int id) const { | 
| return iter != layer_id_map_.end() ? iter->second : NULL; | 
| } | 
| +Layer* LayerTreeHost::LayerForElementId(ElementId element_id) const { | 
| + auto iter = element_id_to_layer_map_.find(element_id); | 
| + return iter != element_id_to_layer_map_.end() ? iter->second.main : nullptr; | 
| +} | 
| + | 
| +Layer* LayerTreeHost::ScrollLayerForElementId(ElementId element_id) const { | 
| + auto iter = element_id_to_layer_map_.find(element_id); | 
| + return iter != element_id_to_layer_map_.end() ? iter->second.scroll : nullptr; | 
| 
 
esprehn
2016/05/10 22:55:13
this could just be tracked inside blink and access
 
loyso (OOO)
2016/05/12 06:02:15
We definitely can't do this:
1) In impl compositor
 
 | 
| +} | 
| + | 
| void LayerTreeHost::AddLayerShouldPushProperties(Layer* layer) { | 
| layers_that_should_push_properties_.insert(layer); | 
| } | 
| @@ -1289,20 +1299,56 @@ void LayerTreeHost::RegisterLayer(Layer* layer) { | 
| DCHECK(!LayerById(layer->id())); | 
| DCHECK(!in_paint_layer_contents_); | 
| layer_id_map_[layer->id()] = layer; | 
| - animation_host_->RegisterElement(layer->id(), ElementListType::ACTIVE); | 
| } | 
| void LayerTreeHost::UnregisterLayer(Layer* layer) { | 
| DCHECK(LayerById(layer->id())); | 
| DCHECK(!in_paint_layer_contents_); | 
| - animation_host_->UnregisterElement(layer->id(), ElementListType::ACTIVE); | 
| RemoveLayerShouldPushProperties(layer); | 
| layer_id_map_.erase(layer->id()); | 
| } | 
| +void LayerTreeHost::RegisterLayerForElementId(Layer* layer) { | 
| + DCHECK(layer->element_id()); | 
| + ElementLayers& element_layers = element_id_to_layer_map_[layer->element_id()]; | 
| + if (layer->scrollable()) { | 
| + DCHECK(!element_layers.scroll); | 
| + element_layers.scroll = layer; | 
| + } else { | 
| + DCHECK(!element_layers.main); | 
| + element_layers.main = layer; | 
| + } | 
| + animation_host_->RegisterElement(layer->element_id(), | 
| + ElementListType::ACTIVE); | 
| +} | 
| + | 
| +void LayerTreeHost::UnregisterLayerForElementId(Layer* layer) { | 
| + DCHECK(layer->element_id()); | 
| + animation_host_->UnregisterElement(layer->element_id(), | 
| + ElementListType::ACTIVE); | 
| + | 
| + auto iter = element_id_to_layer_map_.find(layer->element_id()); | 
| + if (iter == element_id_to_layer_map_.end()) | 
| + return; | 
| + | 
| + ElementLayers& element_layers = iter->second; | 
| + if (layer->scrollable()) { | 
| + DCHECK_EQ(element_layers.scroll, layer); | 
| + element_layers.scroll = nullptr; | 
| + } else { | 
| + DCHECK_EQ(element_layers.main, layer); | 
| + element_layers.main = nullptr; | 
| + } | 
| + | 
| + if (!element_layers.main && !element_layers.scroll) | 
| + element_id_to_layer_map_.erase(layer->element_id()); | 
| +} | 
| + | 
| bool LayerTreeHost::IsElementInList(ElementId element_id, | 
| ElementListType list_type) const { | 
| - return list_type == ElementListType::ACTIVE && LayerById(element_id); | 
| + return list_type == ElementListType::ACTIVE && | 
| + element_id_to_layer_map_.find(element_id) != | 
| + element_id_to_layer_map_.end(); | 
| } | 
| void LayerTreeHost::SetMutatorsNeedCommit() { | 
| @@ -1316,7 +1362,7 @@ void LayerTreeHost::SetMutatorsNeedRebuildPropertyTrees() { | 
| void LayerTreeHost::SetElementFilterMutated(ElementId element_id, | 
| ElementListType list_type, | 
| const FilterOperations& filters) { | 
| - Layer* layer = LayerById(element_id); | 
| + Layer* layer = LayerForElementId(element_id); | 
| DCHECK(layer); | 
| layer->OnFilterAnimated(filters); | 
| } | 
| @@ -1324,7 +1370,7 @@ void LayerTreeHost::SetElementFilterMutated(ElementId element_id, | 
| void LayerTreeHost::SetElementOpacityMutated(ElementId element_id, | 
| ElementListType list_type, | 
| float opacity) { | 
| - Layer* layer = LayerById(element_id); | 
| + Layer* layer = LayerForElementId(element_id); | 
| DCHECK(layer); | 
| layer->OnOpacityAnimated(opacity); | 
| } | 
| @@ -1333,7 +1379,7 @@ void LayerTreeHost::SetElementTransformMutated( | 
| ElementId element_id, | 
| ElementListType list_type, | 
| const gfx::Transform& transform) { | 
| - Layer* layer = LayerById(element_id); | 
| + Layer* layer = LayerForElementId(element_id); | 
| DCHECK(layer); | 
| layer->OnTransformAnimated(transform); | 
| } | 
| @@ -1342,7 +1388,7 @@ void LayerTreeHost::SetElementScrollOffsetMutated( | 
| ElementId element_id, | 
| ElementListType list_type, | 
| const gfx::ScrollOffset& scroll_offset) { | 
| - Layer* layer = LayerById(element_id); | 
| + Layer* layer = ScrollLayerForElementId(element_id); | 
| DCHECK(layer); | 
| layer->OnScrollOffsetAnimated(scroll_offset); | 
| } | 
| @@ -1351,90 +1397,133 @@ void LayerTreeHost::ElementTransformIsPotentiallyAnimatingChanged( | 
| ElementId element_id, | 
| ElementListType list_type, | 
| bool is_animating) { | 
| - Layer* layer = LayerById(element_id); | 
| - DCHECK(layer); | 
| - layer->OnTransformIsPotentiallyAnimatingChanged(is_animating); | 
| + Layer* layer = LayerForElementId(element_id); | 
| + if (layer) | 
| + layer->OnTransformIsPotentiallyAnimatingChanged(is_animating); | 
| } | 
| gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation( | 
| ElementId element_id) const { | 
| - Layer* layer = LayerById(element_id); | 
| + Layer* layer = ScrollLayerForElementId(element_id); | 
| DCHECK(layer); | 
| return layer->ScrollOffsetForAnimation(); | 
| } | 
| bool LayerTreeHost::ScrollOffsetAnimationWasInterrupted( | 
| const Layer* layer) const { | 
| - return animation_host_->ScrollOffsetAnimationWasInterrupted(layer->id()); | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| + return animation_host_->ScrollOffsetAnimationWasInterrupted( | 
| + layer->element_id()); | 
| } | 
| bool LayerTreeHost::IsAnimatingFilterProperty(const Layer* layer) const { | 
| - return animation_host_->IsAnimatingFilterProperty(layer->id(), | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| + return animation_host_->IsAnimatingFilterProperty(layer->element_id(), | 
| ElementListType::ACTIVE); | 
| } | 
| bool LayerTreeHost::IsAnimatingOpacityProperty(const Layer* layer) const { | 
| - return animation_host_->IsAnimatingOpacityProperty(layer->id(), | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| + return animation_host_->IsAnimatingOpacityProperty(layer->element_id(), | 
| ElementListType::ACTIVE); | 
| } | 
| bool LayerTreeHost::IsAnimatingTransformProperty(const Layer* layer) const { | 
| - return animation_host_->IsAnimatingTransformProperty(layer->id(), | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| + return animation_host_->IsAnimatingTransformProperty(layer->element_id(), | 
| ElementListType::ACTIVE); | 
| } | 
| bool LayerTreeHost::HasPotentiallyRunningFilterAnimation( | 
| const Layer* layer) const { | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| return animation_host_->HasPotentiallyRunningFilterAnimation( | 
| - layer->id(), ElementListType::ACTIVE); | 
| + layer->element_id(), ElementListType::ACTIVE); | 
| } | 
| bool LayerTreeHost::HasPotentiallyRunningOpacityAnimation( | 
| const Layer* layer) const { | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| return animation_host_->HasPotentiallyRunningOpacityAnimation( | 
| - layer->id(), ElementListType::ACTIVE); | 
| + layer->element_id(), ElementListType::ACTIVE); | 
| } | 
| bool LayerTreeHost::HasPotentiallyRunningTransformAnimation( | 
| const Layer* layer) const { | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| return animation_host_->HasPotentiallyRunningTransformAnimation( | 
| - layer->id(), ElementListType::ACTIVE); | 
| + layer->element_id(), ElementListType::ACTIVE); | 
| } | 
| bool LayerTreeHost::HasOnlyTranslationTransforms(const Layer* layer) const { | 
| - return animation_host_->HasOnlyTranslationTransforms(layer->id(), | 
| + if (!layer->element_id()) | 
| + return true; | 
| + | 
| + return animation_host_->HasOnlyTranslationTransforms(layer->element_id(), | 
| ElementListType::ACTIVE); | 
| } | 
| bool LayerTreeHost::MaximumTargetScale(const Layer* layer, | 
| float* max_scale) const { | 
| + if (!layer->element_id()) | 
| + return true; | 
| + | 
| return animation_host_->MaximumTargetScale( | 
| - layer->id(), ElementListType::ACTIVE, max_scale); | 
| + layer->element_id(), ElementListType::ACTIVE, max_scale); | 
| } | 
| bool LayerTreeHost::AnimationStartScale(const Layer* layer, | 
| float* start_scale) const { | 
| + if (!layer->element_id()) | 
| + return true; | 
| + | 
| return animation_host_->AnimationStartScale( | 
| - layer->id(), ElementListType::ACTIVE, start_scale); | 
| + layer->element_id(), ElementListType::ACTIVE, start_scale); | 
| } | 
| bool LayerTreeHost::HasAnyAnimationTargetingProperty( | 
| const Layer* layer, | 
| TargetProperty::Type property) const { | 
| - return animation_host_->HasAnyAnimationTargetingProperty(layer->id(), | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| + return animation_host_->HasAnyAnimationTargetingProperty(layer->element_id(), | 
| property); | 
| } | 
| bool LayerTreeHost::AnimationsPreserveAxisAlignment(const Layer* layer) const { | 
| - return animation_host_->AnimationsPreserveAxisAlignment(layer->id()); | 
| + if (!layer->element_id()) | 
| + return true; | 
| + | 
| + return animation_host_->AnimationsPreserveAxisAlignment(layer->element_id()); | 
| } | 
| bool LayerTreeHost::HasAnyAnimation(const Layer* layer) const { | 
| - return animation_host_->HasAnyAnimation(layer->id()); | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| + return animation_host_->HasAnyAnimation(layer->element_id()); | 
| } | 
| bool LayerTreeHost::HasActiveAnimationForTesting(const Layer* layer) const { | 
| - return animation_host_->HasActiveAnimationForTesting(layer->id()); | 
| + if (!layer->element_id()) | 
| + return false; | 
| + | 
| + return animation_host_->HasActiveAnimationForTesting(layer->element_id()); | 
| } | 
| bool LayerTreeHost::IsSingleThreaded() const { |