OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/trees/layer_tree_impl.h" | 5 #include "cc/trees/layer_tree_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <set> | 9 #include <set> |
10 | 10 |
11 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
12 #include "base/trace_event/trace_event_argument.h" | 12 #include "base/trace_event/trace_event_argument.h" |
13 #include "cc/animation/keyframed_animation_curve.h" | 13 #include "cc/animation/keyframed_animation_curve.h" |
14 #include "cc/animation/scrollbar_animation_controller.h" | 14 #include "cc/animation/scrollbar_animation_controller.h" |
15 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" | 15 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" |
16 #include "cc/animation/scrollbar_animation_controller_thinning.h" | 16 #include "cc/animation/scrollbar_animation_controller_thinning.h" |
17 #include "cc/base/math_util.h" | 17 #include "cc/base/math_util.h" |
18 #include "cc/base/synced_property.h" | 18 #include "cc/base/synced_property.h" |
19 #include "cc/base/util.h" | 19 #include "cc/base/util.h" |
20 #include "cc/debug/devtools_instrumentation.h" | 20 #include "cc/debug/devtools_instrumentation.h" |
21 #include "cc/debug/traced_value.h" | 21 #include "cc/debug/traced_value.h" |
22 #include "cc/input/layer_scroll_offset_delegate.h" | |
22 #include "cc/input/page_scale_animation.h" | 23 #include "cc/input/page_scale_animation.h" |
23 #include "cc/layers/heads_up_display_layer_impl.h" | 24 #include "cc/layers/heads_up_display_layer_impl.h" |
24 #include "cc/layers/layer.h" | 25 #include "cc/layers/layer.h" |
25 #include "cc/layers/layer_iterator.h" | 26 #include "cc/layers/layer_iterator.h" |
26 #include "cc/layers/render_surface_impl.h" | 27 #include "cc/layers/render_surface_impl.h" |
27 #include "cc/layers/scrollbar_layer_impl_base.h" | 28 #include "cc/layers/scrollbar_layer_impl_base.h" |
28 #include "cc/resources/ui_resource_request.h" | 29 #include "cc/resources/ui_resource_request.h" |
29 #include "cc/trees/layer_tree_host_common.h" | 30 #include "cc/trees/layer_tree_host_common.h" |
30 #include "cc/trees/layer_tree_host_impl.h" | 31 #include "cc/trees/layer_tree_host_impl.h" |
31 #include "cc/trees/occlusion_tracker.h" | 32 #include "cc/trees/occlusion_tracker.h" |
32 #include "ui/gfx/geometry/point_conversions.h" | 33 #include "ui/gfx/geometry/point_conversions.h" |
33 #include "ui/gfx/geometry/size_conversions.h" | 34 #include "ui/gfx/geometry/size_conversions.h" |
34 #include "ui/gfx/geometry/vector2d_conversions.h" | 35 #include "ui/gfx/geometry/vector2d_conversions.h" |
35 | 36 |
36 namespace cc { | 37 namespace cc { |
37 // This class exists to split the LayerScrollOffsetDelegate between the | 38 |
38 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner | 39 // This class listens to the scroll offset changes of inner and outer viewport |
39 // that never requires the embedder or LayerImpl to know about. | 40 // scroll layer. When they change, the root layer scroll offset delegate needs |
40 class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate { | 41 // to be updated accordingly. |
42 class LayerExternalScrollOffsetListener | |
43 : public LayerImpl::ExternalScrollOffsetListener { | |
41 public: | 44 public: |
42 LayerScrollOffsetDelegateProxy(LayerImpl* layer, | 45 LayerExternalScrollOffsetListener(LayerScrollOffsetDelegate* delegate, |
43 LayerScrollOffsetDelegate* delegate, | 46 LayerTreeImpl* layer_tree) |
44 LayerTreeImpl* layer_tree) | 47 : root_delegate_(delegate), layer_tree_impl_(layer_tree) {} |
45 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} | 48 virtual ~LayerExternalScrollOffsetListener() {} |
46 virtual ~LayerScrollOffsetDelegateProxy() {} | |
47 | 49 |
48 gfx::ScrollOffset last_set_scroll_offset() const { | 50 bool IsExternalFlingActive() const override { |
49 return last_set_scroll_offset_; | 51 return root_delegate_->IsExternalFlingActive(); |
50 } | 52 } |
51 | 53 |
52 // LayerScrollOffsetDelegate implementation. | 54 void DidUpdateScrollOffset() const override { |
53 void SetCurrentScrollOffset(const gfx::ScrollOffset& new_offset) override { | 55 layer_tree_impl_->UpdateRootScrollOffsetDelegate(); |
54 last_set_scroll_offset_ = new_offset; | |
55 } | |
56 | |
57 gfx::ScrollOffset GetCurrentScrollOffset() override { | |
58 return layer_tree_impl_->GetDelegatedScrollOffset(layer_); | |
59 } | |
60 | |
61 bool IsExternalFlingActive() const override { | |
62 return delegate_->IsExternalFlingActive(); | |
63 } | |
64 | |
65 void Update() const override { | |
66 layer_tree_impl_->UpdateScrollOffsetDelegate(); | |
67 } | 56 } |
68 | 57 |
69 private: | 58 private: |
70 LayerImpl* layer_; | 59 LayerScrollOffsetDelegate* root_delegate_; |
71 LayerScrollOffsetDelegate* delegate_; | |
72 LayerTreeImpl* layer_tree_impl_; | 60 LayerTreeImpl* layer_tree_impl_; |
73 gfx::ScrollOffset last_set_scroll_offset_; | |
74 }; | 61 }; |
75 | 62 |
76 LayerTreeImpl::LayerTreeImpl( | 63 LayerTreeImpl::LayerTreeImpl( |
77 LayerTreeHostImpl* layer_tree_host_impl, | 64 LayerTreeHostImpl* layer_tree_host_impl, |
78 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, | 65 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, |
79 scoped_refptr<SyncedTopControls> top_controls_shown_ratio, | 66 scoped_refptr<SyncedTopControls> top_controls_shown_ratio, |
80 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) | 67 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) |
81 : layer_tree_host_impl_(layer_tree_host_impl), | 68 : layer_tree_host_impl_(layer_tree_host_impl), |
82 source_frame_number_(-1), | 69 source_frame_number_(-1), |
83 hud_layer_(0), | 70 hud_layer_(0), |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
143 // that, we need to inform LayerTreeImpl whenever there are requests when we | 130 // that, we need to inform LayerTreeImpl whenever there are requests when we |
144 // get them. | 131 // get them. |
145 LayerTreeHostCommon::CallFunctionForSubtree( | 132 LayerTreeHostCommon::CallFunctionForSubtree( |
146 root_layer_.get(), [request_ids](LayerImpl* layer) { | 133 root_layer_.get(), [request_ids](LayerImpl* layer) { |
147 layer->GatherFrameTimingRequestIds(request_ids); | 134 layer->GatherFrameTimingRequestIds(request_ids); |
148 }); | 135 }); |
149 } | 136 } |
150 | 137 |
151 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { | 138 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { |
152 if (inner_viewport_scroll_layer_) | 139 if (inner_viewport_scroll_layer_) |
153 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); | 140 inner_viewport_scroll_layer_->SetExternalScrollOffsetListener(NULL); |
154 if (outer_viewport_scroll_layer_) | 141 if (outer_viewport_scroll_layer_) |
155 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); | 142 outer_viewport_scroll_layer_->SetExternalScrollOffsetListener(NULL); |
156 inner_viewport_scroll_delegate_proxy_ = nullptr; | 143 layer_scroll_offset_listener_ = nullptr; |
157 outer_viewport_scroll_delegate_proxy_ = nullptr; | |
158 | 144 |
159 root_layer_ = layer.Pass(); | 145 root_layer_ = layer.Pass(); |
160 currently_scrolling_layer_ = NULL; | 146 currently_scrolling_layer_ = NULL; |
161 inner_viewport_scroll_layer_ = NULL; | 147 inner_viewport_scroll_layer_ = NULL; |
162 outer_viewport_scroll_layer_ = NULL; | 148 outer_viewport_scroll_layer_ = NULL; |
163 page_scale_layer_ = NULL; | 149 page_scale_layer_ = NULL; |
164 | 150 |
165 layer_tree_host_impl_->OnCanDrawStateChangedForTree(); | 151 layer_tree_host_impl_->OnCanDrawStateChangedForTree(); |
166 } | 152 } |
167 | 153 |
(...skipping 27 matching lines...) Expand all Loading... | |
195 offset += outer_viewport_scroll_layer_->MaxScrollOffset(); | 181 offset += outer_viewport_scroll_layer_->MaxScrollOffset(); |
196 | 182 |
197 return offset; | 183 return offset; |
198 } | 184 } |
199 | 185 |
200 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { | 186 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { |
201 // Clear all data structures that have direct references to the layer tree. | 187 // Clear all data structures that have direct references to the layer tree. |
202 scrolling_layer_id_from_previous_tree_ = | 188 scrolling_layer_id_from_previous_tree_ = |
203 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; | 189 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; |
204 if (inner_viewport_scroll_layer_) | 190 if (inner_viewport_scroll_layer_) |
205 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); | 191 inner_viewport_scroll_layer_->SetExternalScrollOffsetListener(NULL); |
206 if (outer_viewport_scroll_layer_) | 192 if (outer_viewport_scroll_layer_) |
207 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); | 193 outer_viewport_scroll_layer_->SetExternalScrollOffsetListener(NULL); |
208 inner_viewport_scroll_delegate_proxy_ = nullptr; | 194 layer_scroll_offset_listener_ = nullptr; |
209 outer_viewport_scroll_delegate_proxy_ = nullptr; | |
210 inner_viewport_scroll_layer_ = NULL; | 195 inner_viewport_scroll_layer_ = NULL; |
211 outer_viewport_scroll_layer_ = NULL; | 196 outer_viewport_scroll_layer_ = NULL; |
212 page_scale_layer_ = NULL; | 197 page_scale_layer_ = NULL; |
213 currently_scrolling_layer_ = NULL; | 198 currently_scrolling_layer_ = NULL; |
214 | 199 |
215 render_surface_layer_list_.clear(); | 200 render_surface_layer_list_.clear(); |
216 set_needs_update_draw_properties(); | 201 set_needs_update_draw_properties(); |
217 return root_layer_.Pass(); | 202 return root_layer_.Pass(); |
218 } | 203 } |
219 | 204 |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
525 outer_viewport_scroll_layer_ = | 510 outer_viewport_scroll_layer_ = |
526 LayerById(outer_viewport_scroll_layer_id); | 511 LayerById(outer_viewport_scroll_layer_id); |
527 DCHECK(outer_viewport_scroll_layer_ || | 512 DCHECK(outer_viewport_scroll_layer_ || |
528 outer_viewport_scroll_layer_id == Layer::INVALID_ID); | 513 outer_viewport_scroll_layer_id == Layer::INVALID_ID); |
529 | 514 |
530 HideInnerViewportScrollbarsIfNearMinimumScale(); | 515 HideInnerViewportScrollbarsIfNearMinimumScale(); |
531 | 516 |
532 if (!root_layer_scroll_offset_delegate_) | 517 if (!root_layer_scroll_offset_delegate_) |
533 return; | 518 return; |
534 | 519 |
535 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | 520 layer_scroll_offset_listener_ = |
536 new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_, | 521 make_scoped_ptr(new LayerExternalScrollOffsetListener( |
537 root_layer_scroll_offset_delegate_, | 522 root_layer_scroll_offset_delegate_, this)); |
538 this)); | |
539 | |
540 if (outer_viewport_scroll_layer_) | |
541 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | |
542 new LayerScrollOffsetDelegateProxy(outer_viewport_scroll_layer_, | |
543 root_layer_scroll_offset_delegate_, | |
544 this)); | |
545 } | 523 } |
546 | 524 |
547 void LayerTreeImpl::ClearViewportLayers() { | 525 void LayerTreeImpl::ClearViewportLayers() { |
548 page_scale_layer_ = NULL; | 526 page_scale_layer_ = NULL; |
549 inner_viewport_scroll_layer_ = NULL; | 527 inner_viewport_scroll_layer_ = NULL; |
550 outer_viewport_scroll_layer_ = NULL; | 528 outer_viewport_scroll_layer_ = NULL; |
551 } | 529 } |
552 | 530 |
553 bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { | 531 bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { |
554 if (!needs_update_draw_properties_) | 532 if (!needs_update_draw_properties_) |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1037 | 1015 |
1038 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( | 1016 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( |
1039 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { | 1017 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { |
1040 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) | 1018 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) |
1041 return; | 1019 return; |
1042 | 1020 |
1043 if (!root_layer_scroll_offset_delegate) { | 1021 if (!root_layer_scroll_offset_delegate) { |
1044 // Make sure we remove the proxies from their layers before | 1022 // Make sure we remove the proxies from their layers before |
1045 // releasing them. | 1023 // releasing them. |
1046 if (InnerViewportScrollLayer()) | 1024 if (InnerViewportScrollLayer()) |
1047 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL); | 1025 InnerViewportScrollLayer()->SetExternalScrollOffsetListener(NULL); |
1048 if (OuterViewportScrollLayer()) | 1026 if (OuterViewportScrollLayer()) |
1049 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL); | 1027 OuterViewportScrollLayer()->SetExternalScrollOffsetListener(NULL); |
1050 inner_viewport_scroll_delegate_proxy_ = nullptr; | 1028 layer_scroll_offset_listener_ = nullptr; |
1051 outer_viewport_scroll_delegate_proxy_ = nullptr; | |
1052 } | 1029 } |
1053 | 1030 |
1054 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; | 1031 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; |
1055 | 1032 |
1056 if (root_layer_scroll_offset_delegate_) { | 1033 if (root_layer_scroll_offset_delegate_) { |
1057 root_layer_scroll_offset_delegate_->UpdateRootLayerState( | 1034 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
1058 TotalScrollOffset(), TotalMaxScrollOffset(), ScrollableSize(), | 1035 TotalScrollOffset(), TotalMaxScrollOffset(), ScrollableSize(), |
1059 current_page_scale_factor(), min_page_scale_factor(), | 1036 current_page_scale_factor(), min_page_scale_factor(), |
1060 max_page_scale_factor()); | 1037 max_page_scale_factor()); |
1061 | 1038 |
1039 layer_scroll_offset_listener_ = | |
1040 make_scoped_ptr(new LayerExternalScrollOffsetListener( | |
1041 root_layer_scroll_offset_delegate_, this)); | |
1042 | |
1062 if (inner_viewport_scroll_layer_) { | 1043 if (inner_viewport_scroll_layer_) { |
1063 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | 1044 inner_viewport_scroll_layer_->SetExternalScrollOffsetListener( |
1064 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(), | 1045 layer_scroll_offset_listener_.get()); |
1065 root_layer_scroll_offset_delegate_, | |
1066 this)); | |
1067 inner_viewport_scroll_layer_->SetScrollOffsetDelegate( | |
1068 inner_viewport_scroll_delegate_proxy_.get()); | |
1069 } | 1046 } |
1070 | 1047 |
1071 if (outer_viewport_scroll_layer_) { | 1048 if (outer_viewport_scroll_layer_) { |
1072 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | 1049 outer_viewport_scroll_layer_->SetExternalScrollOffsetListener( |
1073 new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(), | 1050 layer_scroll_offset_listener_.get()); |
1074 root_layer_scroll_offset_delegate_, | |
1075 this)); | |
1076 outer_viewport_scroll_layer_->SetScrollOffsetDelegate( | |
1077 outer_viewport_scroll_delegate_proxy_.get()); | |
1078 } | 1051 } |
1079 | 1052 |
1080 if (inner_viewport_scroll_layer_) | 1053 DistributeRootScrollOffset(); |
1081 inner_viewport_scroll_layer_->RefreshFromScrollDelegate(); | |
1082 if (outer_viewport_scroll_layer_) | |
1083 outer_viewport_scroll_layer_->RefreshFromScrollDelegate(); | |
1084 | |
1085 if (inner_viewport_scroll_layer_) | |
1086 UpdateScrollOffsetDelegate(); | |
1087 } | 1054 } |
1088 } | 1055 } |
1089 | 1056 |
1090 void LayerTreeImpl::OnRootLayerDelegatedScrollOffsetChanged() { | 1057 void LayerTreeImpl::UpdateRootScrollOffsetDelegate() { |
1091 DCHECK(root_layer_scroll_offset_delegate_); | |
1092 if (inner_viewport_scroll_layer_) { | |
1093 inner_viewport_scroll_layer_->RefreshFromScrollDelegate(); | |
1094 } | |
1095 if (outer_viewport_scroll_layer_) { | |
1096 outer_viewport_scroll_layer_->RefreshFromScrollDelegate(); | |
1097 } | |
1098 } | |
1099 | |
1100 void LayerTreeImpl::UpdateScrollOffsetDelegate() { | |
1101 DCHECK(InnerViewportScrollLayer()); | |
1102 DCHECK(!OuterViewportScrollLayer() || outer_viewport_scroll_delegate_proxy_); | |
1103 DCHECK(root_layer_scroll_offset_delegate_); | 1058 DCHECK(root_layer_scroll_offset_delegate_); |
1104 | 1059 |
1105 gfx::ScrollOffset offset = | 1060 gfx::ScrollOffset offset = InnerViewportScrollLayer()->CurrentScrollOffset(); |
1106 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | |
1107 | 1061 |
1108 if (OuterViewportScrollLayer()) | 1062 if (OuterViewportScrollLayer()) |
1109 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 1063 offset += OuterViewportScrollLayer()->CurrentScrollOffset(); |
1110 | 1064 |
1111 root_layer_scroll_offset_delegate_->UpdateRootLayerState( | 1065 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
1112 offset, TotalMaxScrollOffset(), ScrollableSize(), | 1066 offset, TotalMaxScrollOffset(), ScrollableSize(), |
1113 current_page_scale_factor(), min_page_scale_factor(), | 1067 current_page_scale_factor(), min_page_scale_factor(), |
1114 max_page_scale_factor()); | 1068 max_page_scale_factor()); |
1115 } | 1069 } |
1116 | 1070 |
1117 gfx::ScrollOffset LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) { | 1071 void LayerTreeImpl::DistributeRootScrollOffset() { |
1118 DCHECK(root_layer_scroll_offset_delegate_); | 1072 if (!root_layer_scroll_offset_delegate_) |
1119 DCHECK(InnerViewportScrollLayer()); | 1073 return; |
1120 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer()) | 1074 |
1121 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | 1075 gfx::ScrollOffset root_offset = |
1076 root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | |
1077 | |
1078 if (!InnerViewportScrollLayer()) | |
1079 return; | |
1080 | |
1081 if (!OuterViewportScrollLayer()) { | |
aelias_OOO_until_Jul13
2015/04/06 19:57:32
You can delete this block and DCHECK that an Outer
hush (inactive)
2015/04/06 23:08:03
The tests are exercising the InnerViewportScrollLa
| |
1082 InnerViewportScrollLayer()->SetExternalScrollOffsetListener(NULL); | |
1083 InnerViewportScrollLayer()->SetCurrentScrollOffset(root_offset); | |
1084 InnerViewportScrollLayer()->SetExternalScrollOffsetListener( | |
1085 layer_scroll_offset_listener_.get()); | |
1086 UpdateRootScrollOffsetDelegate(); | |
1087 return; | |
1088 } | |
1122 | 1089 |
1123 // If we get here, we have both inner/outer viewports, and need to distribute | 1090 // If we get here, we have both inner/outer viewports, and need to distribute |
1124 // the scroll offset between them. | 1091 // the scroll offset between them. |
1125 DCHECK(inner_viewport_scroll_delegate_proxy_); | 1092 // It is okay for inner and outer viewport scroll layer to have no scroll |
1126 DCHECK(outer_viewport_scroll_delegate_proxy_); | 1093 // delegate at this time. |
1127 gfx::ScrollOffset inner_viewport_offset = | 1094 gfx::ScrollOffset inner_viewport_offset = |
1128 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 1095 InnerViewportScrollLayer()->CurrentScrollOffset(); |
1129 gfx::ScrollOffset outer_viewport_offset = | 1096 gfx::ScrollOffset outer_viewport_offset = |
1130 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 1097 OuterViewportScrollLayer()->CurrentScrollOffset(); |
1131 | 1098 |
1132 // It may be nothing has changed. | 1099 // It may be nothing has changed. |
1133 gfx::ScrollOffset delegate_offset = | 1100 if (inner_viewport_offset + outer_viewport_offset == root_offset) |
1134 root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | 1101 return; |
1135 if (inner_viewport_offset + outer_viewport_offset == delegate_offset) { | 1102 |
1136 if (layer == InnerViewportScrollLayer()) | 1103 // Temporarily uninstall the scroll offset listeners so that the root scroll |
1137 return inner_viewport_offset; | 1104 // offset delegate is not thrashed back and forth when the inner and outer |
1138 else | 1105 // viewport scroll layer change their scroll offsets. |
1139 return outer_viewport_offset; | 1106 InnerViewportScrollLayer()->SetExternalScrollOffsetListener(NULL); |
1140 } | 1107 OuterViewportScrollLayer()->SetExternalScrollOffsetListener(NULL); |
1141 | 1108 |
1142 gfx::ScrollOffset max_outer_viewport_scroll_offset = | 1109 gfx::ScrollOffset max_outer_viewport_scroll_offset = |
1143 OuterViewportScrollLayer()->MaxScrollOffset(); | 1110 OuterViewportScrollLayer()->MaxScrollOffset(); |
1144 | 1111 |
1145 outer_viewport_offset = delegate_offset - inner_viewport_offset; | 1112 outer_viewport_offset = root_offset - inner_viewport_offset; |
1146 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); | 1113 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); |
1147 outer_viewport_offset.SetToMax(gfx::ScrollOffset()); | 1114 outer_viewport_offset.SetToMax(gfx::ScrollOffset()); |
1148 | 1115 |
1149 if (layer == OuterViewportScrollLayer()) | 1116 OuterViewportScrollLayer()->SetCurrentScrollOffset(outer_viewport_offset); |
1150 return outer_viewport_offset; | 1117 inner_viewport_offset = root_offset - outer_viewport_offset; |
1118 InnerViewportScrollLayer()->SetCurrentScrollOffset(inner_viewport_offset); | |
1151 | 1119 |
1152 inner_viewport_offset = delegate_offset - outer_viewport_offset; | 1120 InnerViewportScrollLayer()->SetExternalScrollOffsetListener( |
1121 layer_scroll_offset_listener_.get()); | |
1122 OuterViewportScrollLayer()->SetExternalScrollOffsetListener( | |
1123 layer_scroll_offset_listener_.get()); | |
1153 | 1124 |
1154 return inner_viewport_offset; | 1125 UpdateRootScrollOffsetDelegate(); |
1155 } | 1126 } |
1156 | 1127 |
1157 void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { | 1128 void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { |
1158 DCHECK(swap_promise); | 1129 DCHECK(swap_promise); |
1159 swap_promise_list_.push_back(swap_promise.Pass()); | 1130 swap_promise_list_.push_back(swap_promise.Pass()); |
1160 } | 1131 } |
1161 | 1132 |
1162 void LayerTreeImpl::PassSwapPromises( | 1133 void LayerTreeImpl::PassSwapPromises( |
1163 ScopedPtrVector<SwapPromise>* new_swap_promise) { | 1134 ScopedPtrVector<SwapPromise>* new_swap_promise) { |
1164 swap_promise_list_.insert_and_take(swap_promise_list_.end(), | 1135 swap_promise_list_.insert_and_take(swap_promise_list_.end(), |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1651 scoped_ptr<PendingPageScaleAnimation> pending_animation) { | 1622 scoped_ptr<PendingPageScaleAnimation> pending_animation) { |
1652 pending_page_scale_animation_ = pending_animation.Pass(); | 1623 pending_page_scale_animation_ = pending_animation.Pass(); |
1653 } | 1624 } |
1654 | 1625 |
1655 scoped_ptr<PendingPageScaleAnimation> | 1626 scoped_ptr<PendingPageScaleAnimation> |
1656 LayerTreeImpl::TakePendingPageScaleAnimation() { | 1627 LayerTreeImpl::TakePendingPageScaleAnimation() { |
1657 return pending_page_scale_animation_.Pass(); | 1628 return pending_page_scale_animation_.Pass(); |
1658 } | 1629 } |
1659 | 1630 |
1660 } // namespace cc | 1631 } // namespace cc |
OLD | NEW |