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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp

Issue 2769353002: Only create sticky position constraints for constrained sticky position. (Closed)
Patch Set: Merge with master. Created 3 years, 8 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
7 * Copyright (C) 2010 Google Inc. All rights reserved. 7 * Copyright (C) 2010 Google Inc. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 return nullptr; 67 return nullptr;
68 68
69 return &it->value; 69 return &it->value;
70 } 70 }
71 71
72 // Inclusive of |from|, exclusive of |to|. 72 // Inclusive of |from|, exclusive of |to|.
73 LayoutBoxModelObject* FindFirstStickyBetween(LayoutObject* from, 73 LayoutBoxModelObject* FindFirstStickyBetween(LayoutObject* from,
74 LayoutObject* to) { 74 LayoutObject* to) {
75 LayoutObject* maybe_sticky_ancestor = from; 75 LayoutObject* maybe_sticky_ancestor = from;
76 while (maybe_sticky_ancestor && maybe_sticky_ancestor != to) { 76 while (maybe_sticky_ancestor && maybe_sticky_ancestor != to) {
77 if (maybe_sticky_ancestor->IsStickyPositioned()) { 77 if (maybe_sticky_ancestor->Style()->HasStickyConstrainedPosition()) {
78 return ToLayoutBoxModelObject(maybe_sticky_ancestor); 78 return ToLayoutBoxModelObject(maybe_sticky_ancestor);
79 } 79 }
80 80
81 maybe_sticky_ancestor = 81 maybe_sticky_ancestor =
82 maybe_sticky_ancestor->IsLayoutInline() 82 maybe_sticky_ancestor->IsLayoutInline()
83 ? maybe_sticky_ancestor->Container() 83 ? maybe_sticky_ancestor->Container()
84 : ToLayoutBox(maybe_sticky_ancestor)->LocationContainer(); 84 : ToLayoutBox(maybe_sticky_ancestor)->LocationContainer();
85 } 85 }
86 return nullptr; 86 return nullptr;
87 } 87 }
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 ImageQualityController::Remove(*this); 242 ImageQualityController::Remove(*this);
243 243
244 // A continuation of this LayoutObject should be destroyed at subclasses. 244 // A continuation of this LayoutObject should be destroyed at subclasses.
245 DCHECK(!Continuation()); 245 DCHECK(!Continuation());
246 246
247 if (IsPositioned()) { 247 if (IsPositioned()) {
248 // Don't use this->view() because the document's layoutView has been set to 248 // Don't use this->view() because the document's layoutView has been set to
249 // 0 during destruction. 249 // 0 during destruction.
250 if (LocalFrame* frame = this->GetFrame()) { 250 if (LocalFrame* frame = this->GetFrame()) {
251 if (FrameView* frame_view = frame->View()) { 251 if (FrameView* frame_view = frame->View()) {
252 if (Style()->HasViewportConstrainedPosition()) 252 if (Style()->HasViewportConstrainedPosition() ||
253 Style()->HasStickyConstrainedPosition())
253 frame_view->RemoveViewportConstrainedObject(*this); 254 frame_view->RemoveViewportConstrainedObject(*this);
254 } 255 }
255 } 256 }
256 } 257 }
257 258
258 LayoutObject::WillBeDestroyed(); 259 LayoutObject::WillBeDestroyed();
259 260
260 DestroyLayer(); 261 DestroyLayer();
261 } 262 }
262 263
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 body_layout->SetShouldDoFullPaintInvalidation(); 427 body_layout->SetShouldDoFullPaintInvalidation();
427 } 428 }
428 } 429 }
429 } 430 }
430 431
431 if (FrameView* frame_view = View()->GetFrameView()) { 432 if (FrameView* frame_view = View()->GetFrameView()) {
432 bool new_style_is_viewport_constained = 433 bool new_style_is_viewport_constained =
433 Style()->GetPosition() == EPosition::kFixed; 434 Style()->GetPosition() == EPosition::kFixed;
434 bool old_style_is_viewport_constrained = 435 bool old_style_is_viewport_constrained =
435 old_style && old_style->GetPosition() == EPosition::kFixed; 436 old_style && old_style->GetPosition() == EPosition::kFixed;
436 bool new_style_is_sticky = Style()->GetPosition() == EPosition::kSticky; 437 bool new_style_is_sticky = Style()->HasStickyConstrainedPosition();
437 bool old_style_is_sticky = 438 bool old_style_is_sticky =
438 old_style && old_style->GetPosition() == EPosition::kSticky; 439 old_style && old_style->HasStickyConstrainedPosition();
439 440
440 if (new_style_is_sticky != old_style_is_sticky) { 441 if (new_style_is_sticky != old_style_is_sticky) {
441 if (new_style_is_sticky) { 442 if (new_style_is_sticky) {
442 // During compositing inputs update we'll have the scroll ancestor 443 // During compositing inputs update we'll have the scroll ancestor
443 // without having to walk up the tree and can compute the sticky 444 // without having to walk up the tree and can compute the sticky
444 // position constraints then. 445 // position constraints then.
445 if (Layer()) 446 if (Layer())
446 Layer()->SetNeedsCompositingInputsUpdate(); 447 Layer()->SetNeedsCompositingInputsUpdate();
447 448
448 // TODO(pdr): When slimming paint v2 is enabled, we will need to 449 // TODO(pdr): When slimming paint v2 is enabled, we will need to
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
1054 constraints.AddAnchorEdge( 1055 constraints.AddAnchorEdge(
1055 StickyPositionScrollingConstraints::kAnchorEdgeTop); 1056 StickyPositionScrollingConstraints::kAnchorEdgeTop);
1056 } 1057 }
1057 1058
1058 if (!Style()->Bottom().IsAuto() && !skip_bottom) { 1059 if (!Style()->Bottom().IsAuto() && !skip_bottom) {
1059 constraints.SetBottomOffset(MinimumValueForLength( 1060 constraints.SetBottomOffset(MinimumValueForLength(
1060 Style()->Bottom(), LayoutUnit(constraining_size.Height()))); 1061 Style()->Bottom(), LayoutUnit(constraining_size.Height())));
1061 constraints.AddAnchorEdge( 1062 constraints.AddAnchorEdge(
1062 StickyPositionScrollingConstraints::kAnchorEdgeBottom); 1063 StickyPositionScrollingConstraints::kAnchorEdgeBottom);
1063 } 1064 }
1065 // At least one edge should be anchored if we are calculating constraints.
1066 DCHECK(constraints.GetAnchorEdges());
1064 scrollable_area->GetStickyConstraintsMap().Set(Layer(), constraints); 1067 scrollable_area->GetStickyConstraintsMap().Set(Layer(), constraints);
1065 } 1068 }
1066 1069
1067 FloatRect LayoutBoxModelObject::ComputeStickyConstrainingRect() const { 1070 FloatRect LayoutBoxModelObject::ComputeStickyConstrainingRect() const {
1068 if (Layer()->AncestorOverflowLayer()->IsRootLayer()) 1071 if (Layer()->AncestorOverflowLayer()->IsRootLayer())
1069 return View()->GetFrameView()->VisibleContentRect(); 1072 return View()->GetFrameView()->VisibleContentRect();
1070 1073
1071 LayoutBox* enclosing_clipping_box = 1074 LayoutBox* enclosing_clipping_box =
1072 Layer()->AncestorOverflowLayer()->GetLayoutBox(); 1075 Layer()->AncestorOverflowLayer()->GetLayoutBox();
1073 DCHECK(enclosing_clipping_box); 1076 DCHECK(enclosing_clipping_box);
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 if (root_element_style->HasBackground()) 1482 if (root_element_style->HasBackground())
1480 return false; 1483 return false;
1481 1484
1482 if (GetNode() != GetDocument().FirstBodyElement()) 1485 if (GetNode() != GetDocument().FirstBodyElement())
1483 return false; 1486 return false;
1484 1487
1485 return true; 1488 return true;
1486 } 1489 }
1487 1490
1488 } // namespace blink 1491 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698