| OLD | NEW |
| 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 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
reserved. | 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
reserved. |
| 5 * | 5 * |
| 6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 | 61 |
| 62 LayoutInline* LayoutInline::createAnonymous(Document* document) | 62 LayoutInline* LayoutInline::createAnonymous(Document* document) |
| 63 { | 63 { |
| 64 LayoutInline* layoutObject = new LayoutInline(nullptr); | 64 LayoutInline* layoutObject = new LayoutInline(nullptr); |
| 65 layoutObject->setDocumentForAnonymous(document); | 65 layoutObject->setDocumentForAnonymous(document); |
| 66 return layoutObject; | 66 return layoutObject; |
| 67 } | 67 } |
| 68 | 68 |
| 69 void LayoutInline::willBeDestroyed() | 69 void LayoutInline::willBeDestroyed() |
| 70 { | 70 { |
| 71 #if ENABLE(ASSERT) | |
| 72 // Make sure we do not retain "this" in the continuation outline table map o
f our containing blocks. | |
| 73 if (parent() && style()->visibility() == VISIBLE && style()->hasOutline()) { | |
| 74 bool containingBlockPaintsContinuationOutline = continuation() || isInli
neElementContinuation(); | |
| 75 if (containingBlockPaintsContinuationOutline) { | |
| 76 if (LayoutBlock* cb = containingBlock()) { | |
| 77 if (LayoutBlock* cbCb = cb->containingBlock()) | |
| 78 ASSERT(!cbCb->paintsContinuationOutline(this)); | |
| 79 } | |
| 80 } | |
| 81 } | |
| 82 #endif | |
| 83 | |
| 84 // Make sure to destroy anonymous children first while they are still connec
ted to the rest of the tree, so that they will | 71 // Make sure to destroy anonymous children first while they are still connec
ted to the rest of the tree, so that they will |
| 85 // properly dirty line boxes that they are removed from. Effects that do :b
efore/:after only on hover could crash otherwise. | 72 // properly dirty line boxes that they are removed from. Effects that do :b
efore/:after only on hover could crash otherwise. |
| 86 children()->destroyLeftoverChildren(); | 73 children()->destroyLeftoverChildren(); |
| 87 | 74 |
| 88 // Destroy our continuation before anything other than anonymous children. | 75 // Destroy our continuation before anything other than anonymous children. |
| 89 // The reason we don't destroy it before anonymous children is that they may | 76 // The reason we don't destroy it before anonymous children is that they may |
| 90 // have continuations of their own that are anonymous children of our contin
uation. | 77 // have continuations of their own that are anonymous children of our contin
uation. |
| 91 LayoutBoxModelObject* continuation = this->continuation(); | 78 LayoutBoxModelObject* continuation = this->continuation(); |
| 92 if (continuation) { | 79 if (continuation) { |
| 93 continuation->destroy(); | 80 continuation->destroy(); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 145 static LayoutObject* inFlowPositionedInlineAncestor(LayoutObject* p) | 132 static LayoutObject* inFlowPositionedInlineAncestor(LayoutObject* p) |
| 146 { | 133 { |
| 147 while (p && p->isLayoutInline()) { | 134 while (p && p->isLayoutInline()) { |
| 148 if (p->isInFlowPositioned()) | 135 if (p->isInFlowPositioned()) |
| 149 return p; | 136 return p; |
| 150 p = p->parent(); | 137 p = p->parent(); |
| 151 } | 138 } |
| 152 return nullptr; | 139 return nullptr; |
| 153 } | 140 } |
| 154 | 141 |
| 155 static void updateStyleOfAnonymousBlockContinuations(LayoutObject* block, const
ComputedStyle& newStyle, const ComputedStyle& oldStyle, LayoutObject* containing
BlockOfEndOfContinuation) | 142 static void updateInFlowPositionOfAnonymousBlockContinuations(LayoutObject* bloc
k, const ComputedStyle& newStyle, const ComputedStyle& oldStyle, LayoutObject* c
ontainingBlockOfEndOfContinuation) |
| 156 { | 143 { |
| 157 // If an inline's outline or in-flow positioning has changed then any descen
dant blocks will need to change their styles accordingly. | |
| 158 bool updateOutline = !newStyle.isOutlineEquivalent(&oldStyle); | |
| 159 bool updatePosition = newStyle.position() != oldStyle.position() && (newStyl
e.hasInFlowPosition() || oldStyle.hasInFlowPosition()); | |
| 160 if (!updateOutline && !updatePosition) | |
| 161 return; | |
| 162 | |
| 163 for (; block && block != containingBlockOfEndOfContinuation && block->isAnon
ymousBlock(); block = block->nextSibling()) { | 144 for (; block && block != containingBlockOfEndOfContinuation && block->isAnon
ymousBlock(); block = block->nextSibling()) { |
| 164 if (!toLayoutBlock(block)->isAnonymousBlockContinuation()) | 145 if (!toLayoutBlock(block)->isAnonymousBlockContinuation()) |
| 165 continue; | 146 continue; |
| 166 | 147 |
| 148 // If we are no longer in-flow positioned but our descendant block(s) st
ill have an in-flow positioned ancestor then |
| 149 // their containing anonymous block should keep its in-flow positioning. |
| 150 if (oldStyle.hasInFlowPosition() && inFlowPositionedInlineAncestor(toLay
outBlock(block)->inlineElementContinuation())) |
| 151 continue; |
| 152 |
| 167 RefPtr<ComputedStyle> newBlockStyle = ComputedStyle::clone(block->styleR
ef()); | 153 RefPtr<ComputedStyle> newBlockStyle = ComputedStyle::clone(block->styleR
ef()); |
| 168 | 154 newBlockStyle->setPosition(newStyle.position()); |
| 169 if (updateOutline) | |
| 170 newBlockStyle->setOutlineFromStyle(newStyle); | |
| 171 | |
| 172 if (updatePosition) { | |
| 173 // If we are no longer in-flow positioned but our descendant block(s
) still have an in-flow positioned ancestor then | |
| 174 // their containing anonymous block should keep its in-flow position
ing. | |
| 175 if (oldStyle.hasInFlowPosition() && inFlowPositionedInlineAncestor(t
oLayoutBlock(block)->inlineElementContinuation())) | |
| 176 continue; | |
| 177 newBlockStyle->setPosition(newStyle.position()); | |
| 178 } | |
| 179 | |
| 180 block->setStyle(newBlockStyle); | 155 block->setStyle(newBlockStyle); |
| 181 } | 156 } |
| 182 } | 157 } |
| 183 | 158 |
| 184 void LayoutInline::styleDidChange(StyleDifference diff, const ComputedStyle* old
Style) | 159 void LayoutInline::styleDidChange(StyleDifference diff, const ComputedStyle* old
Style) |
| 185 { | 160 { |
| 186 LayoutBoxModelObject::styleDidChange(diff, oldStyle); | 161 LayoutBoxModelObject::styleDidChange(diff, oldStyle); |
| 187 | 162 |
| 188 // Ensure that all of the split inlines pick up the new style. We | 163 // Ensure that all of the split inlines pick up the new style. We |
| 189 // only do this if we're an inline, since we don't want to propagate | 164 // only do this if we're an inline, since we don't want to propagate |
| 190 // a block's style to the other inlines. | 165 // a block's style to the other inlines. |
| 191 // e.g., <font>foo <h4>goo</h4> moo</font>. The <font> inlines before | 166 // e.g., <font>foo <h4>goo</h4> moo</font>. The <font> inlines before |
| 192 // and after the block share the same style, but the block doesn't | 167 // and after the block share the same style, but the block doesn't |
| 193 // need to pass its style on to anyone else. | 168 // need to pass its style on to anyone else. |
| 194 const ComputedStyle& newStyle = styleRef(); | 169 const ComputedStyle& newStyle = styleRef(); |
| 195 LayoutInline* continuation = inlineElementContinuation(); | 170 LayoutInline* continuation = inlineElementContinuation(); |
| 196 LayoutInline* endOfContinuation = nullptr; | 171 LayoutInline* endOfContinuation = nullptr; |
| 197 for (LayoutInline* currCont = continuation; currCont; currCont = currCont->i
nlineElementContinuation()) { | 172 for (LayoutInline* currCont = continuation; currCont; currCont = currCont->i
nlineElementContinuation()) { |
| 198 LayoutBoxModelObject* nextCont = currCont->continuation(); | 173 LayoutBoxModelObject* nextCont = currCont->continuation(); |
| 199 currCont->setContinuation(nullptr); | 174 currCont->setContinuation(nullptr); |
| 200 currCont->setStyle(mutableStyle()); | 175 currCont->setStyle(mutableStyle()); |
| 201 currCont->setContinuation(nextCont); | 176 currCont->setContinuation(nextCont); |
| 202 endOfContinuation = currCont; | 177 endOfContinuation = currCont; |
| 203 } | 178 } |
| 204 | 179 |
| 205 if (continuation && oldStyle) { | 180 if (continuation && oldStyle) { |
| 206 ASSERT(endOfContinuation); | 181 ASSERT(endOfContinuation); |
| 207 LayoutObject* block = containingBlock()->nextSibling(); | 182 LayoutObject* block = containingBlock()->nextSibling(); |
| 208 if (block && block->isAnonymousBlock()) | 183 // If an inline's in-flow positioning has changed then any descendant bl
ocks will need to change their styles accordingly. |
| 209 updateStyleOfAnonymousBlockContinuations(block, newStyle, *oldStyle,
endOfContinuation->containingBlock()); | 184 if (block && block->isAnonymousBlock() |
| 185 && newStyle.position() != oldStyle->position() |
| 186 && (newStyle.hasInFlowPosition() || oldStyle->hasInFlowPosition())) |
| 187 updateInFlowPositionOfAnonymousBlockContinuations(block, newStyle, *
oldStyle, endOfContinuation->containingBlock()); |
| 210 } | 188 } |
| 211 | 189 |
| 212 if (!alwaysCreateLineBoxes()) { | 190 if (!alwaysCreateLineBoxes()) { |
| 213 bool alwaysCreateLineBoxesNew = hasSelfPaintingLayer() || hasBoxDecorati
onBackground() || newStyle.hasPadding() || newStyle.hasMargin() || newStyle.hasO
utline(); | 191 bool alwaysCreateLineBoxesNew = hasSelfPaintingLayer() || hasBoxDecorati
onBackground() || newStyle.hasPadding() || newStyle.hasMargin() || newStyle.hasO
utline(); |
| 214 if (oldStyle && alwaysCreateLineBoxesNew) { | 192 if (oldStyle && alwaysCreateLineBoxesNew) { |
| 215 dirtyLineBoxes(false); | 193 dirtyLineBoxes(false); |
| 216 setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::Sty
leChange); | 194 setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::Sty
leChange); |
| 217 } | 195 } |
| 218 setAlwaysCreateLineBoxes(alwaysCreateLineBoxesNew); | 196 setAlwaysCreateLineBoxes(alwaysCreateLineBoxesNew); |
| 219 } | 197 } |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 329 // inline into continuations. This involves creating an anonymous block
box to hold | 307 // inline into continuations. This involves creating an anonymous block
box to hold |
| 330 // |newChild|. We then make that block box a continuation of this inlin
e. We take all of | 308 // |newChild|. We then make that block box a continuation of this inlin
e. We take all of |
| 331 // the children after |beforeChild| and put them in a clone of this obje
ct. | 309 // the children after |beforeChild| and put them in a clone of this obje
ct. |
| 332 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyleWith
Display(styleRef(), BLOCK); | 310 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyleWith
Display(styleRef(), BLOCK); |
| 333 | 311 |
| 334 // If inside an inline affected by in-flow positioning the block needs t
o be affected by it too. | 312 // If inside an inline affected by in-flow positioning the block needs t
o be affected by it too. |
| 335 // Giving the block a layer like this allows it to collect the x/y offse
ts from inline parents later. | 313 // Giving the block a layer like this allows it to collect the x/y offse
ts from inline parents later. |
| 336 if (LayoutObject* positionedAncestor = inFlowPositionedInlineAncestor(th
is)) | 314 if (LayoutObject* positionedAncestor = inFlowPositionedInlineAncestor(th
is)) |
| 337 newStyle->setPosition(positionedAncestor->style()->position()); | 315 newStyle->setPosition(positionedAncestor->style()->position()); |
| 338 | 316 |
| 339 // Push outline style to the block continuation. | |
| 340 if (!newStyle->isOutlineEquivalent(style())) | |
| 341 newStyle->setOutlineFromStyle(*style()); | |
| 342 | |
| 343 LayoutBlockFlow* newBox = LayoutBlockFlow::createAnonymous(&document()); | 317 LayoutBlockFlow* newBox = LayoutBlockFlow::createAnonymous(&document()); |
| 344 newBox->setStyle(newStyle.release()); | 318 newBox->setStyle(newStyle.release()); |
| 345 LayoutBoxModelObject* oldContinuation = continuation(); | 319 LayoutBoxModelObject* oldContinuation = continuation(); |
| 346 setContinuation(newBox); | 320 setContinuation(newBox); |
| 347 | 321 |
| 348 splitFlow(beforeChild, newBox, newChild, oldContinuation); | 322 splitFlow(beforeChild, newBox, newChild, oldContinuation); |
| 349 return; | 323 return; |
| 350 } | 324 } |
| 351 | 325 |
| 352 LayoutBoxModelObject::addChild(newChild, beforeChild); | 326 LayoutBoxModelObject::addChild(newChild, beforeChild); |
| (...skipping 1088 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 } | 1415 } |
| 1442 | 1416 |
| 1443 void LayoutInline::invalidateDisplayItemClients(const LayoutBoxModelObject& pain
tInvalidationContainer) const | 1417 void LayoutInline::invalidateDisplayItemClients(const LayoutBoxModelObject& pain
tInvalidationContainer) const |
| 1444 { | 1418 { |
| 1445 LayoutBoxModelObject::invalidateDisplayItemClients(paintInvalidationContaine
r); | 1419 LayoutBoxModelObject::invalidateDisplayItemClients(paintInvalidationContaine
r); |
| 1446 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox()) | 1420 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox()) |
| 1447 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box); | 1421 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box); |
| 1448 } | 1422 } |
| 1449 | 1423 |
| 1450 } // namespace blink | 1424 } // namespace blink |
| OLD | NEW |