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

Side by Side Diff: Source/core/layout/LayoutInline.cpp

Issue 1215023010: Fix style propagation to continuations (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix bug again Created 5 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « LayoutTests/platform/linux/fast/repaint/outline-continuations-expected.txt ('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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 static LayoutObject* inFlowPositionedInlineAncestor(LayoutObject* p) 144 static LayoutObject* inFlowPositionedInlineAncestor(LayoutObject* p)
145 { 145 {
146 while (p && p->isLayoutInline()) { 146 while (p && p->isLayoutInline()) {
147 if (p->isRelPositioned()) 147 if (p->isRelPositioned())
148 return p; 148 return p;
149 p = p->parent(); 149 p = p->parent();
150 } 150 }
151 return nullptr; 151 return nullptr;
152 } 152 }
153 153
154 static void updateStyleOfAnonymousBlockContinuations(LayoutObject* block, const ComputedStyle& newStyle, const ComputedStyle& oldStyle) 154 static void updateStyleOfAnonymousBlockContinuations(LayoutObject* block, const ComputedStyle& newStyle, const ComputedStyle& oldStyle, LayoutObject* containing BlockOfEndOfContinuation)
155 { 155 {
156 for (;block && block->isAnonymousBlock(); block = block->nextSibling()) { 156 // If an inline's outline or in-flow positioning has changed then any descen dant blocks will need to change their styles accordingly.
157 bool updateOutline = !newStyle.isOutlineEquivalent(&oldStyle);
158 bool updatePosition = newStyle.position() != oldStyle.position() && (newStyl e.hasInFlowPosition() || oldStyle.hasInFlowPosition());
159 if (!updateOutline && !updatePosition)
160 return;
161
162 for (; block && block != containingBlockOfEndOfContinuation && block->isAnon ymousBlock(); block = block->nextSibling()) {
157 if (!toLayoutBlock(block)->isAnonymousBlockContinuation()) 163 if (!toLayoutBlock(block)->isAnonymousBlockContinuation())
158 continue; 164 continue;
159 165
160 RefPtr<ComputedStyle> newBlockStyle; 166 RefPtr<ComputedStyle> newBlockStyle = ComputedStyle::clone(block->styleR ef());
161 167
162 if (!block->style()->isOutlineEquivalent(&newStyle)) { 168 if (updateOutline)
163 newBlockStyle = ComputedStyle::clone(block->styleRef());
164 newBlockStyle->setOutlineFromStyle(newStyle); 169 newBlockStyle->setOutlineFromStyle(newStyle);
165 }
166 170
167 if (block->style()->position() != newStyle.position()) { 171 if (updatePosition) {
168 // If we are no longer in-flow positioned but our descendant block(s ) still have an in-flow positioned ancestor then 172 // If we are no longer in-flow positioned but our descendant block(s ) still have an in-flow positioned ancestor then
169 // their containing anonymous block should keep its in-flow position ing. 173 // their containing anonymous block should keep its in-flow position ing.
170 if (oldStyle.hasInFlowPosition() 174 if (oldStyle.hasInFlowPosition() && inFlowPositionedInlineAncestor(t oLayoutBlock(block)->inlineElementContinuation()))
171 && inFlowPositionedInlineAncestor(toLayoutBlock(block)->inlineEl ementContinuation()))
172 continue; 175 continue;
173 if (!newBlockStyle)
174 newBlockStyle = ComputedStyle::clone(block->styleRef());
175 newBlockStyle->setPosition(newStyle.position()); 176 newBlockStyle->setPosition(newStyle.position());
176 } 177 }
177 178
178 if (newBlockStyle) 179 block->setStyle(newBlockStyle);
179 block->setStyle(newBlockStyle);
180 } 180 }
181 } 181 }
182 182
183 void LayoutInline::styleDidChange(StyleDifference diff, const ComputedStyle* old Style) 183 void LayoutInline::styleDidChange(StyleDifference diff, const ComputedStyle* old Style)
184 { 184 {
185 LayoutBoxModelObject::styleDidChange(diff, oldStyle); 185 LayoutBoxModelObject::styleDidChange(diff, oldStyle);
186 186
187 // Ensure that all of the split inlines pick up the new style. We 187 // Ensure that all of the split inlines pick up the new style. We
188 // only do this if we're an inline, since we don't want to propagate 188 // only do this if we're an inline, since we don't want to propagate
189 // a block's style to the other inlines. 189 // a block's style to the other inlines.
190 // e.g., <font>foo <h4>goo</h4> moo</font>. The <font> inlines before 190 // e.g., <font>foo <h4>goo</h4> moo</font>. The <font> inlines before
191 // and after the block share the same style, but the block doesn't 191 // and after the block share the same style, but the block doesn't
192 // need to pass its style on to anyone else. 192 // need to pass its style on to anyone else.
193 const ComputedStyle& newStyle = styleRef(); 193 const ComputedStyle& newStyle = styleRef();
194 LayoutInline* continuation = inlineElementContinuation(); 194 LayoutInline* continuation = inlineElementContinuation();
195 LayoutInline* endOfContinuation = nullptr;
195 for (LayoutInline* currCont = continuation; currCont; currCont = currCont->i nlineElementContinuation()) { 196 for (LayoutInline* currCont = continuation; currCont; currCont = currCont->i nlineElementContinuation()) {
196 LayoutBoxModelObject* nextCont = currCont->continuation(); 197 LayoutBoxModelObject* nextCont = currCont->continuation();
197 currCont->setContinuation(nullptr); 198 currCont->setContinuation(nullptr);
198 currCont->setStyle(mutableStyle()); 199 currCont->setStyle(mutableStyle());
199 currCont->setContinuation(nextCont); 200 currCont->setContinuation(nextCont);
201 endOfContinuation = currCont;
200 } 202 }
201 203
202 // If an inline's outline or in-flow positioning has changed then any descen dant blocks will need to change their styles accordingly. 204 if (continuation && oldStyle) {
203 // Do this by updating the styles of the descendant blocks' containing anony mous blocks - there may be more than one. 205 ASSERT(endOfContinuation);
204 if (continuation && oldStyle
205 && (!newStyle.isOutlineEquivalent(oldStyle)
206 || (newStyle.position() != oldStyle->position() && (newStyle.hasInFl owPosition() || oldStyle->hasInFlowPosition())))) {
207 // If any descendant blocks exist then they will be in the next anonymou s block and its siblings.
208 LayoutObject* block = containingBlock()->nextSibling(); 206 LayoutObject* block = containingBlock()->nextSibling();
209 if (block && block->isAnonymousBlock()) 207 if (block && block->isAnonymousBlock())
210 updateStyleOfAnonymousBlockContinuations(block, newStyle, *oldStyle) ; 208 updateStyleOfAnonymousBlockContinuations(block, newStyle, *oldStyle, endOfContinuation->containingBlock());
211 } 209 }
212 210
213 if (!alwaysCreateLineBoxes()) { 211 if (!alwaysCreateLineBoxes()) {
214 bool alwaysCreateLineBoxesNew = hasSelfPaintingLayer() || hasBoxDecorati onBackground() || newStyle.hasPadding() || newStyle.hasMargin() || newStyle.hasO utline(); 212 bool alwaysCreateLineBoxesNew = hasSelfPaintingLayer() || hasBoxDecorati onBackground() || newStyle.hasPadding() || newStyle.hasMargin() || newStyle.hasO utline();
215 if (oldStyle && alwaysCreateLineBoxesNew) { 213 if (oldStyle && alwaysCreateLineBoxesNew) {
216 dirtyLineBoxes(false); 214 dirtyLineBoxes(false);
217 setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::Sty leChange); 215 setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::Sty leChange);
218 } 216 }
219 setAlwaysCreateLineBoxes(alwaysCreateLineBoxesNew); 217 setAlwaysCreateLineBoxes(alwaysCreateLineBoxesNew);
220 } 218 }
(...skipping 1207 matching lines...) Expand 10 before | Expand all | Expand 10 after
1428 } 1426 }
1429 1427
1430 void LayoutInline::invalidateDisplayItemClients(const LayoutBoxModelObject& pain tInvalidationContainer) const 1428 void LayoutInline::invalidateDisplayItemClients(const LayoutBoxModelObject& pain tInvalidationContainer) const
1431 { 1429 {
1432 LayoutBoxModelObject::invalidateDisplayItemClients(paintInvalidationContaine r); 1430 LayoutBoxModelObject::invalidateDisplayItemClients(paintInvalidationContaine r);
1433 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox()) 1431 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLineBox())
1434 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box); 1432 paintInvalidationContainer.invalidateDisplayItemClientOnBacking(*box);
1435 } 1433 }
1436 1434
1437 } // namespace blink 1435 } // namespace blink
OLDNEW
« no previous file with comments | « LayoutTests/platform/linux/fast/repaint/outline-continuations-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698