2009-02-02 Sam Weinig <sam@webkit.org>
[WebKit-https.git] / WebCore / rendering / RenderBlock.cpp
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2007 David Smith (catfish.man@gmail.com)
5  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include "config.h"
24 #include "RenderBlock.h"
25
26 #include "Document.h"
27 #include "Element.h"
28 #include "FloatQuad.h"
29 #include "Frame.h"
30 #include "FrameView.h"
31 #include "GraphicsContext.h"
32 #include "HTMLNames.h"
33 #include "HitTestResult.h"
34 #include "InlineTextBox.h"
35 #include "RenderImage.h"
36 #include "RenderInline.h"
37 #include "RenderMarquee.h"
38 #include "RenderReplica.h"
39 #include "RenderTableCell.h"
40 #include "RenderTextFragment.h"
41 #include "RenderTheme.h"
42 #include "RenderView.h"
43 #include "SelectionController.h"
44 #include <wtf/StdLibExtras.h>
45
46 using namespace std;
47 using namespace WTF;
48 using namespace Unicode;
49
50 namespace WebCore {
51
52 // Number of pixels to allow as a fudge factor when clicking above or below a line.
53 // clicking up to verticalLineClickFudgeFactor pixels above a line will correspond to the closest point on the line.   
54 const int verticalLineClickFudgeFactor= 3;
55
56 using namespace HTMLNames;
57
58 static void moveChild(RenderObject* to, RenderObjectChildList* toChildList, RenderObject* from, RenderObjectChildList* fromChildList, RenderObject* child)
59 {
60     ASSERT(from == child->parent());
61     toChildList->appendChildNode(to, fromChildList->removeChildNode(from, child, false), false);
62 }
63
64 struct ColumnInfo {
65     ColumnInfo()
66         : m_desiredColumnWidth(0)
67         , m_desiredColumnCount(1)
68         { }
69     int m_desiredColumnWidth;
70     unsigned m_desiredColumnCount;
71     Vector<IntRect> m_columnRects;
72 };
73
74 typedef WTF::HashMap<const RenderBox*, ColumnInfo*> ColumnInfoMap;
75 static ColumnInfoMap* gColumnInfoMap = 0;
76
77 typedef WTF::HashMap<const RenderBlock*, HashSet<RenderBox*>*> PercentHeightDescendantsMap;
78 static PercentHeightDescendantsMap* gPercentHeightDescendantsMap = 0;
79
80 typedef WTF::HashMap<const RenderBox*, HashSet<RenderBlock*>*> PercentHeightContainerMap;
81 static PercentHeightContainerMap* gPercentHeightContainerMap = 0;
82     
83 typedef WTF::HashMap<RenderBlock*, ListHashSet<RenderInline*>*> ContinuationOutlineTableMap;
84
85 // Our MarginInfo state used when laying out block children.
86 RenderBlock::MarginInfo::MarginInfo(RenderBlock* block, int top, int bottom)
87 {
88     // Whether or not we can collapse our own margins with our children.  We don't do this
89     // if we had any border/padding (obviously), if we're the root or HTML elements, or if
90     // we're positioned, floating, a table cell.
91     m_canCollapseWithChildren = !block->isRenderView() && !block->isRoot() && !block->isPositioned() &&
92         !block->isFloating() && !block->isTableCell() && !block->hasOverflowClip() && !block->isInlineBlockOrInlineTable();
93
94     m_canCollapseTopWithChildren = m_canCollapseWithChildren && (top == 0) && block->style()->marginTopCollapse() != MSEPARATE;
95
96     // If any height other than auto is specified in CSS, then we don't collapse our bottom
97     // margins with our children's margins.  To do otherwise would be to risk odd visual
98     // effects when the children overflow out of the parent block and yet still collapse
99     // with it.  We also don't collapse if we have any bottom border/padding.
100     m_canCollapseBottomWithChildren = m_canCollapseWithChildren && (bottom == 0) &&
101         (block->style()->height().isAuto() && block->style()->height().value() == 0) && block->style()->marginBottomCollapse() != MSEPARATE;
102     
103     m_quirkContainer = block->isTableCell() || block->isBody() || block->style()->marginTopCollapse() == MDISCARD || 
104         block->style()->marginBottomCollapse() == MDISCARD;
105
106     m_atTopOfBlock = true;
107     m_atBottomOfBlock = false;
108
109     m_posMargin = m_canCollapseTopWithChildren ? block->maxTopMargin(true) : 0;
110     m_negMargin = m_canCollapseTopWithChildren ? block->maxTopMargin(false) : 0;
111
112     m_selfCollapsingBlockClearedFloat = false;
113     
114     m_topQuirk = m_bottomQuirk = m_determinedTopQuirk = false;
115 }
116
117 // -------------------------------------------------------------------------------------------------------
118
119 RenderBlock::RenderBlock(Node* node)
120       : RenderContainer(node)
121       , m_floatingObjects(0)
122       , m_positionedObjects(0)
123       , m_inlineContinuation(0)
124       , m_maxMargin(0)
125       , m_overflowHeight(0)
126       , m_overflowWidth(0)
127       , m_overflowLeft(0)
128       , m_overflowTop(0)
129       , m_lineHeight(-1)
130 {
131     setChildrenInline(true);
132 }
133
134 RenderBlock::~RenderBlock()
135 {
136     delete m_floatingObjects;
137     delete m_positionedObjects;
138     delete m_maxMargin;
139     
140     if (hasColumns())
141         delete gColumnInfoMap->take(this);
142
143     if (gPercentHeightDescendantsMap) {
144         if (HashSet<RenderBox*>* descendantSet = gPercentHeightDescendantsMap->take(this)) {
145             HashSet<RenderBox*>::iterator end = descendantSet->end();
146             for (HashSet<RenderBox*>::iterator descendant = descendantSet->begin(); descendant != end; ++descendant) {
147                 HashSet<RenderBlock*>* containerSet = gPercentHeightContainerMap->get(*descendant);
148                 ASSERT(containerSet);
149                 if (!containerSet)
150                     continue;
151                 ASSERT(containerSet->contains(this));
152                 containerSet->remove(this);
153                 if (containerSet->isEmpty()) {
154                     gPercentHeightContainerMap->remove(*descendant);
155                     delete containerSet;
156                 }
157             }
158             delete descendantSet;
159         }
160     }
161 }
162
163 void RenderBlock::destroy()
164 {
165     // Detach our continuation first.
166     if (m_inlineContinuation)
167         m_inlineContinuation->destroy();
168     m_inlineContinuation = 0;
169     
170     // Make sure to destroy anonymous children first while they are still connected to the rest of the tree, so that they will
171     // properly dirty line boxes that they are removed from.  Effects that do :before/:after only on hover could crash otherwise.
172     children()->destroyLeftoverChildren();
173
174     if (!documentBeingDestroyed()) {
175         if (firstLineBox()) {
176             // We can't wait for RenderContainer::destroy to clear the selection,
177             // because by then we will have nuked the line boxes.
178             // FIXME: The SelectionController should be responsible for this when it
179             // is notified of DOM mutations.
180             if (isSelectionBorder())
181                 view()->clearSelection();
182
183             // If we are an anonymous block, then our line boxes might have children
184             // that will outlast this block. In the non-anonymous block case those
185             // children will be destroyed by the time we return from this function.
186             if (isAnonymousBlock()) {
187                 for (InlineFlowBox* box = firstLineBox(); box; box = box->nextFlowBox()) {
188                     while (InlineBox* childBox = box->firstChild())
189                         childBox->remove();
190                 }
191             }
192         } else if (isInline() && parent())
193             parent()->dirtyLinesFromChangedChild(this);
194     }
195
196     m_lineBoxes.deleteLineBoxes(renderArena());
197
198     RenderContainer::destroy();
199 }
200
201 void RenderBlock::styleWillChange(RenderStyle::Diff diff, const RenderStyle* newStyle)
202 {
203     setReplaced(newStyle->isDisplayReplacedType());
204     
205     if (style() && parent() && diff == RenderStyle::Layout && style()->position() != newStyle->position()) {
206         if (newStyle->position() == StaticPosition)
207             // Clear our positioned objects list. Our absolutely positioned descendants will be
208             // inserted into our containing block's positioned objects list during layout.
209             removePositionedObjects(0);
210         else if (style()->position() == StaticPosition) {
211             // Remove our absolutely positioned descendants from their current containing block.
212             // They will be inserted into our positioned objects list during layout.
213             RenderObject* cb = parent();
214             while (cb && (cb->style()->position() == StaticPosition || (cb->isInline() && !cb->isReplaced())) && !cb->isRenderView()) {
215                 if (cb->style()->position() == RelativePosition && cb->isInline() && !cb->isReplaced()) {
216                     cb = cb->containingBlock();
217                     break;
218                 }
219                 cb = cb->parent();
220             }
221             
222             if (cb->isRenderBlock())
223                 toRenderBlock(cb)->removePositionedObjects(this);
224         }
225     }
226
227     RenderContainer::styleWillChange(diff, newStyle);
228 }
229
230 void RenderBlock::styleDidChange(RenderStyle::Diff diff, const RenderStyle* oldStyle)
231 {
232     RenderContainer::styleDidChange(diff, oldStyle);
233
234     // FIXME: We could save this call when the change only affected non-inherited properties
235     for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
236         if (child->isAnonymousBlock()) {
237             RefPtr<RenderStyle> newStyle = RenderStyle::create();
238             newStyle->inheritFrom(style());
239             newStyle->setDisplay(BLOCK);
240             child->setStyle(newStyle.release());
241         }
242     }
243
244     m_lineHeight = -1;
245
246     // Update pseudos for :before and :after now.
247     if (!isAnonymous() && document()->usesBeforeAfterRules() && canHaveChildren()) {
248         updateBeforeAfterContent(RenderStyle::BEFORE);
249         updateBeforeAfterContent(RenderStyle::AFTER);
250     }
251     updateFirstLetter();
252 }
253
254 void RenderBlock::updateBeforeAfterContent(RenderStyle::PseudoId pseudoId)
255 {
256     // If this is an anonymous wrapper, then the parent applies its own pseudo-element style to it.
257     if (parent() && parent()->createsAnonymousWrapper())
258         return;
259     return children()->updateBeforeAfterContent(this, pseudoId);
260 }
261     
262 void RenderBlock::addChild(RenderObject* newChild, RenderObject* beforeChild)
263 {
264     // Make sure we don't append things after :after-generated content if we have it.
265     if (!beforeChild && isAfterContent(lastChild()))
266         beforeChild = lastChild();
267
268     bool madeBoxesNonInline = false;
269
270     // If the requested beforeChild is not one of our children, then this is because
271     // there is an anonymous container within this object that contains the beforeChild.
272     if (beforeChild && beforeChild->parent() != this) {
273         RenderObject* anonymousChild = beforeChild->parent();
274         ASSERT(anonymousChild);
275
276         while (anonymousChild->parent() != this)
277             anonymousChild = anonymousChild->parent();
278
279         ASSERT(anonymousChild->isAnonymous());
280
281         if (anonymousChild->isAnonymousBlock()) {
282             // Insert the child into the anonymous block box instead of here.
283             if (newChild->isInline() || beforeChild->parent()->firstChild() != beforeChild)
284                 beforeChild->parent()->addChild(newChild, beforeChild);
285             else
286                 addChild(newChild, beforeChild->parent());
287             return;
288         }
289
290         ASSERT(anonymousChild->isTable());
291         if (newChild->isTableCol() && newChild->style()->display() == TABLE_COLUMN_GROUP
292                 || newChild->isRenderBlock() && newChild->style()->display() == TABLE_CAPTION
293                 || newChild->isTableSection()
294                 || newChild->isTableRow()
295                 || newChild->isTableCell()) {
296             // Insert into the anonymous table.
297             anonymousChild->addChild(newChild, beforeChild);
298             return;
299         }
300
301         // Go on to insert before the anonymous table.
302         beforeChild = anonymousChild;
303     }
304
305     // A block has to either have all of its children inline, or all of its children as blocks.
306     // So, if our children are currently inline and a block child has to be inserted, we move all our
307     // inline children into anonymous block boxes.
308     if (childrenInline() && !newChild->isInline() && !newChild->isFloatingOrPositioned()) {
309         // This is a block with inline content. Wrap the inline content in anonymous blocks.
310         makeChildrenNonInline(beforeChild);
311         madeBoxesNonInline = true;
312
313         if (beforeChild && beforeChild->parent() != this) {
314             beforeChild = beforeChild->parent();
315             ASSERT(beforeChild->isAnonymousBlock());
316             ASSERT(beforeChild->parent() == this);
317         }
318     } else if (!childrenInline() && (newChild->isFloatingOrPositioned() || newChild->isInline())) {
319         // If we're inserting an inline child but all of our children are blocks, then we have to make sure
320         // it is put into an anomyous block box. We try to use an existing anonymous box if possible, otherwise
321         // a new one is created and inserted into our list of children in the appropriate position.
322         RenderObject* afterChild = beforeChild ? beforeChild->previousSibling() : lastChild();
323
324         if (afterChild && afterChild->isAnonymousBlock()) {
325             afterChild->addChild(newChild);
326             return;
327         }
328
329         if (newChild->isInline()) {
330             // No suitable existing anonymous box - create a new one.
331             RenderBlock* newBox = createAnonymousBlock();
332             RenderContainer::addChild(newBox, beforeChild);
333             newBox->addChild(newChild);
334             return;
335         }
336     }
337
338     RenderContainer::addChild(newChild, beforeChild);
339
340     if (madeBoxesNonInline && parent() && isAnonymousBlock() && parent()->isRenderBlock())
341         toRenderBlock(parent())->removeLeftoverAnonymousBlock(this);
342     // this object may be dead here
343 }
344
345 static void getInlineRun(RenderObject* start, RenderObject* boundary,
346                          RenderObject*& inlineRunStart,
347                          RenderObject*& inlineRunEnd)
348 {
349     // Beginning at |start| we find the largest contiguous run of inlines that
350     // we can.  We denote the run with start and end points, |inlineRunStart|
351     // and |inlineRunEnd|.  Note that these two values may be the same if
352     // we encounter only one inline.
353     //
354     // We skip any non-inlines we encounter as long as we haven't found any
355     // inlines yet.
356     //
357     // |boundary| indicates a non-inclusive boundary point.  Regardless of whether |boundary|
358     // is inline or not, we will not include it in a run with inlines before it.  It's as though we encountered
359     // a non-inline.
360     
361     // Start by skipping as many non-inlines as we can.
362     RenderObject * curr = start;
363     bool sawInline;
364     do {
365         while (curr && !(curr->isInline() || curr->isFloatingOrPositioned()))
366             curr = curr->nextSibling();
367         
368         inlineRunStart = inlineRunEnd = curr;
369         
370         if (!curr)
371             return; // No more inline children to be found.
372         
373         sawInline = curr->isInline();
374         
375         curr = curr->nextSibling();
376         while (curr && (curr->isInline() || curr->isFloatingOrPositioned()) && (curr != boundary)) {
377             inlineRunEnd = curr;
378             if (curr->isInline())
379                 sawInline = true;
380             curr = curr->nextSibling();
381         }
382     } while (!sawInline);
383 }
384
385 void RenderBlock::deleteLineBoxTree()
386 {
387     m_lineBoxes.deleteLineBoxTree(renderArena());
388 }
389
390 void RenderBlock::dirtyLineBoxes(bool fullLayout, bool isRootLineBox)
391 {
392     if (!isRootLineBox && isReplaced())
393         return RenderContainer::dirtyLineBoxes(fullLayout, isRootLineBox);
394
395     if (fullLayout)
396         m_lineBoxes.deleteLineBoxes(renderArena());
397     else
398         m_lineBoxes.dirtyLineBoxes();
399 }
400
401 InlineBox* RenderBlock::createInlineBox(bool makePlaceHolderBox, bool isRootLineBox, bool /*isOnlyRun*/)
402 {
403     if (!isRootLineBox && (isReplaced() || makePlaceHolderBox))                     // Inline tables and inline blocks
404         return RenderContainer::createInlineBox(false, isRootLineBox);              // (or positioned element placeholders).
405     InlineFlowBox* flowBox = new (renderArena()) RootInlineBox(this);
406     m_lineBoxes.appendLineBox(flowBox);
407     return flowBox;
408 }
409
410 void RenderBlock::makeChildrenNonInline(RenderObject *insertionPoint)
411 {    
412     // makeChildrenNonInline takes a block whose children are *all* inline and it
413     // makes sure that inline children are coalesced under anonymous
414     // blocks.  If |insertionPoint| is defined, then it represents the insertion point for
415     // the new block child that is causing us to have to wrap all the inlines.  This
416     // means that we cannot coalesce inlines before |insertionPoint| with inlines following
417     // |insertionPoint|, because the new child is going to be inserted in between the inlines,
418     // splitting them.
419     ASSERT(isInlineBlockOrInlineTable() || !isInline());
420     ASSERT(!insertionPoint || insertionPoint->parent() == this);
421
422     setChildrenInline(false);
423
424     RenderObject *child = firstChild();
425     if (!child)
426         return;
427
428     deleteLineBoxTree();
429
430     while (child) {
431         RenderObject *inlineRunStart, *inlineRunEnd;
432         getInlineRun(child, insertionPoint, inlineRunStart, inlineRunEnd);
433
434         if (!inlineRunStart)
435             break;
436
437         child = inlineRunEnd->nextSibling();
438
439         RenderBlock* block = createAnonymousBlock();
440         children()->insertChildNode(this, block, inlineRunStart);
441         RenderObject* o = inlineRunStart;
442         while (o != inlineRunEnd) {
443             RenderObject* no = o;
444             o = no->nextSibling();
445             
446             moveChild(block, block->children(), this, children(), no);
447         }
448         moveChild(block, block->children(), this, children(), inlineRunEnd);
449     }
450
451 #ifndef NDEBUG
452     for (RenderObject *c = firstChild(); c; c = c->nextSibling())
453         ASSERT(!c->isInline());
454 #endif
455
456     repaint();
457 }
458
459 void RenderBlock::removeLeftoverAnonymousBlock(RenderBlock* child)
460 {
461     ASSERT(child->isAnonymousBlock());
462     ASSERT(!child->childrenInline());
463     
464     if (child->inlineContinuation()) 
465         return;
466     
467     RenderObject* firstAnChild = child->m_children.firstChild();
468     RenderObject* lastAnChild = child->m_children.lastChild();
469     if (firstAnChild) {
470         RenderObject* o = firstAnChild;
471         while (o) {
472             o->setParent(this);
473             o = o->nextSibling();
474         }
475         firstAnChild->setPreviousSibling(child->previousSibling());
476         lastAnChild->setNextSibling(child->nextSibling());
477         if (child->previousSibling())
478             child->previousSibling()->setNextSibling(firstAnChild);
479         if (child->nextSibling())
480             child->nextSibling()->setPreviousSibling(lastAnChild);
481     } else {
482         if (child->previousSibling())
483             child->previousSibling()->setNextSibling(child->nextSibling());
484         if (child->nextSibling())
485             child->nextSibling()->setPreviousSibling(child->previousSibling());
486     }
487     if (child == m_children.firstChild())
488         m_children.setFirstChild(firstAnChild);
489     if (child == m_children.lastChild())
490         m_children.setLastChild(lastAnChild);
491     child->setParent(0);
492     child->setPreviousSibling(0);
493     child->setNextSibling(0);
494     
495     child->children()->setFirstChild(0);
496     child->m_next = 0;
497
498     child->destroy();
499 }
500
501 void RenderBlock::removeChild(RenderObject* oldChild)
502 {
503     // If this child is a block, and if our previous and next siblings are
504     // both anonymous blocks with inline content, then we can go ahead and
505     // fold the inline content back together.
506     RenderObject* prev = oldChild->previousSibling();
507     RenderObject* next = oldChild->nextSibling();
508     bool canDeleteAnonymousBlocks = !documentBeingDestroyed() && !isInline() && !oldChild->isInline() && 
509                                     (!oldChild->isRenderBlock() || !toRenderBlock(oldChild)->inlineContinuation()) && 
510                                     (!prev || (prev->isAnonymousBlock() && prev->childrenInline())) &&
511                                     (!next || (next->isAnonymousBlock() && next->childrenInline()));
512     if (canDeleteAnonymousBlocks && prev && next) {
513         // Take all the children out of the |next| block and put them in
514         // the |prev| block.
515         prev->setNeedsLayoutAndPrefWidthsRecalc();
516         RenderObject* o = next->firstChild();
517     
518         RenderBlock* nextBlock = toRenderBlock(next);
519         RenderBlock* prevBlock = toRenderBlock(prev);
520         while (o) {
521             RenderObject* no = o;
522             o = no->nextSibling();
523             moveChild(prevBlock, prevBlock->children(), nextBlock, nextBlock->children(), no);
524         }
525  
526         nextBlock->deleteLineBoxTree();
527         
528         // Nuke the now-empty block.
529         next->destroy();
530     }
531
532     RenderContainer::removeChild(oldChild);
533
534     RenderObject* child = prev ? prev : next;
535     if (canDeleteAnonymousBlocks && child && !child->previousSibling() && !child->nextSibling() && !isFlexibleBox()) {
536         // The removal has knocked us down to containing only a single anonymous
537         // box.  We can go ahead and pull the content right back up into our
538         // box.
539         setNeedsLayoutAndPrefWidthsRecalc();
540         RenderBlock* anonBlock = toRenderBlock(children()->removeChildNode(this, child, false));
541         setChildrenInline(true);
542         RenderObject* o = anonBlock->firstChild();
543         while (o) {
544             RenderObject* no = o;
545             o = no->nextSibling();
546             moveChild(this, children(), anonBlock, anonBlock->children(), no);
547         }
548
549         // Delete the now-empty block's lines and nuke it.
550         anonBlock->deleteLineBoxTree();
551         anonBlock->destroy();
552     }
553 }
554
555 int RenderBlock::overflowHeight(bool includeInterior) const
556 {
557     if (!includeInterior && hasOverflowClip()) {
558         int shadowHeight = 0;
559         for (ShadowData* boxShadow = style()->boxShadow(); boxShadow; boxShadow = boxShadow->next)
560             shadowHeight = max(boxShadow->y + boxShadow->blur, shadowHeight);
561         int inflatedHeight = height() + shadowHeight;
562         if (hasReflection())
563             inflatedHeight = max(inflatedHeight, reflectionBox().bottom());
564         return inflatedHeight;
565     }
566     return m_overflowHeight;
567 }
568
569 int RenderBlock::overflowWidth(bool includeInterior) const
570 {
571     if (!includeInterior && hasOverflowClip()) {
572         int shadowWidth = 0;
573         for (ShadowData* boxShadow = style()->boxShadow(); boxShadow; boxShadow = boxShadow->next)
574             shadowWidth = max(boxShadow->x + boxShadow->blur, shadowWidth);
575         int inflatedWidth = width() + shadowWidth;
576         if (hasReflection())
577             inflatedWidth = max(inflatedWidth, reflectionBox().right());
578         return inflatedWidth;
579     }
580     return m_overflowWidth;
581 }
582
583 int RenderBlock::overflowLeft(bool includeInterior) const
584 {
585     if (!includeInterior && hasOverflowClip()) {
586         int shadowLeft = 0;
587         for (ShadowData* boxShadow = style()->boxShadow(); boxShadow; boxShadow = boxShadow->next)
588             shadowLeft = min(boxShadow->x - boxShadow->blur, shadowLeft);
589         int left = shadowLeft;
590         if (hasReflection())
591             left = min(left, reflectionBox().x());
592         return left;
593     }
594     return m_overflowLeft;
595 }
596
597 int RenderBlock::overflowTop(bool includeInterior) const
598 {
599     if (!includeInterior && hasOverflowClip()) {
600         int shadowTop = 0;
601         for (ShadowData* boxShadow = style()->boxShadow(); boxShadow; boxShadow = boxShadow->next)
602             shadowTop = min(boxShadow->y - boxShadow->blur, shadowTop);
603         int top = shadowTop;
604         if (hasReflection())
605             top = min(top, reflectionBox().y());
606         return top;
607     }
608     return m_overflowTop;
609 }
610
611 IntRect RenderBlock::overflowRect(bool includeInterior) const
612 {
613     if (!includeInterior && hasOverflowClip()) {
614         IntRect box = borderBoxRect();
615         int shadowLeft = 0;
616         int shadowRight = 0;
617         int shadowTop = 0;
618         int shadowBottom = 0;
619
620         for (ShadowData* boxShadow = style()->boxShadow(); boxShadow; boxShadow = boxShadow->next) {
621             shadowLeft = min(boxShadow->x - boxShadow->blur, shadowLeft);
622             shadowRight = max(boxShadow->x + boxShadow->blur, shadowRight);
623             shadowTop = min(boxShadow->y - boxShadow->blur, shadowTop);
624             shadowBottom = max(boxShadow->y + boxShadow->blur, shadowBottom);
625         }
626
627         box.move(shadowLeft, shadowTop);
628         box.setWidth(box.width() - shadowLeft + shadowRight);
629         box.setHeight(box.height() - shadowTop + shadowBottom);
630
631         if (hasReflection()) {
632             IntRect reflection(reflectionBox());
633             int reflectTop = min(box.y(), reflection.y());
634             int reflectBottom = max(box.bottom(), reflection.bottom());
635             box.setHeight(reflectBottom - reflectTop);
636             box.setY(reflectTop);
637             
638             int reflectLeft = min(box.x(), reflection.x());
639             int reflectRight = max(box.right(), reflection.right());
640             box.setWidth(reflectRight - reflectLeft);
641             box.setX(reflectLeft);
642         }
643         return box;
644     }
645
646     if (!includeInterior && hasOverflowClip())
647         return borderBoxRect();
648     int l = overflowLeft(includeInterior);
649     int t = overflowTop(includeInterior);
650     return IntRect(l, t, overflowWidth(includeInterior) - l, max(overflowHeight(includeInterior), height()) - t);
651 }
652
653 bool RenderBlock::isSelfCollapsingBlock() const
654 {
655     // We are not self-collapsing if we
656     // (a) have a non-zero height according to layout (an optimization to avoid wasting time)
657     // (b) are a table,
658     // (c) have border/padding,
659     // (d) have a min-height
660     // (e) have specified that one of our margins can't collapse using a CSS extension
661     if (height() > 0 ||
662         isTable() || (borderBottom() + paddingBottom() + borderTop() + paddingTop()) != 0 ||
663         style()->minHeight().isPositive() || 
664         style()->marginTopCollapse() == MSEPARATE || style()->marginBottomCollapse() == MSEPARATE)
665         return false;
666
667     bool hasAutoHeight = style()->height().isAuto();
668     if (style()->height().isPercent() && !style()->htmlHacks()) {
669         hasAutoHeight = true;
670         for (RenderBlock* cb = containingBlock(); !cb->isRenderView(); cb = cb->containingBlock()) {
671             if (cb->style()->height().isFixed() || cb->isTableCell())
672                 hasAutoHeight = false;
673         }
674     }
675
676     // If the height is 0 or auto, then whether or not we are a self-collapsing block depends
677     // on whether we have content that is all self-collapsing or not.
678     if (hasAutoHeight || ((style()->height().isFixed() || style()->height().isPercent()) && style()->height().isZero())) {
679         // If the block has inline children, see if we generated any line boxes.  If we have any
680         // line boxes, then we can't be self-collapsing, since we have content.
681         if (childrenInline())
682             return !firstLineBox();
683         
684         // Whether or not we collapse is dependent on whether all our normal flow children
685         // are also self-collapsing.
686         for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {
687             if (child->isFloatingOrPositioned())
688                 continue;
689             if (!child->isSelfCollapsingBlock())
690                 return false;
691         }
692         return true;
693     }
694     return false;
695 }
696
697 void RenderBlock::layout()
698 {
699     // Update our first letter info now.
700     updateFirstLetter();
701
702     // Table cells call layoutBlock directly, so don't add any logic here.  Put code into
703     // layoutBlock().
704     layoutBlock(false);
705     
706     // It's safe to check for control clip here, since controls can never be table cells.
707     if (hasControlClip()) {
708         // Because of the lightweight clip, there can never be any overflow from children.
709         m_overflowWidth = width();
710         m_overflowHeight = height();
711         m_overflowLeft = 0;
712         m_overflowTop = 0;
713     }
714 }
715
716 void RenderBlock::layoutBlock(bool relayoutChildren)
717 {
718     ASSERT(needsLayout());
719
720     if (isInline() && !isInlineBlockOrInlineTable()) // Inline <form>s inside various table elements can
721         return;                                      // cause us to come in here.  Just bail.
722
723     if (!relayoutChildren && layoutOnlyPositionedObjects())
724         return;
725
726     LayoutRepainter repainter(*this, m_everHadLayout && checkForRepaintDuringLayout());
727     LayoutStateMaintainer statePusher(view(), this, IntSize(x(), y()), hasColumns() || hasTransform() || hasReflection());
728
729     int oldWidth = width();
730     int oldColumnWidth = desiredColumnWidth();
731
732     calcWidth();
733     calcColumnWidth();
734
735     m_overflowWidth = width();
736     m_overflowLeft = 0;
737
738     if (oldWidth != width() || oldColumnWidth != desiredColumnWidth())
739         relayoutChildren = true;
740
741     clearFloats();
742
743     int previousHeight = height();
744     setHeight(0);
745
746     m_overflowHeight = 0;
747
748     // We use four values, maxTopPos, maxPosNeg, maxBottomPos, and maxBottomNeg, to track
749     // our current maximal positive and negative margins.  These values are used when we
750     // are collapsed with adjacent blocks, so for example, if you have block A and B
751     // collapsing together, then you'd take the maximal positive margin from both A and B
752     // and subtract it from the maximal negative margin from both A and B to get the
753     // true collapsed margin.  This algorithm is recursive, so when we finish layout()
754     // our block knows its current maximal positive/negative values.
755     //
756     // Start out by setting our margin values to our current margins.  Table cells have
757     // no margins, so we don't fill in the values for table cells.
758     bool isCell = isTableCell();
759     if (!isCell) {
760         initMaxMarginValues();
761
762         setTopMarginQuirk(style()->marginTop().quirk());
763         setBottomMarginQuirk(style()->marginBottom().quirk());
764
765         Node* node = element();
766         if (node && node->hasTagName(formTag) && static_cast<HTMLFormElement*>(node)->isMalformed()) {
767             // See if this form is malformed (i.e., unclosed). If so, don't give the form
768             // a bottom margin.
769             setMaxBottomMargins(0, 0);
770         }
771     }
772
773     // For overflow:scroll blocks, ensure we have both scrollbars in place always.
774     if (scrollsOverflow()) {
775         if (style()->overflowX() == OSCROLL)
776             m_layer->setHasHorizontalScrollbar(true);
777         if (style()->overflowY() == OSCROLL)
778             m_layer->setHasVerticalScrollbar(true);
779     }
780
781     int repaintTop = 0;
782     int repaintBottom = 0;
783     int maxFloatBottom = 0;
784     if (childrenInline())
785         layoutInlineChildren(relayoutChildren, repaintTop, repaintBottom);
786     else
787         layoutBlockChildren(relayoutChildren, maxFloatBottom);
788
789     // Expand our intrinsic height to encompass floats.
790     int toAdd = borderBottom() + paddingBottom() + horizontalScrollbarHeight();
791     if (floatBottom() > (height() - toAdd) && expandsToEncloseOverhangingFloats())
792         setHeight(floatBottom() + toAdd);
793     
794     // Now lay out our columns within this intrinsic height, since they can slightly affect the intrinsic height as
795     // we adjust for clean column breaks.
796     int singleColumnBottom = layoutColumns();
797
798     // Calculate our new height.
799     int oldHeight = height();
800     calcHeight();
801     if (oldHeight != height()) {
802         if (oldHeight > height() && maxFloatBottom > height() && !childrenInline()) {
803             // One of our children's floats may have become an overhanging float for us. We need to look for it.
804             for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
805                 if (child->isBlockFlow() && !child->isFloatingOrPositioned()) {
806                     RenderBlock* block = toRenderBlock(child);
807                     if (block->floatBottom() + block->y() > height())
808                         addOverhangingFloats(block, -block->x(), -block->y(), false);
809                 }
810             }
811         }
812         // We have to rebalance columns to the new height.
813         layoutColumns(singleColumnBottom);
814
815         // If the block got expanded in size, then increase our overflowheight to match.
816         if (m_overflowHeight > height())
817             m_overflowHeight -= toAdd;
818         if (m_overflowHeight < height())
819             m_overflowHeight = height();
820     }
821     if (previousHeight != height())
822         relayoutChildren = true;
823
824     if ((isCell || isInline() || isFloatingOrPositioned() || isRoot()) && !hasOverflowClip() && !hasControlClip())
825         addVisualOverflow(floatRect());
826
827     layoutPositionedObjects(relayoutChildren || isRoot());
828
829     positionListMarker();
830
831     // Always ensure our overflow width/height are at least as large as our width/height.
832     m_overflowWidth = max(m_overflowWidth, width());
833     m_overflowHeight = max(m_overflowHeight, height());
834
835     if (!hasOverflowClip()) {
836         for (ShadowData* boxShadow = style()->boxShadow(); boxShadow; boxShadow = boxShadow->next) {
837             m_overflowLeft = min(m_overflowLeft, boxShadow->x - boxShadow->blur);
838             m_overflowWidth = max(m_overflowWidth, width() + boxShadow->x + boxShadow->blur);
839             m_overflowTop = min(m_overflowTop, boxShadow->y - boxShadow->blur);
840             m_overflowHeight = max(m_overflowHeight, height() + boxShadow->y + boxShadow->blur);
841         }
842         
843         if (hasReflection()) {
844             m_overflowTop = min(m_overflowTop, reflectionBox().y());
845             m_overflowHeight = max(m_overflowHeight, reflectionBox().bottom());
846         }
847     }
848
849     statePusher.pop();
850
851     // Update our scroll information if we're overflow:auto/scroll/hidden now that we know if
852     // we overflow or not.
853     if (hasOverflowClip())
854         m_layer->updateScrollInfoAfterLayout();
855
856     // Repaint with our new bounds if they are different from our old bounds.
857     bool didFullRepaint = repainter.repaintAfterLayout();
858     if (!didFullRepaint && repaintTop != repaintBottom && (style()->visibility() == VISIBLE || enclosingLayer()->hasVisibleContent())) {
859         IntRect repaintRect(m_overflowLeft, repaintTop, m_overflowWidth - m_overflowLeft, repaintBottom - repaintTop);
860
861         // FIXME: Deal with multiple column repainting.  We have to split the repaint
862         // rect up into multiple rects if it spans columns.
863
864         repaintRect.inflate(maximalOutlineSize(PaintPhaseOutline));
865         
866         if (hasOverflowClip()) {
867             // Adjust repaint rect for scroll offset
868             int x = repaintRect.x();
869             int y = repaintRect.y();
870             layer()->subtractScrolledContentOffset(x, y);
871             repaintRect.setX(x);
872             repaintRect.setY(y);
873
874             // Don't allow this rect to spill out of our overflow box.
875             repaintRect.intersect(IntRect(0, 0, width(), height()));
876         }
877
878         // Make sure the rect is still non-empty after intersecting for overflow above
879         if (!repaintRect.isEmpty()) {
880             repaintRectangle(repaintRect); // We need to do a partial repaint of our content.
881             if (hasReflection())
882                 layer()->reflection()->repaintRectangle(repaintRect);
883         }
884     }
885     setNeedsLayout(false);
886 }
887
888 bool RenderBlock::expandsToEncloseOverhangingFloats() const
889 {
890     return isInlineBlockOrInlineTable() || isFloatingOrPositioned() || hasOverflowClip() || (parent() && parent()->isFlexibleBox()) || hasColumns() || isTableCell() || isFieldset();
891 }
892
893 void RenderBlock::adjustPositionedBlock(RenderBox* child, const MarginInfo& marginInfo)
894 {
895     if (child->hasStaticX()) {
896         if (style()->direction() == LTR)
897             child->setStaticX(borderLeft() + paddingLeft());
898         else
899             child->setStaticX(borderRight() + paddingRight());
900     }
901
902     if (child->hasStaticY()) {
903         int y = height();
904         if (!marginInfo.canCollapseWithTop()) {
905             child->calcVerticalMargins();
906             int marginTop = child->marginTop();
907             int collapsedTopPos = marginInfo.posMargin();
908             int collapsedTopNeg = marginInfo.negMargin();
909             if (marginTop > 0) {
910                 if (marginTop > collapsedTopPos)
911                     collapsedTopPos = marginTop;
912             } else {
913                 if (-marginTop > collapsedTopNeg)
914                     collapsedTopNeg = -marginTop;
915             }
916             y += (collapsedTopPos - collapsedTopNeg) - marginTop;
917         }
918         child->setStaticY(y);
919     }
920 }
921
922 void RenderBlock::adjustFloatingBlock(const MarginInfo& marginInfo)
923 {
924     // The float should be positioned taking into account the bottom margin
925     // of the previous flow.  We add that margin into the height, get the
926     // float positioned properly, and then subtract the margin out of the
927     // height again.  In the case of self-collapsing blocks, we always just
928     // use the top margins, since the self-collapsing block collapsed its
929     // own bottom margin into its top margin.
930     //
931     // Note also that the previous flow may collapse its margin into the top of
932     // our block.  If this is the case, then we do not add the margin in to our
933     // height when computing the position of the float.   This condition can be tested
934     // for by simply calling canCollapseWithTop.  See
935     // http://www.hixie.ch/tests/adhoc/css/box/block/margin-collapse/046.html for
936     // an example of this scenario.
937     int marginOffset = marginInfo.canCollapseWithTop() ? 0 : marginInfo.margin();
938     setHeight(height() + marginOffset);
939     positionNewFloats();
940     setHeight(height() - marginOffset);
941 }
942
943 RenderBox* RenderBlock::handleSpecialChild(RenderBox* child, const MarginInfo& marginInfo, bool& handled)
944 {
945     // Handle positioned children first.
946     RenderBox* next = handlePositionedChild(child, marginInfo, handled);
947     if (handled) return next;
948     
949     // Handle floating children next.
950     next = handleFloatingChild(child, marginInfo, handled);
951     if (handled) return next;
952
953     // Finally, see if we have a run-in element.
954     return handleRunInChild(child, handled);
955 }
956
957
958 RenderBox* RenderBlock::handlePositionedChild(RenderBox* child, const MarginInfo& marginInfo, bool& handled)
959 {
960     if (child->isPositioned()) {
961         handled = true;
962         child->containingBlock()->insertPositionedObject(child);
963         adjustPositionedBlock(child, marginInfo);
964         return child->nextSiblingBox();
965     }
966
967     return 0;
968 }
969
970 RenderBox* RenderBlock::handleFloatingChild(RenderBox* child, const MarginInfo& marginInfo, bool& handled)
971 {
972     if (child->isFloating()) {
973         handled = true;
974         insertFloatingObject(child);
975         adjustFloatingBlock(marginInfo);
976         return child->nextSiblingBox();
977     }
978     
979     return 0;
980 }
981
982 RenderBox* RenderBlock::handleRunInChild(RenderBox* child, bool& handled)
983 {
984     // See if we have a run-in element with inline children.  If the
985     // children aren't inline, then just treat the run-in as a normal
986     // block.
987     if (child->isRunIn() && (child->childrenInline() || child->isReplaced())) {
988         RenderBlock* blockRunIn = toRenderBlock(child);
989         // Get the next non-positioned/non-floating RenderBlock.
990         RenderObject* curr = blockRunIn->nextSibling();
991         while (curr && curr->isFloatingOrPositioned())
992             curr = curr->nextSibling();
993         if (curr && (curr->isRenderBlock() && curr->childrenInline() && !curr->isRunIn())) {
994             RenderBlock* currBlock = toRenderBlock(curr);
995         
996             // The block acts like an inline, so just null out its
997             // position.
998             handled = true;
999             
1000             // Remove the old child.
1001             RenderBox* next = blockRunIn->nextSiblingBox();
1002             children()->removeChildNode(this, blockRunIn);
1003
1004             // Create an inline.
1005             RenderInline* inlineRunIn = new (renderArena()) RenderInline(blockRunIn->node());
1006             inlineRunIn->setStyle(blockRunIn->style());
1007
1008             // Move the nodes from the old child to the new child.
1009             for (RenderObject* runInChild = blockRunIn->firstChild(); runInChild; runInChild = runInChild->nextSibling())
1010                 moveChild(inlineRunIn, inlineRunIn->children(), blockRunIn, blockRunIn->children(), runInChild);
1011
1012             // Now insert the new child under |currBlock|.
1013             currBlock->children()->insertChildNode(currBlock, inlineRunIn, currBlock->firstChild());
1014             
1015             // If the run-in had an element, we need to set the new renderer.
1016             if (blockRunIn->element())
1017                 blockRunIn->element()->setRenderer(inlineRunIn);
1018             
1019             // Destroy the block run-in.
1020             blockRunIn->destroy();
1021
1022             return next;
1023         }
1024     }
1025     return 0;
1026 }
1027
1028 void RenderBlock::collapseMargins(RenderBox* child, MarginInfo& marginInfo, int yPosEstimate)
1029 {
1030     // Get our max pos and neg top margins.
1031     int posTop = child->maxTopMargin(true);
1032     int negTop = child->maxTopMargin(false);
1033
1034     // For self-collapsing blocks, collapse our bottom margins into our
1035     // top to get new posTop and negTop values.
1036     if (child->isSelfCollapsingBlock()) {
1037         posTop = max(posTop, child->maxBottomMargin(true));
1038         negTop = max(negTop, child->maxBottomMargin(false));
1039     }
1040     
1041     // See if the top margin is quirky. We only care if this child has
1042     // margins that will collapse with us.
1043     bool topQuirk = child->isTopMarginQuirk() || style()->marginTopCollapse() == MDISCARD;
1044
1045     if (marginInfo.canCollapseWithTop()) {
1046         // This child is collapsing with the top of the
1047         // block.  If it has larger margin values, then we need to update
1048         // our own maximal values.
1049         if (!style()->htmlHacks() || !marginInfo.quirkContainer() || !topQuirk)
1050             setMaxTopMargins(max(posTop, maxTopPosMargin()), max(negTop, maxTopNegMargin()));
1051
1052         // The minute any of the margins involved isn't a quirk, don't
1053         // collapse it away, even if the margin is smaller (www.webreference.com
1054         // has an example of this, a <dt> with 0.8em author-specified inside
1055         // a <dl> inside a <td>.
1056         if (!marginInfo.determinedTopQuirk() && !topQuirk && (posTop-negTop)) {
1057             setTopMarginQuirk(false);
1058             marginInfo.setDeterminedTopQuirk(true);
1059         }
1060
1061         if (!marginInfo.determinedTopQuirk() && topQuirk && marginTop() == 0)
1062             // We have no top margin and our top child has a quirky margin.
1063             // We will pick up this quirky margin and pass it through.
1064             // This deals with the <td><div><p> case.
1065             // Don't do this for a block that split two inlines though.  You do
1066             // still apply margins in this case.
1067             setTopMarginQuirk(true);
1068     }
1069
1070     if (marginInfo.quirkContainer() && marginInfo.atTopOfBlock() && (posTop - negTop))
1071         marginInfo.setTopQuirk(topQuirk);
1072
1073     int ypos = height();
1074     if (child->isSelfCollapsingBlock()) {
1075         // This child has no height.  We need to compute our
1076         // position before we collapse the child's margins together,
1077         // so that we can get an accurate position for the zero-height block.
1078         int collapsedTopPos = max(marginInfo.posMargin(), child->maxTopMargin(true));
1079         int collapsedTopNeg = max(marginInfo.negMargin(), child->maxTopMargin(false));
1080         marginInfo.setMargin(collapsedTopPos, collapsedTopNeg);
1081         
1082         // Now collapse the child's margins together, which means examining our
1083         // bottom margin values as well. 
1084         marginInfo.setPosMarginIfLarger(child->maxBottomMargin(true));
1085         marginInfo.setNegMarginIfLarger(child->maxBottomMargin(false));
1086
1087         if (!marginInfo.canCollapseWithTop())
1088             // We need to make sure that the position of the self-collapsing block
1089             // is correct, since it could have overflowing content
1090             // that needs to be positioned correctly (e.g., a block that
1091             // had a specified height of 0 but that actually had subcontent).
1092             ypos = height() + collapsedTopPos - collapsedTopNeg;
1093     }
1094     else {
1095         if (child->style()->marginTopCollapse() == MSEPARATE) {
1096             setHeight(height() + marginInfo.margin() + child->marginTop());
1097             ypos = height();
1098         }
1099         else if (!marginInfo.atTopOfBlock() ||
1100             (!marginInfo.canCollapseTopWithChildren()
1101              && (!style()->htmlHacks() || !marginInfo.quirkContainer() || !marginInfo.topQuirk()))) {
1102             // We're collapsing with a previous sibling's margins and not
1103             // with the top of the block.
1104             setHeight(height() + max(marginInfo.posMargin(), posTop) - max(marginInfo.negMargin(), negTop));
1105             ypos = height();
1106         }
1107
1108         marginInfo.setPosMargin(child->maxBottomMargin(true));
1109         marginInfo.setNegMargin(child->maxBottomMargin(false));
1110
1111         if (marginInfo.margin())
1112             marginInfo.setBottomQuirk(child->isBottomMarginQuirk() || style()->marginBottomCollapse() == MDISCARD);
1113
1114         marginInfo.setSelfCollapsingBlockClearedFloat(false);
1115     }
1116
1117     view()->addLayoutDelta(IntSize(0, yPosEstimate - ypos));
1118     child->setLocation(child->x(), ypos);
1119     if (ypos != yPosEstimate) {
1120         if (child->shrinkToAvoidFloats())
1121             // The child's width depends on the line width.
1122             // When the child shifts to clear an item, its width can
1123             // change (because it has more available line width).
1124             // So go ahead and mark the item as dirty.
1125             child->setChildNeedsLayout(true, false);
1126
1127         if (!child->avoidsFloats() && child->containsFloats())
1128             toRenderBlock(child)->markAllDescendantsWithFloatsForLayout();
1129
1130         // Our guess was wrong. Make the child lay itself out again.
1131         child->layoutIfNeeded();
1132     }
1133 }
1134
1135 void RenderBlock::clearFloatsIfNeeded(RenderBox* child, MarginInfo& marginInfo, int oldTopPosMargin, int oldTopNegMargin)
1136 {
1137     int heightIncrease = getClearDelta(child);
1138     if (!heightIncrease)
1139         return;
1140
1141     // The child needs to be lowered.  Move the child so that it just clears the float.
1142     view()->addLayoutDelta(IntSize(0, -heightIncrease));
1143     child->setLocation(child->x(), child->y() + heightIncrease);
1144
1145     if (child->isSelfCollapsingBlock()) {
1146         // For self-collapsing blocks that clear, they can still collapse their
1147         // margins with following siblings.  Reset the current margins to represent
1148         // the self-collapsing block's margins only.
1149         marginInfo.setPosMargin(max(child->maxTopMargin(true), child->maxBottomMargin(true)));
1150         marginInfo.setNegMargin(max(child->maxTopMargin(false), child->maxBottomMargin(false)));
1151         
1152         // Adjust our height such that we are ready to be collapsed with subsequent siblings.
1153         setHeight(child->y() - max(0, marginInfo.margin()));
1154         
1155         // Set a flag that we cleared a float so that we know both to increase the height of the block
1156         // to compensate for the clear and to avoid collapsing our margins with the parent block's
1157         // bottom margin.
1158         marginInfo.setSelfCollapsingBlockClearedFloat(true);
1159     } else
1160         // Increase our height by the amount we had to clear.
1161         setHeight(height() + heightIncrease);
1162     
1163     if (marginInfo.canCollapseWithTop()) {
1164         // We can no longer collapse with the top of the block since a clear
1165         // occurred.  The empty blocks collapse into the cleared block.
1166         // FIXME: This isn't quite correct.  Need clarification for what to do
1167         // if the height the cleared block is offset by is smaller than the
1168         // margins involved.
1169         setMaxTopMargins(oldTopPosMargin, oldTopNegMargin);
1170         marginInfo.setAtTopOfBlock(false);
1171     }
1172
1173     // If our value of clear caused us to be repositioned vertically to be
1174     // underneath a float, we might have to do another layout to take into account
1175     // the extra space we now have available.
1176     if (child->shrinkToAvoidFloats())
1177         // The child's width depends on the line width.
1178         // When the child shifts to clear an item, its width can
1179         // change (because it has more available line width).
1180         // So go ahead and mark the item as dirty.
1181         child->setChildNeedsLayout(true, false);
1182     if (!child->avoidsFloats() && child->containsFloats())
1183         toRenderBlock(child)->markAllDescendantsWithFloatsForLayout();
1184     child->layoutIfNeeded();
1185 }
1186
1187 int RenderBlock::estimateVerticalPosition(RenderBox* child, const MarginInfo& marginInfo)
1188 {
1189     // FIXME: We need to eliminate the estimation of vertical position, because when it's wrong we sometimes trigger a pathological
1190     // relayout if there are intruding floats.
1191     int yPosEstimate = height();
1192     if (!marginInfo.canCollapseWithTop()) {
1193         int childMarginTop = child->selfNeedsLayout() ? child->marginTop() : child->collapsedMarginTop();
1194         yPosEstimate += max(marginInfo.margin(), childMarginTop);
1195     }
1196     return yPosEstimate;
1197 }
1198
1199 void RenderBlock::determineHorizontalPosition(RenderBox* child)
1200 {
1201     if (style()->direction() == LTR) {
1202         int xPos = borderLeft() + paddingLeft();
1203         
1204         // Add in our left margin.
1205         int chPos = xPos + child->marginLeft();
1206         
1207         // Some objects (e.g., tables, horizontal rules, overflow:auto blocks) avoid floats.  They need
1208         // to shift over as necessary to dodge any floats that might get in the way.
1209         if (child->avoidsFloats()) {
1210             int leftOff = leftOffset(height(), false);
1211             if (style()->textAlign() != WEBKIT_CENTER && child->style()->marginLeft().type() != Auto) {
1212                 if (child->marginLeft() < 0)
1213                     leftOff += child->marginLeft();
1214                 chPos = max(chPos, leftOff); // Let the float sit in the child's margin if it can fit.
1215             }
1216             else if (leftOff != xPos) {
1217                 // The object is shifting right. The object might be centered, so we need to
1218                 // recalculate our horizontal margins. Note that the containing block content
1219                 // width computation will take into account the delta between |leftOff| and |xPos|
1220                 // so that we can just pass the content width in directly to the |calcHorizontalMargins|
1221                 // function.
1222                 child->calcHorizontalMargins(child->style()->marginLeft(), child->style()->marginRight(), lineWidth(child->y(), false));
1223                 chPos = leftOff + child->marginLeft();
1224             }
1225         }
1226         view()->addLayoutDelta(IntSize(child->x() - chPos, 0));
1227         child->setLocation(chPos, child->y());
1228     } else {
1229         int xPos = width() - borderRight() - paddingRight() - verticalScrollbarWidth();
1230         int chPos = xPos - (child->width() + child->marginRight());
1231         if (child->avoidsFloats()) {
1232             int rightOff = rightOffset(height(), false);
1233             if (style()->textAlign() != WEBKIT_CENTER && child->style()->marginRight().type() != Auto) {
1234                 if (child->marginRight() < 0)
1235                     rightOff -= child->marginRight();
1236                 chPos = min(chPos, rightOff - child->width()); // Let the float sit in the child's margin if it can fit.
1237             } else if (rightOff != xPos) {
1238                 // The object is shifting left. The object might be centered, so we need to
1239                 // recalculate our horizontal margins. Note that the containing block content
1240                 // width computation will take into account the delta between |rightOff| and |xPos|
1241                 // so that we can just pass the content width in directly to the |calcHorizontalMargins|
1242                 // function.
1243                 child->calcHorizontalMargins(child->style()->marginLeft(), child->style()->marginRight(), lineWidth(child->y(), false));
1244                 chPos = rightOff - child->marginRight() - child->width();
1245             }
1246         }
1247         view()->addLayoutDelta(IntSize(child->x() - chPos, 0));
1248         child->setLocation(chPos, child->y());
1249     }
1250 }
1251
1252 void RenderBlock::setCollapsedBottomMargin(const MarginInfo& marginInfo)
1253 {
1254     if (marginInfo.canCollapseWithBottom() && !marginInfo.canCollapseWithTop()) {
1255         // Update our max pos/neg bottom margins, since we collapsed our bottom margins
1256         // with our children.
1257         setMaxBottomMargins(max(maxBottomPosMargin(), marginInfo.posMargin()), max(maxBottomNegMargin(), marginInfo.negMargin()));
1258
1259         if (!marginInfo.bottomQuirk())
1260             setBottomMarginQuirk(false);
1261
1262         if (marginInfo.bottomQuirk() && marginBottom() == 0)
1263             // We have no bottom margin and our last child has a quirky margin.
1264             // We will pick up this quirky margin and pass it through.
1265             // This deals with the <td><div><p> case.
1266             setBottomMarginQuirk(true);
1267     }
1268 }
1269
1270 void RenderBlock::handleBottomOfBlock(int top, int bottom, MarginInfo& marginInfo)
1271 {
1272     // If our last flow was a self-collapsing block that cleared a float, then we don't
1273     // collapse it with the bottom of the block.
1274     if (!marginInfo.selfCollapsingBlockClearedFloat())
1275         marginInfo.setAtBottomOfBlock(true);
1276     else {
1277         // We have to special case the negative margin situation (where the collapsed
1278         // margin of the self-collapsing block is negative), since there's no need
1279         // to make an adjustment in that case.
1280         if (marginInfo.margin() < 0)
1281             marginInfo.clearMargin();
1282     }
1283
1284     // If we can't collapse with children then go ahead and add in the bottom margin.
1285     if (!marginInfo.canCollapseWithBottom() && !marginInfo.canCollapseWithTop()
1286         && (!style()->htmlHacks() || !marginInfo.quirkContainer() || !marginInfo.bottomQuirk()))
1287         setHeight(height() + marginInfo.margin());
1288         
1289     // Now add in our bottom border/padding.
1290     setHeight(height() + bottom);
1291
1292     // Negative margins can cause our height to shrink below our minimal height (border/padding).
1293     // If this happens, ensure that the computed height is increased to the minimal height.
1294     setHeight(max(height(), top + bottom));
1295
1296     // Always make sure our overflow height is at least our height.
1297     m_overflowHeight = max(height(), m_overflowHeight);
1298
1299     // Update our bottom collapsed margin info.
1300     setCollapsedBottomMargin(marginInfo);
1301 }
1302
1303 void RenderBlock::layoutBlockChildren(bool relayoutChildren, int& maxFloatBottom)
1304 {
1305     if (gPercentHeightDescendantsMap) {
1306         if (HashSet<RenderBox*>* descendants = gPercentHeightDescendantsMap->get(this)) {
1307             HashSet<RenderBox*>::iterator end = descendants->end();
1308             for (HashSet<RenderBox*>::iterator it = descendants->begin(); it != end; ++it) {
1309                 RenderBox* box = *it;
1310                 while (box != this) {
1311                     if (box->normalChildNeedsLayout())
1312                         break;
1313                     box->setChildNeedsLayout(true, false);
1314                     box = box->containingBlock();
1315                     ASSERT(box);
1316                     if (!box)
1317                         break;
1318                 }
1319             }
1320         }
1321     }
1322
1323     int top = borderTop() + paddingTop();
1324     int bottom = borderBottom() + paddingBottom() + horizontalScrollbarHeight();
1325
1326     m_overflowHeight = top;
1327     setHeight(m_overflowHeight);
1328
1329     // The margin struct caches all our current margin collapsing state.  The compact struct caches state when we encounter compacts,
1330     MarginInfo marginInfo(this, top, bottom);
1331
1332     // Fieldsets need to find their legend and position it inside the border of the object.
1333     // The legend then gets skipped during normal layout.
1334     RenderObject* legend = layoutLegend(relayoutChildren);
1335
1336     int previousFloatBottom = 0;
1337     maxFloatBottom = 0;
1338
1339     RenderBox* child = firstChildBox();
1340     while (child) {
1341         if (legend == child) {
1342             child = child->nextSiblingBox();
1343             continue; // Skip the legend, since it has already been positioned up in the fieldset's border.
1344         }
1345
1346         int oldTopPosMargin = maxTopPosMargin();
1347         int oldTopNegMargin = maxTopNegMargin();
1348
1349         // Make sure we layout children if they need it.
1350         // FIXME: Technically percentage height objects only need a relayout if their percentage isn't going to be turned into
1351         // an auto value.  Add a method to determine this, so that we can avoid the relayout.
1352         if (relayoutChildren || ((child->style()->height().isPercent() || child->style()->minHeight().isPercent() || child->style()->maxHeight().isPercent()) && !isRenderView()))
1353             child->setChildNeedsLayout(true, false);
1354
1355         // If relayoutChildren is set and we have percentage padding, we also need to invalidate the child's pref widths.
1356         if (relayoutChildren && (child->style()->paddingLeft().isPercent() || child->style()->paddingRight().isPercent()))
1357             child->setPrefWidthsDirty(true, false);
1358
1359         // Handle the four types of special elements first.  These include positioned content, floating content, compacts and
1360         // run-ins.  When we encounter these four types of objects, we don't actually lay them out as normal flow blocks.
1361         bool handled = false;
1362         RenderBox* next = handleSpecialChild(child, marginInfo, handled);
1363         if (handled) {
1364             child = next;
1365             continue;
1366         }
1367
1368         // The child is a normal flow object.  Compute its vertical margins now.
1369         child->calcVerticalMargins();
1370
1371         // Do not allow a collapse if the margin top collapse style is set to SEPARATE.
1372         if (child->style()->marginTopCollapse() == MSEPARATE) {
1373             marginInfo.setAtTopOfBlock(false);
1374             marginInfo.clearMargin();
1375         }
1376
1377         // Try to guess our correct y position.  In most cases this guess will
1378         // be correct.  Only if we're wrong (when we compute the real y position)
1379         // will we have to potentially relayout.
1380         int yPosEstimate = estimateVerticalPosition(child, marginInfo);
1381
1382         // Cache our old rect so that we can dirty the proper repaint rects if the child moves.
1383         IntRect oldRect(child->x(), child->y() , child->width(), child->height());
1384 #ifndef NDEBUG
1385         IntSize oldLayoutDelta = view()->layoutDelta();
1386 #endif
1387         // Go ahead and position the child as though it didn't collapse with the top.
1388         view()->addLayoutDelta(IntSize(0, child->y() - yPosEstimate));
1389         child->setLocation(child->x(), yPosEstimate);
1390
1391         bool markDescendantsWithFloats = false;
1392         if (yPosEstimate != oldRect.y() && !child->avoidsFloats() && child->containsFloats())
1393             markDescendantsWithFloats = true;
1394         else if (!child->avoidsFloats() || child->shrinkToAvoidFloats()) {
1395             // If an element might be affected by the presence of floats, then always mark it for
1396             // layout.
1397             int fb = max(previousFloatBottom, floatBottom());
1398             if (fb > height() || fb > yPosEstimate)
1399                 markDescendantsWithFloats = true;
1400         }
1401
1402         if (child->isRenderBlock()) {
1403             if (markDescendantsWithFloats)
1404                 toRenderBlock(child)->markAllDescendantsWithFloatsForLayout();
1405
1406             previousFloatBottom = max(previousFloatBottom, oldRect.y() + toRenderBlock(child)->floatBottom());
1407         }
1408
1409         bool childHadLayout = child->m_everHadLayout;
1410         bool childNeededLayout = child->needsLayout();
1411         if (childNeededLayout)
1412             child->layout();
1413
1414         // Now determine the correct ypos based off examination of collapsing margin
1415         // values.
1416         collapseMargins(child, marginInfo, yPosEstimate);
1417
1418         // Now check for clear.
1419         clearFloatsIfNeeded(child, marginInfo, oldTopPosMargin, oldTopNegMargin);
1420
1421         // We are no longer at the top of the block if we encounter a non-empty child.  
1422         // This has to be done after checking for clear, so that margins can be reset if a clear occurred.
1423         if (marginInfo.atTopOfBlock() && !child->isSelfCollapsingBlock())
1424             marginInfo.setAtTopOfBlock(false);
1425
1426         // Now place the child in the correct horizontal position
1427         determineHorizontalPosition(child);
1428
1429         // Update our height now that the child has been placed in the correct position.
1430         setHeight(height() + child->height());
1431         if (child->style()->marginBottomCollapse() == MSEPARATE) {
1432             setHeight(height() + child->marginBottom());
1433             marginInfo.clearMargin();
1434         }
1435         // If the child has overhanging floats that intrude into following siblings (or possibly out
1436         // of this block), then the parent gets notified of the floats now.
1437         if (child->containsFloats())
1438             maxFloatBottom = max(maxFloatBottom, addOverhangingFloats(toRenderBlock(child), -child->x(), -child->y(), !childNeededLayout));
1439
1440         // Update our overflow in case the child spills out the block.
1441         m_overflowTop = min(m_overflowTop, child->y() + child->overflowTop(false));
1442         m_overflowHeight = max(m_overflowHeight, height() + child->overflowHeight(false) - child->height());
1443         m_overflowWidth = max(child->x() + child->overflowWidth(false), m_overflowWidth);
1444         m_overflowLeft = min(child->x() + child->overflowLeft(false), m_overflowLeft);
1445
1446         IntSize childOffset(child->x() - oldRect.x(), child->y() - oldRect.y());
1447         if (childOffset.width() || childOffset.height()) {
1448             view()->addLayoutDelta(childOffset);
1449
1450             // If the child moved, we have to repaint it as well as any floating/positioned
1451             // descendants.  An exception is if we need a layout.  In this case, we know we're going to
1452             // repaint ourselves (and the child) anyway.
1453             if (childHadLayout && !selfNeedsLayout() && child->checkForRepaintDuringLayout())
1454                 child->repaintDuringLayoutIfMoved(oldRect);
1455         }
1456
1457         if (!childHadLayout && child->checkForRepaintDuringLayout())
1458             child->repaint();
1459
1460         ASSERT(oldLayoutDelta == view()->layoutDelta());
1461         child = child->nextSiblingBox();
1462     }
1463
1464     // Now do the handling of the bottom of the block, adding in our bottom border/padding and
1465     // determining the correct collapsed bottom margin information.
1466     handleBottomOfBlock(top, bottom, marginInfo);
1467 }
1468
1469 bool RenderBlock::layoutOnlyPositionedObjects()
1470 {
1471     if (!posChildNeedsLayout() || normalChildNeedsLayout() || selfNeedsLayout())
1472         return false;
1473
1474     LayoutStateMaintainer statePusher(view(), this, IntSize(x(), y()), hasColumns() || hasTransform() || hasReflection());
1475
1476     if (needsPositionedMovementLayout()) {
1477         tryLayoutDoingPositionedMovementOnly();
1478         if (needsLayout())
1479             return false;
1480     }
1481
1482     // All we have to is lay out our positioned objects.
1483     layoutPositionedObjects(false);
1484
1485     statePusher.pop();
1486
1487     if (hasOverflowClip())
1488         m_layer->updateScrollInfoAfterLayout();
1489
1490     setNeedsLayout(false);
1491     return true;
1492 }
1493
1494 void RenderBlock::layoutPositionedObjects(bool relayoutChildren)
1495 {
1496     if (m_positionedObjects) {
1497         RenderBox* r;
1498         Iterator end = m_positionedObjects->end();
1499         for (Iterator it = m_positionedObjects->begin(); it != end; ++it) {
1500             r = *it;
1501             // When a non-positioned block element moves, it may have positioned children that are implicitly positioned relative to the
1502             // non-positioned block.  Rather than trying to detect all of these movement cases, we just always lay out positioned
1503             // objects that are positioned implicitly like this.  Such objects are rare, and so in typical DHTML menu usage (where everything is
1504             // positioned explicitly) this should not incur a performance penalty.
1505             if (relayoutChildren || (r->hasStaticY() && r->parent() != this && r->parent()->isBlockFlow()))
1506                 r->setChildNeedsLayout(true, false);
1507                 
1508             // If relayoutChildren is set and we have percentage padding, we also need to invalidate the child's pref widths.
1509             //if (relayoutChildren && (r->style()->paddingLeft().isPercent() || r->style()->paddingRight().isPercent()))
1510                 r->setPrefWidthsDirty(true, false);
1511             
1512             // We don't have to do a full layout.  We just have to update our position. Try that first. If we have shrink-to-fit width
1513             // and we hit the available width constraint, the layoutIfNeeded() will catch it and do a full layout.
1514             if (r->needsPositionedMovementLayoutOnly())
1515                 r->tryLayoutDoingPositionedMovementOnly();
1516             r->layoutIfNeeded();
1517         }
1518     }
1519 }
1520
1521 void RenderBlock::markPositionedObjectsForLayout()
1522 {
1523     if (m_positionedObjects) {
1524         RenderBox* r;
1525         Iterator end = m_positionedObjects->end();
1526         for (Iterator it = m_positionedObjects->begin(); it != end; ++it) {
1527             r = *it;
1528             r->setChildNeedsLayout(true);
1529         }
1530     }
1531 }
1532
1533 void RenderBlock::repaintOverhangingFloats(bool paintAllDescendants)
1534 {
1535     // Repaint any overhanging floats (if we know we're the one to paint them).
1536     if (hasOverhangingFloats()) {
1537         // We think that we must be in a bad state if m_floatingObjects is nil at this point, so 
1538         // we assert on Debug builds and nil-check Release builds.
1539         ASSERT(m_floatingObjects);
1540         if (!m_floatingObjects)
1541             return;
1542         
1543         FloatingObject* r;
1544         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
1545
1546         // FIXME: Avoid disabling LayoutState. At the very least, don't disable it for floats originating
1547         // in this block. Better yet would be to push extra state for the containers of other floats.
1548         view()->disableLayoutState();
1549         for ( ; (r = it.current()); ++it) {
1550             // Only repaint the object if it is overhanging, is not in its own layer, and
1551             // is our responsibility to paint (m_shouldPaint is set). When paintAllDescendants is true, the latter
1552             // condition is replaced with being a descendant of us.
1553             if (r->m_bottom > height() && (paintAllDescendants && r->m_renderer->isDescendantOf(this) || r->m_shouldPaint) && !r->m_renderer->hasLayer()) {                
1554                 r->m_renderer->repaint();
1555                 r->m_renderer->repaintOverhangingFloats();
1556             }
1557         }
1558         view()->enableLayoutState();
1559     }
1560 }
1561  
1562 void RenderBlock::paint(PaintInfo& paintInfo, int tx, int ty)
1563 {
1564     tx += x();
1565     ty += y();
1566     
1567     PaintPhase phase = paintInfo.phase;
1568
1569     // Check if we need to do anything at all.
1570     // FIXME: Could eliminate the isRoot() check if we fix background painting so that the RenderView
1571     // paints the root's background.
1572     if (!isRoot()) {
1573         IntRect overflowBox = overflowRect(false);
1574         overflowBox.inflate(maximalOutlineSize(paintInfo.phase));
1575         overflowBox.move(tx, ty);
1576         if (!overflowBox.intersects(paintInfo.rect))
1577             return;
1578     }
1579
1580     bool useControlClip = phase != PaintPhaseBlockBackground && phase != PaintPhaseSelfOutline && phase != PaintPhaseMask && hasControlClip();
1581
1582     // Push a clip.
1583     if (useControlClip) {
1584         if (phase == PaintPhaseOutline)
1585             paintInfo.phase = PaintPhaseChildOutlines;
1586         else if (phase == PaintPhaseChildBlockBackground) {
1587             paintInfo.phase = PaintPhaseBlockBackground;
1588             paintObject(paintInfo, tx, ty);
1589             paintInfo.phase = PaintPhaseChildBlockBackgrounds;
1590         }
1591         IntRect clipRect(controlClipRect(tx, ty));
1592         if (clipRect.isEmpty())
1593             return;
1594         paintInfo.context->save();
1595         paintInfo.context->clip(clipRect);
1596     }
1597
1598     paintObject(paintInfo, tx, ty);
1599     
1600     // Pop the clip.
1601     if (useControlClip) {
1602         paintInfo.context->restore();
1603         if (phase == PaintPhaseOutline) {
1604             paintInfo.phase = PaintPhaseSelfOutline;
1605             paintObject(paintInfo, tx, ty);
1606             paintInfo.phase = phase;
1607         } else if (phase == PaintPhaseChildBlockBackground)
1608             paintInfo.phase = phase;
1609     }
1610 }
1611
1612 void RenderBlock::paintColumns(PaintInfo& paintInfo, int tx, int ty, bool paintingFloats)
1613 {
1614     // We need to do multiple passes, breaking up our child painting into strips.
1615     GraphicsContext* context = paintInfo.context;
1616     int currXOffset = 0;
1617     int currYOffset = 0;
1618     int ruleAdd = borderLeft() + paddingLeft();
1619     int ruleX = 0;
1620     int colGap = columnGap();
1621     const Color& ruleColor = style()->columnRuleColor();
1622     bool ruleTransparent = style()->columnRuleIsTransparent();
1623     EBorderStyle ruleStyle = style()->columnRuleStyle();
1624     int ruleWidth = style()->columnRuleWidth();
1625     bool renderRule = !paintingFloats && ruleStyle > BHIDDEN && !ruleTransparent && ruleWidth <= colGap;
1626     Vector<IntRect>* colRects = columnRects();
1627     unsigned colCount = colRects->size();
1628     for (unsigned i = 0; i < colCount; i++) {
1629         // For each rect, we clip to the rect, and then we adjust our coords.
1630         IntRect colRect = colRects->at(i);
1631         colRect.move(tx, ty);
1632         context->save();
1633         
1634         // Each strip pushes a clip, since column boxes are specified as being
1635         // like overflow:hidden.
1636         context->clip(colRect);
1637         
1638         // Adjust tx and ty to change where we paint.
1639         PaintInfo info(paintInfo);
1640         info.rect.intersect(colRect);
1641         
1642         // Adjust our x and y when painting.
1643         int finalX = tx + currXOffset;
1644         int finalY = ty + currYOffset;
1645         if (paintingFloats)
1646             paintFloats(info, finalX, finalY, paintInfo.phase == PaintPhaseSelection || paintInfo.phase == PaintPhaseTextClip);
1647         else
1648             paintContents(info, finalX, finalY);
1649
1650         // Move to the next position.
1651         if (style()->direction() == LTR) {
1652             ruleX += colRect.width() + colGap / 2;
1653             currXOffset += colRect.width() + colGap;
1654         } else {
1655             ruleX -= (colRect.width() + colGap / 2);
1656             currXOffset -= (colRect.width() + colGap);
1657         }
1658
1659         currYOffset -= colRect.height();
1660         
1661         context->restore();
1662         
1663         // Now paint the column rule.
1664         if (renderRule && paintInfo.phase == PaintPhaseForeground && i < colCount - 1) {
1665             int ruleStart = ruleX - ruleWidth / 2 + ruleAdd;
1666             int ruleEnd = ruleStart + ruleWidth;
1667             drawBorder(paintInfo.context, tx + ruleStart, ty + borderTop() + paddingTop(), tx + ruleEnd, ty + borderTop() + paddingTop() + contentHeight(),
1668                        style()->direction() == LTR ? BSLeft : BSRight, ruleColor, style()->color(), ruleStyle, 0, 0);
1669         }
1670         
1671         ruleX = currXOffset;
1672     }
1673 }
1674
1675 void RenderBlock::paintContents(PaintInfo& paintInfo, int tx, int ty)
1676 {
1677     // Avoid painting descendants of the root element when stylesheets haven't loaded.  This eliminates FOUC.
1678     // It's ok not to draw, because later on, when all the stylesheets do load, updateStyleSelector on the Document
1679     // will do a full repaint().
1680     if (document()->didLayoutWithPendingStylesheets() && !isRenderView())
1681         return;
1682
1683     if (childrenInline())
1684         m_lineBoxes.paint(this, paintInfo, tx, ty);
1685     else
1686         paintChildren(paintInfo, tx, ty);
1687 }
1688
1689 void RenderBlock::paintChildren(PaintInfo& paintInfo, int tx, int ty)
1690 {
1691     PaintPhase newPhase = (paintInfo.phase == PaintPhaseChildOutlines) ? PaintPhaseOutline : paintInfo.phase;
1692     newPhase = (newPhase == PaintPhaseChildBlockBackgrounds) ? PaintPhaseChildBlockBackground : newPhase;
1693     
1694     // We don't paint our own background, but we do let the kids paint their backgrounds.
1695     PaintInfo info(paintInfo);
1696     info.phase = newPhase;
1697     info.paintingRoot = paintingRootForChildren(paintInfo);
1698     bool isPrinting = document()->printing();
1699
1700     for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) {        
1701         // Check for page-break-before: always, and if it's set, break and bail.
1702         if (isPrinting && !childrenInline() && child->style()->pageBreakBefore() == PBALWAYS &&
1703             inRootBlockContext() && (ty + child->y()) > paintInfo.rect.y() && 
1704             (ty + child->y()) < paintInfo.rect.bottom()) {
1705             view()->setBestTruncatedAt(ty + child->y(), this, true);
1706             return;
1707         }
1708
1709         if (!child->hasLayer() && !child->isFloating())
1710             child->paint(info, tx, ty);
1711
1712         // Check for page-break-after: always, and if it's set, break and bail.
1713         if (isPrinting && !childrenInline() && child->style()->pageBreakAfter() == PBALWAYS && 
1714             inRootBlockContext() && (ty + child->y() + child->height()) > paintInfo.rect.y() && 
1715             (ty + child->y() + child->height()) < paintInfo.rect.bottom()) {
1716             view()->setBestTruncatedAt(ty + child->y() + child->height() + max(0, child->collapsedMarginBottom()), this, true);
1717             return;
1718         }
1719     }
1720 }
1721
1722 void RenderBlock::paintCaret(PaintInfo& paintInfo, int tx, int ty, CaretType type)
1723 {
1724     SelectionController* selection = type == CursorCaret ? document()->frame()->selection() : document()->frame()->dragCaretController();
1725
1726     // Ask the SelectionController if the caret should be painted by this block
1727     RenderObject* caretPainter = selection->caretRenderer();
1728     if (caretPainter == this && selection->isContentEditable()) {
1729         // Convert the painting offset into the local coordinate system of this renderer,
1730         // to match the localCaretRect computed by the SelectionController
1731         offsetForContents(tx, ty);
1732
1733         if (type == CursorCaret)
1734             document()->frame()->paintCaret(paintInfo.context, tx, ty, paintInfo.rect);
1735         else
1736             document()->frame()->paintDragCaret(paintInfo.context, tx, ty, paintInfo.rect);
1737     }
1738 }
1739
1740 void RenderBlock::paintObject(PaintInfo& paintInfo, int tx, int ty)
1741 {
1742     PaintPhase paintPhase = paintInfo.phase;
1743
1744     // 1. paint background, borders etc
1745     if ((paintPhase == PaintPhaseBlockBackground || paintPhase == PaintPhaseChildBlockBackground) &&
1746         hasBoxDecorations() && style()->visibility() == VISIBLE) {
1747         paintBoxDecorations(paintInfo, tx, ty);
1748     }
1749
1750     if (paintPhase == PaintPhaseMask && style()->visibility() == VISIBLE) {
1751         paintMask(paintInfo, tx, ty);
1752         return;
1753     }
1754
1755     // We're done.  We don't bother painting any children.
1756     if (paintPhase == PaintPhaseBlockBackground)
1757         return;
1758
1759     // Adjust our painting position if we're inside a scrolled layer (e.g., an overflow:auto div).s
1760     int scrolledX = tx;
1761     int scrolledY = ty;
1762     if (hasOverflowClip())
1763         m_layer->subtractScrolledContentOffset(scrolledX, scrolledY);
1764
1765     // 2. paint contents
1766     if (paintPhase != PaintPhaseSelfOutline) {
1767         if (hasColumns())
1768             paintColumns(paintInfo, scrolledX, scrolledY);
1769         else
1770             paintContents(paintInfo, scrolledX, scrolledY);
1771     }
1772
1773     // 3. paint selection
1774     // FIXME: Make this work with multi column layouts.  For now don't fill gaps.
1775     bool isPrinting = document()->printing();
1776     if (!isPrinting && !hasColumns())
1777         paintSelection(paintInfo, scrolledX, scrolledY); // Fill in gaps in selection on lines and between blocks.
1778
1779     // 4. paint floats.
1780     if (paintPhase == PaintPhaseFloat || paintPhase == PaintPhaseSelection || paintPhase == PaintPhaseTextClip) {
1781         if (hasColumns())
1782             paintColumns(paintInfo, scrolledX, scrolledY, true);
1783         else
1784             paintFloats(paintInfo, scrolledX, scrolledY, paintPhase == PaintPhaseSelection || paintPhase == PaintPhaseTextClip);
1785     }
1786
1787     // 5. paint outline.
1788     if ((paintPhase == PaintPhaseOutline || paintPhase == PaintPhaseSelfOutline) && hasOutline() && style()->visibility() == VISIBLE)
1789         paintOutline(paintInfo.context, tx, ty, width(), height(), style());
1790
1791     // 6. paint continuation outlines.
1792     if ((paintPhase == PaintPhaseOutline || paintPhase == PaintPhaseChildOutlines)) {
1793         if (inlineContinuation() && inlineContinuation()->hasOutline() && inlineContinuation()->style()->visibility() == VISIBLE) {
1794             RenderInline* inlineRenderer = toRenderInline(inlineContinuation()->element()->renderer());
1795             if (!inlineRenderer->hasLayer())
1796                 containingBlock()->addContinuationWithOutline(inlineRenderer);
1797             else if (!inlineRenderer->firstLineBox())
1798                 inlineRenderer->paintOutline(paintInfo.context, tx - x() + inlineRenderer->containingBlock()->x(),
1799                                              ty - y() + inlineRenderer->containingBlock()->y());
1800         }
1801         paintContinuationOutlines(paintInfo, tx, ty);
1802     }
1803
1804     // 7. paint caret.
1805     // If the caret's node's render object's containing block is this block, and the paint action is PaintPhaseForeground,
1806     // then paint the caret.
1807     if (paintPhase == PaintPhaseForeground) {        
1808         paintCaret(paintInfo, scrolledX, scrolledY, CursorCaret);
1809         paintCaret(paintInfo, scrolledX, scrolledY, DragCaret);
1810     }
1811 }
1812
1813 void RenderBlock::paintFloats(PaintInfo& paintInfo, int tx, int ty, bool preservePhase)
1814 {
1815     if (!m_floatingObjects)
1816         return;
1817
1818     FloatingObject* r;
1819     DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
1820     for (; (r = it.current()); ++it) {
1821         // Only paint the object if our m_shouldPaint flag is set.
1822         if (r->m_shouldPaint && !r->m_renderer->hasLayer()) {
1823             PaintInfo currentPaintInfo(paintInfo);
1824             currentPaintInfo.phase = preservePhase ? paintInfo.phase : PaintPhaseBlockBackground;
1825             int currentTX = tx + r->m_left - r->m_renderer->x() + r->m_renderer->marginLeft();
1826             int currentTY = ty + r->m_top - r->m_renderer->y() + r->m_renderer->marginTop();
1827             r->m_renderer->paint(currentPaintInfo, currentTX, currentTY);
1828             if (!preservePhase) {
1829                 currentPaintInfo.phase = PaintPhaseChildBlockBackgrounds;
1830                 r->m_renderer->paint(currentPaintInfo, currentTX, currentTY);
1831                 currentPaintInfo.phase = PaintPhaseFloat;
1832                 r->m_renderer->paint(currentPaintInfo, currentTX, currentTY);
1833                 currentPaintInfo.phase = PaintPhaseForeground;
1834                 r->m_renderer->paint(currentPaintInfo, currentTX, currentTY);
1835                 currentPaintInfo.phase = PaintPhaseOutline;
1836                 r->m_renderer->paint(currentPaintInfo, currentTX, currentTY);
1837             }
1838         }
1839     }
1840 }
1841
1842 void RenderBlock::paintEllipsisBoxes(PaintInfo& paintInfo, int tx, int ty)
1843 {
1844     if (!shouldPaintWithinRoot(paintInfo) || !firstLineBox())
1845         return;
1846
1847     if (style()->visibility() == VISIBLE && paintInfo.phase == PaintPhaseForeground) {
1848         // We can check the first box and last box and avoid painting if we don't
1849         // intersect.
1850         int yPos = ty + firstLineBox()->yPos();
1851         int h = lastLineBox()->yPos() + lastLineBox()->height() - firstLineBox()->yPos();
1852         if (yPos >= paintInfo.rect.bottom() || yPos + h <= paintInfo.rect.y())
1853             return;
1854
1855         // See if our boxes intersect with the dirty rect.  If so, then we paint
1856         // them.  Note that boxes can easily overlap, so we can't make any assumptions
1857         // based off positions of our first line box or our last line box.
1858         for (RootInlineBox* curr = firstRootBox(); curr; curr = curr->nextRootBox()) {
1859             yPos = ty + curr->yPos();
1860             h = curr->height();
1861             if (curr->ellipsisBox() && yPos < paintInfo.rect.bottom() && yPos + h > paintInfo.rect.y())
1862                 curr->paintEllipsisBox(paintInfo, tx, ty);
1863         }
1864     }
1865 }
1866
1867 static ContinuationOutlineTableMap* continuationOutlineTable()
1868 {
1869     DEFINE_STATIC_LOCAL(ContinuationOutlineTableMap, table, ());
1870     return &table;
1871 }
1872
1873 void RenderBlock::addContinuationWithOutline(RenderInline* flow)
1874 {
1875     // We can't make this work if the inline is in a layer.  We'll just rely on the broken
1876     // way of painting.
1877     ASSERT(!flow->layer() && !flow->isInlineContinuation());
1878     
1879     ContinuationOutlineTableMap* table = continuationOutlineTable();
1880     ListHashSet<RenderInline*>* continuations = table->get(this);
1881     if (!continuations) {
1882         continuations = new ListHashSet<RenderInline*>;
1883         table->set(this, continuations);
1884     }
1885     
1886     continuations->add(flow);
1887 }
1888
1889 void RenderBlock::paintContinuationOutlines(PaintInfo& info, int tx, int ty)
1890 {
1891     ContinuationOutlineTableMap* table = continuationOutlineTable();
1892     if (table->isEmpty())
1893         return;
1894         
1895     ListHashSet<RenderInline*>* continuations = table->get(this);
1896     if (!continuations)
1897         return;
1898         
1899     // Paint each continuation outline.
1900     ListHashSet<RenderInline*>::iterator end = continuations->end();
1901     for (ListHashSet<RenderInline*>::iterator it = continuations->begin(); it != end; ++it) {
1902         // Need to add in the coordinates of the intervening blocks.
1903         RenderInline* flow = *it;
1904         RenderBlock* block = flow->containingBlock();
1905         for ( ; block && block != this; block = block->containingBlock()) {
1906             tx += block->x();
1907             ty += block->y();
1908         }
1909         ASSERT(block);   
1910         flow->paintOutline(info.context, tx, ty);
1911     }
1912     
1913     // Delete
1914     delete continuations;
1915     table->remove(this);
1916 }
1917
1918 void RenderBlock::setSelectionState(SelectionState s)
1919 {
1920     if (selectionState() == s)
1921         return;
1922     
1923     if (s == SelectionInside && selectionState() != SelectionNone)
1924         return;
1925
1926     if ((s == SelectionStart && selectionState() == SelectionEnd) ||
1927         (s == SelectionEnd && selectionState() == SelectionStart))
1928         RenderContainer::setSelectionState(SelectionBoth);
1929     else
1930         RenderContainer::setSelectionState(s);
1931     
1932     RenderBlock* cb = containingBlock();
1933     if (cb && !cb->isRenderView())
1934         cb->setSelectionState(s);
1935 }
1936
1937 bool RenderBlock::shouldPaintSelectionGaps() const
1938 {
1939     return selectionState() != SelectionNone && style()->visibility() == VISIBLE && isSelectionRoot();
1940 }
1941
1942 bool RenderBlock::isSelectionRoot() const
1943 {
1944     if (!element())
1945         return false;
1946         
1947     // FIXME: Eventually tables should have to learn how to fill gaps between cells, at least in simple non-spanning cases.
1948     if (isTable())
1949         return false;
1950         
1951     if (isBody() || isRoot() || hasOverflowClip() || isRelPositioned() ||
1952         isFloatingOrPositioned() || isTableCell() || isInlineBlockOrInlineTable() || hasTransform() ||
1953         hasReflection() || hasMask())
1954         return true;
1955     
1956     if (view() && view()->selectionStart()) {
1957         Node* startElement = view()->selectionStart()->element();
1958         if (startElement && startElement->rootEditableElement() == element())
1959             return true;
1960     }
1961     
1962     return false;
1963 }
1964
1965 GapRects RenderBlock::selectionGapRects()
1966 {
1967     ASSERT(!needsLayout());
1968
1969     if (!shouldPaintSelectionGaps())
1970         return GapRects();
1971
1972     // FIXME: this is broken with transforms
1973     FloatPoint absContentPoint = localToAbsolute(FloatPoint());
1974     if (hasOverflowClip())
1975         absContentPoint -= layer()->scrolledContentOffset();
1976
1977     int lastTop = 0;
1978     int lastLeft = leftSelectionOffset(this, lastTop);
1979     int lastRight = rightSelectionOffset(this, lastTop);
1980     
1981     return fillSelectionGaps(this, absContentPoint.x(), absContentPoint.y(), absContentPoint.x(), absContentPoint.y(), lastTop, lastLeft, lastRight);
1982 }
1983
1984 void RenderBlock::paintSelection(PaintInfo& paintInfo, int tx, int ty)
1985 {
1986     if (shouldPaintSelectionGaps() && paintInfo.phase == PaintPhaseForeground) {
1987         int lastTop = 0;
1988         int lastLeft = leftSelectionOffset(this, lastTop);
1989         int lastRight = rightSelectionOffset(this, lastTop);
1990         paintInfo.context->save();
1991         fillSelectionGaps(this, tx, ty, tx, ty, lastTop, lastLeft, lastRight, &paintInfo);
1992         paintInfo.context->restore();
1993     }
1994 }
1995
1996 static void clipOutPositionedObjects(const RenderObject::PaintInfo* paintInfo, int tx, int ty, ListHashSet<RenderBox*>* positionedObjects)
1997 {
1998     if (!positionedObjects)
1999         return;
2000     
2001     ListHashSet<RenderBox*>::const_iterator end = positionedObjects->end();
2002     for (ListHashSet<RenderBox*>::const_iterator it = positionedObjects->begin(); it != end; ++it) {
2003         RenderBox* r = *it;
2004         paintInfo->context->clipOut(IntRect(tx + r->x(), ty + r->y(), r->width(), r->height()));
2005     }
2006 }
2007
2008 GapRects RenderBlock::fillSelectionGaps(RenderBlock* rootBlock, int blockX, int blockY, int tx, int ty,
2009                                         int& lastTop, int& lastLeft, int& lastRight, const PaintInfo* paintInfo)
2010 {
2011     // IMPORTANT: Callers of this method that intend for painting to happen need to do a save/restore.
2012     // Clip out floating and positioned objects when painting selection gaps.
2013     if (paintInfo) {
2014         // Note that we don't clip out overflow for positioned objects.  We just stick to the border box.
2015         clipOutPositionedObjects(paintInfo, tx, ty, m_positionedObjects);
2016         if (isBody() || isRoot()) // The <body> must make sure to examine its containingBlock's positioned objects.
2017             for (RenderBlock* cb = containingBlock(); cb && !cb->isRenderView(); cb = cb->containingBlock())
2018                 clipOutPositionedObjects(paintInfo, cb->x(), cb->y(), cb->m_positionedObjects);
2019         if (m_floatingObjects) {
2020             for (DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects); it.current(); ++it) {
2021                 FloatingObject* r = it.current();
2022                 paintInfo->context->clipOut(IntRect(tx + r->m_left + r->m_renderer->marginLeft(), 
2023                                                     ty + r->m_top + r->m_renderer->marginTop(),
2024                                                     r->m_renderer->width(), r->m_renderer->height()));
2025             }
2026         }
2027     }
2028
2029     // FIXME: overflow: auto/scroll regions need more math here, since painting in the border box is different from painting in the padding box (one is scrolled, the other is
2030     // fixed).
2031     GapRects result;
2032     if (!isBlockFlow()) // FIXME: Make multi-column selection gap filling work someday.
2033         return result;
2034
2035     if (hasColumns() || hasTransform()) {
2036         // FIXME: We should learn how to gap fill multiple columns and transforms eventually.
2037         lastTop = (ty - blockY) + height();
2038         lastLeft = leftSelectionOffset(rootBlock, height());
2039         lastRight = rightSelectionOffset(rootBlock, height());
2040         return result;
2041     }
2042
2043     if (childrenInline())
2044         result = fillInlineSelectionGaps(rootBlock, blockX, blockY, tx, ty, lastTop, lastLeft, lastRight, paintInfo);
2045     else
2046         result = fillBlockSelectionGaps(rootBlock, blockX, blockY, tx, ty, lastTop, lastLeft, lastRight, paintInfo);
2047
2048     // Go ahead and fill the vertical gap all the way to the bottom of our block if the selection extends past our block.
2049     if (rootBlock == this && (selectionState() != SelectionBoth && selectionState() != SelectionEnd))
2050         result.uniteCenter(fillVerticalSelectionGap(lastTop, lastLeft, lastRight, ty + height(),
2051                                                     rootBlock, blockX, blockY, paintInfo));
2052     return result;
2053 }
2054
2055 GapRects RenderBlock::fillInlineSelectionGaps(RenderBlock* rootBlock, int blockX, int blockY, int tx, int ty, 
2056                                               int& lastTop, int& lastLeft, int& lastRight, const PaintInfo* paintInfo)
2057 {
2058     GapRects result;
2059
2060     bool containsStart = selectionState() == SelectionStart || selectionState() == SelectionBoth;
2061
2062     if (!firstLineBox()) {
2063         if (containsStart) {
2064             // Go ahead and update our lastY to be the bottom of the block.  <hr>s or empty blocks with height can trip this
2065             // case.
2066             lastTop = (ty - blockY) + height();
2067             lastLeft = leftSelectionOffset(rootBlock, height());
2068             lastRight = rightSelectionOffset(rootBlock, height());
2069         }
2070         return result;
2071     }
2072
2073     RootInlineBox* lastSelectedLine = 0;
2074     RootInlineBox* curr;
2075     for (curr = firstRootBox(); curr && !curr->hasSelectedChildren(); curr = curr->nextRootBox()) { }
2076
2077     // Now paint the gaps for the lines.
2078     for (; curr && curr->hasSelectedChildren(); curr = curr->nextRootBox()) {
2079         int selTop =  curr->selectionTop();
2080         int selHeight = curr->selectionHeight();
2081
2082         if (!containsStart && !lastSelectedLine &&
2083             selectionState() != SelectionStart && selectionState() != SelectionBoth)
2084             result.uniteCenter(fillVerticalSelectionGap(lastTop, lastLeft, lastRight, ty + selTop,
2085                                                         rootBlock, blockX, blockY, paintInfo));
2086
2087         if (!paintInfo || ty + selTop < paintInfo->rect.bottom() && ty + selTop + selHeight > paintInfo->rect.y())
2088             result.unite(curr->fillLineSelectionGap(selTop, selHeight, rootBlock, blockX, blockY, tx, ty, paintInfo));
2089
2090         lastSelectedLine = curr;
2091     }
2092
2093     if (containsStart && !lastSelectedLine)
2094         // Selection must start just after our last line.
2095         lastSelectedLine = lastRootBox();
2096
2097     if (lastSelectedLine && selectionState() != SelectionEnd && selectionState() != SelectionBoth) {
2098         // Go ahead and update our lastY to be the bottom of the last selected line.
2099         lastTop = (ty - blockY) + lastSelectedLine->bottomOverflow();
2100         lastLeft = leftSelectionOffset(rootBlock, lastSelectedLine->bottomOverflow());
2101         lastRight = rightSelectionOffset(rootBlock, lastSelectedLine->bottomOverflow());
2102     }
2103     return result;
2104 }
2105
2106 GapRects RenderBlock::fillBlockSelectionGaps(RenderBlock* rootBlock, int blockX, int blockY, int tx, int ty,
2107                                              int& lastTop, int& lastLeft, int& lastRight, const PaintInfo* paintInfo)
2108 {
2109     GapRects result;
2110
2111     // Go ahead and jump right to the first block child that contains some selected objects.
2112     RenderBox* curr;
2113     for (curr = firstChildBox(); curr && curr->selectionState() == SelectionNone; curr = curr->nextSiblingBox()) { }
2114
2115     for (bool sawSelectionEnd = false; curr && !sawSelectionEnd; curr = curr->nextSiblingBox()) {
2116         SelectionState childState = curr->selectionState();
2117         if (childState == SelectionBoth || childState == SelectionEnd)
2118             sawSelectionEnd = true;
2119
2120         if (curr->isFloatingOrPositioned())
2121             continue; // We must be a normal flow object in order to even be considered.
2122
2123         if (curr->isRelPositioned() && curr->hasLayer()) {
2124             // If the relposition offset is anything other than 0, then treat this just like an absolute positioned element.
2125             // Just disregard it completely.
2126             IntSize relOffset = curr->layer()->relativePositionOffset();
2127             if (relOffset.width() || relOffset.height())
2128                 continue;
2129         }
2130
2131         bool paintsOwnSelection = curr->shouldPaintSelectionGaps() || curr->isTable(); // FIXME: Eventually we won't special-case table like this.
2132         bool fillBlockGaps = paintsOwnSelection || (curr->canBeSelectionLeaf() && childState != SelectionNone);
2133         if (fillBlockGaps) {
2134             // We need to fill the vertical gap above this object.
2135             if (childState == SelectionEnd || childState == SelectionInside)
2136                 // Fill the gap above the object.
2137                 result.uniteCenter(fillVerticalSelectionGap(lastTop, lastLeft, lastRight, 
2138                                                             ty + curr->y(), rootBlock, blockX, blockY, paintInfo));
2139
2140             // Only fill side gaps for objects that paint their own selection if we know for sure the selection is going to extend all the way *past*
2141             // our object.  We know this if the selection did not end inside our object.
2142             if (paintsOwnSelection && (childState == SelectionStart || sawSelectionEnd))
2143                 childState = SelectionNone;
2144
2145             // Fill side gaps on this object based off its state.
2146             bool leftGap, rightGap;
2147             getHorizontalSelectionGapInfo(childState, leftGap, rightGap);
2148
2149             if (leftGap)
2150                 result.uniteLeft(fillLeftSelectionGap(this, curr->x(), curr->y(), curr->height(), rootBlock, blockX, blockY, tx, ty, paintInfo));
2151             if (rightGap)
2152                 result.uniteRight(fillRightSelectionGap(this, curr->x() + curr->width(), curr->y(), curr->height(), rootBlock, blockX, blockY, tx, ty, paintInfo));
2153
2154             // Update lastTop to be just underneath the object.  lastLeft and lastRight extend as far as
2155             // they can without bumping into floating or positioned objects.  Ideally they will go right up
2156             // to the border of the root selection block.
2157             lastTop = (ty - blockY) + (curr->y() + curr->height());
2158             lastLeft = leftSelectionOffset(rootBlock, curr->y() + curr->height());
2159             lastRight = rightSelectionOffset(rootBlock, curr->y() + curr->height());
2160         } else if (childState != SelectionNone)
2161             // We must be a block that has some selected object inside it.  Go ahead and recur.
2162             result.unite(toRenderBlock(curr)->fillSelectionGaps(rootBlock, blockX, blockY, tx + curr->x(), ty + curr->y(), 
2163                                                                             lastTop, lastLeft, lastRight, paintInfo));
2164     }
2165     return result;
2166 }
2167
2168 IntRect RenderBlock::fillHorizontalSelectionGap(RenderObject* selObj, int xPos, int yPos, int width, int height, const PaintInfo* paintInfo)
2169 {
2170     if (width <= 0 || height <= 0)
2171         return IntRect();
2172     IntRect gapRect(xPos, yPos, width, height);
2173     if (paintInfo && selObj->style()->visibility() == VISIBLE)
2174         paintInfo->context->fillRect(gapRect, selObj->selectionBackgroundColor());
2175     return gapRect;
2176 }
2177
2178 IntRect RenderBlock::fillVerticalSelectionGap(int lastTop, int lastLeft, int lastRight, int bottomY, RenderBlock* rootBlock,
2179                                               int blockX, int blockY, const PaintInfo* paintInfo)
2180 {
2181     int top = blockY + lastTop;
2182     int height = bottomY - top;
2183     if (height <= 0)
2184         return IntRect();
2185
2186     // Get the selection offsets for the bottom of the gap
2187     int left = blockX + max(lastLeft, leftSelectionOffset(rootBlock, bottomY));
2188     int right = blockX + min(lastRight, rightSelectionOffset(rootBlock, bottomY));
2189     int width = right - left;
2190     if (width <= 0)
2191         return IntRect();
2192
2193     IntRect gapRect(left, top, width, height);
2194     if (paintInfo)
2195         paintInfo->context->fillRect(gapRect, selectionBackgroundColor());
2196     return gapRect;
2197 }
2198
2199 IntRect RenderBlock::fillLeftSelectionGap(RenderObject* selObj, int xPos, int yPos, int height, RenderBlock* rootBlock,
2200                                           int blockX, int /*blockY*/, int tx, int ty, const PaintInfo* paintInfo)
2201 {
2202     int top = yPos + ty;
2203     int left = blockX + max(leftSelectionOffset(rootBlock, yPos), leftSelectionOffset(rootBlock, yPos + height));
2204     int right = min(xPos + tx, blockX + min(rightSelectionOffset(rootBlock, yPos), rightSelectionOffset(rootBlock, yPos + height)));
2205     int width = right - left;
2206     if (width <= 0)
2207         return IntRect();
2208
2209     IntRect gapRect(left, top, width, height);
2210     if (paintInfo)
2211         paintInfo->context->fillRect(gapRect, selObj->selectionBackgroundColor());
2212     return gapRect;
2213 }
2214
2215 IntRect RenderBlock::fillRightSelectionGap(RenderObject* selObj, int xPos, int yPos, int height, RenderBlock* rootBlock,
2216                                            int blockX, int /*blockY*/, int tx, int ty, const PaintInfo* paintInfo)
2217 {
2218     int left = max(xPos + tx, blockX + max(leftSelectionOffset(rootBlock, yPos), leftSelectionOffset(rootBlock, yPos + height)));
2219     int top = yPos + ty;
2220     int right = blockX + min(rightSelectionOffset(rootBlock, yPos), rightSelectionOffset(rootBlock, yPos + height));
2221     int width = right - left;
2222     if (width <= 0)
2223         return IntRect();
2224
2225     IntRect gapRect(left, top, width, height);
2226     if (paintInfo)
2227         paintInfo->context->fillRect(gapRect, selObj->selectionBackgroundColor());
2228     return gapRect;
2229 }
2230
2231 void RenderBlock::getHorizontalSelectionGapInfo(SelectionState state, bool& leftGap, bool& rightGap)
2232 {
2233     bool ltr = style()->direction() == LTR;
2234     leftGap = (state == RenderObject::SelectionInside) ||
2235               (state == RenderObject::SelectionEnd && ltr) ||
2236               (state == RenderObject::SelectionStart && !ltr);
2237     rightGap = (state == RenderObject::SelectionInside) ||
2238                (state == RenderObject::SelectionStart && ltr) ||
2239                (state == RenderObject::SelectionEnd && !ltr);
2240 }
2241
2242 int RenderBlock::leftSelectionOffset(RenderBlock* rootBlock, int yPos)
2243 {
2244     int left = leftOffset(yPos, false);
2245     if (left == borderLeft() + paddingLeft()) {
2246         if (rootBlock != this)
2247             // The border can potentially be further extended by our containingBlock().
2248             return containingBlock()->leftSelectionOffset(rootBlock, yPos + y());
2249         return left;
2250     }
2251     else {
2252         RenderBlock* cb = this;
2253         while (cb != rootBlock) {
2254             left += cb->x();
2255             cb = cb->containingBlock();
2256         }
2257     }
2258     
2259     return left;
2260 }
2261
2262 int RenderBlock::rightSelectionOffset(RenderBlock* rootBlock, int yPos)
2263 {
2264     int right = rightOffset(yPos, false);
2265     if (right == (contentWidth() + (borderLeft() + paddingLeft()))) {
2266         if (rootBlock != this)
2267             // The border can potentially be further extended by our containingBlock().
2268             return containingBlock()->rightSelectionOffset(rootBlock, yPos + y());
2269         return right;
2270     }
2271     else {
2272         RenderBlock* cb = this;
2273         while (cb != rootBlock) {
2274             right += cb->x();
2275             cb = cb->containingBlock();
2276         }
2277     }
2278     return right;
2279 }
2280
2281 void RenderBlock::insertPositionedObject(RenderBox* o)
2282 {
2283     // Create the list of special objects if we don't aleady have one
2284     if (!m_positionedObjects)
2285         m_positionedObjects = new ListHashSet<RenderBox*>;
2286
2287     m_positionedObjects->add(o);
2288 }
2289
2290 void RenderBlock::removePositionedObject(RenderBox* o)
2291 {
2292     if (m_positionedObjects)
2293         m_positionedObjects->remove(o);
2294 }
2295
2296 void RenderBlock::removePositionedObjects(RenderBlock* o)
2297 {
2298     if (!m_positionedObjects)
2299         return;
2300     
2301     RenderBox* r;
2302     
2303     Iterator end = m_positionedObjects->end();
2304     
2305     Vector<RenderBox*, 16> deadObjects;
2306
2307     for (Iterator it = m_positionedObjects->begin(); it != end; ++it) {
2308         r = *it;
2309         if (!o || r->isDescendantOf(o)) {
2310             if (o)
2311                 r->setChildNeedsLayout(true, false);
2312             
2313             // It is parent blocks job to add positioned child to positioned objects list of its containing block
2314             // Parent layout needs to be invalidated to ensure this happens.
2315             RenderObject* p = r->parent();
2316             while (p && !p->isRenderBlock())
2317                 p = p->parent();
2318             if (p)
2319                 p->setChildNeedsLayout(true);
2320             
2321             deadObjects.append(r);
2322         }
2323     }
2324     
2325     for (unsigned i = 0; i < deadObjects.size(); i++)
2326         m_positionedObjects->remove(deadObjects.at(i));
2327 }
2328
2329 void RenderBlock::insertFloatingObject(RenderBox* o)
2330 {
2331     ASSERT(o->isFloating());
2332
2333     // Create the list of special objects if we don't aleady have one
2334     if (!m_floatingObjects) {
2335         m_floatingObjects = new DeprecatedPtrList<FloatingObject>;
2336         m_floatingObjects->setAutoDelete(true);
2337     } else {
2338         // Don't insert the object again if it's already in the list
2339         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2340         FloatingObject* f;
2341         while ( (f = it.current()) ) {
2342             if (f->m_renderer == o) return;
2343             ++it;
2344         }
2345     }
2346
2347     // Create the special object entry & append it to the list
2348
2349     o->layoutIfNeeded();
2350
2351     FloatingObject* newObj = new FloatingObject(o->style()->floating() == FLEFT ? FloatingObject::FloatLeft : FloatingObject::FloatRight);
2352
2353     newObj->m_top = -1;
2354     newObj->m_bottom = -1;
2355     newObj->m_width = o->width() + o->marginLeft() + o->marginRight();
2356     newObj->m_shouldPaint = !o->hasLayer(); // If a layer exists, the float will paint itself.  Otherwise someone else will.
2357     newObj->m_isDescendant = true;
2358     newObj->m_renderer = o;
2359
2360     m_floatingObjects->append(newObj);
2361 }
2362
2363 void RenderBlock::removeFloatingObject(RenderBox* o)
2364 {
2365     if (m_floatingObjects) {
2366         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2367         while (it.current()) {
2368             if (it.current()->m_renderer == o) {
2369                 if (childrenInline())
2370                     markLinesDirtyInVerticalRange(0, it.current()->m_bottom);
2371                 m_floatingObjects->removeRef(it.current());
2372             }
2373             ++it;
2374         }
2375     }
2376 }
2377
2378 bool RenderBlock::positionNewFloats()
2379 {
2380     if (!m_floatingObjects)
2381         return false;
2382     
2383     FloatingObject* f = m_floatingObjects->last();
2384
2385     // If all floats have already been positioned, then we have no work to do.
2386     if (!f || f->m_top != -1)
2387         return false;
2388
2389     // Move backwards through our floating object list until we find a float that has
2390     // already been positioned.  Then we'll be able to move forward, positioning all of
2391     // the new floats that need it.
2392     FloatingObject* lastFloat = m_floatingObjects->getPrev();
2393     while (lastFloat && lastFloat->m_top == -1) {
2394         f = m_floatingObjects->prev();
2395         lastFloat = m_floatingObjects->getPrev();
2396     }
2397
2398     int y = height();
2399     
2400     // The float cannot start above the y position of the last positioned float.
2401     if (lastFloat)
2402         y = max(lastFloat->m_top, y);
2403
2404     // Now walk through the set of unpositioned floats and place them.
2405     while (f) {
2406         // The containing block is responsible for positioning floats, so if we have floats in our
2407         // list that come from somewhere else, do not attempt to position them.
2408         if (f->m_renderer->containingBlock() != this) {
2409             f = m_floatingObjects->next();
2410             continue;
2411         }
2412
2413         RenderBox* o = f->m_renderer;
2414         int _height = o->height() + o->marginTop() + o->marginBottom();
2415
2416         int ro = rightOffset(); // Constant part of right offset.
2417         int lo = leftOffset(); // Constat part of left offset.
2418         int fwidth = f->m_width; // The width we look for.
2419         if (ro - lo < fwidth)
2420             fwidth = ro - lo; // Never look for more than what will be available.
2421         
2422         IntRect oldRect(o->x(), o->y() , o->width(), o->height());
2423         
2424         if (o->style()->clear() & CLEFT)
2425             y = max(leftBottom(), y);
2426         if (o->style()->clear() & CRIGHT)
2427             y = max(rightBottom(), y);
2428
2429         if (o->style()->floating() == FLEFT) {
2430             int heightRemainingLeft = 1;
2431             int heightRemainingRight = 1;
2432             int fx = leftRelOffset(y,lo, false, &heightRemainingLeft);
2433             while (rightRelOffset(y,ro, false, &heightRemainingRight)-fx < fwidth) {
2434                 y += min(heightRemainingLeft, heightRemainingRight);
2435                 fx = leftRelOffset(y,lo, false, &heightRemainingLeft);
2436             }
2437             fx = max(0, fx);
2438             f->m_left = fx;
2439             o->setLocation(fx + o->marginLeft(), y + o->marginTop());
2440         } else {
2441             int heightRemainingLeft = 1;
2442             int heightRemainingRight = 1;
2443             int fx = rightRelOffset(y,ro, false, &heightRemainingRight);
2444             while (fx - leftRelOffset(y,lo, false, &heightRemainingLeft) < fwidth) {
2445                 y += min(heightRemainingLeft, heightRemainingRight);
2446                 fx = rightRelOffset(y, ro, false, &heightRemainingRight);
2447             }
2448             f->m_left = fx - f->m_width;
2449             o->setLocation(fx - o->marginRight() - o->width(), y + o->marginTop());
2450         }
2451
2452         f->m_top = y;
2453         f->m_bottom = f->m_top + _height;
2454
2455         // If the child moved, we have to repaint it.
2456         if (o->checkForRepaintDuringLayout())
2457             o->repaintDuringLayoutIfMoved(oldRect);
2458
2459         f = m_floatingObjects->next();
2460     }
2461     return true;
2462 }
2463
2464 void RenderBlock::newLine(EClear clear)
2465 {
2466     positionNewFloats();
2467     // set y position
2468     int newY = 0;
2469     switch(clear)
2470     {
2471         case CLEFT:
2472             newY = leftBottom();
2473             break;
2474         case CRIGHT:
2475             newY = rightBottom();
2476             break;
2477         case CBOTH:
2478             newY = floatBottom();
2479         default:
2480             break;
2481     }
2482     if (height() < newY)
2483         setHeight(newY);
2484 }
2485
2486 void RenderBlock::addPercentHeightDescendant(RenderBox* descendant)
2487 {
2488     if (!gPercentHeightDescendantsMap) {
2489         gPercentHeightDescendantsMap = new PercentHeightDescendantsMap;
2490         gPercentHeightContainerMap = new PercentHeightContainerMap;
2491     }
2492
2493     HashSet<RenderBox*>* descendantSet = gPercentHeightDescendantsMap->get(this);
2494     if (!descendantSet) {
2495         descendantSet = new HashSet<RenderBox*>;
2496         gPercentHeightDescendantsMap->set(this, descendantSet);
2497     }
2498     bool added = descendantSet->add(descendant).second;
2499     if (!added) {
2500         ASSERT(gPercentHeightContainerMap->get(descendant));
2501         ASSERT(gPercentHeightContainerMap->get(descendant)->contains(this));
2502         return;
2503     }
2504
2505     HashSet<RenderBlock*>* containerSet = gPercentHeightContainerMap->get(descendant);
2506     if (!containerSet) {
2507         containerSet = new HashSet<RenderBlock*>;
2508         gPercentHeightContainerMap->set(descendant, containerSet);
2509     }
2510     ASSERT(!containerSet->contains(this));
2511     containerSet->add(this);
2512 }
2513
2514 void RenderBlock::removePercentHeightDescendant(RenderBox* descendant)
2515 {
2516     if (!gPercentHeightContainerMap)
2517         return;
2518
2519     HashSet<RenderBlock*>* containerSet = gPercentHeightContainerMap->take(descendant);
2520     if (!containerSet)
2521         return;
2522
2523     HashSet<RenderBlock*>::iterator end = containerSet->end();
2524     for (HashSet<RenderBlock*>::iterator it = containerSet->begin(); it != end; ++it) {
2525         RenderBlock* container = *it;
2526         HashSet<RenderBox*>* descendantSet = gPercentHeightDescendantsMap->get(container);
2527         ASSERT(descendantSet);
2528         if (!descendantSet)
2529             continue;
2530         ASSERT(descendantSet->contains(descendant));
2531         descendantSet->remove(descendant);
2532         if (descendantSet->isEmpty()) {
2533             gPercentHeightDescendantsMap->remove(container);
2534             delete descendantSet;
2535         }
2536     }
2537
2538     delete containerSet;
2539 }
2540
2541 int RenderBlock::leftOffset() const
2542 {
2543     return borderLeft() + paddingLeft();
2544 }
2545
2546 int RenderBlock::leftRelOffset(int y, int fixedOffset, bool applyTextIndent, int* heightRemaining) const
2547 {
2548     int left = fixedOffset;
2549     if (m_floatingObjects) {
2550         if ( heightRemaining ) *heightRemaining = 1;
2551         FloatingObject* r;
2552         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2553         for ( ; (r = it.current()); ++it )
2554         {
2555             if (r->m_top <= y && r->m_bottom > y &&
2556                 r->type() == FloatingObject::FloatLeft &&
2557                 r->m_left + r->m_width > left) {
2558                 left = r->m_left + r->m_width;
2559                 if ( heightRemaining ) *heightRemaining = r->m_bottom - y;
2560             }
2561         }
2562     }
2563
2564     if (applyTextIndent && style()->direction() == LTR) {
2565         int cw = 0;
2566         if (style()->textIndent().isPercent())
2567             cw = containingBlock()->availableWidth();
2568         left += style()->textIndent().calcMinValue(cw);
2569     }
2570
2571     return left;
2572 }
2573
2574 int RenderBlock::rightOffset() const
2575 {
2576     return borderLeft() + paddingLeft() + availableWidth();
2577 }
2578
2579 int RenderBlock::rightRelOffset(int y, int fixedOffset, bool applyTextIndent, int* heightRemaining) const
2580 {
2581     int right = fixedOffset;
2582
2583     if (m_floatingObjects) {
2584         if (heightRemaining) *heightRemaining = 1;
2585         FloatingObject* r;
2586         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2587         for ( ; (r = it.current()); ++it )
2588         {
2589             if (r->m_top <= y && r->m_bottom > y &&
2590                 r->type() == FloatingObject::FloatRight &&
2591                 r->m_left < right) {
2592                 right = r->m_left;
2593                 if ( heightRemaining ) *heightRemaining = r->m_bottom - y;
2594             }
2595         }
2596     }
2597     
2598     if (applyTextIndent && style()->direction() == RTL) {
2599         int cw = 0;
2600         if (style()->textIndent().isPercent())
2601             cw = containingBlock()->availableWidth();
2602         right -= style()->textIndent().calcMinValue(cw);
2603     }
2604     
2605     return right;
2606 }
2607
2608 int
2609 RenderBlock::lineWidth(int y, bool firstLine) const
2610 {
2611     int result = rightOffset(y, firstLine) - leftOffset(y, firstLine);
2612     return (result < 0) ? 0 : result;
2613 }
2614
2615 int RenderBlock::nextFloatBottomBelow(int height) const
2616 {
2617     if (!m_floatingObjects)
2618         return 0;
2619
2620     int bottom = INT_MAX;
2621     FloatingObject* r;
2622     DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2623     for ( ; (r = it.current()); ++it) {
2624         if (r->m_bottom > height)
2625             bottom = min(r->m_bottom, bottom);
2626     }
2627
2628     return bottom == INT_MAX ? 0 : bottom;
2629 }
2630
2631 int
2632 RenderBlock::floatBottom() const
2633 {
2634     if (!m_floatingObjects) return 0;
2635     int bottom=0;
2636     FloatingObject* r;
2637     DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2638     for ( ; (r = it.current()); ++it )
2639         if (r->m_bottom>bottom)
2640             bottom=r->m_bottom;
2641     return bottom;
2642 }
2643
2644 IntRect RenderBlock::floatRect() const
2645 {
2646     IntRect result;
2647     if (!m_floatingObjects || hasOverflowClip())
2648         return result;
2649     FloatingObject* r;
2650     DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2651     for (; (r = it.current()); ++it) {
2652         if (r->m_shouldPaint && !r->m_renderer->hasLayer()) {
2653             IntRect childRect = r->m_renderer->overflowRect(false);
2654             childRect.move(r->m_left + r->m_renderer->marginLeft(), r->m_top + r->m_renderer->marginTop());
2655             result.unite(childRect);
2656         }
2657     }
2658
2659     return result;
2660 }
2661
2662 int RenderBlock::lowestPosition(bool includeOverflowInterior, bool includeSelf) const
2663 {
2664     if (!includeOverflowInterior && (hasOverflowClip() || hasControlClip()))
2665         return includeSelf && width() > 0 ? overflowHeight(false) : 0;
2666     
2667     int bottom = includeSelf && width() > 0 ? height() : 0;
2668     if (!hasColumns()) {
2669         // FIXME: Come up with a way to use the layer tree to avoid visiting all the kids.
2670         // For now, we have to descend into all the children, since we may have a huge abs div inside
2671         // a tiny rel div buried somewhere deep in our child tree.  In this case we have to get to
2672         // the abs div.
2673         for (RenderObject* c = firstChild(); c; c = c->nextSibling()) {
2674             if (!c->isFloatingOrPositioned() && !c->isText() && !c->isRenderInline())
2675                 bottom = max(bottom, toRenderBox(c)->y() + c->lowestPosition(false));
2676         }
2677     }
2678
2679     if (includeSelf && isRelPositioned())
2680         bottom += relativePositionOffsetY();     
2681     if (!includeOverflowInterior && hasOverflowClip())
2682         return bottom;
2683
2684     int relativeOffset = includeSelf && isRelPositioned() ? relativePositionOffsetY() : 0;
2685
2686     if (includeSelf)
2687         bottom = max(bottom, m_overflowHeight + relativeOffset);
2688         
2689     if (m_positionedObjects) {
2690         RenderBox* r;
2691         Iterator end = m_positionedObjects->end();
2692         for (Iterator it = m_positionedObjects->begin(); it != end; ++it) {
2693             r = *it;
2694             // Fixed positioned objects do not scroll and thus should not constitute
2695             // part of the lowest position.
2696             if (r->style()->position() != FixedPosition) {
2697                 // FIXME: Should work for overflow sections too.
2698                 // If a positioned object lies completely to the left of the root it will be unreachable via scrolling.
2699                 // Therefore we should not allow it to contribute to the lowest position.
2700                 if (!isRenderView() || r->x() + r->width() > 0 || r->x() + r->rightmostPosition(false) > 0) {
2701                     int lp = r->y() + r->lowestPosition(false);
2702                     bottom = max(bottom, lp + relativeOffset);
2703                 }
2704             }
2705         }
2706     }
2707
2708     if (hasColumns()) {
2709         Vector<IntRect>* colRects = columnRects();
2710         for (unsigned i = 0; i < colRects->size(); i++)
2711             bottom = max(bottom, colRects->at(i).bottom() + relativeOffset);
2712         return bottom;
2713     }
2714
2715     if (m_floatingObjects) {
2716         FloatingObject* r;
2717         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2718         for ( ; (r = it.current()); ++it ) {
2719             if (r->m_shouldPaint || r->m_renderer->hasLayer()) {
2720                 int lp = r->m_top + r->m_renderer->marginTop() + r->m_renderer->lowestPosition(false);
2721                 bottom = max(bottom, lp + relativeOffset);
2722             }
2723         }
2724     }
2725
2726     if (!includeSelf && lastLineBox()) {
2727         int lp = lastLineBox()->yPos() + lastLineBox()->height();
2728         bottom = max(bottom, lp);
2729     }
2730     
2731     return bottom;
2732 }
2733
2734 int RenderBlock::rightmostPosition(bool includeOverflowInterior, bool includeSelf) const
2735 {
2736     if (!includeOverflowInterior && (hasOverflowClip() || hasControlClip()))
2737         return includeSelf && height() > 0 ? overflowWidth(false) : 0;
2738
2739     int right = includeSelf && height() > 0 ? width() : 0;
2740
2741     if (!hasColumns()) {
2742         // FIXME: Come up with a way to use the layer tree to avoid visiting all the kids.
2743         // For now, we have to descend into all the children, since we may have a huge abs div inside
2744         // a tiny rel div buried somewhere deep in our child tree.  In this case we have to get to
2745         // the abs div.
2746         for (RenderObject* c = firstChild(); c; c = c->nextSibling()) {
2747             if (!c->isFloatingOrPositioned() && c->isBox() && !c->isRenderInline())
2748                 right = max(right, toRenderBox(c)->x() + c->rightmostPosition(false));
2749         }
2750     }
2751
2752     if (includeSelf && isRelPositioned())
2753         right += relativePositionOffsetX();
2754
2755     if (!includeOverflowInterior && hasOverflowClip())
2756         return right;
2757
2758     int relativeOffset = includeSelf && isRelPositioned() ? relativePositionOffsetX() : 0;
2759
2760     if (includeSelf)
2761         right = max(right, m_overflowWidth + relativeOffset);
2762
2763     if (m_positionedObjects) {
2764         RenderBox* r;
2765         Iterator end = m_positionedObjects->end();
2766         for (Iterator it = m_positionedObjects->begin() ; it != end; ++it) {
2767             r = *it;
2768             // Fixed positioned objects do not scroll and thus should not constitute
2769             // part of the rightmost position.
2770             if (r->style()->position() != FixedPosition) {
2771                 // FIXME: Should work for overflow sections too.
2772                 // If a positioned object lies completely above the root it will be unreachable via scrolling.
2773                 // Therefore we should not allow it to contribute to the rightmost position.
2774                 if (!isRenderView() || r->y() + r->height() > 0 || r->y() + r->lowestPosition(false) > 0) {
2775                     int rp = r->x() + r->rightmostPosition(false);
2776                     right = max(right, rp + relativeOffset);
2777                 }
2778             }
2779         }
2780     }
2781
2782     if (hasColumns()) {
2783         // This only matters for LTR
2784         if (style()->direction() == LTR)
2785             right = max(columnRects()->last().right() + relativeOffset, right);
2786         return right;
2787     }
2788
2789     if (m_floatingObjects) {
2790         FloatingObject* r;
2791         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2792         for ( ; (r = it.current()); ++it ) {
2793             if (r->m_shouldPaint || r->m_renderer->hasLayer()) {
2794                 int rp = r->m_left + r->m_renderer->marginLeft() + r->m_renderer->rightmostPosition(false);
2795                 right = max(right, rp + relativeOffset);
2796             }
2797         }
2798     }
2799
2800     if (!includeSelf && firstLineBox()) {
2801         for (InlineRunBox* currBox = firstLineBox(); currBox; currBox = currBox->nextLineBox()) {
2802             int rp = currBox->xPos() + currBox->width();
2803             // If this node is a root editable element, then the rightmostPosition should account for a caret at the end.
2804             // FIXME: Need to find another way to do this, since scrollbars could show when we don't want them to.
2805             if (node()->isContentEditable() && node() == node()->rootEditableElement() && style()->direction() == LTR)
2806                 rp += 1;
2807             right = max(right, rp);
2808         }
2809     }
2810     
2811     return right;
2812 }
2813
2814 int RenderBlock::leftmostPosition(bool includeOverflowInterior, bool includeSelf) const
2815 {
2816     if (!includeOverflowInterior && (hasOverflowClip() || hasControlClip()))
2817         return includeSelf && height() > 0 ? overflowLeft(false) : width();
2818
2819     int left = includeSelf && height() > 0 ? 0 : width();
2820     if (!hasColumns()) {
2821         // FIXME: Come up with a way to use the layer tree to avoid visiting all the kids.
2822         // For now, we have to descend into all the children, since we may have a huge abs div inside
2823         // a tiny rel div buried somewhere deep in our child tree.  In this case we have to get to
2824         // the abs div.
2825         for (RenderObject* c = firstChild(); c; c = c->nextSibling()) {
2826             if (!c->isFloatingOrPositioned() && c->isBox() && !c->isRenderInline())
2827                 left = min(left, toRenderBox(c)->x() + c->leftmostPosition(false));
2828         }
2829     }
2830
2831     if (includeSelf && isRelPositioned())
2832         left += relativePositionOffsetX(); 
2833
2834     if (!includeOverflowInterior && hasOverflowClip())
2835         return left;
2836     
2837     int relativeOffset = includeSelf && isRelPositioned() ? relativePositionOffsetX() : 0;
2838
2839     if (includeSelf)
2840         left = min(left, m_overflowLeft + relativeOffset);
2841
2842     if (m_positionedObjects) {
2843         RenderBox* r;
2844         Iterator end = m_positionedObjects->end();
2845         for (Iterator it = m_positionedObjects->begin(); it != end; ++it) {
2846             r = *it;
2847             // Fixed positioned objects do not scroll and thus should not constitute
2848             // part of the leftmost position.
2849             if (r->style()->position() != FixedPosition) {
2850                 // FIXME: Should work for overflow sections too.
2851                 // If a positioned object lies completely above the root it will be unreachable via scrolling.
2852                 // Therefore we should not allow it to contribute to the leftmost position.
2853                 if (!isRenderView() || r->y() + r->height() > 0 || r->y() + r->lowestPosition(false) > 0) {
2854                     int lp = r->x() + r->leftmostPosition(false);
2855                     left = min(left, lp + relativeOffset);
2856                 }
2857             }
2858         }
2859     }
2860
2861     if (hasColumns()) {
2862         // This only matters for RTL
2863         if (style()->direction() == RTL)
2864             left = min(columnRects()->last().x() + relativeOffset, left);
2865         return left;
2866     }
2867
2868     if (m_floatingObjects) {
2869         FloatingObject* r;
2870         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2871         for ( ; (r = it.current()); ++it ) {
2872             if (r->m_shouldPaint || r->m_renderer->hasLayer()) {
2873                 int lp = r->m_left + r->m_renderer->marginLeft() + r->m_renderer->leftmostPosition(false);
2874                 left = min(left, lp + relativeOffset);
2875             }
2876         }
2877     }
2878
2879     if (!includeSelf && firstLineBox()) {
2880         for (InlineRunBox* currBox = firstLineBox(); currBox; currBox = currBox->nextLineBox())
2881             left = min(left, (int)currBox->xPos());
2882     }
2883     
2884     return left;
2885 }
2886
2887 int
2888 RenderBlock::leftBottom()
2889 {
2890     if (!m_floatingObjects) return 0;
2891     int bottom=0;
2892     FloatingObject* r;
2893     DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2894     for ( ; (r = it.current()); ++it )
2895         if (r->m_bottom > bottom && r->type() == FloatingObject::FloatLeft)
2896             bottom=r->m_bottom;
2897
2898     return bottom;
2899 }
2900
2901 int
2902 RenderBlock::rightBottom()
2903 {
2904     if (!m_floatingObjects) return 0;
2905     int bottom=0;
2906     FloatingObject* r;
2907     DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
2908     for ( ; (r = it.current()); ++it )
2909         if (r->m_bottom>bottom && r->type() == FloatingObject::FloatRight)
2910             bottom=r->m_bottom;
2911
2912     return bottom;
2913 }
2914
2915 void RenderBlock::markLinesDirtyInVerticalRange(int top, int bottom)
2916 {
2917     if (top >= bottom)
2918         return;
2919
2920     RootInlineBox* lowestDirtyLine = lastRootBox();
2921     RootInlineBox* afterLowest = lowestDirtyLine;
2922     while (lowestDirtyLine && lowestDirtyLine->blockHeight() >= bottom) {
2923         afterLowest = lowestDirtyLine;
2924         lowestDirtyLine = lowestDirtyLine->prevRootBox();
2925     }
2926
2927     while (afterLowest && afterLowest->blockHeight() >= top) {
2928         afterLowest->markDirty();
2929         afterLowest = afterLowest->prevRootBox();
2930     }
2931 }
2932
2933 void RenderBlock::clearFloats()
2934 {
2935     // Inline blocks are covered by the isReplaced() check in the avoidFloats method.
2936     if (avoidsFloats() || isRoot() || isRenderView() || isFloatingOrPositioned() || isTableCell()) {
2937         if (m_floatingObjects)
2938             m_floatingObjects->clear();
2939         return;
2940     }
2941
2942     typedef HashMap<RenderObject*, FloatingObject*> RendererToFloatInfoMap;
2943     RendererToFloatInfoMap floatMap;
2944
2945     if (m_floatingObjects) {
2946         if (childrenInline()) {
2947             m_floatingObjects->first();
2948             while (FloatingObject* f = m_floatingObjects->take())
2949                 floatMap.add(f->m_renderer, f);
2950         } else
2951             m_floatingObjects->clear();
2952     }
2953
2954     // Attempt to locate a previous sibling with overhanging floats.  We skip any elements that are
2955     // out of flow (like floating/positioned elements), and we also skip over any objects that may have shifted
2956     // to avoid floats.
2957     bool parentHasFloats = false;
2958     RenderObject* prev = previousSibling();
2959     while (prev && (!prev->isBox() || !prev->isRenderBlock() || prev->avoidsFloats() || prev->isFloatingOrPositioned())) {
2960         if (prev->isFloating())
2961             parentHasFloats = true;
2962          prev = prev->previousSibling();
2963     }
2964
2965     // First add in floats from the parent.
2966     int offset = y();
2967     if (parentHasFloats) {
2968         RenderBlock* parentBlock = static_cast<RenderBlock *>(parent());
2969         addIntrudingFloats(parentBlock, parentBlock->borderLeft() + parentBlock->paddingLeft(), offset);
2970     }
2971     
2972     int xoffset = 0;
2973     if (prev)
2974         offset -= toRenderBox(prev)->y();
2975     else if (parent()->isBox()) {
2976         prev = parent();
2977         xoffset += toRenderBox(prev)->borderLeft() + toRenderBox(prev)->paddingLeft();
2978     }
2979
2980     // Add overhanging floats from the previous RenderBlock, but only if it has a float that intrudes into our space.
2981     if (!prev || !prev->isRenderBlock())
2982         return;
2983     
2984     RenderBlock* block = static_cast<RenderBlock *>(prev);
2985     if (block->m_floatingObjects && block->floatBottom() > offset)
2986         addIntrudingFloats(block, xoffset, offset);
2987
2988     if (childrenInline()) {
2989         int changeTop = INT_MAX;
2990         int changeBottom = INT_MIN;
2991         if (m_floatingObjects) {
2992             for (FloatingObject* f = m_floatingObjects->first(); f; f = m_floatingObjects->next()) {
2993                 FloatingObject* oldFloatingObject = floatMap.get(f->m_renderer);
2994                 if (oldFloatingObject) {
2995                     if (f->m_width != oldFloatingObject->m_width || f->m_left != oldFloatingObject->m_left) {
2996                         changeTop = 0;
2997                         changeBottom = max(changeBottom, max(f->m_bottom, oldFloatingObject->m_bottom));
2998                     } else if (f->m_bottom != oldFloatingObject->m_bottom) {
2999                         changeTop = min(changeTop, min(f->m_bottom, oldFloatingObject->m_bottom));
3000                         changeBottom = max(changeBottom, max(f->m_bottom, oldFloatingObject->m_bottom));
3001                     }
3002
3003                     floatMap.remove(f->m_renderer);
3004                     delete oldFloatingObject;
3005                 } else {
3006                     changeTop = 0;
3007                     changeBottom = max(changeBottom, f->m_bottom);
3008                 }
3009             }
3010         }
3011
3012         RendererToFloatInfoMap::iterator end = floatMap.end();
3013         for (RendererToFloatInfoMap::iterator it = floatMap.begin(); it != end; ++it) {
3014             FloatingObject* floatingObject = (*it).second;
3015             if (!floatingObject->m_isDescendant) {
3016                 changeTop = 0;
3017                 changeBottom = max(changeBottom, floatingObject->m_bottom);
3018             }
3019         }
3020         deleteAllValues(floatMap);
3021
3022         markLinesDirtyInVerticalRange(changeTop, changeBottom);
3023     }
3024 }
3025
3026 int RenderBlock::addOverhangingFloats(RenderBlock* child, int xoff, int yoff, bool makeChildPaintOtherFloats)
3027 {
3028     // Prevent floats from being added to the canvas by the root element, e.g., <html>.
3029     if (child->hasOverflowClip() || !child->containsFloats() || child->isRoot())
3030         return 0;
3031
3032     int lowestFloatBottom = 0;
3033
3034     // Floats that will remain the child's responsiblity to paint should factor into its
3035     // visual overflow.
3036     IntRect floatsOverflowRect;
3037     DeprecatedPtrListIterator<FloatingObject> it(*child->m_floatingObjects);
3038     for (FloatingObject* r; (r = it.current()); ++it) {
3039         int bottom = child->y() + r->m_bottom;
3040         lowestFloatBottom = max(lowestFloatBottom, bottom);
3041
3042         if (bottom > height()) {
3043             // If the object is not in the list, we add it now.
3044             if (!containsFloat(r->m_renderer)) {
3045                 FloatingObject *floatingObj = new FloatingObject(r->type());
3046                 floatingObj->m_top = r->m_top - yoff;
3047                 floatingObj->m_bottom = r->m_bottom - yoff;
3048                 floatingObj->m_left = r->m_left - xoff;
3049                 floatingObj->m_width = r->m_width;
3050                 floatingObj->m_renderer = r->m_renderer;
3051
3052                 // The nearest enclosing layer always paints the float (so that zindex and stacking
3053                 // behaves properly).  We always want to propagate the desire to paint the float as
3054                 // far out as we can, to the outermost block that overlaps the float, stopping only
3055                 // if we hit a layer boundary.
3056                 if (r->m_renderer->enclosingLayer() == enclosingLayer())
3057                     r->m_shouldPaint = false;
3058                 else
3059                     floatingObj->m_shouldPaint = false;
3060                 
3061                 // We create the floating object list lazily.
3062                 if (!m_floatingObjects) {
3063                     m_floatingObjects = new DeprecatedPtrList<FloatingObject>;
3064                     m_floatingObjects->setAutoDelete(true);
3065                 }
3066                 m_floatingObjects->append(floatingObj);
3067             }
3068         } else if (makeChildPaintOtherFloats && !r->m_shouldPaint && !r->m_renderer->hasLayer() && r->m_renderer->isDescendantOf(child) && r->m_renderer->enclosingLayer() == child->enclosingLayer())
3069             // The float is not overhanging from this block, so if it is a descendant of the child, the child should
3070             // paint it (the other case is that it is intruding into the child), unless it has its own layer or enclosing
3071             // layer.
3072             // If makeChildPaintOtherFloats is false, it means that the child must already know about all the floats
3073             // it should paint.
3074             r->m_shouldPaint = true;
3075
3076         if (r->m_shouldPaint && !r->m_renderer->hasLayer()) {
3077             IntRect floatOverflowRect = r->m_renderer->overflowRect(false);
3078             floatOverflowRect.move(r->m_left + r->m_renderer->marginLeft(), r->m_top + r->m_renderer->marginTop());
3079             floatsOverflowRect.unite(floatOverflowRect);
3080         }
3081     }
3082     child->addVisualOverflow(floatsOverflowRect);
3083     return lowestFloatBottom;
3084 }
3085
3086 void RenderBlock::addIntrudingFloats(RenderBlock* prev, int xoff, int yoff)
3087 {
3088     // If the parent or previous sibling doesn't have any floats to add, don't bother.
3089     if (!prev->m_floatingObjects)
3090         return;
3091
3092     DeprecatedPtrListIterator<FloatingObject> it(*prev->m_floatingObjects);
3093     for (FloatingObject *r; (r = it.current()); ++it) {
3094         if (r->m_bottom > yoff) {
3095             // The object may already be in our list. Check for it up front to avoid
3096             // creating duplicate entries.
3097             FloatingObject* f = 0;
3098             if (m_floatingObjects) {
3099                 DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
3100                 while ((f = it.current())) {
3101                     if (f->m_renderer == r->m_renderer) break;
3102                     ++it;
3103                 }
3104             }
3105             if (!f) {
3106                 FloatingObject *floatingObj = new FloatingObject(r->type());
3107                 floatingObj->m_top = r->m_top - yoff;
3108                 floatingObj->m_bottom = r->m_bottom - yoff;
3109                 floatingObj->m_left = r->m_left - xoff;
3110                 // Applying the child's margin makes no sense in the case where the child was passed in.
3111                 // since his own margin was added already through the subtraction of the |xoff| variable
3112                 // above.  |xoff| will equal -flow->marginLeft() in this case, so it's already been taken
3113                 // into account.  Only apply this code if |child| is false, since otherwise the left margin
3114                 // will get applied twice.
3115                 if (prev != parent())
3116                     floatingObj->m_left += prev->marginLeft();
3117                 floatingObj->m_left -= marginLeft();
3118                 floatingObj->m_shouldPaint = false;  // We are not in the direct inheritance chain for this float. We will never paint it.
3119                 floatingObj->m_width = r->m_width;
3120                 floatingObj->m_renderer = r->m_renderer;
3121                 
3122                 // We create the floating object list lazily.
3123                 if (!m_floatingObjects) {
3124                     m_floatingObjects = new DeprecatedPtrList<FloatingObject>;
3125                     m_floatingObjects->setAutoDelete(true);
3126                 }
3127                 m_floatingObjects->append(floatingObj);
3128             }
3129         }
3130     }
3131 }
3132
3133 bool RenderBlock::avoidsFloats() const
3134 {
3135     // Floats can't intrude into our box if we have a non-auto column count or width.
3136     return RenderContainer::avoidsFloats() || !style()->hasAutoColumnCount() || !style()->hasAutoColumnWidth();
3137 }
3138
3139 bool RenderBlock::containsFloat(RenderObject* o)
3140 {
3141     if (m_floatingObjects) {
3142         DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
3143         while (it.current()) {
3144             if (it.current()->m_renderer == o)
3145                 return true;
3146             ++it;
3147         }
3148     }
3149     return false;
3150 }
3151
3152 void RenderBlock::markAllDescendantsWithFloatsForLayout(RenderBox* floatToRemove, bool inLayout)
3153 {
3154     setChildNeedsLayout(true, !inLayout);
3155
3156     if (floatToRemove)
3157         removeFloatingObject(floatToRemove);
3158
3159     // Iterate over our children and mark them as needed.
3160     if (!childrenInline()) {
3161         for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
3162             if (child->isRenderBlock() && !child->isFloatingOrPositioned() &&
3163                 ((floatToRemove ? child->containsFloat(floatToRemove) : child->containsFloats()) || child->shrinkToAvoidFloats()))
3164                 toRenderBlock(child)->markAllDescendantsWithFloatsForLayout(floatToRemove, inLayout);
3165         }
3166     }
3167 }
3168
3169 int RenderBlock::getClearDelta(RenderBox* child)
3170 {
3171     // There is no need to compute clearance if we have no floats.
3172     if (!containsFloats())
3173         return 0;
3174     
3175     // At least one float is present.  We need to perform the clearance computation.
3176     bool clearSet = child->style()->clear() != CNONE;
3177     int bottom = 0;
3178     switch (child->style()->clear()) {
3179         case CNONE:
3180             break;
3181         case CLEFT:
3182             bottom = leftBottom();
3183             break;
3184         case CRIGHT:
3185             bottom = rightBottom();
3186             break;
3187         case CBOTH:
3188             bottom = floatBottom();
3189             break;
3190     }
3191
3192     // We also clear floats if we are too big to sit on the same line as a float (and wish to avoid floats by default).
3193     // FIXME: Note that the remaining space checks aren't quite accurate, since you should be able to clear only some floats (the minimum # needed
3194     // to fit) and not all (we should be using nextFloatBottomBelow and looping).
3195     // Do not allow tables to wrap in quirks or even in almost strict mode 
3196     // (ebay on the PLT, finance.yahoo.com in the real world, versiontracker.com forces even almost strict mode not to work)
3197     int result = clearSet ? max(0, bottom - child->y()) : 0;
3198     if (!result && child->avoidsFloats() && child->style()->width().isFixed() && 
3199         child->minPrefWidth() > lineWidth(child->y(), false) && child->minPrefWidth() <= availableWidth() && 
3200         document()->inStrictMode())   
3201         result = max(0, floatBottom() - child->y());
3202     return result;
3203 }
3204
3205 void RenderBlock::addVisualOverflow(const IntRect& r)
3206 {
3207     if (r.isEmpty())
3208         return;
3209     m_overflowLeft = min(m_overflowLeft, r.x());
3210     m_overflowWidth = max(m_overflowWidth, r.right());
3211     m_overflowTop = min(m_overflowTop, r.y());
3212     m_overflowHeight = max(m_overflowHeight, r.bottom());
3213 }
3214
3215 bool RenderBlock::isPointInOverflowControl(HitTestResult& result, int, int, int, int)
3216 {
3217     if (!scrollsOverflow())
3218         return false;
3219
3220     return layer()->hitTestOverflowControls(result);
3221 }
3222
3223 bool RenderBlock::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, int _x, int _y, int _tx, int _ty, HitTestAction hitTestAction)
3224 {
3225     int tx = _tx + x();
3226     int ty = _ty + y();
3227
3228     if (!isRenderView()) {
3229         // Check if we need to do anything at all.
3230         IntRect overflowBox = overflowRect(false);
3231         overflowBox.move(tx, ty);
3232         if (!overflowBox.contains(_x, _y))
3233             return false;
3234     }
3235
3236     if (isPointInOverflowControl(result, _x, _y, tx, ty)) {
3237         if (hitTestAction == HitTestBlockBackground) {
3238             updateHitTestResult(result, IntPoint(_x - tx, _y - ty));
3239             return true;
3240         }
3241         return false;
3242     }
3243
3244      // If we have lightweight control clipping, then we can't have any spillout. 
3245     if (!hasControlClip() || controlClipRect(tx, ty).contains(_x, _y)) {
3246         // Hit test descendants first.
3247         int scrolledX = tx;
3248         int scrolledY = ty;
3249         if (hasOverflowClip())
3250             m_layer->subtractScrolledContentOffset(scrolledX, scrolledY);
3251
3252         // Hit test contents if we don't have columns.
3253         if (!hasColumns() && hitTestContents(request, result, _x, _y, scrolledX, scrolledY, hitTestAction))
3254             return true;
3255             
3256         // Hit test our columns if we do have them.
3257         if (hasColumns() && hitTestColumns(request, result, _x, _y, scrolledX, scrolledY, hitTestAction))
3258             return true;
3259
3260         // Hit test floats.
3261         if (hitTestAction == HitTestFloat && m_floatingObjects) {
3262             if (isRenderView()) {
3263                 scrolledX += toRenderView(this)->frameView()->scrollX();
3264                 scrolledY += toRenderView(this)->frameView()->scrollY();
3265             }
3266             
3267             FloatingObject* o;
3268             DeprecatedPtrListIterator<FloatingObject> it(*m_floatingObjects);
3269             for (it.toLast(); (o = it.current()); --it) {
3270                 if (o->m_shouldPaint && !o->m_renderer->hasLayer()) {
3271                     int xoffset = scrolledX + o->m_left + o->m_renderer->marginLeft() - o->m_renderer->x();
3272                     int yoffset =  scrolledY + o->m_top + o->m_renderer->marginTop() - o->m_renderer->y();
3273                     if (o->m_renderer->hitTest(request, result, IntPoint(_x, _y), xoffset, yoffset)) {
3274                         updateHitTestResult(result, IntPoint(_x - xoffset, _y - yoffset));
3275                         return true;
3276                     }
3277                 }
3278             }
3279         }
3280     }
3281
3282     // Now hit test our background
3283     if (hitTestAction == HitTestBlockBackground || hitTestAction == HitTestChildBlockBackground) {
3284         IntRect boundsRect(tx, ty, width(), height());
3285         if (visibleToHitTesting() && boundsRect.contains(_x, _y)) {
3286             updateHitTestResult(result, IntPoint(_x - tx, _y - ty));
3287             return true;
3288         }
3289     }
3290
3291     return false;
3292 }
3293
3294 bool RenderBlock::hitTestColumns(const HitTestRequest& request, HitTestResult& result, int x, int y, int tx, int ty, HitTestAction hitTestAction)
3295<