| 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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 } | 155 } |
| 156 return 0; | 156 return 0; |
| 157 } | 157 } |
| 158 | 158 |
| 159 static void updateStyleOfAnonymousBlockContinuations(RenderObject* block, const
RenderStyle* newStyle, const RenderStyle* oldStyle) | 159 static void updateStyleOfAnonymousBlockContinuations(RenderObject* block, const
RenderStyle* newStyle, const RenderStyle* oldStyle) |
| 160 { | 160 { |
| 161 for (;block && block->isAnonymousBlock(); block = block->nextSibling()) { | 161 for (;block && block->isAnonymousBlock(); block = block->nextSibling()) { |
| 162 if (!toRenderBlock(block)->isAnonymousBlockContinuation()) | 162 if (!toRenderBlock(block)->isAnonymousBlockContinuation()) |
| 163 continue; | 163 continue; |
| 164 | 164 |
| 165 RefPtr<RenderStyle> newBlockStyle; |
| 166 |
| 165 if (!block->style()->isOutlineEquivalent(newStyle)) { | 167 if (!block->style()->isOutlineEquivalent(newStyle)) { |
| 166 RefPtr<RenderStyle> blockStyle = RenderStyle::clone(block->style()); | 168 newBlockStyle = RenderStyle::clone(block->style()); |
| 167 blockStyle->setOutlineFromStyle(*newStyle); | 169 newBlockStyle->setOutlineFromStyle(*newStyle); |
| 168 block->setStyle(blockStyle); | |
| 169 } | 170 } |
| 170 | 171 |
| 171 if (block->style()->position() != newStyle->position()) { | 172 if (block->style()->position() != newStyle->position()) { |
| 172 // If we are no longer in-flow positioned but our descendant block(s
) still have an in-flow positioned ancestor then | 173 // If we are no longer in-flow positioned but our descendant block(s
) still have an in-flow positioned ancestor then |
| 173 // their containing anonymous block should keep its in-flow position
ing. | 174 // their containing anonymous block should keep its in-flow position
ing. |
| 174 if (oldStyle->hasInFlowPosition() | 175 if (oldStyle->hasInFlowPosition() |
| 175 && inFlowPositionedInlineAncestor(toRenderBlock(block)->inlineEl
ementContinuation())) | 176 && inFlowPositionedInlineAncestor(toRenderBlock(block)->inlineEl
ementContinuation())) |
| 176 continue; | 177 continue; |
| 177 // FIXME: We should share blockStyle with the outline case, but it f
ails layout tests | 178 if (!newBlockStyle) |
| 178 // for dynamic position change of inlines containing block continuat
ions. crbug.com/405222. | 179 newBlockStyle = RenderStyle::clone(block->style()); |
| 179 RefPtr<RenderStyle> blockStyle = RenderStyle::createAnonymousStyleWi
thDisplay(block->style(), BLOCK); | 180 newBlockStyle->setPosition(newStyle->position()); |
| 180 blockStyle->setPosition(newStyle->position()); | |
| 181 block->setStyle(blockStyle); | |
| 182 } | 181 } |
| 182 |
| 183 if (newBlockStyle) |
| 184 block->setStyle(newBlockStyle); |
| 183 } | 185 } |
| 184 } | 186 } |
| 185 | 187 |
| 186 void RenderInline::styleDidChange(StyleDifference diff, const RenderStyle* oldSt
yle) | 188 void RenderInline::styleDidChange(StyleDifference diff, const RenderStyle* oldSt
yle) |
| 187 { | 189 { |
| 188 RenderBoxModelObject::styleDidChange(diff, oldStyle); | 190 RenderBoxModelObject::styleDidChange(diff, oldStyle); |
| 189 | 191 |
| 190 // Ensure that all of the split inlines pick up the new style. We | 192 // Ensure that all of the split inlines pick up the new style. We |
| 191 // only do this if we're an inline, since we don't want to propagate | 193 // only do this if we're an inline, since we don't want to propagate |
| 192 // a block's style to the other inlines. | 194 // a block's style to the other inlines. |
| 193 // e.g., <font>foo <h4>goo</h4> moo</font>. The <font> inlines before | 195 // e.g., <font>foo <h4>goo</h4> moo</font>. The <font> inlines before |
| 194 // and after the block share the same style, but the block doesn't | 196 // and after the block share the same style, but the block doesn't |
| 195 // need to pass its style on to anyone else. | 197 // need to pass its style on to anyone else. |
| 196 RenderStyle* newStyle = style(); | 198 RenderStyle* newStyle = style(); |
| 197 RenderInline* continuation = inlineElementContinuation(); | 199 RenderInline* continuation = inlineElementContinuation(); |
| 198 for (RenderInline* currCont = continuation; currCont; currCont = currCont->i
nlineElementContinuation()) { | 200 for (RenderInline* currCont = continuation; currCont; currCont = currCont->i
nlineElementContinuation()) { |
| 199 RenderBoxModelObject* nextCont = currCont->continuation(); | 201 RenderBoxModelObject* nextCont = currCont->continuation(); |
| 200 currCont->setContinuation(0); | 202 currCont->setContinuation(0); |
| 201 currCont->setStyle(newStyle); | 203 currCont->setStyle(newStyle); |
| 202 currCont->setContinuation(nextCont); | 204 currCont->setContinuation(nextCont); |
| 203 } | 205 } |
| 204 | 206 |
| 205 // If an inline's in-flow positioning has changed then any descendant blocks
will need to change their in-flow positioning accordingly. | 207 // If an inline's outline or in-flow positioning has changed then any descen
dant blocks will need to change their styles accordingly. |
| 206 // Do this by updating the position of the descendant blocks' containing ano
nymous blocks - there may be more than one. | 208 // Do this by updating the styles of the descendant blocks' containing anony
mous blocks - there may be more than one. |
| 207 if (continuation && oldStyle | 209 if (continuation && oldStyle |
| 208 && (!newStyle->isOutlineEquivalent(oldStyle) | 210 && (!newStyle->isOutlineEquivalent(oldStyle) |
| 209 || (newStyle->position() != oldStyle->position() && (newStyle->hasIn
FlowPosition() || oldStyle->hasInFlowPosition())))) { | 211 || (newStyle->position() != oldStyle->position() && (newStyle->hasIn
FlowPosition() || oldStyle->hasInFlowPosition())))) { |
| 210 // If any descendant blocks exist then they will be in the next anonymou
s block and its siblings. | 212 // If any descendant blocks exist then they will be in the next anonymou
s block and its siblings. |
| 211 RenderObject* block = containingBlock()->nextSibling(); | 213 RenderObject* block = containingBlock()->nextSibling(); |
| 212 if (block && block->isAnonymousBlock()) | 214 if (block && block->isAnonymousBlock()) |
| 213 updateStyleOfAnonymousBlockContinuations(block, newStyle, oldStyle); | 215 updateStyleOfAnonymousBlockContinuations(block, newStyle, oldStyle); |
| 214 } | 216 } |
| 215 | 217 |
| 216 if (!alwaysCreateLineBoxes()) { | 218 if (!alwaysCreateLineBoxes()) { |
| 217 bool alwaysCreateLineBoxesNew = hasSelfPaintingLayer() || hasBoxDecorati
onBackground() || newStyle->hasPadding() || newStyle->hasMargin() || newStyle->h
asOutline(); | 219 bool alwaysCreateLineBoxesNew = hasSelfPaintingLayer() || hasBoxDecorati
onBackground() || newStyle->hasPadding() || newStyle->hasMargin() || newStyle->h
asOutline(); |
| 218 if (oldStyle && alwaysCreateLineBoxesNew) { | 220 if (oldStyle && alwaysCreateLineBoxesNew) { |
| 219 dirtyLineBoxes(false); | 221 dirtyLineBoxes(false); |
| 220 setNeedsLayoutAndFullPaintInvalidation(); | 222 setNeedsLayoutAndFullPaintInvalidation(); |
| 221 } | 223 } |
| 222 setAlwaysCreateLineBoxes(alwaysCreateLineBoxesNew); | 224 setAlwaysCreateLineBoxes(alwaysCreateLineBoxesNew); |
| 223 } | 225 } |
| 224 } | 226 } |
| 225 | 227 |
| 226 void RenderInline::setContinuation(RenderBoxModelObject* continuation) | |
| 227 { | |
| 228 RenderBoxModelObject::setContinuation(continuation); | |
| 229 if (continuation && continuation->isAnonymousBlock() && !continuation->style
()->isOutlineEquivalent(style())) { | |
| 230 // Push outline style to the block continuation. | |
| 231 RefPtr<RenderStyle> blockStyle = RenderStyle::clone(continuation->style(
)); | |
| 232 blockStyle->setOutlineFromStyle(*style()); | |
| 233 continuation->setStyle(blockStyle); | |
| 234 } | |
| 235 // FIXME: What if continuation is added when the inline has relative positio
n? crbug.com/405222. | |
| 236 } | |
| 237 | |
| 238 void RenderInline::updateAlwaysCreateLineBoxes(bool fullLayout) | 228 void RenderInline::updateAlwaysCreateLineBoxes(bool fullLayout) |
| 239 { | 229 { |
| 240 // Once we have been tainted once, just assume it will happen again. This wa
y effects like hover highlighting that change the | 230 // Once we have been tainted once, just assume it will happen again. This wa
y effects like hover highlighting that change the |
| 241 // background color will only cause a layout on the first rollover. | 231 // background color will only cause a layout on the first rollover. |
| 242 if (alwaysCreateLineBoxes()) | 232 if (alwaysCreateLineBoxes()) |
| 243 return; | 233 return; |
| 244 | 234 |
| 245 RenderStyle* parentStyle = parent()->style(); | 235 RenderStyle* parentStyle = parent()->style(); |
| 246 RenderInline* parentRenderInline = parent()->isRenderInline() ? toRenderInli
ne(parent()) : 0; | 236 RenderInline* parentRenderInline = parent()->isRenderInline() ? toRenderInli
ne(parent()) : 0; |
| 247 bool checkFonts = document().inNoQuirksMode(); | 237 bool checkFonts = document().inNoQuirksMode(); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 // inline into continuations. This involves creating an anonymous block
box to hold | 332 // inline into continuations. This involves creating an anonymous block
box to hold |
| 343 // |newChild|. We then make that block box a continuation of this inlin
e. We take all of | 333 // |newChild|. We then make that block box a continuation of this inlin
e. We take all of |
| 344 // the children after |beforeChild| and put them in a clone of this obje
ct. | 334 // the children after |beforeChild| and put them in a clone of this obje
ct. |
| 345 RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisp
lay(style(), BLOCK); | 335 RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisp
lay(style(), BLOCK); |
| 346 | 336 |
| 347 // If inside an inline affected by in-flow positioning the block needs t
o be affected by it too. | 337 // If inside an inline affected by in-flow positioning the block needs t
o be affected by it too. |
| 348 // Giving the block a layer like this allows it to collect the x/y offse
ts from inline parents later. | 338 // Giving the block a layer like this allows it to collect the x/y offse
ts from inline parents later. |
| 349 if (RenderObject* positionedAncestor = inFlowPositionedInlineAncestor(th
is)) | 339 if (RenderObject* positionedAncestor = inFlowPositionedInlineAncestor(th
is)) |
| 350 newStyle->setPosition(positionedAncestor->style()->position()); | 340 newStyle->setPosition(positionedAncestor->style()->position()); |
| 351 | 341 |
| 342 // Push outline style to the block continuation. |
| 343 if (!newStyle->isOutlineEquivalent(style())) |
| 344 newStyle->setOutlineFromStyle(*style()); |
| 345 |
| 352 RenderBlockFlow* newBox = RenderBlockFlow::createAnonymous(&document()); | 346 RenderBlockFlow* newBox = RenderBlockFlow::createAnonymous(&document()); |
| 353 newBox->setStyle(newStyle.release()); | 347 newBox->setStyle(newStyle.release()); |
| 354 RenderBoxModelObject* oldContinuation = continuation(); | 348 RenderBoxModelObject* oldContinuation = continuation(); |
| 355 setContinuation(newBox); | 349 setContinuation(newBox); |
| 356 | 350 |
| 357 splitFlow(beforeChild, newBox, newChild, oldContinuation); | 351 splitFlow(beforeChild, newBox, newChild, oldContinuation); |
| 358 return; | 352 return; |
| 359 } | 353 } |
| 360 | 354 |
| 361 RenderBoxModelObject::addChild(newChild, beforeChild); | 355 RenderBoxModelObject::addChild(newChild, beforeChild); |
| (...skipping 1245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1607 container = this; | 1601 container = this; |
| 1608 | 1602 |
| 1609 FloatPoint absPos = container->localToAbsolute(); | 1603 FloatPoint absPos = container->localToAbsolute(); |
| 1610 region.bounds.setX(absPos.x() + region.bounds.x()); | 1604 region.bounds.setX(absPos.x() + region.bounds.x()); |
| 1611 region.bounds.setY(absPos.y() + region.bounds.y()); | 1605 region.bounds.setY(absPos.y() + region.bounds.y()); |
| 1612 | 1606 |
| 1613 regions.append(region); | 1607 regions.append(region); |
| 1614 } | 1608 } |
| 1615 | 1609 |
| 1616 } // namespace blink | 1610 } // namespace blink |
| OLD | NEW |