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

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

Issue 926193003: Move rendering/RenderBox to layout/LayoutBox. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 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 | « Source/core/rendering/RenderBlock.h ('k') | Source/core/rendering/RenderBlockFlow.h » ('j') | 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 * (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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 #include "wtf/StdLibExtras.h" 70 #include "wtf/StdLibExtras.h"
71 #include "wtf/TemporaryChange.h" 71 #include "wtf/TemporaryChange.h"
72 72
73 using namespace WTF; 73 using namespace WTF;
74 using namespace Unicode; 74 using namespace Unicode;
75 75
76 namespace blink { 76 namespace blink {
77 77
78 using namespace HTMLNames; 78 using namespace HTMLNames;
79 79
80 struct SameSizeAsRenderBlock : public RenderBox { 80 struct SameSizeAsRenderBlock : public LayoutBox {
81 LayoutObjectChildList children; 81 LayoutObjectChildList children;
82 RenderLineBoxList lineBoxes; 82 RenderLineBoxList lineBoxes;
83 int pageLogicalOffset; 83 int pageLogicalOffset;
84 uint32_t bitfields; 84 uint32_t bitfields;
85 }; 85 };
86 86
87 static_assert(sizeof(RenderBlock) == sizeof(SameSizeAsRenderBlock), "RenderBlock should stay small"); 87 static_assert(sizeof(RenderBlock) == sizeof(SameSizeAsRenderBlock), "RenderBlock should stay small");
88 88
89 typedef WTF::HashMap<const RenderBox*, OwnPtr<ColumnInfo> > ColumnInfoMap; 89 typedef WTF::HashMap<const LayoutBox*, OwnPtr<ColumnInfo>> ColumnInfoMap;
90 static ColumnInfoMap* gColumnInfoMap = 0; 90 static ColumnInfoMap* gColumnInfoMap = 0;
91 91
92 static TrackedDescendantsMap* gPositionedDescendantsMap = 0; 92 static TrackedDescendantsMap* gPositionedDescendantsMap = 0;
93 static TrackedDescendantsMap* gPercentHeightDescendantsMap = 0; 93 static TrackedDescendantsMap* gPercentHeightDescendantsMap = 0;
94 94
95 static TrackedContainerMap* gPositionedContainerMap = 0; 95 static TrackedContainerMap* gPositionedContainerMap = 0;
96 static TrackedContainerMap* gPercentHeightContainerMap = 0; 96 static TrackedContainerMap* gPercentHeightContainerMap = 0;
97 97
98 typedef WTF::HashSet<RenderBlock*> DelayedUpdateScrollInfoSet; 98 typedef WTF::HashSet<RenderBlock*> DelayedUpdateScrollInfoSet;
99 static int gDelayUpdateScrollInfo = 0; 99 static int gDelayUpdateScrollInfo = 0;
100 static DelayedUpdateScrollInfoSet* gDelayedUpdateScrollInfoSet = 0; 100 static DelayedUpdateScrollInfoSet* gDelayedUpdateScrollInfoSet = 0;
101 101
102 static bool gColumnFlowSplitEnabled = true; 102 static bool gColumnFlowSplitEnabled = true;
103 103
104 // This class helps dispatching the 'overflow' event on layout change. overflow can be set on RenderBoxes, yet the existing code 104 // This class helps dispatching the 'overflow' event on layout change. overflow can be set on LayoutBoxes, yet the existing code
105 // only works on RenderBlocks. If this changes, this class should be shared with other RenderBoxes. 105 // only works on RenderBlocks. If this changes, this class should be shared with other LayoutBoxes.
106 class OverflowEventDispatcher { 106 class OverflowEventDispatcher {
107 WTF_MAKE_NONCOPYABLE(OverflowEventDispatcher); 107 WTF_MAKE_NONCOPYABLE(OverflowEventDispatcher);
108 public: 108 public:
109 OverflowEventDispatcher(const RenderBlock* block) 109 OverflowEventDispatcher(const RenderBlock* block)
110 : m_block(block) 110 : m_block(block)
111 , m_hadHorizontalLayoutOverflow(false) 111 , m_hadHorizontalLayoutOverflow(false)
112 , m_hadVerticalLayoutOverflow(false) 112 , m_hadVerticalLayoutOverflow(false)
113 { 113 {
114 m_shouldDispatchEvent = !m_block->isAnonymous() && m_block->hasOverflowC lip() && m_block->document().hasListenerType(Document::OVERFLOWCHANGED_LISTENER) ; 114 m_shouldDispatchEvent = !m_block->isAnonymous() && m_block->hasOverflowC lip() && m_block->document().hasListenerType(Document::OVERFLOWCHANGED_LISTENER) ;
115 if (m_shouldDispatchEvent) { 115 if (m_shouldDispatchEvent) {
(...skipping 22 matching lines...) Expand all
138 } 138 }
139 139
140 private: 140 private:
141 const RenderBlock* m_block; 141 const RenderBlock* m_block;
142 bool m_shouldDispatchEvent; 142 bool m_shouldDispatchEvent;
143 bool m_hadHorizontalLayoutOverflow; 143 bool m_hadHorizontalLayoutOverflow;
144 bool m_hadVerticalLayoutOverflow; 144 bool m_hadVerticalLayoutOverflow;
145 }; 145 };
146 146
147 RenderBlock::RenderBlock(ContainerNode* node) 147 RenderBlock::RenderBlock(ContainerNode* node)
148 : RenderBox(node) 148 : LayoutBox(node)
149 , m_hasMarginBeforeQuirk(false) 149 , m_hasMarginBeforeQuirk(false)
150 , m_hasMarginAfterQuirk(false) 150 , m_hasMarginAfterQuirk(false)
151 , m_beingDestroyed(false) 151 , m_beingDestroyed(false)
152 , m_hasMarkupTruncation(false) 152 , m_hasMarkupTruncation(false)
153 , m_widthAvailableToChildrenChanged(false) 153 , m_widthAvailableToChildrenChanged(false)
154 , m_hasOnlySelfCollapsingChildren(false) 154 , m_hasOnlySelfCollapsingChildren(false)
155 , m_descendantsWithFloatsMarkedForLayout(false) 155 , m_descendantsWithFloatsMarkedForLayout(false)
156 { 156 {
157 // RenderBlockFlow calls setChildrenInline(true). 157 // RenderBlockFlow calls setChildrenInline(true).
158 // By default, subclasses do not have inline children. 158 // By default, subclasses do not have inline children.
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 // The reason we don't destroy it before anonymous children is that they may 236 // The reason we don't destroy it before anonymous children is that they may
237 // have continuations of their own that are anonymous children of our contin uation. 237 // have continuations of their own that are anonymous children of our contin uation.
238 LayoutBoxModelObject* continuation = this->continuation(); 238 LayoutBoxModelObject* continuation = this->continuation();
239 if (continuation) { 239 if (continuation) {
240 continuation->destroy(); 240 continuation->destroy();
241 setContinuation(0); 241 setContinuation(0);
242 } 242 }
243 243
244 if (!documentBeingDestroyed()) { 244 if (!documentBeingDestroyed()) {
245 if (firstLineBox()) { 245 if (firstLineBox()) {
246 // We can't wait for RenderBox::destroy to clear the selection, 246 // We can't wait for LayoutBox::destroy to clear the selection,
247 // because by then we will have nuked the line boxes. 247 // because by then we will have nuked the line boxes.
248 // FIXME: The FrameSelection should be responsible for this when it 248 // FIXME: The FrameSelection should be responsible for this when it
249 // is notified of DOM mutations. 249 // is notified of DOM mutations.
250 if (isSelectionBorder()) 250 if (isSelectionBorder())
251 view()->clearSelection(); 251 view()->clearSelection();
252 252
253 // If we are an anonymous block, then our line boxes might have chil dren 253 // If we are an anonymous block, then our line boxes might have chil dren
254 // that will outlast this block. In the non-anonymous block case tho se 254 // that will outlast this block. In the non-anonymous block case tho se
255 // children will be destroyed by the time we return from this functi on. 255 // children will be destroyed by the time we return from this functi on.
256 if (isAnonymousBlock()) { 256 if (isAnonymousBlock()) {
257 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLi neBox()) { 257 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextLi neBox()) {
258 while (InlineBox* childBox = box->firstChild()) 258 while (InlineBox* childBox = box->firstChild())
259 childBox->remove(); 259 childBox->remove();
260 } 260 }
261 } 261 }
262 } else if (parent()) 262 } else if (parent())
263 parent()->dirtyLinesFromChangedChild(this); 263 parent()->dirtyLinesFromChangedChild(this);
264 } 264 }
265 265
266 m_lineBoxes.deleteLineBoxes(); 266 m_lineBoxes.deleteLineBoxes();
267 267
268 if (UNLIKELY(gDelayedUpdateScrollInfoSet != 0)) 268 if (UNLIKELY(gDelayedUpdateScrollInfoSet != 0))
269 gDelayedUpdateScrollInfoSet->remove(this); 269 gDelayedUpdateScrollInfoSet->remove(this);
270 270
271 if (TextAutosizer* textAutosizer = document().textAutosizer()) 271 if (TextAutosizer* textAutosizer = document().textAutosizer())
272 textAutosizer->destroy(this); 272 textAutosizer->destroy(this);
273 273
274 RenderBox::willBeDestroyed(); 274 LayoutBox::willBeDestroyed();
275 } 275 }
276 276
277 void RenderBlock::styleWillChange(StyleDifference diff, const LayoutStyle& newSt yle) 277 void RenderBlock::styleWillChange(StyleDifference diff, const LayoutStyle& newSt yle)
278 { 278 {
279 LayoutStyle* oldStyle = style(); 279 LayoutStyle* oldStyle = style();
280 280
281 setReplaced(newStyle.isDisplayInlineType()); 281 setReplaced(newStyle.isDisplayInlineType());
282 282
283 if (oldStyle && parent()) { 283 if (oldStyle && parent()) {
284 bool oldStyleIsContainer = oldStyle->position() != StaticPosition || old Style->hasTransformRelatedProperty(); 284 bool oldStyleIsContainer = oldStyle->position() != StaticPosition || old Style->hasTransformRelatedProperty();
(...skipping 13 matching lines...) Expand all
298 break; 298 break;
299 } 299 }
300 cb = cb->parent(); 300 cb = cb->parent();
301 } 301 }
302 302
303 if (cb->isRenderBlock()) 303 if (cb->isRenderBlock())
304 toRenderBlock(cb)->removePositionedObjects(this, NewContainingBl ock); 304 toRenderBlock(cb)->removePositionedObjects(this, NewContainingBl ock);
305 } 305 }
306 } 306 }
307 307
308 RenderBox::styleWillChange(diff, newStyle); 308 LayoutBox::styleWillChange(diff, newStyle);
309 } 309 }
310 310
311 static bool borderOrPaddingLogicalWidthChanged(const LayoutStyle& oldStyle, cons t LayoutStyle& newStyle) 311 static bool borderOrPaddingLogicalWidthChanged(const LayoutStyle& oldStyle, cons t LayoutStyle& newStyle)
312 { 312 {
313 if (newStyle.isHorizontalWritingMode()) 313 if (newStyle.isHorizontalWritingMode())
314 return oldStyle.borderLeftWidth() != newStyle.borderLeftWidth() 314 return oldStyle.borderLeftWidth() != newStyle.borderLeftWidth()
315 || oldStyle.borderRightWidth() != newStyle.borderRightWidth() 315 || oldStyle.borderRightWidth() != newStyle.borderRightWidth()
316 || oldStyle.paddingLeft() != newStyle.paddingLeft() 316 || oldStyle.paddingLeft() != newStyle.paddingLeft()
317 || oldStyle.paddingRight() != newStyle.paddingRight(); 317 || oldStyle.paddingRight() != newStyle.paddingRight();
318 318
319 return oldStyle.borderTopWidth() != newStyle.borderTopWidth() 319 return oldStyle.borderTopWidth() != newStyle.borderTopWidth()
320 || oldStyle.borderBottomWidth() != newStyle.borderBottomWidth() 320 || oldStyle.borderBottomWidth() != newStyle.borderBottomWidth()
321 || oldStyle.paddingTop() != newStyle.paddingTop() 321 || oldStyle.paddingTop() != newStyle.paddingTop()
322 || oldStyle.paddingBottom() != newStyle.paddingBottom(); 322 || oldStyle.paddingBottom() != newStyle.paddingBottom();
323 } 323 }
324 324
325 void RenderBlock::styleDidChange(StyleDifference diff, const LayoutStyle* oldSty le) 325 void RenderBlock::styleDidChange(StyleDifference diff, const LayoutStyle* oldSty le)
326 { 326 {
327 RenderBox::styleDidChange(diff, oldStyle); 327 LayoutBox::styleDidChange(diff, oldStyle);
328 328
329 if (isFloatingOrOutOfFlowPositioned() && oldStyle && !oldStyle->isFloating() && !oldStyle->hasOutOfFlowPosition() && parent() && parent()->isRenderBlockFlow ()) 329 if (isFloatingOrOutOfFlowPositioned() && oldStyle && !oldStyle->isFloating() && !oldStyle->hasOutOfFlowPosition() && parent() && parent()->isRenderBlockFlow ())
330 toRenderBlock(parent())->removeAnonymousWrappersIfRequired(); 330 toRenderBlock(parent())->removeAnonymousWrappersIfRequired();
331 331
332 const LayoutStyle& newStyle = styleRef(); 332 const LayoutStyle& newStyle = styleRef();
333 333
334 if (!isAnonymousBlock()) { 334 if (!isAnonymousBlock()) {
335 // Ensure that all of our continuation blocks pick up the new style. 335 // Ensure that all of our continuation blocks pick up the new style.
336 for (RenderBlock* currCont = blockElementContinuation(); currCont; currC ont = currCont->blockElementContinuation()) { 336 for (RenderBlock* currCont = blockElementContinuation(); currCont; currC ont = currCont->blockElementContinuation()) {
337 LayoutBoxModelObject* nextCont = currCont->continuation(); 337 LayoutBoxModelObject* nextCont = currCont->continuation();
(...skipping 17 matching lines...) Expand all
355 Vector<ImageResource*> images; 355 Vector<ImageResource*> images;
356 appendImagesFromStyle(images, newStyle); 356 appendImagesFromStyle(images, newStyle);
357 if (images.isEmpty()) 357 if (images.isEmpty())
358 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->removeLa youtObject(this); 358 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->removeLa youtObject(this);
359 else 359 else
360 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->addLayou tObject(this); 360 ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->addLayou tObject(this);
361 } 361 }
362 362
363 void RenderBlock::invalidatePaintOfSubtreesIfNeeded(const PaintInvalidationState & childPaintInvalidationState) 363 void RenderBlock::invalidatePaintOfSubtreesIfNeeded(const PaintInvalidationState & childPaintInvalidationState)
364 { 364 {
365 RenderBox::invalidatePaintOfSubtreesIfNeeded(childPaintInvalidationState); 365 LayoutBox::invalidatePaintOfSubtreesIfNeeded(childPaintInvalidationState);
366 366
367 // Take care of positioned objects. This is required as PaintInvalidationSta te keeps a single clip rect. 367 // Take care of positioned objects. This is required as PaintInvalidationSta te keeps a single clip rect.
368 if (TrackedRendererListHashSet* positionedObjects = this->positionedObjects( )) { 368 if (TrackedRendererListHashSet* positionedObjects = this->positionedObjects( )) {
369 TrackedRendererListHashSet::iterator end = positionedObjects->end(); 369 TrackedRendererListHashSet::iterator end = positionedObjects->end();
370 for (TrackedRendererListHashSet::iterator it = positionedObjects->begin( ); it != end; ++it) { 370 for (TrackedRendererListHashSet::iterator it = positionedObjects->begin( ); it != end; ++it) {
371 RenderBox* box = *it; 371 LayoutBox* box = *it;
372 372
373 // One of the renderers we're skipping over here may be the child's paint invalidation container, 373 // One of the renderers we're skipping over here may be the child's paint invalidation container,
374 // so we can't pass our own paint invalidation container along. 374 // so we can't pass our own paint invalidation container along.
375 const LayoutBoxModelObject& paintInvalidationContainerForChild = *bo x->containerForPaintInvalidation(); 375 const LayoutBoxModelObject& paintInvalidationContainerForChild = *bo x->containerForPaintInvalidation();
376 376
377 // If it's a new paint invalidation container, we won't have properl y accumulated the offset into the 377 // If it's a new paint invalidation container, we won't have properl y accumulated the offset into the
378 // PaintInvalidationState. 378 // PaintInvalidationState.
379 // FIXME: Teach PaintInvalidationState to handle this case. crbug.co m/371485 379 // FIXME: Teach PaintInvalidationState to handle this case. crbug.co m/371485
380 if (paintInvalidationContainerForChild != childPaintInvalidationStat e.paintInvalidationContainer()) { 380 if (paintInvalidationContainerForChild != childPaintInvalidationStat e.paintInvalidationContainer()) {
381 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInvalida tionState); 381 ForceHorriblySlowRectMapping slowRectMapping(&childPaintInvalida tionState);
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 LayoutObject* afterChild = beforeChild ? beforeChild->previousSibling() : lastChild(); 897 LayoutObject* afterChild = beforeChild ? beforeChild->previousSibling() : lastChild();
898 898
899 if (afterChild && afterChild->isAnonymousBlock()) { 899 if (afterChild && afterChild->isAnonymousBlock()) {
900 afterChild->addChild(newChild); 900 afterChild->addChild(newChild);
901 return; 901 return;
902 } 902 }
903 903
904 if (newChild->isInline()) { 904 if (newChild->isInline()) {
905 // No suitable existing anonymous box - create a new one. 905 // No suitable existing anonymous box - create a new one.
906 RenderBlock* newBox = createAnonymousBlock(); 906 RenderBlock* newBox = createAnonymousBlock();
907 RenderBox::addChild(newBox, beforeChild); 907 LayoutBox::addChild(newBox, beforeChild);
908 newBox->addChild(newChild); 908 newBox->addChild(newChild);
909 return; 909 return;
910 } 910 }
911 } 911 }
912 912
913 RenderBox::addChild(newChild, beforeChild); 913 LayoutBox::addChild(newChild, beforeChild);
914 914
915 if (madeBoxesNonInline && parent() && isAnonymousBlock() && parent()->isRend erBlock()) 915 if (madeBoxesNonInline && parent() && isAnonymousBlock() && parent()->isRend erBlock())
916 toRenderBlock(parent())->removeLeftoverAnonymousBlock(this); 916 toRenderBlock(parent())->removeLeftoverAnonymousBlock(this);
917 // this object may be dead here 917 // this object may be dead here
918 } 918 }
919 919
920 void RenderBlock::addChild(LayoutObject* newChild, LayoutObject* beforeChild) 920 void RenderBlock::addChild(LayoutObject* newChild, LayoutObject* beforeChild)
921 { 921 {
922 if (continuation() && !isAnonymousBlock()) 922 if (continuation() && !isAnonymousBlock())
923 addChildToContinuation(newChild, beforeChild); 923 addChildToContinuation(newChild, beforeChild);
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1094 return true; 1094 return true;
1095 1095
1096 // Make sure the types of the anonymous blocks match up. 1096 // Make sure the types of the anonymous blocks match up.
1097 return prev->isAnonymousColumnsBlock() == next->isAnonymousColumnsBlock() 1097 return prev->isAnonymousColumnsBlock() == next->isAnonymousColumnsBlock()
1098 && prev->isAnonymousColumnSpanBlock() == next->isAnonymousColumnSpanB lock(); 1098 && prev->isAnonymousColumnSpanBlock() == next->isAnonymousColumnSpanB lock();
1099 } 1099 }
1100 1100
1101 void RenderBlock::removeAnonymousWrappersIfRequired() 1101 void RenderBlock::removeAnonymousWrappersIfRequired()
1102 { 1102 {
1103 ASSERT(isRenderBlockFlow()); 1103 ASSERT(isRenderBlockFlow());
1104 Vector<RenderBox*, 16> blocksToRemove; 1104 Vector<LayoutBox*, 16> blocksToRemove;
1105 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) { 1105 for (LayoutBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) {
1106 // There are still block children in the container, so any anonymous wra ppers are still needed. 1106 // There are still block children in the container, so any anonymous wra ppers are still needed.
1107 if (!child->isAnonymousBlock() && !child->isFloatingOrOutOfFlowPositione d()) 1107 if (!child->isAnonymousBlock() && !child->isFloatingOrOutOfFlowPositione d())
1108 return; 1108 return;
1109 // We can't remove anonymous wrappers if they contain continuations as t his means there are block children present. 1109 // We can't remove anonymous wrappers if they contain continuations as t his means there are block children present.
1110 if (child->isRenderBlock() && toRenderBlock(child)->continuation()) 1110 if (child->isRenderBlock() && toRenderBlock(child)->continuation())
1111 return; 1111 return;
1112 // We are only interested in removing anonymous wrappers if there are in line siblings underneath them. 1112 // We are only interested in removing anonymous wrappers if there are in line siblings underneath them.
1113 if (!child->childrenInline()) 1113 if (!child->childrenInline())
1114 return; 1114 return;
1115 if (child->isAnonymousBlock()) 1115 if (child->isAnonymousBlock())
(...skipping 30 matching lines...) Expand all
1146 // block handling in willBeDestroyed will cause problems. 1146 // block handling in willBeDestroyed will cause problems.
1147 child->deleteLineBoxTree(); 1147 child->deleteLineBoxTree();
1148 child->destroy(); 1148 child->destroy();
1149 } 1149 }
1150 1150
1151 void RenderBlock::removeChild(LayoutObject* oldChild) 1151 void RenderBlock::removeChild(LayoutObject* oldChild)
1152 { 1152 {
1153 // No need to waste time in merging or removing empty anonymous blocks. 1153 // No need to waste time in merging or removing empty anonymous blocks.
1154 // We can just bail out if our document is getting destroyed. 1154 // We can just bail out if our document is getting destroyed.
1155 if (documentBeingDestroyed()) { 1155 if (documentBeingDestroyed()) {
1156 RenderBox::removeChild(oldChild); 1156 LayoutBox::removeChild(oldChild);
1157 return; 1157 return;
1158 } 1158 }
1159 1159
1160 // This protects against column split flows when anonymous blocks are gettin g merged. 1160 // This protects against column split flows when anonymous blocks are gettin g merged.
1161 TemporaryChange<bool> columnFlowSplitEnabled(gColumnFlowSplitEnabled, false) ; 1161 TemporaryChange<bool> columnFlowSplitEnabled(gColumnFlowSplitEnabled, false) ;
1162 1162
1163 // If this child is a block, and if our previous and next siblings are 1163 // If this child is a block, and if our previous and next siblings are
1164 // both anonymous blocks with inline content, then we can go ahead and 1164 // both anonymous blocks with inline content, then we can go ahead and
1165 // fold the inline content back together. 1165 // fold the inline content back together.
1166 LayoutObject* prev = oldChild->previousSibling(); 1166 LayoutObject* prev = oldChild->previousSibling();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1202 // the |prev| block. 1202 // the |prev| block.
1203 nextBlock->moveAllChildrenIncludingFloatsTo(prevBlock, nextBlock->ha sLayer() || prevBlock->hasLayer()); 1203 nextBlock->moveAllChildrenIncludingFloatsTo(prevBlock, nextBlock->ha sLayer() || prevBlock->hasLayer());
1204 1204
1205 // Delete the now-empty block's lines and nuke it. 1205 // Delete the now-empty block's lines and nuke it.
1206 nextBlock->deleteLineBoxTree(); 1206 nextBlock->deleteLineBoxTree();
1207 nextBlock->destroy(); 1207 nextBlock->destroy();
1208 next = 0; 1208 next = 0;
1209 } 1209 }
1210 } 1210 }
1211 1211
1212 RenderBox::removeChild(oldChild); 1212 LayoutBox::removeChild(oldChild);
1213 1213
1214 LayoutObject* child = prev ? prev : next; 1214 LayoutObject* child = prev ? prev : next;
1215 if (canMergeAnonymousBlocks && child && !child->previousSibling() && !child- >nextSibling() && canCollapseAnonymousBlockChild()) { 1215 if (canMergeAnonymousBlocks && child && !child->previousSibling() && !child- >nextSibling() && canCollapseAnonymousBlockChild()) {
1216 // The removal has knocked us down to containing only a single anonymous 1216 // The removal has knocked us down to containing only a single anonymous
1217 // box. We can go ahead and pull the content right back up into our 1217 // box. We can go ahead and pull the content right back up into our
1218 // box. 1218 // box.
1219 collapseAnonymousBlockChild(this, toRenderBlock(child)); 1219 collapseAnonymousBlockChild(this, toRenderBlock(child));
1220 } else if (((prev && prev->isAnonymousBlock()) || (next && next->isAnonymous Block())) && canCollapseAnonymousBlockChild()) { 1220 } else if (((prev && prev->isAnonymousBlock()) || (next && next->isAnonymous Block())) && canCollapseAnonymousBlockChild()) {
1221 // It's possible that the removal has knocked us down to a single anonym ous 1221 // It's possible that the removal has knocked us down to a single anonym ous
1222 // block with pseudo-style element siblings (e.g. first-letter). If thes e 1222 // block with pseudo-style element siblings (e.g. first-letter). If thes e
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1305 if (hasAutoHeight || ((logicalHeightLength.isFixed() || logicalHeightLength. isPercent()) && logicalHeightLength.isZero())) { 1305 if (hasAutoHeight || ((logicalHeightLength.isFixed() || logicalHeightLength. isPercent()) && logicalHeightLength.isZero())) {
1306 // If the block has inline children, see if we generated any line boxes. If we have any 1306 // If the block has inline children, see if we generated any line boxes. If we have any
1307 // line boxes, then we can't be self-collapsing, since we have content. 1307 // line boxes, then we can't be self-collapsing, since we have content.
1308 if (childrenInline()) 1308 if (childrenInline())
1309 return !firstLineBox(); 1309 return !firstLineBox();
1310 1310
1311 // Whether or not we collapse is dependent on whether all our normal flo w children 1311 // Whether or not we collapse is dependent on whether all our normal flo w children
1312 // are also self-collapsing. 1312 // are also self-collapsing.
1313 if (m_hasOnlySelfCollapsingChildren) 1313 if (m_hasOnlySelfCollapsingChildren)
1314 return true; 1314 return true;
1315 for (RenderBox* child = firstChildBox(); child; child = child->nextSibli ngBox()) { 1315 for (LayoutBox* child = firstChildBox(); child; child = child->nextSibli ngBox()) {
1316 if (child->isFloatingOrOutOfFlowPositioned()) 1316 if (child->isFloatingOrOutOfFlowPositioned())
1317 continue; 1317 continue;
1318 if (!child->isSelfCollapsingBlock()) 1318 if (!child->isSelfCollapsingBlock())
1319 return false; 1319 return false;
1320 } 1320 }
1321 return true; 1321 return true;
1322 } 1322 }
1323 return false; 1323 return false;
1324 } 1324 }
1325 1325
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
1491 m_overflow->setLayoutClientAfterEdge(oldClientAfterEdge); 1491 m_overflow->setLayoutClientAfterEdge(oldClientAfterEdge);
1492 } 1492 }
1493 1493
1494 addVisualEffectOverflow(); 1494 addVisualEffectOverflow();
1495 1495
1496 addVisualOverflowFromTheme(); 1496 addVisualOverflowFromTheme();
1497 } 1497 }
1498 1498
1499 void RenderBlock::addOverflowFromBlockChildren() 1499 void RenderBlock::addOverflowFromBlockChildren()
1500 { 1500 {
1501 for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) { 1501 for (LayoutBox* child = firstChildBox(); child; child = child->nextSiblingBo x()) {
1502 if (!child->isFloatingOrOutOfFlowPositioned() && !child->isColumnSpanAll ()) 1502 if (!child->isFloatingOrOutOfFlowPositioned() && !child->isColumnSpanAll ())
1503 addOverflowFromChild(child); 1503 addOverflowFromChild(child);
1504 } 1504 }
1505 } 1505 }
1506 1506
1507 void RenderBlock::addOverflowFromPositionedObjects() 1507 void RenderBlock::addOverflowFromPositionedObjects()
1508 { 1508 {
1509 TrackedRendererListHashSet* positionedDescendants = positionedObjects(); 1509 TrackedRendererListHashSet* positionedDescendants = positionedObjects();
1510 if (!positionedDescendants) 1510 if (!positionedDescendants)
1511 return; 1511 return;
1512 1512
1513 RenderBox* positionedObject; 1513 LayoutBox* positionedObject;
1514 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); 1514 TrackedRendererListHashSet::iterator end = positionedDescendants->end();
1515 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin( ); it != end; ++it) { 1515 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin( ); it != end; ++it) {
1516 positionedObject = *it; 1516 positionedObject = *it;
1517 1517
1518 // Fixed positioned elements don't contribute to layout overflow, since they don't scroll with the content. 1518 // Fixed positioned elements don't contribute to layout overflow, since they don't scroll with the content.
1519 if (positionedObject->style()->position() != FixedPosition) 1519 if (positionedObject->style()->position() != FixedPosition)
1520 addOverflowFromChild(positionedObject, toLayoutSize(positionedObject ->location())); 1520 addOverflowFromChild(positionedObject, toLayoutSize(positionedObject ->location()));
1521 } 1521 }
1522 } 1522 }
1523 1523
1524 void RenderBlock::addVisualOverflowFromTheme() 1524 void RenderBlock::addVisualOverflowFromTheme()
1525 { 1525 {
1526 if (!style()->hasAppearance()) 1526 if (!style()->hasAppearance())
1527 return; 1527 return;
1528 1528
1529 IntRect inflatedRect = pixelSnappedBorderBoxRect(); 1529 IntRect inflatedRect = pixelSnappedBorderBoxRect();
1530 LayoutTheme::theme().adjustPaintInvalidationRect(this, inflatedRect); 1530 LayoutTheme::theme().adjustPaintInvalidationRect(this, inflatedRect);
1531 addVisualOverflow(inflatedRect); 1531 addVisualOverflow(inflatedRect);
1532 } 1532 }
1533 1533
1534 bool RenderBlock::createsNewFormattingContext() const 1534 bool RenderBlock::createsNewFormattingContext() const
1535 { 1535 {
1536 return isInlineBlockOrInlineTable() || isFloatingOrOutOfFlowPositioned() || hasOverflowClip() || isFlexItemIncludingDeprecated() 1536 return isInlineBlockOrInlineTable() || isFloatingOrOutOfFlowPositioned() || hasOverflowClip() || isFlexItemIncludingDeprecated()
1537 || style()->specifiesColumns() || isLayoutFlowThread() || isTableCell() || isTableCaption() || isFieldset() || isWritingModeRoot() 1537 || style()->specifiesColumns() || isLayoutFlowThread() || isTableCell() || isTableCaption() || isFieldset() || isWritingModeRoot()
1538 || isDocumentElement() || (document().regionBasedColumnsEnabled() ? isCo lumnSpanAll() : style()->columnSpan()) || isGridItem(); 1538 || isDocumentElement() || (document().regionBasedColumnsEnabled() ? isCo lumnSpanAll() : style()->columnSpan()) || isGridItem();
1539 } 1539 }
1540 1540
1541 void RenderBlock::updateBlockChildDirtyBitsBeforeLayout(bool relayoutChildren, R enderBox& child) 1541 void RenderBlock::updateBlockChildDirtyBitsBeforeLayout(bool relayoutChildren, L ayoutBox& child)
1542 { 1542 {
1543 // FIXME: Technically percentage height objects only need a relayout if thei r percentage isn't going to be turned into 1543 // FIXME: Technically percentage height objects only need a relayout if thei r percentage isn't going to be turned into
1544 // an auto value. Add a method to determine this, so that we can avoid the r elayout. 1544 // an auto value. Add a method to determine this, so that we can avoid the r elayout.
1545 bool hasRelativeLogicalHeight = child.hasRelativeLogicalHeight() || (child.i sAnonymous() && this->hasRelativeLogicalHeight()); 1545 bool hasRelativeLogicalHeight = child.hasRelativeLogicalHeight() || (child.i sAnonymous() && this->hasRelativeLogicalHeight());
1546 if (relayoutChildren || (hasRelativeLogicalHeight && !isRenderView())) 1546 if (relayoutChildren || (hasRelativeLogicalHeight && !isRenderView()))
1547 child.setChildNeedsLayout(MarkOnlyThis); 1547 child.setChildNeedsLayout(MarkOnlyThis);
1548 1548
1549 // If relayoutChildren is set and the child has percentage padding or an emb edded content box, we also need to invalidate the childs pref widths. 1549 // If relayoutChildren is set and the child has percentage padding or an emb edded content box, we also need to invalidate the childs pref widths.
1550 if (relayoutChildren && child.needsPreferredWidthsRecalculation()) 1550 if (relayoutChildren && child.needsPreferredWidthsRecalculation())
1551 child.setPreferredLogicalWidthsDirty(MarkOnlyThis); 1551 child.setPreferredLogicalWidthsDirty(MarkOnlyThis);
1552 } 1552 }
1553 1553
1554 void RenderBlock::simplifiedNormalFlowLayout() 1554 void RenderBlock::simplifiedNormalFlowLayout()
1555 { 1555 {
1556 if (childrenInline()) { 1556 if (childrenInline()) {
1557 ListHashSet<RootInlineBox*> lineBoxes; 1557 ListHashSet<RootInlineBox*> lineBoxes;
1558 for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { 1558 for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) {
1559 LayoutObject* o = walker.current(); 1559 LayoutObject* o = walker.current();
1560 if (!o->isOutOfFlowPositioned() && (o->isReplaced() || o->isFloating ())) { 1560 if (!o->isOutOfFlowPositioned() && (o->isReplaced() || o->isFloating ())) {
1561 o->layoutIfNeeded(); 1561 o->layoutIfNeeded();
1562 if (toRenderBox(o)->inlineBoxWrapper()) { 1562 if (toLayoutBox(o)->inlineBoxWrapper()) {
1563 RootInlineBox& box = toRenderBox(o)->inlineBoxWrapper()->roo t(); 1563 RootInlineBox& box = toLayoutBox(o)->inlineBoxWrapper()->roo t();
1564 lineBoxes.add(&box); 1564 lineBoxes.add(&box);
1565 } 1565 }
1566 } else if (o->isText() || (o->isRenderInline() && !walker.atEndOfInl ine())) { 1566 } else if (o->isText() || (o->isRenderInline() && !walker.atEndOfInl ine())) {
1567 o->clearNeedsLayout(); 1567 o->clearNeedsLayout();
1568 } 1568 }
1569 } 1569 }
1570 1570
1571 // FIXME: Glyph overflow will get lost in this case, but not really a bi g deal. 1571 // FIXME: Glyph overflow will get lost in this case, but not really a bi g deal.
1572 GlyphOverflowAndFallbackFontsMap textBoxDataMap; 1572 GlyphOverflowAndFallbackFontsMap textBoxDataMap;
1573 for (ListHashSet<RootInlineBox*>::const_iterator it = lineBoxes.begin(); it != lineBoxes.end(); ++it) { 1573 for (ListHashSet<RootInlineBox*>::const_iterator it = lineBoxes.begin(); it != lineBoxes.end(); ++it) {
1574 RootInlineBox* box = *it; 1574 RootInlineBox* box = *it;
1575 box->computeOverflow(box->lineTop(), box->lineBottom(), textBoxDataM ap); 1575 box->computeOverflow(box->lineTop(), box->lineBottom(), textBoxDataM ap);
1576 } 1576 }
1577 } else { 1577 } else {
1578 for (RenderBox* box = firstChildBox(); box; box = box->nextSiblingBox()) { 1578 for (LayoutBox* box = firstChildBox(); box; box = box->nextSiblingBox()) {
1579 if (!box->isOutOfFlowPositioned()) 1579 if (!box->isOutOfFlowPositioned())
1580 box->layoutIfNeeded(); 1580 box->layoutIfNeeded();
1581 } 1581 }
1582 } 1582 }
1583 } 1583 }
1584 1584
1585 bool RenderBlock::simplifiedLayout() 1585 bool RenderBlock::simplifiedLayout()
1586 { 1586 {
1587 // Check if we need to do a full layout. 1587 // Check if we need to do a full layout.
1588 if (normalChildNeedsLayout() || selfNeedsLayout()) 1588 if (normalChildNeedsLayout() || selfNeedsLayout())
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 bool hasStaticInlinePosition = child->style()->hasStaticInlinePosition(isHor izontalWritingMode()); 1643 bool hasStaticInlinePosition = child->style()->hasStaticInlinePosition(isHor izontalWritingMode());
1644 if (!hasStaticBlockPosition && !hasStaticInlinePosition) 1644 if (!hasStaticBlockPosition && !hasStaticInlinePosition)
1645 return; 1645 return;
1646 1646
1647 LayoutObject* o = child->parent(); 1647 LayoutObject* o = child->parent();
1648 while (o && !o->isRenderView() && o->style()->position() != AbsolutePosition ) 1648 while (o && !o->isRenderView() && o->style()->position() != AbsolutePosition )
1649 o = o->parent(); 1649 o = o->parent();
1650 if (o->style()->position() != AbsolutePosition) 1650 if (o->style()->position() != AbsolutePosition)
1651 return; 1651 return;
1652 1652
1653 RenderBox* box = toRenderBox(child); 1653 LayoutBox* box = toLayoutBox(child);
1654 if (hasStaticInlinePosition) { 1654 if (hasStaticInlinePosition) {
1655 LogicalExtentComputedValues computedValues; 1655 LogicalExtentComputedValues computedValues;
1656 box->computeLogicalWidth(computedValues); 1656 box->computeLogicalWidth(computedValues);
1657 LayoutUnit newLeft = computedValues.m_position; 1657 LayoutUnit newLeft = computedValues.m_position;
1658 if (newLeft != box->logicalLeft()) 1658 if (newLeft != box->logicalLeft())
1659 layoutScope.setChildNeedsLayout(child); 1659 layoutScope.setChildNeedsLayout(child);
1660 } else if (hasStaticBlockPosition) { 1660 } else if (hasStaticBlockPosition) {
1661 LayoutUnit oldTop = box->logicalTop(); 1661 LayoutUnit oldTop = box->logicalTop();
1662 box->updateLogicalHeight(); 1662 box->updateLogicalHeight();
1663 if (box->logicalTop() != oldTop) 1663 if (box->logicalTop() != oldTop)
1664 layoutScope.setChildNeedsLayout(child); 1664 layoutScope.setChildNeedsLayout(child);
1665 } 1665 }
1666 } 1666 }
1667 1667
1668 LayoutUnit RenderBlock::marginIntrinsicLogicalWidthForChild(RenderBox& child) co nst 1668 LayoutUnit RenderBlock::marginIntrinsicLogicalWidthForChild(LayoutBox& child) co nst
1669 { 1669 {
1670 // A margin has three types: fixed, percentage, and auto (variable). 1670 // A margin has three types: fixed, percentage, and auto (variable).
1671 // Auto and percentage margins become 0 when computing min/max width. 1671 // Auto and percentage margins become 0 when computing min/max width.
1672 // Fixed margins can be added in as is. 1672 // Fixed margins can be added in as is.
1673 Length marginLeft = child.style()->marginStartUsing(style()); 1673 Length marginLeft = child.style()->marginStartUsing(style());
1674 Length marginRight = child.style()->marginEndUsing(style()); 1674 Length marginRight = child.style()->marginEndUsing(style());
1675 LayoutUnit margin = 0; 1675 LayoutUnit margin = 0;
1676 if (marginLeft.isFixed()) 1676 if (marginLeft.isFixed())
1677 margin += marginLeft.value(); 1677 margin += marginLeft.value();
1678 if (marginRight.isFixed()) 1678 if (marginRight.isFixed())
1679 margin += marginRight.value(); 1679 margin += marginRight.value();
1680 return margin; 1680 return margin;
1681 } 1681 }
1682 1682
1683 void RenderBlock::layoutPositionedObjects(bool relayoutChildren, PositionedLayou tBehavior info) 1683 void RenderBlock::layoutPositionedObjects(bool relayoutChildren, PositionedLayou tBehavior info)
1684 { 1684 {
1685 TrackedRendererListHashSet* positionedDescendants = positionedObjects(); 1685 TrackedRendererListHashSet* positionedDescendants = positionedObjects();
1686 if (!positionedDescendants) 1686 if (!positionedDescendants)
1687 return; 1687 return;
1688 1688
1689 if (hasColumns()) 1689 if (hasColumns())
1690 view()->layoutState()->clearPaginationInformation(); // Positioned objec ts are not part of the column flow, so they don't paginate with the columns. 1690 view()->layoutState()->clearPaginationInformation(); // Positioned objec ts are not part of the column flow, so they don't paginate with the columns.
1691 1691
1692 RenderBox* r; 1692 LayoutBox* r;
1693 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); 1693 TrackedRendererListHashSet::iterator end = positionedDescendants->end();
1694 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin( ); it != end; ++it) { 1694 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin( ); it != end; ++it) {
1695 r = *it; 1695 r = *it;
1696 1696
1697 r->setMayNeedPaintInvalidation(); 1697 r->setMayNeedPaintInvalidation();
1698 1698
1699 SubtreeLayoutScope layoutScope(*r); 1699 SubtreeLayoutScope layoutScope(*r);
1700 // A fixed position element with an absolute positioned ancestor has no way of knowing if the latter has changed position. So 1700 // A fixed position element with an absolute positioned ancestor has no way of knowing if the latter has changed position. So
1701 // if this is a fixed position element, mark it for layout if it has an abspos ancestor and needs to move with that ancestor, i.e. 1701 // if this is a fixed position element, mark it for layout if it has an abspos ancestor and needs to move with that ancestor, i.e.
1702 // it has static position. 1702 // it has static position.
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
1912 while (child && child->isRenderBlock()) { 1912 while (child && child->isRenderBlock()) {
1913 beforeBlock = toRenderBlock(child); 1913 beforeBlock = toRenderBlock(child);
1914 offset += LayoutSize(beforeBlock->logicalLeft(), beforeBlock->logicalTop ()); 1914 offset += LayoutSize(beforeBlock->logicalLeft(), beforeBlock->logicalTop ());
1915 child = beforeBlock->lastChild(); 1915 child = beforeBlock->lastChild();
1916 } 1916 }
1917 return beforeBlock; 1917 return beforeBlock;
1918 } 1918 }
1919 1919
1920 void RenderBlock::setSelectionState(SelectionState state) 1920 void RenderBlock::setSelectionState(SelectionState state)
1921 { 1921 {
1922 RenderBox::setSelectionState(state); 1922 LayoutBox::setSelectionState(state);
1923 1923
1924 if (inlineBoxWrapper() && canUpdateSelectionOnRootLineBoxes()) 1924 if (inlineBoxWrapper() && canUpdateSelectionOnRootLineBoxes())
1925 inlineBoxWrapper()->root().setHasSelectedChildren(state != SelectionNone ); 1925 inlineBoxWrapper()->root().setHasSelectedChildren(state != SelectionNone );
1926 } 1926 }
1927 1927
1928 void RenderBlock::insertIntoTrackedRendererMaps(RenderBox* descendant, TrackedDe scendantsMap*& descendantsMap, TrackedContainerMap*& containerMap) 1928 void RenderBlock::insertIntoTrackedRendererMaps(LayoutBox* descendant, TrackedDe scendantsMap*& descendantsMap, TrackedContainerMap*& containerMap)
1929 { 1929 {
1930 if (!descendantsMap) { 1930 if (!descendantsMap) {
1931 descendantsMap = new TrackedDescendantsMap; 1931 descendantsMap = new TrackedDescendantsMap;
1932 containerMap = new TrackedContainerMap; 1932 containerMap = new TrackedContainerMap;
1933 } 1933 }
1934 1934
1935 TrackedRendererListHashSet* descendantSet = descendantsMap->get(this); 1935 TrackedRendererListHashSet* descendantSet = descendantsMap->get(this);
1936 if (!descendantSet) { 1936 if (!descendantSet) {
1937 descendantSet = new TrackedRendererListHashSet; 1937 descendantSet = new TrackedRendererListHashSet;
1938 descendantsMap->set(this, adoptPtr(descendantSet)); 1938 descendantsMap->set(this, adoptPtr(descendantSet));
1939 } 1939 }
1940 bool added = descendantSet->add(descendant).isNewEntry; 1940 bool added = descendantSet->add(descendant).isNewEntry;
1941 if (!added) { 1941 if (!added) {
1942 ASSERT(containerMap->get(descendant)); 1942 ASSERT(containerMap->get(descendant));
1943 ASSERT(containerMap->get(descendant)->contains(this)); 1943 ASSERT(containerMap->get(descendant)->contains(this));
1944 return; 1944 return;
1945 } 1945 }
1946 1946
1947 HashSet<RenderBlock*>* containerSet = containerMap->get(descendant); 1947 HashSet<RenderBlock*>* containerSet = containerMap->get(descendant);
1948 if (!containerSet) { 1948 if (!containerSet) {
1949 containerSet = new HashSet<RenderBlock*>; 1949 containerSet = new HashSet<RenderBlock*>;
1950 containerMap->set(descendant, adoptPtr(containerSet)); 1950 containerMap->set(descendant, adoptPtr(containerSet));
1951 } 1951 }
1952 ASSERT(!containerSet->contains(this)); 1952 ASSERT(!containerSet->contains(this));
1953 containerSet->add(this); 1953 containerSet->add(this);
1954 } 1954 }
1955 1955
1956 void RenderBlock::removeFromTrackedRendererMaps(RenderBox* descendant, TrackedDe scendantsMap*& descendantsMap, TrackedContainerMap*& containerMap) 1956 void RenderBlock::removeFromTrackedRendererMaps(LayoutBox* descendant, TrackedDe scendantsMap*& descendantsMap, TrackedContainerMap*& containerMap)
1957 { 1957 {
1958 if (!descendantsMap) 1958 if (!descendantsMap)
1959 return; 1959 return;
1960 1960
1961 OwnPtr<HashSet<RenderBlock*> > containerSet = containerMap->take(descendant) ; 1961 OwnPtr<HashSet<RenderBlock*> > containerSet = containerMap->take(descendant) ;
1962 if (!containerSet) 1962 if (!containerSet)
1963 return; 1963 return;
1964 1964
1965 HashSet<RenderBlock*>::iterator end = containerSet->end(); 1965 HashSet<RenderBlock*>::iterator end = containerSet->end();
1966 for (HashSet<RenderBlock*>::iterator it = containerSet->begin(); it != end; ++it) { 1966 for (HashSet<RenderBlock*>::iterator it = containerSet->begin(); it != end; ++it) {
(...skipping 16 matching lines...) Expand all
1983 } 1983 }
1984 } 1984 }
1985 1985
1986 TrackedRendererListHashSet* RenderBlock::positionedObjects() const 1986 TrackedRendererListHashSet* RenderBlock::positionedObjects() const
1987 { 1987 {
1988 if (gPositionedDescendantsMap) 1988 if (gPositionedDescendantsMap)
1989 return gPositionedDescendantsMap->get(this); 1989 return gPositionedDescendantsMap->get(this);
1990 return 0; 1990 return 0;
1991 } 1991 }
1992 1992
1993 void RenderBlock::insertPositionedObject(RenderBox* o) 1993 void RenderBlock::insertPositionedObject(LayoutBox* o)
1994 { 1994 {
1995 ASSERT(!isAnonymousBlock()); 1995 ASSERT(!isAnonymousBlock());
1996 insertIntoTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedConta inerMap); 1996 insertIntoTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedConta inerMap);
1997 } 1997 }
1998 1998
1999 void RenderBlock::removePositionedObject(RenderBox* o) 1999 void RenderBlock::removePositionedObject(LayoutBox* o)
2000 { 2000 {
2001 removeFromTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedConta inerMap); 2001 removeFromTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedConta inerMap);
2002 } 2002 }
2003 2003
2004 void RenderBlock::removePositionedObjects(RenderBlock* o, ContainingBlockState c ontainingBlockState) 2004 void RenderBlock::removePositionedObjects(RenderBlock* o, ContainingBlockState c ontainingBlockState)
2005 { 2005 {
2006 TrackedRendererListHashSet* positionedDescendants = positionedObjects(); 2006 TrackedRendererListHashSet* positionedDescendants = positionedObjects();
2007 if (!positionedDescendants) 2007 if (!positionedDescendants)
2008 return; 2008 return;
2009 2009
2010 RenderBox* r; 2010 LayoutBox* r;
2011 2011
2012 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); 2012 TrackedRendererListHashSet::iterator end = positionedDescendants->end();
2013 2013
2014 Vector<RenderBox*, 16> deadObjects; 2014 Vector<LayoutBox*, 16> deadObjects;
2015 2015
2016 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin( ); it != end; ++it) { 2016 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin( ); it != end; ++it) {
2017 r = *it; 2017 r = *it;
2018 if (!o || r->isDescendantOf(o)) { 2018 if (!o || r->isDescendantOf(o)) {
2019 if (containingBlockState == NewContainingBlock) { 2019 if (containingBlockState == NewContainingBlock) {
2020 r->setChildNeedsLayout(MarkOnlyThis); 2020 r->setChildNeedsLayout(MarkOnlyThis);
2021 if (r->needsPreferredWidthsRecalculation()) 2021 if (r->needsPreferredWidthsRecalculation())
2022 r->setPreferredLogicalWidthsDirty(MarkOnlyThis); 2022 r->setPreferredLogicalWidthsDirty(MarkOnlyThis);
2023 } 2023 }
2024 2024
2025 // It is parent blocks job to add positioned child to positioned obj ects list of its containing block 2025 // It is parent blocks job to add positioned child to positioned obj ects list of its containing block
2026 // Parent layout needs to be invalidated to ensure this happens. 2026 // Parent layout needs to be invalidated to ensure this happens.
2027 LayoutObject* p = r->parent(); 2027 LayoutObject* p = r->parent();
2028 while (p && !p->isRenderBlock()) 2028 while (p && !p->isRenderBlock())
2029 p = p->parent(); 2029 p = p->parent();
2030 if (p) 2030 if (p)
2031 p->setChildNeedsLayout(); 2031 p->setChildNeedsLayout();
2032 2032
2033 deadObjects.append(r); 2033 deadObjects.append(r);
2034 } 2034 }
2035 } 2035 }
2036 2036
2037 for (unsigned i = 0; i < deadObjects.size(); i++) 2037 for (unsigned i = 0; i < deadObjects.size(); i++)
2038 removePositionedObject(deadObjects.at(i)); 2038 removePositionedObject(deadObjects.at(i));
2039 } 2039 }
2040 2040
2041 void RenderBlock::addPercentHeightDescendant(RenderBox* descendant) 2041 void RenderBlock::addPercentHeightDescendant(LayoutBox* descendant)
2042 { 2042 {
2043 insertIntoTrackedRendererMaps(descendant, gPercentHeightDescendantsMap, gPer centHeightContainerMap); 2043 insertIntoTrackedRendererMaps(descendant, gPercentHeightDescendantsMap, gPer centHeightContainerMap);
2044 } 2044 }
2045 2045
2046 void RenderBlock::removePercentHeightDescendant(RenderBox* descendant) 2046 void RenderBlock::removePercentHeightDescendant(LayoutBox* descendant)
2047 { 2047 {
2048 removeFromTrackedRendererMaps(descendant, gPercentHeightDescendantsMap, gPer centHeightContainerMap); 2048 removeFromTrackedRendererMaps(descendant, gPercentHeightDescendantsMap, gPer centHeightContainerMap);
2049 } 2049 }
2050 2050
2051 TrackedRendererListHashSet* RenderBlock::percentHeightDescendants() const 2051 TrackedRendererListHashSet* RenderBlock::percentHeightDescendants() const
2052 { 2052 {
2053 return gPercentHeightDescendantsMap ? gPercentHeightDescendantsMap->get(this ) : 0; 2053 return gPercentHeightDescendantsMap ? gPercentHeightDescendantsMap->get(this ) : 0;
2054 } 2054 }
2055 2055
2056 bool RenderBlock::hasPercentHeightContainerMap() 2056 bool RenderBlock::hasPercentHeightContainerMap()
2057 { 2057 {
2058 return gPercentHeightContainerMap; 2058 return gPercentHeightContainerMap;
2059 } 2059 }
2060 2060
2061 bool RenderBlock::hasPercentHeightDescendant(RenderBox* descendant) 2061 bool RenderBlock::hasPercentHeightDescendant(LayoutBox* descendant)
2062 { 2062 {
2063 // We don't null check gPercentHeightContainerMap since the caller 2063 // We don't null check gPercentHeightContainerMap since the caller
2064 // already ensures this and we need to call this function on every 2064 // already ensures this and we need to call this function on every
2065 // descendant in clearPercentHeightDescendantsFrom(). 2065 // descendant in clearPercentHeightDescendantsFrom().
2066 ASSERT(gPercentHeightContainerMap); 2066 ASSERT(gPercentHeightContainerMap);
2067 return gPercentHeightContainerMap->contains(descendant); 2067 return gPercentHeightContainerMap->contains(descendant);
2068 } 2068 }
2069 2069
2070 void RenderBlock::dirtyForLayoutFromPercentageHeightDescendants(SubtreeLayoutSco pe& layoutScope) 2070 void RenderBlock::dirtyForLayoutFromPercentageHeightDescendants(SubtreeLayoutSco pe& layoutScope)
2071 { 2071 {
2072 if (!gPercentHeightDescendantsMap) 2072 if (!gPercentHeightDescendantsMap)
2073 return; 2073 return;
2074 2074
2075 TrackedRendererListHashSet* descendants = gPercentHeightDescendantsMap->get( this); 2075 TrackedRendererListHashSet* descendants = gPercentHeightDescendantsMap->get( this);
2076 if (!descendants) 2076 if (!descendants)
2077 return; 2077 return;
2078 2078
2079 TrackedRendererListHashSet::iterator end = descendants->end(); 2079 TrackedRendererListHashSet::iterator end = descendants->end();
2080 for (TrackedRendererListHashSet::iterator it = descendants->begin(); it != e nd; ++it) { 2080 for (TrackedRendererListHashSet::iterator it = descendants->begin(); it != e nd; ++it) {
2081 RenderBox* box = *it; 2081 LayoutBox* box = *it;
2082 while (box != this) { 2082 while (box != this) {
2083 if (box->normalChildNeedsLayout()) 2083 if (box->normalChildNeedsLayout())
2084 break; 2084 break;
2085 layoutScope.setChildNeedsLayout(box); 2085 layoutScope.setChildNeedsLayout(box);
2086 box = box->containingBlock(); 2086 box = box->containingBlock();
2087 ASSERT(box); 2087 ASSERT(box);
2088 if (!box) 2088 if (!box)
2089 break; 2089 break;
2090 } 2090 }
2091 } 2091 }
2092 } 2092 }
2093 2093
2094 void RenderBlock::removePercentHeightDescendantIfNeeded(RenderBox* descendant) 2094 void RenderBlock::removePercentHeightDescendantIfNeeded(LayoutBox* descendant)
2095 { 2095 {
2096 // We query the map directly, rather than looking at style's 2096 // We query the map directly, rather than looking at style's
2097 // logicalHeight()/logicalMinHeight()/logicalMaxHeight() since those 2097 // logicalHeight()/logicalMinHeight()/logicalMaxHeight() since those
2098 // can change with writing mode/directional changes. 2098 // can change with writing mode/directional changes.
2099 if (!hasPercentHeightContainerMap()) 2099 if (!hasPercentHeightContainerMap())
2100 return; 2100 return;
2101 2101
2102 if (!hasPercentHeightDescendant(descendant)) 2102 if (!hasPercentHeightDescendant(descendant))
2103 return; 2103 return;
2104 2104
2105 removePercentHeightDescendant(descendant); 2105 removePercentHeightDescendant(descendant);
2106 } 2106 }
2107 2107
2108 void RenderBlock::clearPercentHeightDescendantsFrom(RenderBox* parent) 2108 void RenderBlock::clearPercentHeightDescendantsFrom(LayoutBox* parent)
2109 { 2109 {
2110 ASSERT(gPercentHeightContainerMap); 2110 ASSERT(gPercentHeightContainerMap);
2111 for (LayoutObject* curr = parent->slowFirstChild(); curr; curr = curr->nextI nPreOrder(parent)) { 2111 for (LayoutObject* curr = parent->slowFirstChild(); curr; curr = curr->nextI nPreOrder(parent)) {
2112 if (!curr->isBox()) 2112 if (!curr->isBox())
2113 continue; 2113 continue;
2114 2114
2115 RenderBox* box = toRenderBox(curr); 2115 LayoutBox* box = toLayoutBox(curr);
2116 if (!hasPercentHeightDescendant(box)) 2116 if (!hasPercentHeightDescendant(box))
2117 continue; 2117 continue;
2118 2118
2119 removePercentHeightDescendant(box); 2119 removePercentHeightDescendant(box);
2120 } 2120 }
2121 } 2121 }
2122 2122
2123 LayoutUnit RenderBlock::textIndentOffset() const 2123 LayoutUnit RenderBlock::textIndentOffset() const
2124 { 2124 {
2125 LayoutUnit cw = 0; 2125 LayoutUnit cw = 0;
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
2358 { 2358 {
2359 if (childrenInline() && !isTable()) { 2359 if (childrenInline() && !isTable()) {
2360 // We have to hit-test our line boxes. 2360 // We have to hit-test our line boxes.
2361 if (m_lineBoxes.hitTest(this, request, result, locationInContainer, accu mulatedOffset, hitTestAction)) 2361 if (m_lineBoxes.hitTest(this, request, result, locationInContainer, accu mulatedOffset, hitTestAction))
2362 return true; 2362 return true;
2363 } else { 2363 } else {
2364 // Hit test our children. 2364 // Hit test our children.
2365 HitTestAction childHitTest = hitTestAction; 2365 HitTestAction childHitTest = hitTestAction;
2366 if (hitTestAction == HitTestChildBlockBackgrounds) 2366 if (hitTestAction == HitTestChildBlockBackgrounds)
2367 childHitTest = HitTestChildBlockBackground; 2367 childHitTest = HitTestChildBlockBackground;
2368 for (RenderBox* child = lastChildBox(); child; child = child->previousSi blingBox()) { 2368 for (LayoutBox* child = lastChildBox(); child; child = child->previousSi blingBox()) {
2369 LayoutPoint childPoint = flipForWritingModeForChild(child, accumulat edOffset); 2369 LayoutPoint childPoint = flipForWritingModeForChild(child, accumulat edOffset);
2370 if (!child->hasSelfPaintingLayer() && !child->isFloating() && !child ->isColumnSpanAll() && child->nodeAtPoint(request, result, locationInContainer, childPoint, childHitTest)) 2370 if (!child->hasSelfPaintingLayer() && !child->isFloating() && !child ->isColumnSpanAll() && child->nodeAtPoint(request, result, locationInContainer, childPoint, childHitTest))
2371 return true; 2371 return true;
2372 } 2372 }
2373 } 2373 }
2374 2374
2375 return false; 2375 return false;
2376 } 2376 }
2377 2377
2378 Position RenderBlock::positionForBox(InlineBox *box, bool start) const 2378 Position RenderBlock::positionForBox(InlineBox *box, bool start) const
(...skipping 15 matching lines...) Expand all
2394 { 2394 {
2395 ASSERT(!ancestor || ancestor->nonPseudoNode()); 2395 ASSERT(!ancestor || ancestor->nonPseudoNode());
2396 ASSERT(child && child->nonPseudoNode()); 2396 ASSERT(child && child->nonPseudoNode());
2397 return !ancestor || !ancestor->parent() || (ancestor->hasLayer() && ancestor ->parent()->isRenderView()) 2397 return !ancestor || !ancestor->parent() || (ancestor->hasLayer() && ancestor ->parent()->isRenderView())
2398 || ancestor->nonPseudoNode()->hasEditableStyle() == child->nonPseudoNode ()->hasEditableStyle(); 2398 || ancestor->nonPseudoNode()->hasEditableStyle() == child->nonPseudoNode ()->hasEditableStyle();
2399 } 2399 }
2400 2400
2401 // FIXME: This function should go on LayoutObject as an instance method. Then 2401 // FIXME: This function should go on LayoutObject as an instance method. Then
2402 // all cases in which positionForPoint recurs could call this instead to 2402 // all cases in which positionForPoint recurs could call this instead to
2403 // prevent crossing editable boundaries. This would require many tests. 2403 // prevent crossing editable boundaries. This would require many tests.
2404 static PositionWithAffinity positionForPointRespectingEditingBoundaries(RenderBl ock* parent, RenderBox* child, const LayoutPoint& pointInParentCoordinates) 2404 static PositionWithAffinity positionForPointRespectingEditingBoundaries(RenderBl ock* parent, LayoutBox* child, const LayoutPoint& pointInParentCoordinates)
2405 { 2405 {
2406 LayoutPoint childLocation = child->location(); 2406 LayoutPoint childLocation = child->location();
2407 if (child->isRelPositioned()) 2407 if (child->isRelPositioned())
2408 childLocation += child->offsetForInFlowPosition(); 2408 childLocation += child->offsetForInFlowPosition();
2409 2409
2410 // FIXME: This is wrong if the child's writing-mode is different from the pa rent's. 2410 // FIXME: This is wrong if the child's writing-mode is different from the pa rent's.
2411 LayoutPoint pointInChildCoordinates(toLayoutPoint(pointInParentCoordinates - childLocation)); 2411 LayoutPoint pointInChildCoordinates(toLayoutPoint(pointInParentCoordinates - childLocation));
2412 2412
2413 // If this is an anonymous renderer, we just recur normally 2413 // If this is an anonymous renderer, we just recur normally
2414 Node* childNode = child->nonPseudoNode(); 2414 Node* childNode = child->nonPseudoNode();
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
2496 // y coordinate is above first root line box, so return the star t of the first 2496 // y coordinate is above first root line box, so return the star t of the first
2497 return PositionWithAffinity(positionForBox(box, true), DOWNSTREA M); 2497 return PositionWithAffinity(positionForBox(box, true), DOWNSTREA M);
2498 } 2498 }
2499 } 2499 }
2500 2500
2501 // pass the box a top position that is inside it 2501 // pass the box a top position that is inside it
2502 LayoutPoint point(pointInLogicalContents.x(), closestBox->root().blockDi rectionPointInLine()); 2502 LayoutPoint point(pointInLogicalContents.x(), closestBox->root().blockDi rectionPointInLine());
2503 if (!isHorizontalWritingMode()) 2503 if (!isHorizontalWritingMode())
2504 point = point.transposedPoint(); 2504 point = point.transposedPoint();
2505 if (closestBox->renderer().isReplaced()) 2505 if (closestBox->renderer().isReplaced())
2506 return positionForPointRespectingEditingBoundaries(this, &toRenderBo x(closestBox->renderer()), point); 2506 return positionForPointRespectingEditingBoundaries(this, &toLayoutBo x(closestBox->renderer()), point);
2507 return closestBox->renderer().positionForPoint(point); 2507 return closestBox->renderer().positionForPoint(point);
2508 } 2508 }
2509 2509
2510 if (lastRootBoxWithChildren) { 2510 if (lastRootBoxWithChildren) {
2511 // We hit this case for Mac behavior when the Y coordinate is below the last box. 2511 // We hit this case for Mac behavior when the Y coordinate is below the last box.
2512 ASSERT(moveCaretToBoundary); 2512 ASSERT(moveCaretToBoundary);
2513 InlineBox* logicallyLastBox; 2513 InlineBox* logicallyLastBox;
2514 if (lastRootBoxWithChildren->getLogicalEndBoxWithNode(logicallyLastBox)) 2514 if (lastRootBoxWithChildren->getLogicalEndBoxWithNode(logicallyLastBox))
2515 return PositionWithAffinity(positionForBox(logicallyLastBox, false), DOWNSTREAM); 2515 return PositionWithAffinity(positionForBox(logicallyLastBox, false), DOWNSTREAM);
2516 } 2516 }
2517 2517
2518 // Can't reach this. We have a root line box, but it has no kids. 2518 // Can't reach this. We have a root line box, but it has no kids.
2519 // FIXME: This should ASSERT_NOT_REACHED(), but clicking on placeholder text 2519 // FIXME: This should ASSERT_NOT_REACHED(), but clicking on placeholder text
2520 // seems to hit this code path. 2520 // seems to hit this code path.
2521 return createPositionWithAffinity(0, DOWNSTREAM); 2521 return createPositionWithAffinity(0, DOWNSTREAM);
2522 } 2522 }
2523 2523
2524 static inline bool isChildHitTestCandidate(RenderBox* box) 2524 static inline bool isChildHitTestCandidate(LayoutBox* box)
2525 { 2525 {
2526 return box->size().height() && box->style()->visibility() == VISIBLE && !box ->isFloatingOrOutOfFlowPositioned(); 2526 return box->size().height() && box->style()->visibility() == VISIBLE && !box ->isFloatingOrOutOfFlowPositioned();
2527 } 2527 }
2528 2528
2529 PositionWithAffinity RenderBlock::positionForPoint(const LayoutPoint& point) 2529 PositionWithAffinity RenderBlock::positionForPoint(const LayoutPoint& point)
2530 { 2530 {
2531 if (isTable()) 2531 if (isTable())
2532 return RenderBox::positionForPoint(point); 2532 return LayoutBox::positionForPoint(point);
2533 2533
2534 if (isReplaced()) { 2534 if (isReplaced()) {
2535 // FIXME: This seems wrong when the object's writing-mode doesn't match the line's writing-mode. 2535 // FIXME: This seems wrong when the object's writing-mode doesn't match the line's writing-mode.
2536 LayoutUnit pointLogicalLeft = isHorizontalWritingMode() ? point.x() : po int.y(); 2536 LayoutUnit pointLogicalLeft = isHorizontalWritingMode() ? point.x() : po int.y();
2537 LayoutUnit pointLogicalTop = isHorizontalWritingMode() ? point.y() : poi nt.x(); 2537 LayoutUnit pointLogicalTop = isHorizontalWritingMode() ? point.y() : poi nt.x();
2538 2538
2539 if (pointLogicalLeft < 0) 2539 if (pointLogicalLeft < 0)
2540 return createPositionWithAffinity(caretMinOffset(), DOWNSTREAM); 2540 return createPositionWithAffinity(caretMinOffset(), DOWNSTREAM);
2541 if (pointLogicalLeft >= logicalWidth()) 2541 if (pointLogicalLeft >= logicalWidth())
2542 return createPositionWithAffinity(caretMaxOffset(), DOWNSTREAM); 2542 return createPositionWithAffinity(caretMaxOffset(), DOWNSTREAM);
2543 if (pointLogicalTop < 0) 2543 if (pointLogicalTop < 0)
2544 return createPositionWithAffinity(caretMinOffset(), DOWNSTREAM); 2544 return createPositionWithAffinity(caretMinOffset(), DOWNSTREAM);
2545 if (pointLogicalTop >= logicalHeight()) 2545 if (pointLogicalTop >= logicalHeight())
2546 return createPositionWithAffinity(caretMaxOffset(), DOWNSTREAM); 2546 return createPositionWithAffinity(caretMaxOffset(), DOWNSTREAM);
2547 } 2547 }
2548 2548
2549 LayoutPoint pointInContents = point; 2549 LayoutPoint pointInContents = point;
2550 offsetForContents(pointInContents); 2550 offsetForContents(pointInContents);
2551 LayoutPoint pointInLogicalContents(pointInContents); 2551 LayoutPoint pointInLogicalContents(pointInContents);
2552 if (!isHorizontalWritingMode()) 2552 if (!isHorizontalWritingMode())
2553 pointInLogicalContents = pointInLogicalContents.transposedPoint(); 2553 pointInLogicalContents = pointInLogicalContents.transposedPoint();
2554 2554
2555 if (childrenInline()) 2555 if (childrenInline())
2556 return positionForPointWithInlineChildren(pointInLogicalContents); 2556 return positionForPointWithInlineChildren(pointInLogicalContents);
2557 2557
2558 RenderBox* lastCandidateBox = lastChildBox(); 2558 LayoutBox* lastCandidateBox = lastChildBox();
2559 while (lastCandidateBox && !isChildHitTestCandidate(lastCandidateBox)) 2559 while (lastCandidateBox && !isChildHitTestCandidate(lastCandidateBox))
2560 lastCandidateBox = lastCandidateBox->previousSiblingBox(); 2560 lastCandidateBox = lastCandidateBox->previousSiblingBox();
2561 2561
2562 bool blocksAreFlipped = style()->isFlippedBlocksWritingMode(); 2562 bool blocksAreFlipped = style()->isFlippedBlocksWritingMode();
2563 if (lastCandidateBox) { 2563 if (lastCandidateBox) {
2564 if (pointInLogicalContents.y() > logicalTopForChild(*lastCandidateBox) 2564 if (pointInLogicalContents.y() > logicalTopForChild(*lastCandidateBox)
2565 || (!blocksAreFlipped && pointInLogicalContents.y() == logicalTopFor Child(*lastCandidateBox))) 2565 || (!blocksAreFlipped && pointInLogicalContents.y() == logicalTopFor Child(*lastCandidateBox)))
2566 return positionForPointRespectingEditingBoundaries(this, lastCandida teBox, pointInContents); 2566 return positionForPointRespectingEditingBoundaries(this, lastCandida teBox, pointInContents);
2567 2567
2568 for (RenderBox* childBox = firstChildBox(); childBox; childBox = childBo x->nextSiblingBox()) { 2568 for (LayoutBox* childBox = firstChildBox(); childBox; childBox = childBo x->nextSiblingBox()) {
2569 if (!isChildHitTestCandidate(childBox)) 2569 if (!isChildHitTestCandidate(childBox))
2570 continue; 2570 continue;
2571 LayoutUnit childLogicalBottom = logicalTopForChild(*childBox) + logi calHeightForChild(*childBox); 2571 LayoutUnit childLogicalBottom = logicalTopForChild(*childBox) + logi calHeightForChild(*childBox);
2572 // We hit child if our click is above the bottom of its padding box (like IE6/7 and FF3). 2572 // We hit child if our click is above the bottom of its padding box (like IE6/7 and FF3).
2573 if (isChildHitTestCandidate(childBox) && (pointInLogicalContents.y() < childLogicalBottom 2573 if (isChildHitTestCandidate(childBox) && (pointInLogicalContents.y() < childLogicalBottom
2574 || (blocksAreFlipped && pointInLogicalContents.y() == childLogic alBottom))) 2574 || (blocksAreFlipped && pointInLogicalContents.y() == childLogic alBottom)))
2575 return positionForPointRespectingEditingBoundaries(this, childBo x, pointInContents); 2575 return positionForPointRespectingEditingBoundaries(this, childBo x, pointInContents);
2576 } 2576 }
2577 } 2577 }
2578 2578
2579 // We only get here if there are no hit test candidate children below the cl ick. 2579 // We only get here if there are no hit test candidate children below the cl ick.
2580 return RenderBox::positionForPoint(point); 2580 return LayoutBox::positionForPoint(point);
2581 } 2581 }
2582 2582
2583 void RenderBlock::offsetForContents(LayoutPoint& offset) const 2583 void RenderBlock::offsetForContents(LayoutPoint& offset) const
2584 { 2584 {
2585 offset = flipForWritingMode(offset); 2585 offset = flipForWritingMode(offset);
2586 2586
2587 if (hasOverflowClip()) 2587 if (hasOverflowClip())
2588 offset += LayoutSize(scrolledContentOffset()); 2588 offset += LayoutSize(scrolledContentOffset());
2589 2589
2590 if (hasColumns()) 2590 if (hasColumns())
2591 adjustPointToColumnContents(offset); 2591 adjustPointToColumnContents(offset);
2592 2592
2593 offset = flipForWritingMode(offset); 2593 offset = flipForWritingMode(offset);
2594 } 2594 }
2595 2595
2596 LayoutUnit RenderBlock::availableLogicalWidth() const 2596 LayoutUnit RenderBlock::availableLogicalWidth() const
2597 { 2597 {
2598 // If we have multiple columns, then the available logical width is reduced to our column width. 2598 // If we have multiple columns, then the available logical width is reduced to our column width.
2599 if (hasColumns()) 2599 if (hasColumns())
2600 return desiredColumnWidth(); 2600 return desiredColumnWidth();
2601 return RenderBox::availableLogicalWidth(); 2601 return LayoutBox::availableLogicalWidth();
2602 } 2602 }
2603 2603
2604 int RenderBlock::columnGap() const 2604 int RenderBlock::columnGap() const
2605 { 2605 {
2606 if (style()->hasNormalColumnGap()) 2606 if (style()->hasNormalColumnGap())
2607 return style()->fontDescription().computedPixelSize(); // "1em" is recom mended as the normal gap setting. Matches <p> margins. 2607 return style()->fontDescription().computedPixelSize(); // "1em" is recom mended as the normal gap setting. Matches <p> margins.
2608 return static_cast<int>(style()->columnGap()); 2608 return static_cast<int>(style()->columnGap());
2609 } 2609 }
2610 2610
2611 void RenderBlock::calcColumnWidth() 2611 void RenderBlock::calcColumnWidth()
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
3045 LayoutUnit floatLeftWidth = 0, floatRightWidth = 0; 3045 LayoutUnit floatLeftWidth = 0, floatRightWidth = 0;
3046 while (child) { 3046 while (child) {
3047 // Positioned children don't affect the min/max width. Spanners only aff ect the min/max 3047 // Positioned children don't affect the min/max width. Spanners only aff ect the min/max
3048 // width of the multicol container, not the flow thread. 3048 // width of the multicol container, not the flow thread.
3049 if (child->isOutOfFlowPositioned() || child->isColumnSpanAll()) { 3049 if (child->isOutOfFlowPositioned() || child->isColumnSpanAll()) {
3050 child = child->nextSibling(); 3050 child = child->nextSibling();
3051 continue; 3051 continue;
3052 } 3052 }
3053 3053
3054 RefPtr<LayoutStyle> childStyle = child->style(); 3054 RefPtr<LayoutStyle> childStyle = child->style();
3055 if (child->isFloating() || (child->isBox() && toRenderBox(child)->avoids Floats())) { 3055 if (child->isFloating() || (child->isBox() && toLayoutBox(child)->avoids Floats())) {
3056 LayoutUnit floatTotalWidth = floatLeftWidth + floatRightWidth; 3056 LayoutUnit floatTotalWidth = floatLeftWidth + floatRightWidth;
3057 if (childStyle->clear() & CLEFT) { 3057 if (childStyle->clear() & CLEFT) {
3058 maxLogicalWidth = std::max(floatTotalWidth, maxLogicalWidth); 3058 maxLogicalWidth = std::max(floatTotalWidth, maxLogicalWidth);
3059 floatLeftWidth = 0; 3059 floatLeftWidth = 0;
3060 } 3060 }
3061 if (childStyle->clear() & CRIGHT) { 3061 if (childStyle->clear() & CRIGHT) {
3062 maxLogicalWidth = std::max(floatTotalWidth, maxLogicalWidth); 3062 maxLogicalWidth = std::max(floatTotalWidth, maxLogicalWidth);
3063 floatRightWidth = 0; 3063 floatRightWidth = 0;
3064 } 3064 }
3065 } 3065 }
3066 3066
3067 // A margin basically has three types: fixed, percentage, and auto (vari able). 3067 // A margin basically has three types: fixed, percentage, and auto (vari able).
3068 // Auto and percentage margins simply become 0 when computing min/max wi dth. 3068 // Auto and percentage margins simply become 0 when computing min/max wi dth.
3069 // Fixed margins can be added in as is. 3069 // Fixed margins can be added in as is.
3070 Length startMarginLength = childStyle->marginStartUsing(&styleToUse); 3070 Length startMarginLength = childStyle->marginStartUsing(&styleToUse);
3071 Length endMarginLength = childStyle->marginEndUsing(&styleToUse); 3071 Length endMarginLength = childStyle->marginEndUsing(&styleToUse);
3072 LayoutUnit margin = 0; 3072 LayoutUnit margin = 0;
3073 LayoutUnit marginStart = 0; 3073 LayoutUnit marginStart = 0;
3074 LayoutUnit marginEnd = 0; 3074 LayoutUnit marginEnd = 0;
3075 if (startMarginLength.isFixed()) 3075 if (startMarginLength.isFixed())
3076 marginStart += startMarginLength.value(); 3076 marginStart += startMarginLength.value();
3077 if (endMarginLength.isFixed()) 3077 if (endMarginLength.isFixed())
3078 marginEnd += endMarginLength.value(); 3078 marginEnd += endMarginLength.value();
3079 margin = marginStart + marginEnd; 3079 margin = marginStart + marginEnd;
3080 3080
3081 LayoutUnit childMinPreferredLogicalWidth, childMaxPreferredLogicalWidth; 3081 LayoutUnit childMinPreferredLogicalWidth, childMaxPreferredLogicalWidth;
3082 if (child->isBox() && child->isHorizontalWritingMode() != isHorizontalWr itingMode()) { 3082 if (child->isBox() && child->isHorizontalWritingMode() != isHorizontalWr itingMode()) {
3083 RenderBox* childBox = toRenderBox(child); 3083 LayoutBox* childBox = toLayoutBox(child);
3084 LogicalExtentComputedValues computedValues; 3084 LogicalExtentComputedValues computedValues;
3085 childBox->computeLogicalHeight(childBox->borderAndPaddingLogicalHeig ht(), 0, computedValues); 3085 childBox->computeLogicalHeight(childBox->borderAndPaddingLogicalHeig ht(), 0, computedValues);
3086 childMinPreferredLogicalWidth = childMaxPreferredLogicalWidth = comp utedValues.m_extent; 3086 childMinPreferredLogicalWidth = childMaxPreferredLogicalWidth = comp utedValues.m_extent;
3087 } else { 3087 } else {
3088 childMinPreferredLogicalWidth = child->minPreferredLogicalWidth(); 3088 childMinPreferredLogicalWidth = child->minPreferredLogicalWidth();
3089 childMaxPreferredLogicalWidth = child->maxPreferredLogicalWidth(); 3089 childMaxPreferredLogicalWidth = child->maxPreferredLogicalWidth();
3090 } 3090 }
3091 3091
3092 LayoutUnit w = childMinPreferredLogicalWidth + margin; 3092 LayoutUnit w = childMinPreferredLogicalWidth + margin;
3093 minLogicalWidth = std::max(w, minLogicalWidth); 3093 minLogicalWidth = std::max(w, minLogicalWidth);
3094 3094
3095 // IE ignores tables for calculation of nowrap. Makes some sense. 3095 // IE ignores tables for calculation of nowrap. Makes some sense.
3096 if (nowrap && !child->isTable()) 3096 if (nowrap && !child->isTable())
3097 maxLogicalWidth = std::max(w, maxLogicalWidth); 3097 maxLogicalWidth = std::max(w, maxLogicalWidth);
3098 3098
3099 w = childMaxPreferredLogicalWidth + margin; 3099 w = childMaxPreferredLogicalWidth + margin;
3100 3100
3101 if (!child->isFloating()) { 3101 if (!child->isFloating()) {
3102 if (child->isBox() && toRenderBox(child)->avoidsFloats()) { 3102 if (child->isBox() && toLayoutBox(child)->avoidsFloats()) {
3103 // Determine a left and right max value based off whether or not the floats can fit in the 3103 // Determine a left and right max value based off whether or not the floats can fit in the
3104 // margins of the object. For negative margins, we will attempt to overlap the float if the negative margin 3104 // margins of the object. For negative margins, we will attempt to overlap the float if the negative margin
3105 // is smaller than the float width. 3105 // is smaller than the float width.
3106 bool ltr = containingBlock ? containingBlock->style()->isLeftToR ightDirection() : styleToUse.isLeftToRightDirection(); 3106 bool ltr = containingBlock ? containingBlock->style()->isLeftToR ightDirection() : styleToUse.isLeftToRightDirection();
3107 LayoutUnit marginLogicalLeft = ltr ? marginStart : marginEnd; 3107 LayoutUnit marginLogicalLeft = ltr ? marginStart : marginEnd;
3108 LayoutUnit marginLogicalRight = ltr ? marginEnd : marginStart; 3108 LayoutUnit marginLogicalRight = ltr ? marginEnd : marginStart;
3109 LayoutUnit maxLeft = marginLogicalLeft > 0 ? std::max(floatLeftW idth, marginLogicalLeft) : floatLeftWidth + marginLogicalLeft; 3109 LayoutUnit maxLeft = marginLogicalLeft > 0 ? std::max(floatLeftW idth, marginLogicalLeft) : floatLeftWidth + marginLogicalLeft;
3110 LayoutUnit maxRight = marginLogicalRight > 0 ? std::max(floatRig htWidth, marginLogicalRight) : floatRightWidth + marginLogicalRight; 3110 LayoutUnit maxRight = marginLogicalRight > 0 ? std::max(floatRig htWidth, marginLogicalRight) : floatRightWidth + marginLogicalRight;
3111 w = childMaxPreferredLogicalWidth + maxLeft + maxRight; 3111 w = childMaxPreferredLogicalWidth + maxLeft + maxRight;
3112 w = std::max(w, floatLeftWidth + floatRightWidth); 3112 w = std::max(w, floatLeftWidth + floatRightWidth);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3149 return false; 3149 return false;
3150 } 3150 }
3151 3151
3152 LayoutUnit RenderBlock::lineHeight(bool firstLine, LineDirectionMode direction, LinePositionMode linePositionMode) const 3152 LayoutUnit RenderBlock::lineHeight(bool firstLine, LineDirectionMode direction, LinePositionMode linePositionMode) const
3153 { 3153 {
3154 // Inline blocks are replaced elements. Otherwise, just pass off to 3154 // Inline blocks are replaced elements. Otherwise, just pass off to
3155 // the base class. If we're being queried as though we're the root line 3155 // the base class. If we're being queried as though we're the root line
3156 // box, then the fact that we're an inline-block is irrelevant, and we behav e 3156 // box, then the fact that we're an inline-block is irrelevant, and we behav e
3157 // just like a block. 3157 // just like a block.
3158 if (isReplaced() && linePositionMode == PositionOnContainingLine) 3158 if (isReplaced() && linePositionMode == PositionOnContainingLine)
3159 return RenderBox::lineHeight(firstLine, direction, linePositionMode); 3159 return LayoutBox::lineHeight(firstLine, direction, linePositionMode);
3160 3160
3161 const LayoutStyle& style = styleRef(firstLine && document().styleEngine()->u sesFirstLineRules()); 3161 const LayoutStyle& style = styleRef(firstLine && document().styleEngine()->u sesFirstLineRules());
3162 return style.computedLineHeight(); 3162 return style.computedLineHeight();
3163 } 3163 }
3164 3164
3165 int RenderBlock::beforeMarginInLineDirection(LineDirectionMode direction) const 3165 int RenderBlock::beforeMarginInLineDirection(LineDirectionMode direction) const
3166 { 3166 {
3167 return direction == HorizontalLine ? marginTop() : marginRight(); 3167 return direction == HorizontalLine ? marginTop() : marginRight();
3168 } 3168 }
3169 3169
(...skipping 29 matching lines...) Expand all
3199 // breaks -webkit-line-clamp, which is used in the wild -- we would 3199 // breaks -webkit-line-clamp, which is used in the wild -- we would
3200 // calculate the baseline as if -webkit-line-clamp wasn't used. 3200 // calculate the baseline as if -webkit-line-clamp wasn't used.
3201 // For simplicity, we use this for all uses of deprecated flexbox. 3201 // For simplicity, we use this for all uses of deprecated flexbox.
3202 LayoutUnit bottomOfContent = direction == HorizontalLine ? size().he ight() - borderBottom() - paddingBottom() - horizontalScrollbarHeight() : size() .width() - borderLeft() - paddingLeft() - verticalScrollbarWidth(); 3202 LayoutUnit bottomOfContent = direction == HorizontalLine ? size().he ight() - borderBottom() - paddingBottom() - horizontalScrollbarHeight() : size() .width() - borderLeft() - paddingLeft() - verticalScrollbarWidth();
3203 if (baselinePos > bottomOfContent) 3203 if (baselinePos > bottomOfContent)
3204 baselinePos = -1; 3204 baselinePos = -1;
3205 } 3205 }
3206 if (baselinePos != -1) 3206 if (baselinePos != -1)
3207 return beforeMarginInLineDirection(direction) + baselinePos; 3207 return beforeMarginInLineDirection(direction) + baselinePos;
3208 3208
3209 return RenderBox::baselinePosition(baselineType, firstLine, direction, l inePositionMode); 3209 return LayoutBox::baselinePosition(baselineType, firstLine, direction, l inePositionMode);
3210 } 3210 }
3211 3211
3212 // If we're not replaced, we'll only get called with PositionOfInteriorLineB oxes. 3212 // If we're not replaced, we'll only get called with PositionOfInteriorLineB oxes.
3213 // Note that inline-block counts as replaced here. 3213 // Note that inline-block counts as replaced here.
3214 ASSERT(linePositionMode == PositionOfInteriorLineBoxes); 3214 ASSERT(linePositionMode == PositionOfInteriorLineBoxes);
3215 3215
3216 const FontMetrics& fontMetrics = style(firstLine)->fontMetrics(); 3216 const FontMetrics& fontMetrics = style(firstLine)->fontMetrics();
3217 return fontMetrics.ascent(baselineType) + (lineHeight(firstLine, direction, linePositionMode) - fontMetrics.height()) / 2; 3217 return fontMetrics.ascent(baselineType) + (lineHeight(firstLine, direction, linePositionMode) - fontMetrics.height()) / 2;
3218 } 3218 }
3219 3219
(...skipping 13 matching lines...) Expand all
3233 if (isWritingModeRoot() && !isRubyRun()) 3233 if (isWritingModeRoot() && !isRubyRun())
3234 return -1; 3234 return -1;
3235 3235
3236 if (childrenInline()) { 3236 if (childrenInline()) {
3237 if (firstLineBox()) 3237 if (firstLineBox())
3238 return firstLineBox()->logicalTop() + style(true)->fontMetrics().asc ent(firstRootBox()->baselineType()); 3238 return firstLineBox()->logicalTop() + style(true)->fontMetrics().asc ent(firstRootBox()->baselineType());
3239 else 3239 else
3240 return -1; 3240 return -1;
3241 } 3241 }
3242 else { 3242 else {
3243 for (RenderBox* curr = firstChildBox(); curr; curr = curr->nextSiblingBo x()) { 3243 for (LayoutBox* curr = firstChildBox(); curr; curr = curr->nextSiblingBo x()) {
3244 if (!curr->isFloatingOrOutOfFlowPositioned()) { 3244 if (!curr->isFloatingOrOutOfFlowPositioned()) {
3245 int result = curr->firstLineBoxBaseline(); 3245 int result = curr->firstLineBoxBaseline();
3246 if (result != -1) 3246 if (result != -1)
3247 return curr->logicalTop() + result; // Translate to our coor dinate space. 3247 return curr->logicalTop() + result; // Translate to our coor dinate space.
3248 } 3248 }
3249 } 3249 }
3250 } 3250 }
3251 3251
3252 return -1; 3252 return -1;
3253 } 3253 }
3254 3254
3255 int RenderBlock::inlineBlockBaseline(LineDirectionMode direction) const 3255 int RenderBlock::inlineBlockBaseline(LineDirectionMode direction) const
3256 { 3256 {
3257 if (!style()->isOverflowVisible()) { 3257 if (!style()->isOverflowVisible()) {
3258 // We are not calling RenderBox::baselinePosition here because the calle r should add the margin-top/margin-right, not us. 3258 // We are not calling LayoutBox::baselinePosition here because the calle r should add the margin-top/margin-right, not us.
3259 return direction == HorizontalLine ? size().height() + marginBottom() : size().width() + marginLeft(); 3259 return direction == HorizontalLine ? size().height() + marginBottom() : size().width() + marginLeft();
3260 } 3260 }
3261 3261
3262 return lastLineBoxBaseline(direction); 3262 return lastLineBoxBaseline(direction);
3263 } 3263 }
3264 3264
3265 int RenderBlock::lastLineBoxBaseline(LineDirectionMode lineDirection) const 3265 int RenderBlock::lastLineBoxBaseline(LineDirectionMode lineDirection) const
3266 { 3266 {
3267 if (isWritingModeRoot() && !isRubyRun()) 3267 if (isWritingModeRoot() && !isRubyRun())
3268 return -1; 3268 return -1;
3269 3269
3270 if (childrenInline()) { 3270 if (childrenInline()) {
3271 if (!firstLineBox() && hasLineIfEmpty()) { 3271 if (!firstLineBox() && hasLineIfEmpty()) {
3272 const FontMetrics& fontMetrics = firstLineStyle()->fontMetrics(); 3272 const FontMetrics& fontMetrics = firstLineStyle()->fontMetrics();
3273 return fontMetrics.ascent() 3273 return fontMetrics.ascent()
3274 + (lineHeight(true, lineDirection, PositionOfInteriorLineBoxes) - fontMetrics.height()) / 2 3274 + (lineHeight(true, lineDirection, PositionOfInteriorLineBoxes) - fontMetrics.height()) / 2
3275 + (lineDirection == HorizontalLine ? borderTop() + paddingTop() : borderRight() + paddingRight()); 3275 + (lineDirection == HorizontalLine ? borderTop() + paddingTop() : borderRight() + paddingRight());
3276 } 3276 }
3277 if (lastLineBox()) 3277 if (lastLineBox())
3278 return lastLineBox()->logicalTop() + style(lastLineBox() == firstLin eBox())->fontMetrics().ascent(lastRootBox()->baselineType()); 3278 return lastLineBox()->logicalTop() + style(lastLineBox() == firstLin eBox())->fontMetrics().ascent(lastRootBox()->baselineType());
3279 return -1; 3279 return -1;
3280 } else { 3280 } else {
3281 bool haveNormalFlowChild = false; 3281 bool haveNormalFlowChild = false;
3282 for (RenderBox* curr = lastChildBox(); curr; curr = curr->previousSiblin gBox()) { 3282 for (LayoutBox* curr = lastChildBox(); curr; curr = curr->previousSiblin gBox()) {
3283 if (!curr->isFloatingOrOutOfFlowPositioned()) { 3283 if (!curr->isFloatingOrOutOfFlowPositioned()) {
3284 haveNormalFlowChild = true; 3284 haveNormalFlowChild = true;
3285 int result = curr->inlineBlockBaseline(lineDirection); 3285 int result = curr->inlineBlockBaseline(lineDirection);
3286 if (result != -1) 3286 if (result != -1)
3287 return curr->logicalTop() + result; // Translate to our coor dinate space. 3287 return curr->logicalTop() + result; // Translate to our coor dinate space.
3288 } 3288 }
3289 } 3289 }
3290 if (!haveNormalFlowChild && hasLineIfEmpty()) { 3290 if (!haveNormalFlowChild && hasLineIfEmpty()) {
3291 const FontMetrics& fontMetrics = firstLineStyle()->fontMetrics(); 3291 const FontMetrics& fontMetrics = firstLineStyle()->fontMetrics();
3292 return fontMetrics.ascent() 3292 return fontMetrics.ascent()
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3345 3345
3346 static int getHeightForLineCount(RenderBlock* block, int l, bool includeBottom, int& count) 3346 static int getHeightForLineCount(RenderBlock* block, int l, bool includeBottom, int& count)
3347 { 3347 {
3348 if (block->style()->visibility() == VISIBLE) { 3348 if (block->style()->visibility() == VISIBLE) {
3349 if (block->isRenderBlockFlow() && block->childrenInline()) { 3349 if (block->isRenderBlockFlow() && block->childrenInline()) {
3350 for (RootInlineBox* box = toRenderBlockFlow(block)->firstRootBox(); box; box = box->nextRootBox()) { 3350 for (RootInlineBox* box = toRenderBlockFlow(block)->firstRootBox(); box; box = box->nextRootBox()) {
3351 if (++count == l) 3351 if (++count == l)
3352 return box->lineBottom() + (includeBottom ? (block->borderBo ttom() + block->paddingBottom()) : LayoutUnit()); 3352 return box->lineBottom() + (includeBottom ? (block->borderBo ttom() + block->paddingBottom()) : LayoutUnit());
3353 } 3353 }
3354 } else { 3354 } else {
3355 RenderBox* normalFlowChildWithoutLines = 0; 3355 LayoutBox* normalFlowChildWithoutLines = 0;
3356 for (RenderBox* obj = block->firstChildBox(); obj; obj = obj->nextSi blingBox()) { 3356 for (LayoutBox* obj = block->firstChildBox(); obj; obj = obj->nextSi blingBox()) {
3357 if (shouldCheckLines(obj)) { 3357 if (shouldCheckLines(obj)) {
3358 int result = getHeightForLineCount(toRenderBlock(obj), l, fa lse, count); 3358 int result = getHeightForLineCount(toRenderBlock(obj), l, fa lse, count);
3359 if (result != -1) 3359 if (result != -1)
3360 return result + obj->location().y() + (includeBottom ? ( block->borderBottom() + block->paddingBottom()) : LayoutUnit()); 3360 return result + obj->location().y() + (includeBottom ? ( block->borderBottom() + block->paddingBottom()) : LayoutUnit());
3361 } else if (!obj->isFloatingOrOutOfFlowPositioned()) { 3361 } else if (!obj->isFloatingOrOutOfFlowPositioned()) {
3362 normalFlowChildWithoutLines = obj; 3362 normalFlowChildWithoutLines = obj;
3363 } 3363 }
3364 } 3364 }
3365 if (normalFlowChildWithoutLines && l == 0) 3365 if (normalFlowChildWithoutLines && l == 0)
3366 return normalFlowChildWithoutLines->location().y() + normalFlowC hildWithoutLines->size().height(); 3366 return normalFlowChildWithoutLines->location().y() + normalFlowC hildWithoutLines->size().height();
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
3467 // inline boxes above and below us (thus getting merged with them to form a single irregular 3467 // inline boxes above and below us (thus getting merged with them to form a single irregular
3468 // shape). 3468 // shape).
3469 if (isAnonymousBlockContinuation()) { 3469 if (isAnonymousBlockContinuation()) {
3470 // FIXME: This is wrong for vertical writing-modes. 3470 // FIXME: This is wrong for vertical writing-modes.
3471 // https://bugs.webkit.org/show_bug.cgi?id=46781 3471 // https://bugs.webkit.org/show_bug.cgi?id=46781
3472 LayoutRect localRect(LayoutPoint(), size()); 3472 LayoutRect localRect(LayoutPoint(), size());
3473 localRect.expand(collapsedMarginBoxLogicalOutsets()); 3473 localRect.expand(collapsedMarginBoxLogicalOutsets());
3474 quads.append(localToAbsoluteQuad(FloatRect(localRect), 0 /* mode */, was Fixed)); 3474 quads.append(localToAbsoluteQuad(FloatRect(localRect), 0 /* mode */, was Fixed));
3475 continuation()->absoluteQuads(quads, wasFixed); 3475 continuation()->absoluteQuads(quads, wasFixed);
3476 } else { 3476 } else {
3477 quads.append(RenderBox::localToAbsoluteQuad(FloatRect(0, 0, size().width ().toFloat(), size().height().toFloat()), 0 /* mode */, wasFixed)); 3477 quads.append(LayoutBox::localToAbsoluteQuad(FloatRect(0, 0, size().width ().toFloat(), size().height().toFloat()), 0 /* mode */, wasFixed));
3478 } 3478 }
3479 } 3479 }
3480 3480
3481 LayoutRect RenderBlock::rectWithOutlineForPaintInvalidation(const LayoutBoxModel Object* paintInvalidationContainer, LayoutUnit outlineWidth, const PaintInvalida tionState* paintInvalidationState) const 3481 LayoutRect RenderBlock::rectWithOutlineForPaintInvalidation(const LayoutBoxModel Object* paintInvalidationContainer, LayoutUnit outlineWidth, const PaintInvalida tionState* paintInvalidationState) const
3482 { 3482 {
3483 LayoutRect r(RenderBox::rectWithOutlineForPaintInvalidation(paintInvalidatio nContainer, outlineWidth, paintInvalidationState)); 3483 LayoutRect r(LayoutBox::rectWithOutlineForPaintInvalidation(paintInvalidatio nContainer, outlineWidth, paintInvalidationState));
3484 if (isAnonymousBlockContinuation()) 3484 if (isAnonymousBlockContinuation())
3485 r.inflateY(collapsedMarginBefore()); // FIXME: This is wrong for vertica l writing-modes. 3485 r.inflateY(collapsedMarginBefore()); // FIXME: This is wrong for vertica l writing-modes.
3486 return r; 3486 return r;
3487 } 3487 }
3488 3488
3489 LayoutObject* RenderBlock::hoverAncestor() const 3489 LayoutObject* RenderBlock::hoverAncestor() const
3490 { 3490 {
3491 return isAnonymousBlockContinuation() ? continuation() : RenderBox::hoverAnc estor(); 3491 return isAnonymousBlockContinuation() ? continuation() : LayoutBox::hoverAnc estor();
3492 } 3492 }
3493 3493
3494 void RenderBlock::updateDragState(bool dragOn) 3494 void RenderBlock::updateDragState(bool dragOn)
3495 { 3495 {
3496 RenderBox::updateDragState(dragOn); 3496 LayoutBox::updateDragState(dragOn);
3497 if (continuation()) 3497 if (continuation())
3498 continuation()->updateDragState(dragOn); 3498 continuation()->updateDragState(dragOn);
3499 } 3499 }
3500 3500
3501 void RenderBlock::childBecameNonInline(LayoutObject*) 3501 void RenderBlock::childBecameNonInline(LayoutObject*)
3502 { 3502 {
3503 makeChildrenNonInline(); 3503 makeChildrenNonInline();
3504 if (isAnonymousBlock() && parent() && parent()->isRenderBlock()) 3504 if (isAnonymousBlock() && parent() && parent()->isRenderBlock())
3505 toRenderBlock(parent())->removeLeftoverAnonymousBlock(this); 3505 toRenderBlock(parent())->removeLeftoverAnonymousBlock(this);
3506 // |this| may be dead here 3506 // |this| may be dead here
(...skipping 16 matching lines...) Expand all
3523 // so the firstChild() is nullptr if the only child is an empty inline-block. 3523 // so the firstChild() is nullptr if the only child is an empty inline-block.
3524 inline bool RenderBlock::isInlineBoxWrapperActuallyChild() const 3524 inline bool RenderBlock::isInlineBoxWrapperActuallyChild() const
3525 { 3525 {
3526 return isInlineBlockOrInlineTable() && !size().isEmpty() && node() && editin gIgnoresContent(node()); 3526 return isInlineBlockOrInlineTable() && !size().isEmpty() && node() && editin gIgnoresContent(node());
3527 } 3527 }
3528 3528
3529 LayoutRect RenderBlock::localCaretRect(InlineBox* inlineBox, int caretOffset, La youtUnit* extraWidthToEndOfLine) 3529 LayoutRect RenderBlock::localCaretRect(InlineBox* inlineBox, int caretOffset, La youtUnit* extraWidthToEndOfLine)
3530 { 3530 {
3531 // Do the normal calculation in most cases. 3531 // Do the normal calculation in most cases.
3532 if (firstChild() || isInlineBoxWrapperActuallyChild()) 3532 if (firstChild() || isInlineBoxWrapperActuallyChild())
3533 return RenderBox::localCaretRect(inlineBox, caretOffset, extraWidthToEnd OfLine); 3533 return LayoutBox::localCaretRect(inlineBox, caretOffset, extraWidthToEnd OfLine);
3534 3534
3535 LayoutRect caretRect = localCaretRectForEmptyElement(size().width(), textInd entOffset()); 3535 LayoutRect caretRect = localCaretRectForEmptyElement(size().width(), textInd entOffset());
3536 3536
3537 if (extraWidthToEndOfLine) 3537 if (extraWidthToEndOfLine)
3538 *extraWidthToEndOfLine = size().width() - caretRect.maxX(); 3538 *extraWidthToEndOfLine = size().width() - caretRect.maxX();
3539 3539
3540 return caretRect; 3540 return caretRect;
3541 } 3541 }
3542 3542
3543 void RenderBlock::addFocusRingRects(Vector<LayoutRect>& rects, const LayoutPoint & additionalOffset) const 3543 void RenderBlock::addFocusRingRects(Vector<LayoutRect>& rects, const LayoutPoint & additionalOffset) const
(...skipping 30 matching lines...) Expand all
3574 3574
3575 addChildFocusRingRects(rects, additionalOffset); 3575 addChildFocusRingRects(rects, additionalOffset);
3576 } 3576 }
3577 3577
3578 if (inlineElementContinuation()) 3578 if (inlineElementContinuation())
3579 inlineElementContinuation()->addFocusRingRects(rects, additionalOffset + (inlineElementContinuation()->containingBlock()->location() - location())); 3579 inlineElementContinuation()->addFocusRingRects(rects, additionalOffset + (inlineElementContinuation()->containingBlock()->location() - location()));
3580 } 3580 }
3581 3581
3582 void RenderBlock::computeSelfHitTestRects(Vector<LayoutRect>& rects, const Layou tPoint& layerOffset) const 3582 void RenderBlock::computeSelfHitTestRects(Vector<LayoutRect>& rects, const Layou tPoint& layerOffset) const
3583 { 3583 {
3584 RenderBox::computeSelfHitTestRects(rects, layerOffset); 3584 LayoutBox::computeSelfHitTestRects(rects, layerOffset);
3585 3585
3586 if (hasHorizontalLayoutOverflow() || hasVerticalLayoutOverflow()) { 3586 if (hasHorizontalLayoutOverflow() || hasVerticalLayoutOverflow()) {
3587 for (RootInlineBox* curr = firstRootBox(); curr; curr = curr->nextRootBo x()) { 3587 for (RootInlineBox* curr = firstRootBox(); curr; curr = curr->nextRootBo x()) {
3588 LayoutUnit top = std::max<LayoutUnit>(curr->lineTop(), curr->top()); 3588 LayoutUnit top = std::max<LayoutUnit>(curr->lineTop(), curr->top());
3589 LayoutUnit bottom = std::min<LayoutUnit>(curr->lineBottom(), curr->t op() + curr->height()); 3589 LayoutUnit bottom = std::min<LayoutUnit>(curr->lineBottom(), curr->t op() + curr->height());
3590 LayoutRect rect(layerOffset.x() + curr->x(), layerOffset.y() + top, curr->width(), bottom - top); 3590 LayoutRect rect(layerOffset.x() + curr->x(), layerOffset.y() + top, curr->width(), bottom - top);
3591 // It's common for this rect to be entirely contained in our box, so exclude that simple case. 3591 // It's common for this rect to be entirely contained in our box, so exclude that simple case.
3592 if (!rect.isEmpty() && (rects.isEmpty() || !rects[0].contains(rect)) ) 3592 if (!rect.isEmpty() && (rects.isEmpty() || !rects[0].contains(rect)) )
3593 rects.append(rect); 3593 rects.append(rect);
3594 } 3594 }
3595 } 3595 }
3596 } 3596 }
3597 3597
3598 RenderBox* RenderBlock::createAnonymousBoxWithSameTypeAs(const LayoutObject* par ent) const 3598 LayoutBox* RenderBlock::createAnonymousBoxWithSameTypeAs(const LayoutObject* par ent) const
3599 { 3599 {
3600 if (isAnonymousColumnsBlock()) 3600 if (isAnonymousColumnsBlock())
3601 return createAnonymousColumnsWithParentRenderer(parent); 3601 return createAnonymousColumnsWithParentRenderer(parent);
3602 if (isAnonymousColumnSpanBlock()) 3602 if (isAnonymousColumnSpanBlock())
3603 return createAnonymousColumnSpanWithParentRenderer(parent); 3603 return createAnonymousColumnSpanWithParentRenderer(parent);
3604 return createAnonymousWithParentRendererAndDisplay(parent, style()->display( )); 3604 return createAnonymousWithParentRendererAndDisplay(parent, style()->display( ));
3605 } 3605 }
3606 3606
3607 LayoutUnit RenderBlock::nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundar yRule pageBoundaryRule) const 3607 LayoutUnit RenderBlock::nextPageLogicalTop(LayoutUnit logicalOffset, PageBoundar yRule pageBoundaryRule) const
3608 { 3608 {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3666 RELEASE_ASSERT(layoutState); 3666 RELEASE_ASSERT(layoutState);
3667 if (!layoutState->isPaginated()) 3667 if (!layoutState->isPaginated())
3668 return LayoutUnit(); 3668 return LayoutUnit();
3669 // It would be possible to remove the requirement that this block be the one currently being 3669 // It would be possible to remove the requirement that this block be the one currently being
3670 // laid out, but nobody needs that at the moment. 3670 // laid out, but nobody needs that at the moment.
3671 ASSERT(layoutState->renderer() == this); 3671 ASSERT(layoutState->renderer() == this);
3672 LayoutSize offsetDelta = layoutState->layoutOffset() - layoutState->pageOffs et(); 3672 LayoutSize offsetDelta = layoutState->layoutOffset() - layoutState->pageOffs et();
3673 return isHorizontalWritingMode() ? offsetDelta.height() : offsetDelta.width( ); 3673 return isHorizontalWritingMode() ? offsetDelta.height() : offsetDelta.width( );
3674 } 3674 }
3675 3675
3676 LayoutUnit RenderBlock::collapsedMarginBeforeForChild(const RenderBox& child) co nst 3676 LayoutUnit RenderBlock::collapsedMarginBeforeForChild(const LayoutBox& child) co nst
3677 { 3677 {
3678 // If the child has the same directionality as we do, then we can just retur n its 3678 // If the child has the same directionality as we do, then we can just retur n its
3679 // collapsed margin. 3679 // collapsed margin.
3680 if (!child.isWritingModeRoot()) 3680 if (!child.isWritingModeRoot())
3681 return child.collapsedMarginBefore(); 3681 return child.collapsedMarginBefore();
3682 3682
3683 // The child has a different directionality. If the child is parallel, then it's just 3683 // The child has a different directionality. If the child is parallel, then it's just
3684 // flipped relative to us. We can use the collapsed margin for the opposite edge. 3684 // flipped relative to us. We can use the collapsed margin for the opposite edge.
3685 if (child.isHorizontalWritingMode() == isHorizontalWritingMode()) 3685 if (child.isHorizontalWritingMode() == isHorizontalWritingMode())
3686 return child.collapsedMarginAfter(); 3686 return child.collapsedMarginAfter();
3687 3687
3688 // The child is perpendicular to us, which means its margins don't collapse but are on the 3688 // The child is perpendicular to us, which means its margins don't collapse but are on the
3689 // "logical left/right" sides of the child box. We can just return the raw margin in this case. 3689 // "logical left/right" sides of the child box. We can just return the raw margin in this case.
3690 return marginBeforeForChild(child); 3690 return marginBeforeForChild(child);
3691 } 3691 }
3692 3692
3693 LayoutUnit RenderBlock::collapsedMarginAfterForChild(const RenderBox& child) con st 3693 LayoutUnit RenderBlock::collapsedMarginAfterForChild(const LayoutBox& child) con st
3694 { 3694 {
3695 // If the child has the same directionality as we do, then we can just retur n its 3695 // If the child has the same directionality as we do, then we can just retur n its
3696 // collapsed margin. 3696 // collapsed margin.
3697 if (!child.isWritingModeRoot()) 3697 if (!child.isWritingModeRoot())
3698 return child.collapsedMarginAfter(); 3698 return child.collapsedMarginAfter();
3699 3699
3700 // The child has a different directionality. If the child is parallel, then it's just 3700 // The child has a different directionality. If the child is parallel, then it's just
3701 // flipped relative to us. We can use the collapsed margin for the opposite edge. 3701 // flipped relative to us. We can use the collapsed margin for the opposite edge.
3702 if (child.isHorizontalWritingMode() == isHorizontalWritingMode()) 3702 if (child.isHorizontalWritingMode() == isHorizontalWritingMode())
3703 return child.collapsedMarginBefore(); 3703 return child.collapsedMarginBefore();
3704 3704
3705 // The child is perpendicular to us, which means its margins don't collapse but are on the 3705 // The child is perpendicular to us, which means its margins don't collapse but are on the
3706 // "logical left/right" side of the child box. We can just return the raw m argin in this case. 3706 // "logical left/right" side of the child box. We can just return the raw m argin in this case.
3707 return marginAfterForChild(child); 3707 return marginAfterForChild(child);
3708 } 3708 }
3709 3709
3710 bool RenderBlock::hasMarginBeforeQuirk(const RenderBox* child) const 3710 bool RenderBlock::hasMarginBeforeQuirk(const LayoutBox* child) const
3711 { 3711 {
3712 // If the child has the same directionality as we do, then we can just retur n its 3712 // If the child has the same directionality as we do, then we can just retur n its
3713 // margin quirk. 3713 // margin quirk.
3714 if (!child->isWritingModeRoot()) 3714 if (!child->isWritingModeRoot())
3715 return child->isRenderBlock() ? toRenderBlock(child)->hasMarginBeforeQui rk() : child->style()->hasMarginBeforeQuirk(); 3715 return child->isRenderBlock() ? toRenderBlock(child)->hasMarginBeforeQui rk() : child->style()->hasMarginBeforeQuirk();
3716 3716
3717 // The child has a different directionality. If the child is parallel, then it's just 3717 // The child has a different directionality. If the child is parallel, then it's just
3718 // flipped relative to us. We can use the opposite edge. 3718 // flipped relative to us. We can use the opposite edge.
3719 if (child->isHorizontalWritingMode() == isHorizontalWritingMode()) 3719 if (child->isHorizontalWritingMode() == isHorizontalWritingMode())
3720 return child->isRenderBlock() ? toRenderBlock(child)->hasMarginAfterQuir k() : child->style()->hasMarginAfterQuirk(); 3720 return child->isRenderBlock() ? toRenderBlock(child)->hasMarginAfterQuir k() : child->style()->hasMarginAfterQuirk();
3721 3721
3722 // The child is perpendicular to us and box sides are never quirky in html.c ss, and we don't really care about 3722 // The child is perpendicular to us and box sides are never quirky in html.c ss, and we don't really care about
3723 // whether or not authors specified quirky ems, since they're an implementat ion detail. 3723 // whether or not authors specified quirky ems, since they're an implementat ion detail.
3724 return false; 3724 return false;
3725 } 3725 }
3726 3726
3727 bool RenderBlock::hasMarginAfterQuirk(const RenderBox* child) const 3727 bool RenderBlock::hasMarginAfterQuirk(const LayoutBox* child) const
3728 { 3728 {
3729 // If the child has the same directionality as we do, then we can just retur n its 3729 // If the child has the same directionality as we do, then we can just retur n its
3730 // margin quirk. 3730 // margin quirk.
3731 if (!child->isWritingModeRoot()) 3731 if (!child->isWritingModeRoot())
3732 return child->isRenderBlock() ? toRenderBlock(child)->hasMarginAfterQuir k() : child->style()->hasMarginAfterQuirk(); 3732 return child->isRenderBlock() ? toRenderBlock(child)->hasMarginAfterQuir k() : child->style()->hasMarginAfterQuirk();
3733 3733
3734 // The child has a different directionality. If the child is parallel, then it's just 3734 // The child has a different directionality. If the child is parallel, then it's just
3735 // flipped relative to us. We can use the opposite edge. 3735 // flipped relative to us. We can use the opposite edge.
3736 if (child->isHorizontalWritingMode() == isHorizontalWritingMode()) 3736 if (child->isHorizontalWritingMode() == isHorizontalWritingMode())
3737 return child->isRenderBlock() ? toRenderBlock(child)->hasMarginBeforeQui rk() : child->style()->hasMarginBeforeQuirk(); 3737 return child->isRenderBlock() ? toRenderBlock(child)->hasMarginBeforeQui rk() : child->style()->hasMarginBeforeQuirk();
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
3832 } 3832 }
3833 } 3833 }
3834 3834
3835 // FIXME: Glyph overflow will get lost in this case, but not really a bi g deal. 3835 // FIXME: Glyph overflow will get lost in this case, but not really a bi g deal.
3836 GlyphOverflowAndFallbackFontsMap textBoxDataMap; 3836 GlyphOverflowAndFallbackFontsMap textBoxDataMap;
3837 for (ListHashSet<RootInlineBox*>::const_iterator it = lineBoxes.begin(); it != lineBoxes.end(); ++it) { 3837 for (ListHashSet<RootInlineBox*>::const_iterator it = lineBoxes.begin(); it != lineBoxes.end(); ++it) {
3838 RootInlineBox* box = *it; 3838 RootInlineBox* box = *it;
3839 box->computeOverflow(box->lineTop(), box->lineBottom(), textBoxDataM ap); 3839 box->computeOverflow(box->lineTop(), box->lineBottom(), textBoxDataM ap);
3840 } 3840 }
3841 } else { 3841 } else {
3842 for (RenderBox* box = firstChildBox(); box; box = box->nextSiblingBox()) { 3842 for (LayoutBox* box = firstChildBox(); box; box = box->nextSiblingBox()) {
3843 if (recalcNormalFlowChildOverflowIfNeeded(box)) 3843 if (recalcNormalFlowChildOverflowIfNeeded(box))
3844 childrenOverflowChanged = true; 3844 childrenOverflowChanged = true;
3845 } 3845 }
3846 } 3846 }
3847 3847
3848 TrackedRendererListHashSet* positionedDescendants = positionedObjects(); 3848 TrackedRendererListHashSet* positionedDescendants = positionedObjects();
3849 if (!positionedDescendants) 3849 if (!positionedDescendants)
3850 return childrenOverflowChanged; 3850 return childrenOverflowChanged;
3851 3851
3852 TrackedRendererListHashSet::iterator end = positionedDescendants->end(); 3852 TrackedRendererListHashSet::iterator end = positionedDescendants->end();
3853 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin( ); it != end; ++it) { 3853 for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin( ); it != end; ++it) {
3854 RenderBox* box = *it; 3854 LayoutBox* box = *it;
3855 3855
3856 if (!box->needsOverflowRecalcAfterStyleChange()) 3856 if (!box->needsOverflowRecalcAfterStyleChange())
3857 continue; 3857 continue;
3858 RenderBlock* block = toRenderBlock(box); 3858 RenderBlock* block = toRenderBlock(box);
3859 if (!block->recalcOverflowAfterStyleChange() || box->style()->position() == FixedPosition) 3859 if (!block->recalcOverflowAfterStyleChange() || box->style()->position() == FixedPosition)
3860 continue; 3860 continue;
3861 3861
3862 childrenOverflowChanged = true; 3862 childrenOverflowChanged = true;
3863 } 3863 }
3864 return childrenOverflowChanged; 3864 return childrenOverflowChanged;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3912 3912
3913 #if ENABLE(ASSERT) 3913 #if ENABLE(ASSERT)
3914 void RenderBlock::checkPositionedObjectsNeedLayout() 3914 void RenderBlock::checkPositionedObjectsNeedLayout()
3915 { 3915 {
3916 if (!gPositionedDescendantsMap) 3916 if (!gPositionedDescendantsMap)
3917 return; 3917 return;
3918 3918
3919 if (TrackedRendererListHashSet* positionedDescendantSet = positionedObjects( )) { 3919 if (TrackedRendererListHashSet* positionedDescendantSet = positionedObjects( )) {
3920 TrackedRendererListHashSet::const_iterator end = positionedDescendantSet ->end(); 3920 TrackedRendererListHashSet::const_iterator end = positionedDescendantSet ->end();
3921 for (TrackedRendererListHashSet::const_iterator it = positionedDescendan tSet->begin(); it != end; ++it) { 3921 for (TrackedRendererListHashSet::const_iterator it = positionedDescendan tSet->begin(); it != end; ++it) {
3922 RenderBox* currBox = *it; 3922 LayoutBox* currBox = *it;
3923 ASSERT(!currBox->needsLayout()); 3923 ASSERT(!currBox->needsLayout());
3924 } 3924 }
3925 } 3925 }
3926 } 3926 }
3927 3927
3928 bool RenderBlock::paintsContinuationOutline(RenderInline* flow) 3928 bool RenderBlock::paintsContinuationOutline(RenderInline* flow)
3929 { 3929 {
3930 ContinuationOutlineTableMap* table = continuationOutlineTable(); 3930 ContinuationOutlineTableMap* table = continuationOutlineTable();
3931 if (table->isEmpty()) 3931 if (table->isEmpty())
3932 return false; 3932 return false;
(...skipping 12 matching lines...) Expand all
3945 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const 3945 void RenderBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const
3946 { 3946 {
3947 showLayoutObject(); 3947 showLayoutObject();
3948 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) 3948 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box())
3949 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); 3949 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1);
3950 } 3950 }
3951 3951
3952 #endif 3952 #endif
3953 3953
3954 } // namespace blink 3954 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderBlock.h ('k') | Source/core/rendering/RenderBlockFlow.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698