Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(950)

Side by Side Diff: cc/trees/layer_tree_impl.cc

Issue 21091004: Fix bottom/right fixed-pos with non-overlay scrollbars. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/trees/layer_tree_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/animation/keyframed_animation_curve.h" 8 #include "cc/animation/keyframed_animation_curve.h"
9 #include "cc/animation/scrollbar_animation_controller.h" 9 #include "cc/animation/scrollbar_animation_controller.h"
10 #include "cc/debug/traced_value.h" 10 #include "cc/debug/traced_value.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 } 136 }
137 137
138 LayerImpl* LayerTreeImpl::RootScrollLayer() const { 138 LayerImpl* LayerTreeImpl::RootScrollLayer() const {
139 return root_scroll_layer_; 139 return root_scroll_layer_;
140 } 140 }
141 141
142 LayerImpl* LayerTreeImpl::RootContainerLayer() const { 142 LayerImpl* LayerTreeImpl::RootContainerLayer() const {
143 return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL; 143 return root_scroll_layer_ ? root_scroll_layer_->parent() : NULL;
144 } 144 }
145 145
146 LayerImpl* LayerTreeImpl::ViewportLayer() const {
147 // Return the first ancestor of the root container layer which has
148 // nonzero bounds.
149 LayerImpl* root_container = RootContainerLayer();
150 if (!root_container)
151 return NULL;
152
153 LayerImpl* ancestor = root_container->parent();
154 while (ancestor) {
155 if (!ancestor->bounds().IsEmpty())
156 return ancestor;
157 ancestor = ancestor->parent();
158 }
159 return NULL;
160 }
161
146 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { 162 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const {
147 DCHECK(IsActiveTree()); 163 DCHECK(IsActiveTree());
148 return currently_scrolling_layer_; 164 return currently_scrolling_layer_;
149 } 165 }
150 166
167 int LayerTreeImpl::NonOverlayScrollbarThickness(
168 ScrollbarOrientation orientation) const {
169 LayerImpl* viewport = ViewportLayer();
170 LayerImpl* root_container = RootContainerLayer();
171 if (!viewport || !root_container)
172 return 0;
173
174 DCHECK_GE(viewport->bounds().width(), root_container->bounds().width());
175 DCHECK_GE(viewport->bounds().height(), root_container->bounds().height());
176
177 if (orientation == VERTICAL)
178 return viewport->bounds().width() - root_container->bounds().width();
179 else
180 return viewport->bounds().height() - root_container->bounds().height();
181 }
182
151 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { 183 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) {
152 if (currently_scrolling_layer_ == layer) 184 if (currently_scrolling_layer_ == layer)
153 return; 185 return;
154 186
155 if (currently_scrolling_layer_ && 187 if (currently_scrolling_layer_ &&
156 currently_scrolling_layer_->scrollbar_animation_controller()) 188 currently_scrolling_layer_->scrollbar_animation_controller())
157 currently_scrolling_layer_->scrollbar_animation_controller()-> 189 currently_scrolling_layer_->scrollbar_animation_controller()->
158 DidScrollGestureEnd(CurrentPhysicalTimeTicks()); 190 DidScrollGestureEnd(CurrentPhysicalTimeTicks());
159 currently_scrolling_layer_ = layer; 191 currently_scrolling_layer_ = layer;
160 if (layer && layer->scrollbar_animation_controller()) 192 if (layer && layer->scrollbar_animation_controller())
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 void LayerTreeImpl::UpdateMaxScrollOffset() { 242 void LayerTreeImpl::UpdateMaxScrollOffset() {
211 LayerImpl* root_scroll = RootScrollLayer(); 243 LayerImpl* root_scroll = RootScrollLayer();
212 if (!root_scroll || !root_scroll->children().size()) 244 if (!root_scroll || !root_scroll->children().size())
213 return; 245 return;
214 246
215 gfx::Vector2dF max_scroll = gfx::Rect(ScrollableSize()).bottom_right() - 247 gfx::Vector2dF max_scroll = gfx::Rect(ScrollableSize()).bottom_right() -
216 gfx::RectF(ScrollableViewportSize()).bottom_right(); 248 gfx::RectF(ScrollableViewportSize()).bottom_right();
217 249
218 // The scrollable viewport size is based on device viewport instead of Blink's 250 // The scrollable viewport size is based on device viewport instead of Blink's
219 // container layer, so we need to adjust for non-overlay scrollbars. 251 // container layer, so we need to adjust for non-overlay scrollbars.
220 ScrollbarLayerImpl* horiz = root_scroll->horizontal_scrollbar_layer(); 252 max_scroll.set_x(max_scroll.x() + NonOverlayScrollbarThickness(VERTICAL));
enne (OOO) 2013/07/30 02:32:17 This code seems like it'd be cleaner if it set Ren
aelias_OOO_until_Jul13 2013/07/30 02:52:00 OK, I'll try that. It will be useful for root ove
enne (OOO) 2013/07/30 03:44:47 Oh, I see what you're getting at. What would make
aelias_OOO_until_Jul13 2013/07/30 04:06:13 That actually is not correct. In your page scale
221 ScrollbarLayerImpl* vertical = root_scroll->vertical_scrollbar_layer(); 253 max_scroll.set_y(max_scroll.y() + NonOverlayScrollbarThickness(HORIZONTAL));
222 if (horiz && !horiz->is_overlay_scrollbar())
223 max_scroll.set_y(max_scroll.y() + horiz->thumb_thickness());
224 if (vertical && !vertical->is_overlay_scrollbar())
225 max_scroll.set_x(max_scroll.x() + vertical->thumb_thickness());
226 254
227 // The viewport may be larger than the contents in some cases, such as 255 // The viewport may be larger than the contents in some cases, such as
228 // having a vertical scrollbar but no horizontal overflow. 256 // having a vertical scrollbar but no horizontal overflow.
229 max_scroll.SetToMax(gfx::Vector2dF()); 257 max_scroll.SetToMax(gfx::Vector2dF());
230 258
231 root_scroll_layer_->SetMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll)); 259 root_scroll_layer_->SetMaxScrollOffset(gfx::ToFlooredVector2d(max_scroll));
232 } 260 }
233 261
234 void LayerTreeImpl::UpdateSolidColorScrollbars() { 262 void LayerTreeImpl::UpdateSolidColorScrollbars() {
235 DCHECK(settings().solid_color_scrollbars); 263 DCHECK(settings().solid_color_scrollbars);
(...skipping 15 matching lines...) Expand all
251 scrollable_viewport.width() / ScrollableSize().width()); 279 scrollable_viewport.width() / ScrollableSize().width());
252 } 280 }
253 if (ScrollbarLayerImpl* vertical = root_scroll->vertical_scrollbar_layer()) { 281 if (ScrollbarLayerImpl* vertical = root_scroll->vertical_scrollbar_layer()) {
254 vertical->set_vertical_adjust(vertical_adjust); 282 vertical->set_vertical_adjust(vertical_adjust);
255 vertical->set_visible_to_total_length_ratio( 283 vertical->set_visible_to_total_length_ratio(
256 scrollable_viewport.height() / ScrollableSize().height()); 284 scrollable_viewport.height() / ScrollableSize().height());
257 } 285 }
258 } 286 }
259 287
260 void LayerTreeImpl::UpdateDrawProperties() { 288 void LayerTreeImpl::UpdateDrawProperties() {
261 if (IsActiveTree() && RootScrollLayer() && RootContainerLayer()) 289 if (IsActiveTree())
262 UpdateRootScrollLayerSizeDelta(); 290 UpdateRootScrollLayerSizeDelta();
263 291
264 if (settings().solid_color_scrollbars && 292 if (settings().solid_color_scrollbars &&
265 IsActiveTree() && 293 IsActiveTree() &&
266 RootScrollLayer()) { 294 RootScrollLayer()) {
267 UpdateSolidColorScrollbars(); 295 UpdateSolidColorScrollbars();
268 } 296 }
269 297
270 needs_update_draw_properties_ = false; 298 needs_update_draw_properties_ = false;
271 render_surface_layer_list_.clear(); 299 render_surface_layer_list_.clear();
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
519 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate( 547 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
520 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) { 548 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) {
521 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate; 549 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
522 if (root_scroll_layer_) { 550 if (root_scroll_layer_) {
523 root_scroll_layer_->SetScrollOffsetDelegate( 551 root_scroll_layer_->SetScrollOffsetDelegate(
524 root_layer_scroll_offset_delegate_); 552 root_layer_scroll_offset_delegate_);
525 } 553 }
526 } 554 }
527 555
528 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() { 556 void LayerTreeImpl::UpdateRootScrollLayerSizeDelta() {
529 LayerImpl* root_scroll = RootScrollLayer(); 557 LayerImpl* viewport_layer = ViewportLayer();
530 LayerImpl* root_container = RootContainerLayer(); 558 if (!viewport_layer)
531 DCHECK(root_scroll); 559 return;
532 DCHECK(root_container); 560
533 DCHECK(IsActiveTree()); 561 DCHECK(IsActiveTree());
562 DCHECK(root_scroll_layer_);
534 563
535 gfx::Vector2dF scrollable_viewport_size = 564 // This corrects fixed-position elements for 1) dynamic viewport size changes
536 gfx::RectF(ScrollableViewportSize()).bottom_right() - gfx::PointF(); 565 // caused by things like URL-bar hiding, and 2) impl-side page scale delta.
566 gfx::SizeF true_viewport_size =
567 gfx::ScaleSize(layer_tree_host_impl_->VisibleViewportSize(),
568 1 / total_page_scale_factor());
569 gfx::SizeF blink_perceived_viewport_size =
570 gfx::ScaleSize(viewport_layer->bounds(), 1 / page_scale_factor());
enne (OOO) 2013/07/30 02:32:17 Just to make sure I'm reading this correctly, View
aelias_OOO_until_Jul13 2013/07/30 02:52:00 It doesn't matter because it's a delta. This is c
enne (OOO) 2013/07/30 03:44:47 I worked through an example, and I'll buy that exp
571 gfx::Vector2dF delta(
572 true_viewport_size.width() - blink_perceived_viewport_size.width(),
573 true_viewport_size.height() - blink_perceived_viewport_size.height());
537 574
538 gfx::Vector2dF original_viewport_size = 575 root_scroll_layer_->SetFixedContainerSizeDelta(delta);
539 gfx::RectF(root_container->bounds()).bottom_right() -
540 gfx::PointF();
541 original_viewport_size.Scale(1 / page_scale_factor());
542
543 root_scroll->SetFixedContainerSizeDelta(
544 scrollable_viewport_size - original_viewport_size);
545 } 576 }
546 577
547 void LayerTreeImpl::SetLatencyInfo(const ui::LatencyInfo& latency_info) { 578 void LayerTreeImpl::SetLatencyInfo(const ui::LatencyInfo& latency_info) {
548 latency_info_.MergeWith(latency_info); 579 latency_info_.MergeWith(latency_info);
549 } 580 }
550 581
551 const ui::LatencyInfo& LayerTreeImpl::GetLatencyInfo() { 582 const ui::LatencyInfo& LayerTreeImpl::GetLatencyInfo() {
552 return latency_info_; 583 return latency_info_;
553 } 584 }
554 585
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 const std::vector<LayerImpl*> LayerTreeImpl::LayersWithCopyOutputRequest() 620 const std::vector<LayerImpl*> LayerTreeImpl::LayersWithCopyOutputRequest()
590 const { 621 const {
591 // Only the active tree needs to know about layers with copy requests, as 622 // Only the active tree needs to know about layers with copy requests, as
592 // they are aborted if not serviced during draw. 623 // they are aborted if not serviced during draw.
593 DCHECK(IsActiveTree()); 624 DCHECK(IsActiveTree());
594 625
595 return layers_with_copy_output_request_; 626 return layers_with_copy_output_request_;
596 } 627 }
597 628
598 } // namespace cc 629 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698