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/auto_reset.h" | |
11 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
12 #include "base/trace_event/trace_event_argument.h" | 13 #include "base/trace_event/trace_event_argument.h" |
13 #include "cc/animation/keyframed_animation_curve.h" | 14 #include "cc/animation/keyframed_animation_curve.h" |
14 #include "cc/animation/scrollbar_animation_controller.h" | 15 #include "cc/animation/scrollbar_animation_controller.h" |
15 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" | 16 #include "cc/animation/scrollbar_animation_controller_linear_fade.h" |
16 #include "cc/animation/scrollbar_animation_controller_thinning.h" | 17 #include "cc/animation/scrollbar_animation_controller_thinning.h" |
17 #include "cc/base/math_util.h" | 18 #include "cc/base/math_util.h" |
18 #include "cc/base/synced_property.h" | 19 #include "cc/base/synced_property.h" |
19 #include "cc/base/util.h" | 20 #include "cc/base/util.h" |
20 #include "cc/debug/devtools_instrumentation.h" | 21 #include "cc/debug/devtools_instrumentation.h" |
21 #include "cc/debug/traced_value.h" | 22 #include "cc/debug/traced_value.h" |
23 #include "cc/input/layer_scroll_offset_delegate.h" | |
22 #include "cc/input/page_scale_animation.h" | 24 #include "cc/input/page_scale_animation.h" |
23 #include "cc/layers/heads_up_display_layer_impl.h" | 25 #include "cc/layers/heads_up_display_layer_impl.h" |
24 #include "cc/layers/layer.h" | 26 #include "cc/layers/layer.h" |
25 #include "cc/layers/layer_iterator.h" | 27 #include "cc/layers/layer_iterator.h" |
26 #include "cc/layers/render_surface_impl.h" | 28 #include "cc/layers/render_surface_impl.h" |
27 #include "cc/layers/scrollbar_layer_impl_base.h" | 29 #include "cc/layers/scrollbar_layer_impl_base.h" |
28 #include "cc/resources/ui_resource_request.h" | 30 #include "cc/resources/ui_resource_request.h" |
29 #include "cc/trees/layer_tree_host_common.h" | 31 #include "cc/trees/layer_tree_host_common.h" |
30 #include "cc/trees/layer_tree_host_impl.h" | 32 #include "cc/trees/layer_tree_host_impl.h" |
31 #include "cc/trees/occlusion_tracker.h" | 33 #include "cc/trees/occlusion_tracker.h" |
32 #include "ui/gfx/geometry/point_conversions.h" | 34 #include "ui/gfx/geometry/point_conversions.h" |
33 #include "ui/gfx/geometry/size_conversions.h" | 35 #include "ui/gfx/geometry/size_conversions.h" |
34 #include "ui/gfx/geometry/vector2d_conversions.h" | 36 #include "ui/gfx/geometry/vector2d_conversions.h" |
35 | 37 |
36 namespace cc { | 38 namespace cc { |
37 // This class exists to split the LayerScrollOffsetDelegate between the | |
38 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner | |
39 // that never requires the embedder or LayerImpl to know about. | |
40 class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate { | |
41 public: | |
42 LayerScrollOffsetDelegateProxy(LayerImpl* layer, | |
43 LayerScrollOffsetDelegate* delegate, | |
44 LayerTreeImpl* layer_tree) | |
45 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {} | |
46 virtual ~LayerScrollOffsetDelegateProxy() {} | |
47 | |
48 gfx::ScrollOffset last_set_scroll_offset() const { | |
49 return last_set_scroll_offset_; | |
50 } | |
51 | |
52 // LayerScrollOffsetDelegate implementation. | |
53 void SetCurrentScrollOffset(const gfx::ScrollOffset& new_offset) override { | |
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 } | |
68 | |
69 private: | |
70 LayerImpl* layer_; | |
71 LayerScrollOffsetDelegate* delegate_; | |
72 LayerTreeImpl* layer_tree_impl_; | |
73 gfx::ScrollOffset last_set_scroll_offset_; | |
74 }; | |
75 | 39 |
76 LayerTreeImpl::LayerTreeImpl( | 40 LayerTreeImpl::LayerTreeImpl( |
77 LayerTreeHostImpl* layer_tree_host_impl, | 41 LayerTreeHostImpl* layer_tree_host_impl, |
78 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, | 42 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, |
79 scoped_refptr<SyncedTopControls> top_controls_shown_ratio, | 43 scoped_refptr<SyncedTopControls> top_controls_shown_ratio, |
80 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) | 44 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) |
81 : layer_tree_host_impl_(layer_tree_host_impl), | 45 : layer_tree_host_impl_(layer_tree_host_impl), |
82 source_frame_number_(-1), | 46 source_frame_number_(-1), |
83 hud_layer_(0), | 47 hud_layer_(0), |
84 currently_scrolling_layer_(NULL), | 48 currently_scrolling_layer_(NULL), |
85 root_layer_scroll_offset_delegate_(NULL), | 49 root_layer_scroll_offset_delegate_(NULL), |
50 is_distributing_root_scroll_(false), | |
86 background_color_(0), | 51 background_color_(0), |
87 has_transparent_background_(false), | 52 has_transparent_background_(false), |
88 overscroll_elasticity_layer_(NULL), | 53 overscroll_elasticity_layer_(NULL), |
89 page_scale_layer_(NULL), | 54 page_scale_layer_(NULL), |
90 inner_viewport_scroll_layer_(NULL), | 55 inner_viewport_scroll_layer_(NULL), |
91 outer_viewport_scroll_layer_(NULL), | 56 outer_viewport_scroll_layer_(NULL), |
92 page_scale_factor_(page_scale_factor), | 57 page_scale_factor_(page_scale_factor), |
93 min_page_scale_factor_(0), | 58 min_page_scale_factor_(0), |
94 max_page_scale_factor_(0), | 59 max_page_scale_factor_(0), |
95 elastic_overscroll_(elastic_overscroll), | 60 elastic_overscroll_(elastic_overscroll), |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
141 | 106 |
142 // TODO(vmpstr): Early out if there are no requests on any of the layers. For | 107 // TODO(vmpstr): Early out if there are no requests on any of the layers. For |
143 // that, we need to inform LayerTreeImpl whenever there are requests when we | 108 // that, we need to inform LayerTreeImpl whenever there are requests when we |
144 // get them. | 109 // get them. |
145 LayerTreeHostCommon::CallFunctionForSubtree( | 110 LayerTreeHostCommon::CallFunctionForSubtree( |
146 root_layer_.get(), [request_ids](LayerImpl* layer) { | 111 root_layer_.get(), [request_ids](LayerImpl* layer) { |
147 layer->GatherFrameTimingRequestIds(request_ids); | 112 layer->GatherFrameTimingRequestIds(request_ids); |
148 }); | 113 }); |
149 } | 114 } |
150 | 115 |
116 bool LayerTreeImpl::IsExternalFlingActive() const { | |
117 return root_layer_scroll_offset_delegate_ && | |
118 root_layer_scroll_offset_delegate_->IsExternalFlingActive(); | |
119 } | |
120 | |
121 void LayerTreeImpl::DidUpdateScrollOffset(int layer_id) { | |
122 if ((InnerViewportScrollLayer() && | |
123 layer_id != InnerViewportScrollLayer()->id()) || | |
124 (OuterViewportScrollLayer() && | |
125 layer_id != OuterViewportScrollLayer()->id()) || | |
126 is_distributing_root_scroll_ || !root_layer_scroll_offset_delegate_) | |
127 return; | |
128 UpdateRootScrollOffsetDelegate(); | |
129 } | |
130 | |
151 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { | 131 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) { |
152 if (inner_viewport_scroll_layer_) | |
153 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); | |
154 if (outer_viewport_scroll_layer_) | |
155 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); | |
156 inner_viewport_scroll_delegate_proxy_ = nullptr; | |
157 outer_viewport_scroll_delegate_proxy_ = nullptr; | |
158 | |
159 root_layer_ = layer.Pass(); | 132 root_layer_ = layer.Pass(); |
160 currently_scrolling_layer_ = NULL; | 133 currently_scrolling_layer_ = NULL; |
161 inner_viewport_scroll_layer_ = NULL; | 134 inner_viewport_scroll_layer_ = NULL; |
162 outer_viewport_scroll_layer_ = NULL; | 135 outer_viewport_scroll_layer_ = NULL; |
163 page_scale_layer_ = NULL; | 136 page_scale_layer_ = NULL; |
164 | 137 |
165 layer_tree_host_impl_->OnCanDrawStateChangedForTree(); | 138 layer_tree_host_impl_->OnCanDrawStateChangedForTree(); |
166 } | 139 } |
167 | 140 |
168 LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const { | 141 LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const { |
(...skipping 25 matching lines...) Expand all Loading... | |
194 if (outer_viewport_scroll_layer_) | 167 if (outer_viewport_scroll_layer_) |
195 offset += outer_viewport_scroll_layer_->MaxScrollOffset(); | 168 offset += outer_viewport_scroll_layer_->MaxScrollOffset(); |
196 | 169 |
197 return offset; | 170 return offset; |
198 } | 171 } |
199 | 172 |
200 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { | 173 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() { |
201 // Clear all data structures that have direct references to the layer tree. | 174 // Clear all data structures that have direct references to the layer tree. |
202 scrolling_layer_id_from_previous_tree_ = | 175 scrolling_layer_id_from_previous_tree_ = |
203 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; | 176 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0; |
204 if (inner_viewport_scroll_layer_) | |
205 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); | |
206 if (outer_viewport_scroll_layer_) | |
207 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL); | |
208 inner_viewport_scroll_delegate_proxy_ = nullptr; | |
209 outer_viewport_scroll_delegate_proxy_ = nullptr; | |
210 inner_viewport_scroll_layer_ = NULL; | 177 inner_viewport_scroll_layer_ = NULL; |
211 outer_viewport_scroll_layer_ = NULL; | 178 outer_viewport_scroll_layer_ = NULL; |
212 page_scale_layer_ = NULL; | 179 page_scale_layer_ = NULL; |
213 currently_scrolling_layer_ = NULL; | 180 currently_scrolling_layer_ = NULL; |
214 | 181 |
215 render_surface_layer_list_.clear(); | 182 render_surface_layer_list_.clear(); |
216 set_needs_update_draw_properties(); | 183 set_needs_update_draw_properties(); |
217 return root_layer_.Pass(); | 184 return root_layer_.Pass(); |
218 } | 185 } |
219 | 186 |
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
524 | 491 |
525 outer_viewport_scroll_layer_ = | 492 outer_viewport_scroll_layer_ = |
526 LayerById(outer_viewport_scroll_layer_id); | 493 LayerById(outer_viewport_scroll_layer_id); |
527 DCHECK(outer_viewport_scroll_layer_ || | 494 DCHECK(outer_viewport_scroll_layer_ || |
528 outer_viewport_scroll_layer_id == Layer::INVALID_ID); | 495 outer_viewport_scroll_layer_id == Layer::INVALID_ID); |
529 | 496 |
530 HideInnerViewportScrollbarsIfNearMinimumScale(); | 497 HideInnerViewportScrollbarsIfNearMinimumScale(); |
531 | 498 |
532 if (!root_layer_scroll_offset_delegate_) | 499 if (!root_layer_scroll_offset_delegate_) |
533 return; | 500 return; |
534 | |
535 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | |
536 new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_, | |
537 root_layer_scroll_offset_delegate_, | |
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 } | 501 } |
546 | 502 |
547 void LayerTreeImpl::ClearViewportLayers() { | 503 void LayerTreeImpl::ClearViewportLayers() { |
548 page_scale_layer_ = NULL; | 504 page_scale_layer_ = NULL; |
549 inner_viewport_scroll_layer_ = NULL; | 505 inner_viewport_scroll_layer_ = NULL; |
550 outer_viewport_scroll_layer_ = NULL; | 506 outer_viewport_scroll_layer_ = NULL; |
551 } | 507 } |
552 | 508 |
553 bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { | 509 bool LayerTreeImpl::UpdateDrawProperties(bool update_lcd_text) { |
554 if (!needs_update_draw_properties_) | 510 if (!needs_update_draw_properties_) |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1033 for (size_t i = 0; i < swap_promise_list_.size(); i++) | 989 for (size_t i = 0; i < swap_promise_list_.size(); i++) |
1034 state->AppendDouble(swap_promise_list_[i]->TraceId()); | 990 state->AppendDouble(swap_promise_list_[i]->TraceId()); |
1035 state->EndArray(); | 991 state->EndArray(); |
1036 } | 992 } |
1037 | 993 |
1038 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( | 994 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( |
1039 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { | 995 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { |
1040 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) | 996 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate) |
1041 return; | 997 return; |
1042 | 998 |
1043 if (!root_layer_scroll_offset_delegate) { | |
1044 // Make sure we remove the proxies from their layers before | |
1045 // releasing them. | |
1046 if (InnerViewportScrollLayer()) | |
1047 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL); | |
1048 if (OuterViewportScrollLayer()) | |
1049 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL); | |
1050 inner_viewport_scroll_delegate_proxy_ = nullptr; | |
1051 outer_viewport_scroll_delegate_proxy_ = nullptr; | |
1052 } | |
1053 | |
1054 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; | 999 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; |
1055 | 1000 |
1056 if (root_layer_scroll_offset_delegate_) { | 1001 if (root_layer_scroll_offset_delegate_) { |
1057 root_layer_scroll_offset_delegate_->UpdateRootLayerState( | 1002 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
1058 TotalScrollOffset(), TotalMaxScrollOffset(), ScrollableSize(), | 1003 TotalScrollOffset(), TotalMaxScrollOffset(), ScrollableSize(), |
1059 current_page_scale_factor(), min_page_scale_factor(), | 1004 current_page_scale_factor(), min_page_scale_factor(), |
1060 max_page_scale_factor()); | 1005 max_page_scale_factor()); |
1061 | 1006 |
1062 if (inner_viewport_scroll_layer_) { | 1007 DistributeRootScrollOffset(); |
1063 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | |
1064 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(), | |
1065 root_layer_scroll_offset_delegate_, | |
1066 this)); | |
1067 inner_viewport_scroll_layer_->SetScrollOffsetDelegate( | |
1068 inner_viewport_scroll_delegate_proxy_.get()); | |
1069 } | |
1070 | |
1071 if (outer_viewport_scroll_layer_) { | |
1072 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr( | |
1073 new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(), | |
1074 root_layer_scroll_offset_delegate_, | |
1075 this)); | |
1076 outer_viewport_scroll_layer_->SetScrollOffsetDelegate( | |
1077 outer_viewport_scroll_delegate_proxy_.get()); | |
1078 } | |
1079 | |
1080 if (inner_viewport_scroll_layer_) | |
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 } | 1008 } |
1088 } | 1009 } |
1089 | 1010 |
1090 void LayerTreeImpl::OnRootLayerDelegatedScrollOffsetChanged() { | 1011 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_); | 1012 DCHECK(root_layer_scroll_offset_delegate_); |
1104 | 1013 |
1105 gfx::ScrollOffset offset = | 1014 gfx::ScrollOffset offset = InnerViewportScrollLayer()->CurrentScrollOffset(); |
1106 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | |
1107 | 1015 |
1108 if (OuterViewportScrollLayer()) | 1016 if (OuterViewportScrollLayer()) |
1109 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 1017 offset += OuterViewportScrollLayer()->CurrentScrollOffset(); |
1110 | 1018 |
1111 root_layer_scroll_offset_delegate_->UpdateRootLayerState( | 1019 root_layer_scroll_offset_delegate_->UpdateRootLayerState( |
1112 offset, TotalMaxScrollOffset(), ScrollableSize(), | 1020 offset, TotalMaxScrollOffset(), ScrollableSize(), |
1113 current_page_scale_factor(), min_page_scale_factor(), | 1021 current_page_scale_factor(), min_page_scale_factor(), |
1114 max_page_scale_factor()); | 1022 max_page_scale_factor()); |
1115 } | 1023 } |
1116 | 1024 |
1117 gfx::ScrollOffset LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) { | 1025 void LayerTreeImpl::DistributeRootScrollOffset() { |
1118 DCHECK(root_layer_scroll_offset_delegate_); | 1026 base::AutoReset<bool> is_distributing_root_scroll_auto_reset( |
aelias_OOO_until_Jul13
2015/04/07 00:52:20
Could you avoid this by having a new method LayerI
hush (inactive)
2015/04/07 01:29:08
Done.
| |
1119 DCHECK(InnerViewportScrollLayer()); | 1027 &is_distributing_root_scroll_, true); |
1120 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer()) | 1028 |
1121 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | 1029 if (!root_layer_scroll_offset_delegate_) |
1030 return; | |
1031 | |
1032 gfx::ScrollOffset root_offset = | |
1033 root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | |
1034 | |
1035 if (!InnerViewportScrollLayer()) | |
1036 return; | |
1037 | |
1038 // TODO(hush): Use DCHECK(OuterViewportScrollLayer()); here instead. And fix | |
1039 // the broken unit tests. | |
1040 if (!OuterViewportScrollLayer()) { | |
hush (inactive)
2015/04/07 01:29:08
I just removed this block and fixed the unit tests
| |
1041 InnerViewportScrollLayer()->SetCurrentScrollOffset(root_offset); | |
1042 UpdateRootScrollOffsetDelegate(); | |
1043 return; | |
1044 } | |
1122 | 1045 |
1123 // If we get here, we have both inner/outer viewports, and need to distribute | 1046 // If we get here, we have both inner/outer viewports, and need to distribute |
1124 // the scroll offset between them. | 1047 // the scroll offset between them. |
1125 DCHECK(inner_viewport_scroll_delegate_proxy_); | |
1126 DCHECK(outer_viewport_scroll_delegate_proxy_); | |
1127 gfx::ScrollOffset inner_viewport_offset = | 1048 gfx::ScrollOffset inner_viewport_offset = |
1128 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 1049 InnerViewportScrollLayer()->CurrentScrollOffset(); |
1129 gfx::ScrollOffset outer_viewport_offset = | 1050 gfx::ScrollOffset outer_viewport_offset = |
1130 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset(); | 1051 OuterViewportScrollLayer()->CurrentScrollOffset(); |
1131 | 1052 |
1132 // It may be nothing has changed. | 1053 // It may be nothing has changed. |
1133 gfx::ScrollOffset delegate_offset = | 1054 if (inner_viewport_offset + outer_viewport_offset == root_offset) |
1134 root_layer_scroll_offset_delegate_->GetTotalScrollOffset(); | 1055 return; |
1135 if (inner_viewport_offset + outer_viewport_offset == delegate_offset) { | |
1136 if (layer == InnerViewportScrollLayer()) | |
1137 return inner_viewport_offset; | |
1138 else | |
1139 return outer_viewport_offset; | |
1140 } | |
1141 | 1056 |
1142 gfx::ScrollOffset max_outer_viewport_scroll_offset = | 1057 gfx::ScrollOffset max_outer_viewport_scroll_offset = |
1143 OuterViewportScrollLayer()->MaxScrollOffset(); | 1058 OuterViewportScrollLayer()->MaxScrollOffset(); |
1144 | 1059 |
1145 outer_viewport_offset = delegate_offset - inner_viewport_offset; | 1060 outer_viewport_offset = root_offset - inner_viewport_offset; |
1146 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); | 1061 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset); |
1147 outer_viewport_offset.SetToMax(gfx::ScrollOffset()); | 1062 outer_viewport_offset.SetToMax(gfx::ScrollOffset()); |
1148 | 1063 |
1149 if (layer == OuterViewportScrollLayer()) | 1064 OuterViewportScrollLayer()->SetCurrentScrollOffset(outer_viewport_offset); |
1150 return outer_viewport_offset; | 1065 inner_viewport_offset = root_offset - outer_viewport_offset; |
1066 InnerViewportScrollLayer()->SetCurrentScrollOffset(inner_viewport_offset); | |
1151 | 1067 |
1152 inner_viewport_offset = delegate_offset - outer_viewport_offset; | 1068 UpdateRootScrollOffsetDelegate(); |
1153 | |
1154 return inner_viewport_offset; | |
1155 } | 1069 } |
1156 | 1070 |
1157 void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { | 1071 void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) { |
1158 DCHECK(swap_promise); | 1072 DCHECK(swap_promise); |
1159 swap_promise_list_.push_back(swap_promise.Pass()); | 1073 swap_promise_list_.push_back(swap_promise.Pass()); |
1160 } | 1074 } |
1161 | 1075 |
1162 void LayerTreeImpl::PassSwapPromises( | 1076 void LayerTreeImpl::PassSwapPromises( |
1163 ScopedPtrVector<SwapPromise>* new_swap_promise) { | 1077 ScopedPtrVector<SwapPromise>* new_swap_promise) { |
1164 swap_promise_list_.insert_and_take(swap_promise_list_.end(), | 1078 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) { | 1565 scoped_ptr<PendingPageScaleAnimation> pending_animation) { |
1652 pending_page_scale_animation_ = pending_animation.Pass(); | 1566 pending_page_scale_animation_ = pending_animation.Pass(); |
1653 } | 1567 } |
1654 | 1568 |
1655 scoped_ptr<PendingPageScaleAnimation> | 1569 scoped_ptr<PendingPageScaleAnimation> |
1656 LayerTreeImpl::TakePendingPageScaleAnimation() { | 1570 LayerTreeImpl::TakePendingPageScaleAnimation() { |
1657 return pending_page_scale_animation_.Pass(); | 1571 return pending_page_scale_animation_.Pass(); |
1658 } | 1572 } |
1659 | 1573 |
1660 } // namespace cc | 1574 } // namespace cc |
OLD | NEW |