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

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

Issue 1413823005: Invalidate objects when containing block changed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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) 2007 David Smith (catfish.man@gmail.com) 4 * (C) 2007 David Smith (catfish.man@gmail.com)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 const ComputedStyle* oldStyle = style(); 228 const ComputedStyle* oldStyle = style();
229 229
230 setReplaced(newStyle.isDisplayInlineType()); 230 setReplaced(newStyle.isDisplayInlineType());
231 231
232 if (oldStyle && parent()) { 232 if (oldStyle && parent()) {
233 bool oldHasTransformRelatedProperty = oldStyle->hasTransformRelatedPrope rty(); 233 bool oldHasTransformRelatedProperty = oldStyle->hasTransformRelatedPrope rty();
234 bool newHasTransformRelatedProperty = newStyle.hasTransformRelatedProper ty(); 234 bool newHasTransformRelatedProperty = newStyle.hasTransformRelatedProper ty();
235 bool oldStyleIsContainer = oldStyle->position() != StaticPosition || old HasTransformRelatedProperty; 235 bool oldStyleIsContainer = oldStyle->position() != StaticPosition || old HasTransformRelatedProperty;
236 236
237 if (oldStyleIsContainer && (newStyle.position() == StaticPosition || (ol dHasTransformRelatedProperty && !newHasTransformRelatedProperty))) { 237 if (oldStyleIsContainer && (newStyle.position() == StaticPosition || (ol dHasTransformRelatedProperty && !newHasTransformRelatedProperty))) {
238 // Clear our positioned objects list. Our absolutely positioned desc endants will be 238 // Clear our positioned objects list. Our absolute and fixed positio ned descendants will be
239 // inserted into our containing block's positioned objects list duri ng layout. 239 // inserted into our containing block's positioned objects list duri ng layout.
240 removePositionedObjects(0, NewContainingBlock); 240 removePositionedObjects(nullptr, NewContainingBlock);
241 } else if (!oldStyleIsContainer && (newStyle.position() != StaticPositio n || newHasTransformRelatedProperty)) { 241 } else if (!oldStyleIsContainer && (newStyle.position() != StaticPositio n || newHasTransformRelatedProperty)) {
242 // Remove our absolutely positioned descendants from their current c ontaining block. 242 // Remove our absolutely positioned descendants from their current c ontaining block.
243 // They will be inserted into our positioned objects list during lay out. 243 // They will be inserted into our positioned objects list during lay out.
244 if (LayoutBlock* cb = containingBlockForAbsolutePosition()) 244 if (LayoutBlock* cb = containingBlockForAbsolutePosition())
245 cb->removePositionedObjects(this, NewContainingBlock); 245 cb->removePositionedObjects(this, NewContainingBlock);
246 } 246 }
247 if (!oldHasTransformRelatedProperty && newHasTransformRelatedProperty) {
248 // Remove our fixed positioned descendants from their current contai ning block.
249 // They will be inserted into our positioned objects list during lay out.
250 if (LayoutBlock* cb = containerForFixedPosition())
251 cb->removePositionedObjects(this, NewContainingBlock);
252 }
247 } 253 }
248 254
249 LayoutBox::styleWillChange(diff, newStyle); 255 LayoutBox::styleWillChange(diff, newStyle);
250 } 256 }
251 257
252 static bool borderOrPaddingLogicalWidthChanged(const ComputedStyle& oldStyle, co nst ComputedStyle& newStyle) 258 static bool borderOrPaddingLogicalWidthChanged(const ComputedStyle& oldStyle, co nst ComputedStyle& newStyle)
253 { 259 {
254 if (newStyle.isHorizontalWritingMode()) { 260 if (newStyle.isHorizontalWritingMode()) {
255 return oldStyle.borderLeftWidth() != newStyle.borderLeftWidth() 261 return oldStyle.borderLeftWidth() != newStyle.borderLeftWidth()
256 || oldStyle.borderRightWidth() != newStyle.borderRightWidth() 262 || oldStyle.borderRightWidth() != newStyle.borderRightWidth()
(...skipping 17 matching lines...) Expand all
274 if (previousSibling() && previousSibling()->isAnonymousBlock()) 280 if (previousSibling() && previousSibling()->isAnonymousBlock())
275 toLayoutBlock(parent())->moveChildTo(toLayoutBlock(previousSibling() ), this, nullptr, false); 281 toLayoutBlock(parent())->moveChildTo(toLayoutBlock(previousSibling() ), this, nullptr, false);
276 else if (nextSibling() && nextSibling()->isAnonymousBlock()) 282 else if (nextSibling() && nextSibling()->isAnonymousBlock())
277 toLayoutBlock(parent())->moveChildTo(toLayoutBlock(nextSibling()), t his, nextSibling()->slowFirstChild(), false); 283 toLayoutBlock(parent())->moveChildTo(toLayoutBlock(nextSibling()), t his, nextSibling()->slowFirstChild(), false);
278 } 284 }
279 285
280 const ComputedStyle& newStyle = styleRef(); 286 const ComputedStyle& newStyle = styleRef();
281 287
282 if (oldStyle && parent()) { 288 if (oldStyle && parent()) {
283 if (oldStyle->position() != newStyle.position() && newStyle.position() ! = StaticPosition) { 289 if (oldStyle->position() != newStyle.position() && newStyle.position() ! = StaticPosition) {
284 // Remove our absolutely positioned descendants from their new conta ining block, 290 // Remove our absolute and fixed positioned descendants from their n ew containing block,
285 // in case containingBlock() changes by the change to the position p roperty. 291 // in case containingBlock() changes by the change to the position p roperty.
286 // See styleWillChange() for other cases. 292 // See styleWillChange() for other cases.
287 if (LayoutBlock* cb = containingBlock()) 293 if (LayoutBlock* cb = containingBlock())
288 cb->removePositionedObjects(this, NewContainingBlock); 294 cb->removePositionedObjects(this, NewContainingBlock);
289 } 295 }
290 } 296 }
291 297
292 if (TextAutosizer* textAutosizer = document().textAutosizer()) 298 if (TextAutosizer* textAutosizer = document().textAutosizer())
293 textAutosizer->record(this); 299 textAutosizer->record(this);
294 300
(...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1459 } 1465 }
1460 1466
1461 void LayoutBlock::removePositionedObjects(LayoutBlock* o, ContainingBlockState c ontainingBlockState) 1467 void LayoutBlock::removePositionedObjects(LayoutBlock* o, ContainingBlockState c ontainingBlockState)
1462 { 1468 {
1463 TrackedLayoutBoxListHashSet* positionedDescendants = positionedObjects(); 1469 TrackedLayoutBoxListHashSet* positionedDescendants = positionedObjects();
1464 if (!positionedDescendants) 1470 if (!positionedDescendants)
1465 return; 1471 return;
1466 1472
1467 Vector<LayoutBox*, 16> deadObjects; 1473 Vector<LayoutBox*, 16> deadObjects;
1468 for (auto* positionedObject : *positionedDescendants) { 1474 for (auto* positionedObject : *positionedDescendants) {
1469 if (!o || positionedObject->isDescendantOf(o)) { 1475 if (!o || (positionedObject->isDescendantOf(o) && o != positionedObject) ) {
1470 if (containingBlockState == NewContainingBlock) { 1476 if (containingBlockState == NewContainingBlock) {
1471 positionedObject->setChildNeedsLayout(MarkOnlyThis); 1477 positionedObject->setChildNeedsLayout(MarkOnlyThis);
1472 if (positionedObject->needsPreferredWidthsRecalculation()) 1478 if (positionedObject->needsPreferredWidthsRecalculation())
1473 positionedObject->setPreferredLogicalWidthsDirty(MarkOnlyThi s); 1479 positionedObject->setPreferredLogicalWidthsDirty(MarkOnlyThi s);
1480
1481 // The positioned object changing containing block may change pa int invalidation container.
1482 // Invalidate it (including non-compositing descendants) on its original paint invalidation container.
1483 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) {
1484 // This valid because we need to invalidate based on the cur rent status.
1485 DisableCompositingQueryAsserts compositingDisabler;
1486 if (!positionedObject->isPaintInvalidationContainer())
1487 positionedObject->invalidatePaintIncludingNonCompositing Descendants();
1488 }
1474 } 1489 }
1475 1490
1476 // It is parent blocks job to add positioned child to positioned obj ects list of its containing block 1491 // It is parent blocks job to add positioned child to positioned obj ects list of its containing block
1477 // Parent layout needs to be invalidated to ensure this happens. 1492 // Parent layout needs to be invalidated to ensure this happens.
1478 LayoutObject* p = positionedObject->parent(); 1493 LayoutObject* p = positionedObject->parent();
1479 while (p && !p->isLayoutBlock()) 1494 while (p && !p->isLayoutBlock())
1480 p = p->parent(); 1495 p = p->parent();
1481 if (p) 1496 if (p)
1482 p->setChildNeedsLayout(); 1497 p->setChildNeedsLayout();
1483 1498
(...skipping 1389 matching lines...) Expand 10 before | Expand all | Expand 10 after
2873 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const 2888 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const
2874 { 2889 {
2875 showLayoutObject(); 2890 showLayoutObject();
2876 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) 2891 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box())
2877 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); 2892 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1);
2878 } 2893 }
2879 2894
2880 #endif 2895 #endif
2881 2896
2882 } // namespace blink 2897 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698