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

Side by Side Diff: Source/core/rendering/RenderInline.cpp

Issue 538213002: Cleanup RenderInline style propagation to continuations (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: For landing Created 6 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
« no previous file with comments | « Source/core/rendering/RenderInline.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 * 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
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
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
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
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderInline.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698