diff options
Diffstat (limited to 'Source/WebCore/rendering/RenderBlock.cpp')
-rwxr-xr-x | Source/WebCore/rendering/RenderBlock.cpp | 307 |
1 files changed, 165 insertions, 142 deletions
diff --git a/Source/WebCore/rendering/RenderBlock.cpp b/Source/WebCore/rendering/RenderBlock.cpp index 0e4a77a78..c2509065e 100755 --- a/Source/WebCore/rendering/RenderBlock.cpp +++ b/Source/WebCore/rendering/RenderBlock.cpp @@ -71,7 +71,7 @@ namespace WebCore { using namespace HTMLNames; struct SameSizeAsRenderBlock : public RenderBox { - void* pointers[3]; + void* pointers[2]; RenderObjectChildList children; RenderLineBoxList lineBoxes; uint32_t bitfields; @@ -96,11 +96,11 @@ struct SameSizeAsMarginInfo { typedef WTF::HashMap<const RenderBox*, ColumnInfo*> ColumnInfoMap; static ColumnInfoMap* gColumnInfoMap = 0; -typedef WTF::HashMap<const RenderBlock*, HashSet<RenderBox*>*> PercentHeightDescendantsMap; -static PercentHeightDescendantsMap* gPercentHeightDescendantsMap = 0; +static TrackedDescendantsMap* gPositionedDescendantsMap = 0; +static TrackedDescendantsMap* gPercentHeightDescendantsMap = 0; -typedef WTF::HashMap<const RenderBox*, HashSet<RenderBlock*>*> PercentHeightContainerMap; -static PercentHeightContainerMap* gPercentHeightContainerMap = 0; +static TrackedContainerMap* gPositionedContainerMap = 0; +static TrackedContainerMap* gPercentHeightContainerMap = 0; typedef WTF::HashMap<RenderBlock*, ListHashSet<RenderInline*>*> ContinuationOutlineTableMap; @@ -196,6 +196,26 @@ RenderBlock::RenderBlock(Node* node) COMPILE_ASSERT(sizeof(RenderBlock::MarginInfo) == sizeof(SameSizeAsMarginInfo), MarginInfo_should_stay_small); } +static void removeBlockFromDescendantAndContainerMaps(RenderBlock* block, TrackedDescendantsMap*& descendantMap, TrackedContainerMap*& containerMap) +{ + if (TrackedRendererListHashSet* descendantSet = descendantMap->take(block)) { + TrackedRendererListHashSet::iterator end = descendantSet->end(); + for (TrackedRendererListHashSet::iterator descendant = descendantSet->begin(); descendant != end; ++descendant) { + HashSet<RenderBlock*>* containerSet = containerMap->get(*descendant); + ASSERT(containerSet); + if (!containerSet) + continue; + ASSERT(containerSet->contains(block)); + containerSet->remove(block); + if (containerSet->isEmpty()) { + containerMap->remove(*descendant); + delete containerSet; + } + } + delete descendantSet; + } +} + RenderBlock::~RenderBlock() { if (m_floatingObjects) @@ -204,24 +224,10 @@ RenderBlock::~RenderBlock() if (hasColumns()) delete gColumnInfoMap->take(this); - if (gPercentHeightDescendantsMap) { - if (HashSet<RenderBox*>* descendantSet = gPercentHeightDescendantsMap->take(this)) { - HashSet<RenderBox*>::iterator end = descendantSet->end(); - for (HashSet<RenderBox*>::iterator descendant = descendantSet->begin(); descendant != end; ++descendant) { - HashSet<RenderBlock*>* containerSet = gPercentHeightContainerMap->get(*descendant); - ASSERT(containerSet); - if (!containerSet) - continue; - ASSERT(containerSet->contains(this)); - containerSet->remove(this); - if (containerSet->isEmpty()) { - gPercentHeightContainerMap->remove(*descendant); - delete containerSet; - } - } - delete descendantSet; - } - } + if (gPercentHeightDescendantsMap) + removeBlockFromDescendantAndContainerMaps(this, gPercentHeightDescendantsMap, gPercentHeightContainerMap); + if (gPositionedDescendantsMap) + removeBlockFromDescendantAndContainerMaps(this, gPositionedDescendantsMap, gPositionedContainerMap); } void RenderBlock::willBeDestroyed() @@ -1139,15 +1145,21 @@ void RenderBlock::collapseAnonymousBoxChild(RenderBlock* parent, RenderObject* c RenderBlock* anonBlock = toRenderBlock(parent->children()->removeChildNode(parent, child, child->hasLayer())); anonBlock->moveAllChildrenTo(parent, nextSibling, child->hasLayer()); // Delete the now-empty block's lines and nuke it. - if (!parent->documentBeingDestroyed()) - anonBlock->deleteLineBoxTree(); - if (!parent->documentBeingDestroyed() && childFlowThread && childFlowThread->isRenderNamedFlowThread()) + anonBlock->deleteLineBoxTree(); + if (childFlowThread && childFlowThread->isRenderNamedFlowThread()) toRenderNamedFlowThread(childFlowThread)->removeFlowChildInfo(anonBlock); anonBlock->destroy(); } void RenderBlock::removeChild(RenderObject* oldChild) { + // No need to waste time in merging or removing empty anonymous blocks. + // We can just bail out if our document is getting destroyed. + if (documentBeingDestroyed()) { + RenderBox::removeChild(oldChild); + return; + } + // If this child is a block, and if our previous and next siblings are // both anonymous blocks with inline content, then we can go ahead and // fold the inline content back together. @@ -1169,12 +1181,14 @@ void RenderBlock::removeChild(RenderObject* oldChild) // column span flag if it is set. ASSERT(!inlineChildrenBlock->continuation()); RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisplay(style(), BLOCK); - children()->removeChildNode(this, inlineChildrenBlock, inlineChildrenBlock->hasLayer()); + // Cache this value as it might get changed in setStyle() call. + bool inlineChildrenBlockHasLayer = inlineChildrenBlock->hasLayer(); inlineChildrenBlock->setStyle(newStyle); + children()->removeChildNode(this, inlineChildrenBlock, inlineChildrenBlockHasLayer); // Now just put the inlineChildrenBlock inside the blockChildrenBlock. blockChildrenBlock->children()->insertChildNode(blockChildrenBlock, inlineChildrenBlock, prev == inlineChildrenBlock ? blockChildrenBlock->firstChild() : 0, - inlineChildrenBlock->hasLayer() || blockChildrenBlock->hasLayer()); + inlineChildrenBlockHasLayer || blockChildrenBlock->hasLayer()); next->setNeedsLayoutAndPrefWidthsRecalc(); // inlineChildrenBlock got reparented to blockChildrenBlock, so it is no longer a child @@ -1215,14 +1229,14 @@ void RenderBlock::removeChild(RenderObject* oldChild) } } - if (!firstChild() && !documentBeingDestroyed()) { + if (!firstChild()) { // If this was our last child be sure to clear out our line boxes. if (childrenInline()) deleteLineBoxTree(); // If we are an empty anonymous block in the continuation chain, // we need to remove ourself and fix the continuation chain. - if (!beingDestroyed() && isAnonymousBlockContinuation()) { + if (!beingDestroyed() && isAnonymousBlockContinuation() && !oldChild->isListMarker()) { RenderObject* containingBlockIgnoringAnonymous = containingBlock(); while (containingBlockIgnoringAnonymous && containingBlockIgnoringAnonymous->isAnonymousBlock()) containingBlockIgnoringAnonymous = containingBlockIgnoringAnonymous->containingBlock(); @@ -1418,7 +1432,7 @@ void RenderBlock::layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeigh if (!relayoutChildren && simplifiedLayout()) return; - LayoutRepainter repainter(*this, everHadLayout() && checkForRepaintDuringLayout()); + LayoutRepainter repainter(*this, checkForRepaintDuringLayout()); if (recomputeLogicalWidth()) relayoutChildren = true; @@ -1472,14 +1486,6 @@ void RenderBlock::layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeigh setPaginationStrut(0); } - // For overflow:scroll blocks, ensure we have both scrollbars in place always. - if (scrollsOverflow() && style()->appearance() != ListboxPart) { - if (styleToUse->overflowX() == OSCROLL) - layer()->setHasHorizontalScrollbar(true); - if (styleToUse->overflowY() == OSCROLL) - layer()->setHasVerticalScrollbar(true); - } - LayoutUnit repaintLogicalTop = ZERO_LAYOUT_UNIT; LayoutUnit repaintLogicalBottom = ZERO_LAYOUT_UNIT; LayoutUnit maxFloatLogicalBottom = ZERO_LAYOUT_UNIT; @@ -1660,17 +1666,22 @@ void RenderBlock::addOverflowFromFloats() void RenderBlock::addOverflowFromPositionedObjects() { - if (!m_positionedObjects) + TrackedRendererListHashSet* positionedDescendants = positionedObjects(); + if (!positionedDescendants) return; RenderBox* positionedObject; - Iterator end = m_positionedObjects->end(); - for (Iterator it = m_positionedObjects->begin(); it != end; ++it) { + TrackedRendererListHashSet::iterator end = positionedDescendants->end(); + for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin(); it != end; ++it) { positionedObject = *it; // Fixed positioned elements don't contribute to layout overflow, since they don't scroll with the content. - if (positionedObject->style()->position() != FixedPosition) - addOverflowFromChild(positionedObject, IntSize(positionedObject->x(), positionedObject->y())); + if (positionedObject->style()->position() != FixedPosition) { + LayoutUnit x = positionedObject->x(); + if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) + x -= verticalScrollbarWidth(); + addOverflowFromChild(positionedObject, LayoutSize(x, positionedObject->y())); + } } } @@ -1699,18 +1710,11 @@ void RenderBlock::adjustPositionedBlock(RenderBox* child, const MarginInfo& marg setStaticInlinePositionForChild(child, logicalTop, startOffsetForContent(logicalTop)); if (!marginInfo.canCollapseWithMarginBefore()) { - child->computeBlockDirectionMargins(this); - LayoutUnit marginBefore = marginBeforeForChild(child); + // Positioned blocks don't collapse margins, so add the margin provided by + // the container now. The child's own margin is added later when calculating its logical top. LayoutUnit collapsedBeforePos = marginInfo.positiveMargin(); LayoutUnit collapsedBeforeNeg = marginInfo.negativeMargin(); - if (marginBefore > 0) { - if (marginBefore > collapsedBeforePos) - collapsedBeforePos = marginBefore; - } else { - if (-marginBefore > collapsedBeforeNeg) - collapsedBeforeNeg = -marginBefore; - } - logicalTop += (collapsedBeforePos - collapsedBeforeNeg) - marginBefore; + logicalTop += collapsedBeforePos - collapsedBeforeNeg; } RenderLayer* childLayer = child->layer(); @@ -1849,11 +1853,7 @@ void RenderBlock::moveRunInUnderSiblingBlockIfNeeded(RenderObject* runIn) // Check if this node is allowed to run-in. E.g. <select> expects its renderer to // be a RenderListBox or RenderMenuList, and hence cannot be a RenderInline run-in. - Node* runInNode = runIn->node(); - if (runInNode && runInNode->hasTagName(selectTag)) - return; - - if (runInNode && runInNode->hasTagName(progressTag)) + if (!runIn->canBeReplacedWithInlineRunIn()) return; RenderObject* curr = runIn->nextSibling(); @@ -2204,6 +2204,8 @@ LayoutUnit RenderBlock::computeStartPositionDeltaForChildAvoidingFloats(const Re void RenderBlock::determineLogicalLeftPositionForChild(RenderBox* child) { LayoutUnit startPosition = borderStart() + paddingStart(); + if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) + startPosition -= verticalScrollbarWidth(); LayoutUnit totalAvailableLogicalWidth = borderAndPaddingLogicalWidth() + availableLogicalWidth(); // Add in our start margin. @@ -2285,9 +2287,9 @@ void RenderBlock::setLogicalTopForChild(RenderBox* child, LayoutUnit logicalTop, void RenderBlock::layoutBlockChildren(bool relayoutChildren, LayoutUnit& maxFloatLogicalBottom) { if (gPercentHeightDescendantsMap) { - if (HashSet<RenderBox*>* descendants = gPercentHeightDescendantsMap->get(this)) { - HashSet<RenderBox*>::iterator end = descendants->end(); - for (HashSet<RenderBox*>::iterator it = descendants->begin(); it != end; ++it) { + if (TrackedRendererListHashSet* descendants = gPercentHeightDescendantsMap->get(this)) { + TrackedRendererListHashSet::iterator end = descendants->end(); + for (TrackedRendererListHashSet::iterator it = descendants->begin(); it != end; ++it) { RenderBox* box = *it; while (box != this) { if (box->normalChildNeedsLayout()) @@ -2566,15 +2568,16 @@ bool RenderBlock::simplifiedLayout() void RenderBlock::layoutPositionedObjects(bool relayoutChildren) { - if (!m_positionedObjects) + TrackedRendererListHashSet* positionedDescendants = positionedObjects(); + if (!positionedDescendants) return; if (hasColumns()) view()->layoutState()->clearPaginationInformation(); // Positioned objects are not part of the column flow, so they don't paginate with the columns. RenderBox* r; - Iterator end = m_positionedObjects->end(); - for (Iterator it = m_positionedObjects->begin(); it != end; ++it) { + TrackedRendererListHashSet::iterator end = positionedDescendants->end(); + for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin(); it != end; ++it) { r = *it; // When a non-positioned block element moves, it may have positioned children that are implicitly positioned relative to the // non-positioned block. Rather than trying to detect all of these movement cases, we just always lay out positioned @@ -2630,10 +2633,11 @@ void RenderBlock::layoutPositionedObjects(bool relayoutChildren) void RenderBlock::markPositionedObjectsForLayout() { - if (m_positionedObjects) { + TrackedRendererListHashSet* positionedDescendants = positionedObjects(); + if (positionedDescendants) { RenderBox* r; - Iterator end = m_positionedObjects->end(); - for (Iterator it = m_positionedObjects->begin(); it != end; ++it) { + TrackedRendererListHashSet::iterator end = positionedDescendants->end(); + for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin(); it != end; ++it) { r = *it; r->setChildNeedsLayout(true); } @@ -2969,11 +2973,8 @@ void RenderBlock::paintObject(PaintInfo& paintInfo, const LayoutPoint& paintOffs // Adjust our painting position if we're inside a scrolled layer (e.g., an overflow:auto div). LayoutPoint scrolledOffset = paintOffset; - if (hasOverflowClip()) { + if (hasOverflowClip()) scrolledOffset.move(-scrolledContentOffset()); - if (style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) - scrolledOffset.move(verticalScrollbarWidth(), 0); - } // 2. paint contents if (paintPhase != PaintPhaseSelfOutline) { @@ -3220,7 +3221,7 @@ GapRects RenderBlock::selectionGapRectsForRepaint(RenderBoxModelObject* repaintC // FIXME: this is broken with transforms TransformState transformState(TransformState::ApplyTransformDirection, FloatPoint()); - mapLocalToContainer(repaintContainer, false, false, transformState); + mapLocalToContainer(repaintContainer, transformState); LayoutPoint offsetFromRepaintContainer = roundedLayoutPoint(transformState.mappedPoint()); if (hasOverflowClip()) @@ -3258,13 +3259,13 @@ void RenderBlock::paintSelection(PaintInfo& paintInfo, const LayoutPoint& paintO } } -static void clipOutPositionedObjects(const PaintInfo* paintInfo, const LayoutPoint& offset, RenderBlock::PositionedObjectsListHashSet* positionedObjects) +static void clipOutPositionedObjects(const PaintInfo* paintInfo, const LayoutPoint& offset, TrackedRendererListHashSet* positionedObjects) { if (!positionedObjects) return; - RenderBlock::PositionedObjectsListHashSet::const_iterator end = positionedObjects->end(); - for (RenderBlock::PositionedObjectsListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { + TrackedRendererListHashSet::const_iterator end = positionedObjects->end(); + for (TrackedRendererListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { RenderBox* r = *it; paintInfo->context->clipOut(IntRect(offset.x() + r->x(), offset.y() + r->y(), r->width(), r->height())); } @@ -3302,10 +3303,10 @@ GapRects RenderBlock::selectionGaps(RenderBlock* rootBlock, const LayoutPoint& r LayoutRect flippedBlockRect(offsetFromRootBlock.width(), offsetFromRootBlock.height(), width(), height()); rootBlock->flipForWritingMode(flippedBlockRect); flippedBlockRect.moveBy(rootBlockPhysicalPosition); - clipOutPositionedObjects(paintInfo, flippedBlockRect.location(), m_positionedObjects.get()); + clipOutPositionedObjects(paintInfo, flippedBlockRect.location(), positionedObjects()); if (isBody() || isRoot()) // The <body> must make sure to examine its containingBlock's positioned objects. for (RenderBlock* cb = containingBlock(); cb && !cb->isRenderView(); cb = cb->containingBlock()) - clipOutPositionedObjects(paintInfo, LayoutPoint(cb->x(), cb->y()), cb->m_positionedObjects.get()); // FIXME: Not right for flipped writing modes. + clipOutPositionedObjects(paintInfo, LayoutPoint(cb->x(), cb->y()), cb->positionedObjects()); // FIXME: Not right for flipped writing modes. if (m_floatingObjects) { const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); FloatingObjectSetIterator end = floatingObjectSet.end(); @@ -3596,6 +3597,74 @@ RenderBlock* RenderBlock::blockBeforeWithinSelectionRoot(LayoutSize& offset) con return beforeBlock; } +void RenderBlock::insertIntoTrackedRendererMaps(RenderBox* descendant, TrackedDescendantsMap*& descendantsMap, TrackedContainerMap*& containerMap) +{ + if (!descendantsMap) { + descendantsMap = new TrackedDescendantsMap; + containerMap = new TrackedContainerMap; + } + + TrackedRendererListHashSet* descendantSet = descendantsMap->get(this); + if (!descendantSet) { + descendantSet = new TrackedRendererListHashSet; + descendantsMap->set(this, descendantSet); + } + bool added = descendantSet->add(descendant).isNewEntry; + if (!added) { + ASSERT(containerMap->get(descendant)); + ASSERT(containerMap->get(descendant)->contains(this)); + return; + } + + HashSet<RenderBlock*>* containerSet = containerMap->get(descendant); + if (!containerSet) { + containerSet = new HashSet<RenderBlock*>; + containerMap->set(descendant, containerSet); + } + ASSERT(!containerSet->contains(this)); + containerSet->add(this); +} + +void RenderBlock::removeFromTrackedRendererMaps(RenderBox* descendant, TrackedDescendantsMap*& descendantsMap, TrackedContainerMap*& containerMap) +{ + if (!descendantsMap) + return; + + HashSet<RenderBlock*>* containerSet = containerMap->take(descendant); + if (!containerSet) + return; + + HashSet<RenderBlock*>::iterator end = containerSet->end(); + for (HashSet<RenderBlock*>::iterator it = containerSet->begin(); it != end; ++it) { + RenderBlock* container = *it; + + // FIXME: Disabling this assert temporarily until we fix the layout + // bugs associated with positioned objects not properly cleared from + // their ancestor chain before being moved. See webkit bug 93766. + // ASSERT(descendant->isDescendantOf(container)); + + TrackedRendererListHashSet* descendantSet = descendantsMap->get(container); + ASSERT(descendantSet); + if (!descendantSet) + continue; + ASSERT(descendantSet->contains(descendant)); + descendantSet->remove(descendant); + if (descendantSet->isEmpty()) { + descendantsMap->remove(container); + delete descendantSet; + } + } + + delete containerSet; +} + +TrackedRendererListHashSet* RenderBlock::positionedObjects() const +{ + if (gPositionedDescendantsMap) + return gPositionedDescendantsMap->get(this); + return 0; +} + void RenderBlock::insertPositionedObject(RenderBox* o) { ASSERT(!isAnonymousBlock()); @@ -3603,31 +3672,27 @@ void RenderBlock::insertPositionedObject(RenderBox* o) if (o->isRenderFlowThread()) return; - // Create the list of special objects if we don't aleady have one - if (!m_positionedObjects) - m_positionedObjects = adoptPtr(new PositionedObjectsListHashSet); - - m_positionedObjects->add(o); + insertIntoTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedContainerMap); } void RenderBlock::removePositionedObject(RenderBox* o) { - if (m_positionedObjects) - m_positionedObjects->remove(o); + removeFromTrackedRendererMaps(o, gPositionedDescendantsMap, gPositionedContainerMap); } void RenderBlock::removePositionedObjects(RenderBlock* o) { - if (!m_positionedObjects) + TrackedRendererListHashSet* positionedDescendants = positionedObjects(); + if (!positionedDescendants) return; RenderBox* r; - Iterator end = m_positionedObjects->end(); + TrackedRendererListHashSet::iterator end = positionedDescendants->end(); Vector<RenderBox*, 16> deadObjects; - for (Iterator it = m_positionedObjects->begin(); it != end; ++it) { + for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin(); it != end; ++it) { r = *it; if (!o || r->isDescendantOf(o)) { if (o) @@ -3646,7 +3711,7 @@ void RenderBlock::removePositionedObjects(RenderBlock* o) } for (unsigned i = 0; i < deadObjects.size(); i++) - m_positionedObjects->remove(deadObjects.at(i)); + removePositionedObject(deadObjects.at(i)); } RenderBlock::FloatingObject* RenderBlock::insertFloatingObject(RenderBox* o) @@ -3924,60 +3989,15 @@ void RenderBlock::newLine(EClear clear) void RenderBlock::addPercentHeightDescendant(RenderBox* descendant) { - if (!gPercentHeightDescendantsMap) { - gPercentHeightDescendantsMap = new PercentHeightDescendantsMap; - gPercentHeightContainerMap = new PercentHeightContainerMap; - } - - HashSet<RenderBox*>* descendantSet = gPercentHeightDescendantsMap->get(this); - if (!descendantSet) { - descendantSet = new HashSet<RenderBox*>; - gPercentHeightDescendantsMap->set(this, descendantSet); - } - bool added = descendantSet->add(descendant).isNewEntry; - if (!added) { - ASSERT(gPercentHeightContainerMap->get(descendant)); - ASSERT(gPercentHeightContainerMap->get(descendant)->contains(this)); - return; - } - - HashSet<RenderBlock*>* containerSet = gPercentHeightContainerMap->get(descendant); - if (!containerSet) { - containerSet = new HashSet<RenderBlock*>; - gPercentHeightContainerMap->set(descendant, containerSet); - } - ASSERT(!containerSet->contains(this)); - containerSet->add(this); + insertIntoTrackedRendererMaps(descendant, gPercentHeightDescendantsMap, gPercentHeightContainerMap); } void RenderBlock::removePercentHeightDescendant(RenderBox* descendant) { - if (!gPercentHeightContainerMap) - return; - - HashSet<RenderBlock*>* containerSet = gPercentHeightContainerMap->take(descendant); - if (!containerSet) - return; - - HashSet<RenderBlock*>::iterator end = containerSet->end(); - for (HashSet<RenderBlock*>::iterator it = containerSet->begin(); it != end; ++it) { - RenderBlock* container = *it; - HashSet<RenderBox*>* descendantSet = gPercentHeightDescendantsMap->get(container); - ASSERT(descendantSet); - if (!descendantSet) - continue; - ASSERT(descendantSet->contains(descendant)); - descendantSet->remove(descendant); - if (descendantSet->isEmpty()) { - gPercentHeightDescendantsMap->remove(container); - delete descendantSet; - } - } - - delete containerSet; + removeFromTrackedRendererMaps(descendant, gPercentHeightDescendantsMap, gPercentHeightContainerMap); } -HashSet<RenderBox*>* RenderBlock::percentHeightDescendants() const +TrackedRendererListHashSet* RenderBlock::percentHeightDescendants() const { return gPercentHeightDescendantsMap ? gPercentHeightDescendantsMap->get(this) : 0; } @@ -6902,11 +6922,11 @@ LayoutUnit RenderBlock::pageRemainingLogicalHeightForOffset(LayoutUnit offset, P if (!inRenderFlowThread()) { LayoutUnit pageLogicalHeight = renderView->layoutState()->m_pageLogicalHeight; - LayoutUnit remainingHeight = pageLogicalHeight - layoutMod(offset, pageLogicalHeight); + LayoutUnit remainingHeight = pageLogicalHeight - intMod(offset, pageLogicalHeight); if (pageBoundaryRule == IncludePageBoundary) { // If includeBoundaryPoint is true the line exactly on the top edge of a // column will act as being part of the previous column. - remainingHeight = layoutMod(remainingHeight, pageLogicalHeight); + remainingHeight = intMod(remainingHeight, pageLogicalHeight); } return remainingHeight; } @@ -7438,9 +7458,12 @@ RenderBlock* RenderBlock::createAnonymousColumnSpanWithParentRenderer(const Rend #ifndef NDEBUG void RenderBlock::checkPositionedObjectsNeedLayout() { - if (PositionedObjectsListHashSet* positionedObjects = this->positionedObjects()) { - PositionedObjectsListHashSet::const_iterator end = positionedObjects->end(); - for (PositionedObjectsListHashSet::const_iterator it = positionedObjects->begin(); it != end; ++it) { + if (!gPositionedDescendantsMap) + return; + + if (TrackedRendererListHashSet* positionedDescendantSet = positionedObjects()) { + TrackedRendererListHashSet::const_iterator end = positionedDescendantSet->end(); + for (TrackedRendererListHashSet::const_iterator it = positionedDescendantSet->begin(); it != end; ++it) { RenderBox* currBox = *it; ASSERT(!currBox->needsLayout()); } |