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

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

Issue 2310223002: Disable scroll anchoring is an element within the scroll changes its in-flow state (Closed)
Patch Set: apply review comments Created 4 years, 3 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) 2000 Dirk Mueller (mueller@kde.org) 4 * (C) 2000 Dirk Mueller (mueller@kde.org)
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2009 Google Inc. All rights reserved. 7 * Copyright (C) 2009 Google Inc. All rights reserved.
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/) 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo bile.com/)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 1694 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 { 1705 {
1706 ASSERT(a->cursors() != b->cursors()); 1706 ASSERT(a->cursors() != b->cursors());
1707 return a->cursors() && b->cursors() && *a->cursors() == *b->cursors(); 1707 return a->cursors() && b->cursors() && *a->cursors() == *b->cursors();
1708 } 1708 }
1709 1709
1710 static inline bool areCursorsEqual(const ComputedStyle* a, const ComputedStyle* b) 1710 static inline bool areCursorsEqual(const ComputedStyle* a, const ComputedStyle* b)
1711 { 1711 {
1712 return a->cursor() == b->cursor() && (a->cursors() == b->cursors() || areNon IdenticalCursorListsEqual(a, b)); 1712 return a->cursor() == b->cursor() && (a->cursors() == b->cursors() || areNon IdenticalCursorListsEqual(a, b));
1713 } 1713 }
1714 1714
1715 void LayoutObject::setScrollAnchorDisablingStyleChangedOnAncestor()
1716 {
1717 // Walk up the parent chain and find the first scrolling block to disable
1718 // scroll anchoring on.
1719 LayoutObject* object = this;
1720 Element* viewportDefiningElement = document().viewportDefiningElement();
1721 do {
1722 object = object->parent();
1723 if (object && object->isLayoutBlock()) {
1724 LayoutBlock* block = toLayoutBlock(object);
1725 if (block->hasOverflowClip() || block->node() == viewportDefiningEle ment) {
1726 block->setScrollAnchorDisablingStyleChanged(true);
1727 return;
1728 }
1729 }
1730 } while (object);
skobes 2016/09/07 19:26:27 This can be a normal while loop.
ymalik 2016/09/07 19:55:37 Done.
1731 }
1732
1715 void LayoutObject::styleDidChange(StyleDifference diff, const ComputedStyle* old Style) 1733 void LayoutObject::styleDidChange(StyleDifference diff, const ComputedStyle* old Style)
1716 { 1734 {
1717 if (s_affectsParentBlock) 1735 if (s_affectsParentBlock)
1718 handleDynamicFloatPositionChange(this); 1736 handleDynamicFloatPositionChange(this);
1719 1737
1720 if (!m_parent) 1738 if (!m_parent)
1721 return; 1739 return;
1722 1740
1723 if (diff.needsFullLayout()) { 1741 if (diff.needsFullLayout()) {
1724 LayoutCounter::layoutObjectStyleChanged(*this, oldStyle, *m_style); 1742 LayoutCounter::layoutObjectStyleChanged(*this, oldStyle, *m_style);
1725 1743
1744 // If the in-flow state of an element is changed, disable scroll
1745 // anchoring on the containing scroller.
1746 if (oldStyle->hasOutOfFlowPosition() != m_style->hasOutOfFlowPosition())
1747 setScrollAnchorDisablingStyleChangedOnAncestor();
1748
1726 // If the object already needs layout, then setNeedsLayout won't do 1749 // If the object already needs layout, then setNeedsLayout won't do
1727 // any work. But if the containing block has changed, then we may need 1750 // any work. But if the containing block has changed, then we may need
1728 // to mark the new containing blocks for layout. The change that can 1751 // to mark the new containing blocks for layout. The change that can
1729 // directly affect the containing block of this object is a change to 1752 // directly affect the containing block of this object is a change to
1730 // the position style. 1753 // the position style.
1731 if (needsLayout() && oldStyle->position() != m_style->position()) 1754 if (needsLayout() && oldStyle->position() != m_style->position())
1732 markContainerChainForLayout(); 1755 markContainerChainForLayout();
1733 1756
1734 // Ditto. 1757 // Ditto.
1735 if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_s tyle->position()) 1758 if (needsOverflowRecalcAfterStyleChange() && oldStyle->position() != m_s tyle->position())
(...skipping 1497 matching lines...) Expand 10 before | Expand all | Expand 10 after
3233 const blink::LayoutObject* root = object1; 3256 const blink::LayoutObject* root = object1;
3234 while (root->parent()) 3257 while (root->parent())
3235 root = root->parent(); 3258 root = root->parent();
3236 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); 3259 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0);
3237 } else { 3260 } else {
3238 WTFLogAlways("%s", "Cannot showLayoutTree. Root is (nil)"); 3261 WTFLogAlways("%s", "Cannot showLayoutTree. Root is (nil)");
3239 } 3262 }
3240 } 3263 }
3241 3264
3242 #endif 3265 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutObject.h ('k') | third_party/WebKit/Source/core/layout/ScrollAnchorTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698