| Index: third_party/WebKit/Source/core/layout/LayoutInline.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.cpp b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
|
| index 7e9767b93fcf3a703dc3141d2382a5c687347d9b..45c42ac1a37a82eec5ba2b85be9a06871ce6bae3 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutInline.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
|
| @@ -1,7 +1,8 @@
|
| /*
|
| * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
|
| * (C) 1999 Antti Koivisto (koivisto@kde.org)
|
| - * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
|
| + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc.
|
| + * All rights reserved.
|
| *
|
| * This library is free software; you can redistribute it and/or
|
| * modify it under the terms of the GNU Library General Public
|
| @@ -57,13 +58,16 @@ LayoutInline::LayoutInline(Element* element) : LayoutBoxModelObject(element) {
|
| }
|
|
|
| void LayoutInline::willBeDestroyed() {
|
| - // Make sure to destroy anonymous children first while they are still connected to the rest of the tree, so that they will
|
| - // properly dirty line boxes that they are removed from. Effects that do :before/:after only on hover could crash otherwise.
|
| + // Make sure to destroy anonymous children first while they are still
|
| + // connected to the rest of the tree, so that they will properly dirty line
|
| + // boxes that they are removed from. Effects that do :before/:after only on
|
| + // hover could crash otherwise.
|
| children()->destroyLeftoverChildren();
|
|
|
| // Destroy our continuation before anything other than anonymous children.
|
| // The reason we don't destroy it before anonymous children is that they may
|
| - // have continuations of their own that are anonymous children of our continuation.
|
| + // have continuations of their own that are anonymous children of our
|
| + // continuation.
|
| LayoutBoxModelObject* continuation = this->continuation();
|
| if (continuation) {
|
| continuation->destroy();
|
| @@ -108,7 +112,8 @@ LayoutInline* LayoutInline::inlineElementContinuation() const {
|
| void LayoutInline::updateFromStyle() {
|
| LayoutBoxModelObject::updateFromStyle();
|
|
|
| - // FIXME: Is this still needed. Was needed for run-ins, since run-in is considered a block display type.
|
| + // FIXME: Is this still needed. Was needed for run-ins, since run-in is
|
| + // considered a block display type.
|
| setInline(true);
|
|
|
| // FIXME: Support transforms and reflections on inline flows someday.
|
| @@ -137,8 +142,9 @@ static void updateInFlowPositionOfAnonymousBlockContinuations(
|
| if (!blockFlow->isAnonymousBlockContinuation())
|
| continue;
|
|
|
| - // If we are no longer in-flow positioned but our descendant block(s) still have an in-flow positioned ancestor then
|
| - // their containing anonymous block should keep its in-flow positioning.
|
| + // If we are no longer in-flow positioned but our descendant block(s) still
|
| + // have an in-flow positioned ancestor then their containing anonymous block
|
| + // should keep its in-flow positioning.
|
| if (oldStyle.hasInFlowPosition() &&
|
| inFlowPositionedInlineAncestor(blockFlow->inlineElementContinuation()))
|
| continue;
|
| @@ -154,12 +160,11 @@ void LayoutInline::styleDidChange(StyleDifference diff,
|
| const ComputedStyle* oldStyle) {
|
| LayoutBoxModelObject::styleDidChange(diff, oldStyle);
|
|
|
| - // Ensure that all of the split inlines pick up the new style. We
|
| - // only do this if we're an inline, since we don't want to propagate
|
| - // a block's style to the other inlines.
|
| - // e.g., <font>foo <h4>goo</h4> moo</font>. The <font> inlines before
|
| - // and after the block share the same style, but the block doesn't
|
| - // need to pass its style on to anyone else.
|
| + // Ensure that all of the split inlines pick up the new style. We only do this
|
| + // if we're an inline, since we don't want to propagate a block's style to the
|
| + // other inlines. e.g., <font>foo <h4>goo</h4> moo</font>. The <font> inlines
|
| + // before and after the block share the same style, but the block doesn't need
|
| + // to pass its style on to anyone else.
|
| const ComputedStyle& newStyle = styleRef();
|
| LayoutInline* continuation = inlineElementContinuation();
|
| LayoutInline* endOfContinuation = nullptr;
|
| @@ -175,7 +180,8 @@ void LayoutInline::styleDidChange(StyleDifference diff,
|
| if (continuation && oldStyle) {
|
| ASSERT(endOfContinuation);
|
| LayoutObject* block = containingBlock()->nextSibling();
|
| - // If an inline's in-flow positioning has changed then any descendant blocks will need to change their styles accordingly.
|
| + // If an inline's in-flow positioning has changed then any descendant blocks
|
| + // will need to change their styles accordingly.
|
| if (block && block->isAnonymousBlock() &&
|
| newStyle.position() != oldStyle->position() &&
|
| (newStyle.hasInFlowPosition() || oldStyle->hasInFlowPosition()))
|
| @@ -228,8 +234,9 @@ static inline bool fontDifferenceRequiresLineBox(
|
| }
|
|
|
| void LayoutInline::updateAlwaysCreateLineBoxes(bool fullLayout) {
|
| - // Once we have been tainted once, just assume it will happen again. This way effects like hover highlighting that change the
|
| - // background color will only cause a layout on the first rollover.
|
| + // Once we have been tainted once, just assume it will happen again. This way
|
| + // effects like hover highlighting that change the background color will only
|
| + // cause a layout on the first rollover.
|
| if (alwaysCreateLineBoxes())
|
| return;
|
|
|
| @@ -272,7 +279,8 @@ LayoutRect LayoutInline::localCaretRect(InlineBox* inlineBox,
|
| if (firstChild()) {
|
| // This condition is possible if the LayoutInline is at an editing boundary,
|
| // i.e. the VisiblePosition is:
|
| - // <LayoutInline editingBoundary=true>|<LayoutText> </LayoutText></LayoutInline>
|
| + // <LayoutInline editingBoundary=true>|<LayoutText>
|
| + // </LayoutText></LayoutInline>
|
| // FIXME: need to figure out how to make this return a valid rect, note that
|
| // there are no line boxes created in the above case.
|
| return LayoutRect();
|
| @@ -286,19 +294,18 @@ LayoutRect LayoutInline::localCaretRect(InlineBox* inlineBox,
|
| LayoutRect caretRect =
|
| localCaretRectForEmptyElement(borderAndPaddingWidth(), LayoutUnit());
|
|
|
| - if (InlineBox* firstBox = firstLineBox()) {
|
| - // FIXME: the call to roundedLayoutPoint() below is temporary and should be removed once
|
| - // the transition to LayoutUnit-based types is complete (crbug.com/321237)
|
| + if (InlineBox* firstBox = firstLineBox())
|
| caretRect.moveBy(firstBox->topLeft());
|
| - }
|
|
|
| return caretRect;
|
| }
|
|
|
| void LayoutInline::addChild(LayoutObject* newChild, LayoutObject* beforeChild) {
|
| - // Any table-part dom child of an inline element has anonymous wrappers in the layout tree
|
| - // so we need to climb up to the enclosing anonymous table wrapper and add the new child before that.
|
| - // TODO(rhogan): If newChild is a table part we want to insert it into the same table as beforeChild.
|
| + // Any table-part dom child of an inline element has anonymous wrappers in the
|
| + // layout tree so we need to climb up to the enclosing anonymous table wrapper
|
| + // and add the new child before that.
|
| + // TODO(rhogan): If newChild is a table part we want to insert it into the
|
| + // same table as beforeChild.
|
| while (beforeChild && beforeChild->isTablePart())
|
| beforeChild = beforeChild->parent();
|
| if (continuation())
|
| @@ -339,22 +346,25 @@ LayoutBoxModelObject* LayoutInline::continuationBefore(
|
|
|
| void LayoutInline::addChildIgnoringContinuation(LayoutObject* newChild,
|
| LayoutObject* beforeChild) {
|
| - // Make sure we don't append things after :after-generated content if we have it.
|
| + // Make sure we don't append things after :after-generated content if we have
|
| + // it.
|
| if (!beforeChild && isAfterContent(lastChild()))
|
| beforeChild = lastChild();
|
|
|
| if (!newChild->isInline() && !newChild->isFloatingOrOutOfFlowPositioned() &&
|
| !newChild->isTablePart()) {
|
| - // We are placing a block inside an inline. We have to perform a split of this
|
| - // inline into continuations. This involves creating an anonymous block box to hold
|
| - // |newChild|. We then make that block box a continuation of this inline. We take all of
|
| - // the children after |beforeChild| and put them in a clone of this object.
|
| + // We are placing a block inside an inline. We have to perform a split of
|
| + // this inline into continuations. This involves creating an anonymous
|
| + // block box to hold |newChild|. We then make that block box a continuation
|
| + // of this inline. We take all of the children after |beforeChild| and put
|
| + // them in a clone of this object.
|
| RefPtr<ComputedStyle> newStyle =
|
| ComputedStyle::createAnonymousStyleWithDisplay(
|
| containingBlock()->styleRef(), EDisplay::Block);
|
|
|
| - // If inside an inline affected by in-flow positioning the block needs to be affected by it too.
|
| - // Giving the block a layer like this allows it to collect the x/y offsets from inline parents later.
|
| + // If inside an inline affected by in-flow positioning the block needs to be
|
| + // affected by it too. Giving the block a layer like this allows it to
|
| + // collect the x/y offsets from inline parents later.
|
| if (LayoutObject* positionedAncestor = inFlowPositionedInlineAncestor(this))
|
| newStyle->setPosition(positionedAncestor->style()->position());
|
|
|
| @@ -400,10 +410,10 @@ void LayoutInline::splitInlines(LayoutBlockFlow* fromBlock,
|
| ASSERT(isDescendantOf(fromBlock));
|
|
|
| // If we're splitting the inline containing the fullscreened element,
|
| - // |beforeChild| may be the layoutObject for the fullscreened element. However,
|
| - // that layoutObject is wrapped in a LayoutFullScreen, so |this| is not its
|
| - // parent. Since the splitting logic expects |this| to be the parent, set
|
| - // |beforeChild| to be the LayoutFullScreen.
|
| + // |beforeChild| may be the layoutObject for the fullscreened element.
|
| + // However, that layoutObject is wrapped in a LayoutFullScreen, so |this| is
|
| + // not its parent. Since the splitting logic expects |this| to be the parent,
|
| + // set |beforeChild| to be the LayoutFullScreen.
|
| if (Fullscreen* fullscreen = Fullscreen::fromIfExists(document())) {
|
| const Element* fullScreenElement = fullscreen->currentFullScreenElement();
|
| if (fullScreenElement && beforeChild &&
|
| @@ -411,10 +421,12 @@ void LayoutInline::splitInlines(LayoutBlockFlow* fromBlock,
|
| beforeChild = fullscreen->fullScreenLayoutObject();
|
| }
|
|
|
| - // FIXME: Because splitting is O(n^2) as tags nest pathologically, we cap the depth at which we're willing to clone.
|
| - // There will eventually be a better approach to this problem that will let us nest to a much
|
| - // greater depth (see bugzilla bug 13430) but for now we have a limit. This *will* result in
|
| - // incorrect rendering, but the alternative is to hang forever.
|
| + // FIXME: Because splitting is O(n^2) as tags nest pathologically, we cap the
|
| + // depth at which we're willing to clone.
|
| + // There will eventually be a better approach to this problem that will let us
|
| + // nest to a much greater depth (see bugzilla bug 13430) but for now we have a
|
| + // limit. This *will* result in incorrect rendering, but the alternative is to
|
| + // hang forever.
|
| const unsigned cMaxSplitDepth = 200;
|
| Vector<LayoutInline*> inlinesToClone;
|
| LayoutInline* topMostInline = this;
|
| @@ -422,8 +434,9 @@ void LayoutInline::splitInlines(LayoutBlockFlow* fromBlock,
|
| topMostInline = toLayoutInline(o);
|
| if (inlinesToClone.size() < cMaxSplitDepth)
|
| inlinesToClone.append(topMostInline);
|
| - // Keep walking up the chain to ensure |topMostInline| is a child of |fromBlock|,
|
| - // to avoid assertion failure when |fromBlock|'s children are moved to |toBlock| below.
|
| + // Keep walking up the chain to ensure |topMostInline| is a child of
|
| + // |fromBlock|, to avoid assertion failure when |fromBlock|'s children are
|
| + // moved to |toBlock| below.
|
| }
|
|
|
| // Create a new clone of the top-most inline in |inlinesToClone|.
|
| @@ -433,17 +446,19 @@ void LayoutInline::splitInlines(LayoutBlockFlow* fromBlock,
|
| // Now we are at the block level. We need to put the clone into the |toBlock|.
|
| toBlock->children()->appendChildNode(toBlock, cloneInline);
|
|
|
| - // Now take all the children after |topMostInline| and remove them from the |fromBlock|
|
| - // and put them into the toBlock.
|
| + // Now take all the children after |topMostInline| and remove them from the
|
| + // |fromBlock| and put them into the toBlock.
|
| fromBlock->moveChildrenTo(toBlock, topMostInline->nextSibling(), nullptr,
|
| true);
|
|
|
| LayoutInline* currentParent = topMostInlineToClone;
|
| LayoutInline* cloneInlineParent = cloneInline;
|
|
|
| - // Clone the inlines from top to down to ensure any new object will be added into a rooted tree.
|
| - // Note that we have already cloned the top-most one, so the loop begins from size - 2 (except if
|
| - // we have reached |cMaxDepth| in which case we sacrifice correct rendering for performance).
|
| + // Clone the inlines from top to down to ensure any new object will be added
|
| + // into a rooted tree.
|
| + // Note that we have already cloned the top-most one, so the loop begins from
|
| + // size - 2 (except if we have reached |cMaxDepth| in which case we sacrifice
|
| + // correct rendering for performance).
|
| for (int i = static_cast<int>(inlinesToClone.size()) - 2; i >= 0; --i) {
|
| // Hook the clone up as a continuation of |currentInline|.
|
| LayoutBoxModelObject* oldCont = currentParent->continuation();
|
| @@ -466,7 +481,8 @@ void LayoutInline::splitInlines(LayoutBlockFlow* fromBlock,
|
| cloneInlineParent = cloneInline;
|
| }
|
|
|
| - // The last inline to clone is |this|, and the current |cloneInline| is cloned from |this|.
|
| + // The last inline to clone is |this|, and the current |cloneInline| is cloned
|
| + // from |this|.
|
| ASSERT(this == inlinesToClone.first());
|
|
|
| // Hook |cloneInline| up as the continuation of the middle block.
|
| @@ -493,7 +509,8 @@ void LayoutInline::splitFlow(LayoutObject* beforeChild,
|
| LayoutBlock* outerContainingBlock = block->containingBlock();
|
| if (outerContainingBlock && outerContainingBlock->isLayoutBlockFlow() &&
|
| !outerContainingBlock->createsAnonymousWrapper()) {
|
| - // We can reuse this block and make it the preBlock of the next continuation.
|
| + // We can reuse this block and make it the preBlock of the next
|
| + // continuation.
|
| block->removePositionedObjects(nullptr);
|
| block->removeFloatingObjects();
|
| pre = block;
|
| @@ -501,10 +518,10 @@ void LayoutInline::splitFlow(LayoutObject* beforeChild,
|
| reusedAnonymousBlock = true;
|
| }
|
| }
|
| +
|
| + // No anonymous block available for use. Make one.
|
| if (!reusedAnonymousBlock)
|
| - pre = toLayoutBlockFlow(
|
| - block
|
| - ->createAnonymousBlock()); // No anonymous block available for use. Make one.
|
| + pre = toLayoutBlockFlow(block->createAnonymousBlock());
|
|
|
| LayoutBlockFlow* post = toLayoutBlockFlow(pre->createAnonymousBlock());
|
|
|
| @@ -530,15 +547,17 @@ void LayoutInline::splitFlow(LayoutObject* beforeChild,
|
|
|
| splitInlines(pre, post, newBlockBox, beforeChild, oldCont);
|
|
|
| - // We already know the newBlockBox isn't going to contain inline kids, so avoid wasting
|
| - // time in makeChildrenNonInline by just setting this explicitly up front.
|
| + // We already know the newBlockBox isn't going to contain inline kids, so
|
| + // avoid wasting time in makeChildrenNonInline by just setting this explicitly
|
| + // up front.
|
| newBlockBox->setChildrenInline(false);
|
|
|
| newBlockBox->addChild(newChild);
|
|
|
| - // Always just do a full layout in order to ensure that line boxes (especially wrappers for images)
|
| - // get deleted properly. Because objects moves from the pre block into the post block, we want to
|
| - // make new line boxes instead of leaving the old line boxes around.
|
| + // Always just do a full layout in order to ensure that line boxes (especially
|
| + // wrappers for images) get deleted properly. Because objects moves from the
|
| + // pre block into the post block, we want to make new line boxes instead of
|
| + // leaving the old line boxes around.
|
| pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(
|
| LayoutInvalidationReason::AnonymousBlockChange);
|
| block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(
|
| @@ -549,8 +568,8 @@ void LayoutInline::splitFlow(LayoutObject* beforeChild,
|
|
|
| void LayoutInline::addChildToContinuation(LayoutObject* newChild,
|
| LayoutObject* beforeChild) {
|
| - // A continuation always consists of two potential candidates: an inline or an anonymous
|
| - // block box holding block children.
|
| + // A continuation always consists of two potential candidates: an inline or an
|
| + // anonymous block box holding block children.
|
| LayoutBoxModelObject* flow = continuationBefore(beforeChild);
|
| ASSERT(!beforeChild || beforeChild->parent()->isAnonymousBlock() ||
|
| beforeChild->parent()->isLayoutInline());
|
| @@ -565,13 +584,14 @@ void LayoutInline::addChildToContinuation(LayoutObject* newChild,
|
| beforeChildParent = flow;
|
| }
|
|
|
| - // TODO(rhogan): Should we treat out-of-flows and floats as through they're inline below?
|
| + // TODO(rhogan): Should we treat out-of-flows and floats as through they're
|
| + // inline below?
|
| if (newChild->isFloatingOrOutOfFlowPositioned())
|
| return beforeChildParent->addChildIgnoringContinuation(newChild,
|
| beforeChild);
|
|
|
| - // A table part will be wrapped by an inline anonymous table when it is added to the layout
|
| - // tree, so treat it as inline when deciding where to add it.
|
| + // A table part will be wrapped by an inline anonymous table when it is added
|
| + // to the layout tree, so treat it as inline when deciding where to add it.
|
| bool childInline = newChild->isInline() || newChild->isTablePart();
|
| bool bcpInline = beforeChildParent->isInline();
|
| bool flowInline = flow->isInline();
|
| @@ -579,14 +599,15 @@ void LayoutInline::addChildToContinuation(LayoutObject* newChild,
|
| if (flow == beforeChildParent)
|
| return flow->addChildIgnoringContinuation(newChild, beforeChild);
|
|
|
| - // The goal here is to match up if we can, so that we can coalesce and create the
|
| - // minimal # of continuations needed for the inline.
|
| + // The goal here is to match up if we can, so that we can coalesce and create
|
| + // the minimal # of continuations needed for the inline.
|
| if (childInline == bcpInline || (beforeChild && beforeChild->isInline()))
|
| return beforeChildParent->addChildIgnoringContinuation(newChild,
|
| beforeChild);
|
| - if (flowInline == childInline)
|
| - return flow->addChildIgnoringContinuation(newChild,
|
| - 0); // Just treat like an append.
|
| + if (flowInline == childInline) {
|
| + // Just treat like an append.
|
| + return flow->addChildIgnoringContinuation(newChild, 0);
|
| + }
|
| return beforeChildParent->addChildIgnoringContinuation(newChild, beforeChild);
|
| }
|
|
|
| @@ -618,8 +639,9 @@ void LayoutInline::generateCulledLineBoxRects(
|
| if (curr->isFloatingOrOutOfFlowPositioned())
|
| continue;
|
|
|
| - // We want to get the margin box in the inline direction, and then use our font ascent/descent in the block
|
| - // direction (aligned to the root box's baseline).
|
| + // We want to get the margin box in the inline direction, and then use our
|
| + // font ascent/descent in the block direction (aligned to the root box's
|
| + // baseline).
|
| if (curr->isBox()) {
|
| LayoutBox* currBox = toLayoutBox(curr);
|
| if (currBox->inlineBoxWrapper()) {
|
| @@ -947,7 +969,8 @@ PositionWithAffinity LayoutInline::positionForPoint(const LayoutPoint& point) {
|
| }
|
|
|
| if (firstLineBoxIncludingCulling()) {
|
| - // This inline actually has a line box. We must have clicked in the border/padding of one of these boxes. We
|
| + // This inline actually has a line box. We must have clicked in the
|
| + // border/padding of one of these boxes. We
|
| // should try to find a result by asking our containing block.
|
| return containingBlock()->positionForPoint(point);
|
| }
|
| @@ -980,9 +1003,12 @@ LayoutRect LayoutInline::linesBoundingBox() const {
|
|
|
| LayoutRect result;
|
|
|
| - // See <rdar://problem/5289721>, for an unknown reason the linked list here is sometimes inconsistent, first is non-zero and last is zero. We have been
|
| - // unable to reproduce this at all (and consequently unable to figure ot why this is happening). The assert will hopefully catch the problem in debug
|
| - // builds and help us someday figure out why. We also put in a redundant check of lastLineBox() to avoid the crash for now.
|
| + // See <rdar://problem/5289721>, for an unknown reason the linked list here is
|
| + // sometimes inconsistent, first is non-zero and last is zero. We have been
|
| + // unable to reproduce this at all (and consequently unable to figure ot why
|
| + // this is happening). The assert will hopefully catch the problem in debug
|
| + // builds and help us someday figure out why. We also put in a redundant
|
| + // check of lastLineBox() to avoid the crash for now.
|
| ASSERT(!firstLineBox() ==
|
| !lastLineBox()); // Either both are null or both exist.
|
| if (firstLineBox() && lastLineBox()) {
|
| @@ -1016,8 +1042,9 @@ InlineBox* LayoutInline::culledInlineFirstLineBox() const {
|
| if (curr->isFloatingOrOutOfFlowPositioned())
|
| continue;
|
|
|
| - // We want to get the margin box in the inline direction, and then use our font ascent/descent in the block
|
| - // direction (aligned to the root box's baseline).
|
| + // We want to get the margin box in the inline direction, and then use our
|
| + // font ascent/descent in the block direction (aligned to the root box's
|
| + // baseline).
|
| if (curr->isBox())
|
| return toLayoutBox(curr)->inlineBoxWrapper();
|
| if (curr->isLayoutInline()) {
|
| @@ -1039,8 +1066,9 @@ InlineBox* LayoutInline::culledInlineLastLineBox() const {
|
| if (curr->isFloatingOrOutOfFlowPositioned())
|
| continue;
|
|
|
| - // We want to get the margin box in the inline direction, and then use our font ascent/descent in the block
|
| - // direction (aligned to the root box's baseline).
|
| + // We want to get the margin box in the inline direction, and then use our
|
| + // font ascent/descent in the block direction (aligned to the root box's
|
| + // baseline).
|
| if (curr->isBox())
|
| return toLayoutBox(curr)->inlineBoxWrapper();
|
| if (curr->isLayoutInline()) {
|
| @@ -1179,13 +1207,16 @@ LayoutRect LayoutInline::visualOverflowRect() const {
|
| if (outlineOutset) {
|
| Vector<LayoutRect> rects;
|
| if (document().inNoQuirksMode()) {
|
| - // We have already included outline extents of line boxes in linesVisualOverflowBoundingBox(),
|
| - // so the following just add outline rects for children and continuations.
|
| + // We have already included outline extents of line boxes in
|
| + // linesVisualOverflowBoundingBox(), so the following just add outline
|
| + // rects for children and continuations.
|
| addOutlineRectsForChildrenAndContinuations(
|
| rects, LayoutPoint(), outlineRectsShouldIncludeBlockVisualOverflow());
|
| } else {
|
| - // In non-standard mode, because the difference in LayoutBlock::minLineHeightForReplacedObject(),
|
| - // linesVisualOverflowBoundingBox() may not cover outline rects of lines containing replaced objects.
|
| + // In non-standard mode, because the difference in
|
| + // LayoutBlock::minLineHeightForReplacedObject(),
|
| + // linesVisualOverflowBoundingBox() may not cover outline rects of lines
|
| + // containing replaced objects.
|
| addOutlineRects(rects, LayoutPoint(),
|
| outlineRectsShouldIncludeBlockVisualOverflow());
|
| }
|
| @@ -1211,10 +1242,11 @@ bool LayoutInline::mapToVisualRectInAncestorSpace(
|
| return true;
|
|
|
| if (style()->hasInFlowPosition() && layer()) {
|
| - // Apply the in-flow position offset when invalidating a rectangle. The layer
|
| - // is translated, but the layout box isn't, so we need to do this to get the
|
| - // right dirty rect. Since this is called from LayoutObject::setStyle, the relative position
|
| - // flag on the LayoutObject has been cleared, so use the one on the style().
|
| + // Apply the in-flow position offset when invalidating a rectangle. The
|
| + // layer is translated, but the layout box isn't, so we need to do this to
|
| + // get the right dirty rect. Since this is called from LayoutObject::
|
| + // setStyle, the relative position flag on the LayoutObject has been
|
| + // cleared, so use the one on the style().
|
| rect.move(layer()->offsetForInFlowPosition());
|
| }
|
|
|
| @@ -1276,8 +1308,9 @@ void LayoutInline::updateHitTestResult(HitTestResult& result,
|
| LayoutPoint localPoint(point);
|
| if (n) {
|
| if (isInlineElementContinuation()) {
|
| - // We're in the continuation of a split inline. Adjust our local point to be in the coordinate space
|
| - // of the principal layoutObject's containing block. This will end up being the innerNode.
|
| + // We're in the continuation of a split inline. Adjust our local point to
|
| + // be in the coordinate space of the principal layoutObject's containing
|
| + // block. This will end up being the innerNode.
|
| LayoutBlock* firstBlock = n->layoutObject()->containingBlock();
|
|
|
| // Get our containing block.
|
| @@ -1296,7 +1329,8 @@ void LayoutInline::dirtyLineBoxes(bool fullLayout) {
|
| }
|
|
|
| if (!alwaysCreateLineBoxes()) {
|
| - // We have to grovel into our children in order to dirty the appropriate lines.
|
| + // We have to grovel into our children in order to dirty the appropriate
|
| + // lines.
|
| for (LayoutObject* curr = firstChild(); curr; curr = curr->nextSibling()) {
|
| if (curr->isFloatingOrOutOfFlowPositioned())
|
| continue;
|
| @@ -1368,9 +1402,9 @@ LayoutSize LayoutInline::offsetForInFlowPositionedInline(
|
| if (!isInFlowPositioned())
|
| return LayoutSize();
|
|
|
| - // When we have an enclosing relpositioned inline, we need to add in the offset of the first line
|
| - // box from the rest of the content, but only in the cases where we know we're positioned
|
| - // relative to the inline itself.
|
| + // When we have an enclosing relpositioned inline, we need to add in the
|
| + // offset of the first line box from the rest of the content, but only in the
|
| + // cases where we know we're positioned relative to the inline itself.
|
|
|
| LayoutSize logicalOffset;
|
| LayoutUnit inlinePosition;
|
| @@ -1383,10 +1417,12 @@ LayoutSize LayoutInline::offsetForInFlowPositionedInline(
|
| blockPosition = layer()->staticBlockPosition();
|
| }
|
|
|
| - // Per http://www.w3.org/TR/CSS2/visudet.html#abs-non-replaced-width an absolute positioned box
|
| - // with a static position should locate itself as though it is a normal flow box in relation to
|
| - // its containing block. If this relative-positioned inline has a negative offset we need to
|
| - // compensate for it so that we align the positioned object with the edge of its containing block.
|
| + // Per http://www.w3.org/TR/CSS2/visudet.html#abs-non-replaced-width an
|
| + // absolute positioned box with a static position should locate itself as
|
| + // though it is a normal flow box in relation to its containing block. If this
|
| + // relative-positioned inline has a negative offset we need to compensate for
|
| + // it so that we align the positioned object with the edge of its containing
|
| + // block.
|
| if (child.style()->hasStaticInlinePosition(
|
| style()->isHorizontalWritingMode()))
|
| logicalOffset.setWidth(
|
|
|