| Index: third_party/WebKit/WebCore/rendering/RenderBox.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/rendering/RenderBox.cpp (revision 9391)
|
| +++ third_party/WebKit/WebCore/rendering/RenderBox.cpp (working copy)
|
| @@ -276,86 +276,6 @@
|
| setNeedsLayout(false);
|
| }
|
|
|
| -int RenderBox::offsetLeft() const
|
| -{
|
| - RenderBox* offsetPar = offsetParent();
|
| - if (!offsetPar)
|
| - return 0;
|
| - int xPos = x() - offsetPar->borderLeft();
|
| - if (!isPositioned()) {
|
| - if (isRelPositioned())
|
| - xPos += relativePositionOffsetX();
|
| - RenderObject* curr = parent();
|
| - while (curr && curr != offsetPar) {
|
| - // FIXME: What are we supposed to do inside SVG content?
|
| - if (curr->isBox() && !curr->isTableRow())
|
| - xPos += toRenderBox(curr)->x();
|
| - curr = curr->parent();
|
| - }
|
| - if (offsetPar->isBody() && !offsetPar->isRelPositioned() && !offsetPar->isPositioned())
|
| - xPos += offsetPar->x();
|
| - }
|
| - return xPos;
|
| -}
|
| -
|
| -int RenderBox::offsetTop() const
|
| -{
|
| - RenderBox* offsetPar = offsetParent();
|
| - if (!offsetPar)
|
| - return 0;
|
| - int yPos = y() - offsetPar->borderTop();
|
| - if (!isPositioned()) {
|
| - if (isRelPositioned())
|
| - yPos += relativePositionOffsetY();
|
| - RenderObject* curr = parent();
|
| - while (curr && curr != offsetPar) {
|
| - // FIXME: What are we supposed to do inside SVG content?
|
| - if (curr->isBox() && !curr->isTableRow())
|
| - yPos += toRenderBox(curr)->y();
|
| - curr = curr->parent();
|
| - }
|
| - if (offsetPar->isBody() && !offsetPar->isRelPositioned() && !offsetPar->isPositioned())
|
| - yPos += offsetPar->y();
|
| - }
|
| - return yPos;
|
| -}
|
| -
|
| -RenderBox* RenderBox::offsetParent() const
|
| -{
|
| - // FIXME: It feels like this function could almost be written using containing blocks.
|
| - if (isBody())
|
| - return 0;
|
| -
|
| - bool skipTables = isPositioned() || isRelPositioned();
|
| - float currZoom = style()->effectiveZoom();
|
| - RenderObject* curr = parent();
|
| - while (curr && (!curr->element() ||
|
| - (!curr->isPositioned() && !curr->isRelPositioned() && !curr->isBody()))) {
|
| - Node* element = curr->element();
|
| - if (!skipTables && element) {
|
| - bool isTableElement = element->hasTagName(tableTag) ||
|
| - element->hasTagName(tdTag) ||
|
| - element->hasTagName(thTag);
|
| -
|
| -#if ENABLE(WML)
|
| - if (!isTableElement && element->isWMLElement())
|
| - isTableElement = element->hasTagName(WMLNames::tableTag) ||
|
| - element->hasTagName(WMLNames::tdTag);
|
| -#endif
|
| -
|
| - if (isTableElement)
|
| - break;
|
| - }
|
| -
|
| - float newZoom = curr->style()->effectiveZoom();
|
| - if (currZoom != newZoom)
|
| - break;
|
| - currZoom = newZoom;
|
| - curr = curr->parent();
|
| - }
|
| - return curr && curr->isBox() ? toRenderBox(curr) : 0;
|
| -}
|
| -
|
| // More IE extensions. clientWidth and clientHeight represent the interior of an object
|
| // excluding border and scrollbar.
|
| int RenderBox::clientWidth() const
|
| @@ -408,42 +328,6 @@
|
| layer()->scrollToYOffset(newTop);
|
| }
|
|
|
| -int RenderBox::paddingTop(bool) const
|
| -{
|
| - int w = 0;
|
| - Length padding = style()->paddingTop();
|
| - if (padding.isPercent())
|
| - w = containingBlock()->availableWidth();
|
| - return padding.calcMinValue(w);
|
| -}
|
| -
|
| -int RenderBox::paddingBottom(bool) const
|
| -{
|
| - int w = 0;
|
| - Length padding = style()->paddingBottom();
|
| - if (padding.isPercent())
|
| - w = containingBlock()->availableWidth();
|
| - return padding.calcMinValue(w);
|
| -}
|
| -
|
| -int RenderBox::paddingLeft(bool) const
|
| -{
|
| - int w = 0;
|
| - Length padding = style()->paddingLeft();
|
| - if (padding.isPercent())
|
| - w = containingBlock()->availableWidth();
|
| - return padding.calcMinValue(w);
|
| -}
|
| -
|
| -int RenderBox::paddingRight(bool) const
|
| -{
|
| - int w = 0;
|
| - Length padding = style()->paddingRight();
|
| - if (padding.isPercent())
|
| - w = containingBlock()->availableWidth();
|
| - return padding.calcMinValue(w);
|
| -}
|
| -
|
| void RenderBox::absoluteRects(Vector<IntRect>& rects, int tx, int ty, bool)
|
| {
|
| rects.append(IntRect(tx, ty, width(), height()));
|
| @@ -881,60 +765,20 @@
|
| paintFillLayerExtended(paintInfo, c, fillLayer, clipY, clipH, tx, ty, width, height, 0, op);
|
| }
|
|
|
| -IntSize RenderBox::calculateBackgroundSize(const FillLayer* bgLayer, int scaledWidth, int scaledHeight) const
|
| -{
|
| - StyleImage* bg = bgLayer->image();
|
| - bg->setImageContainerSize(IntSize(scaledWidth, scaledHeight)); // Use the box established by background-origin.
|
| -
|
| - if (bgLayer->isSizeSet()) {
|
| - int w = scaledWidth;
|
| - int h = scaledHeight;
|
| - Length bgWidth = bgLayer->size().width();
|
| - Length bgHeight = bgLayer->size().height();
|
| -
|
| - if (bgWidth.isFixed())
|
| - w = bgWidth.value();
|
| - else if (bgWidth.isPercent())
|
| - w = bgWidth.calcValue(scaledWidth);
|
| -
|
| - if (bgHeight.isFixed())
|
| - h = bgHeight.value();
|
| - else if (bgHeight.isPercent())
|
| - h = bgHeight.calcValue(scaledHeight);
|
| -
|
| - // If one of the values is auto we have to use the appropriate
|
| - // scale to maintain our aspect ratio.
|
| - if (bgWidth.isAuto() && !bgHeight.isAuto())
|
| - w = bg->imageSize(this, style()->effectiveZoom()).width() * h / bg->imageSize(this, style()->effectiveZoom()).height();
|
| - else if (!bgWidth.isAuto() && bgHeight.isAuto())
|
| - h = bg->imageSize(this, style()->effectiveZoom()).height() * w / bg->imageSize(this, style()->effectiveZoom()).width();
|
| - else if (bgWidth.isAuto() && bgHeight.isAuto()) {
|
| - // If both width and height are auto, we just want to use the image's
|
| - // intrinsic size.
|
| - w = bg->imageSize(this, style()->effectiveZoom()).width();
|
| - h = bg->imageSize(this, style()->effectiveZoom()).height();
|
| - }
|
| -
|
| - return IntSize(max(1, w), max(1, h));
|
| - } else
|
| - return bg->imageSize(this, style()->effectiveZoom());
|
| -}
|
| -
|
| void RenderBox::imageChanged(WrappedImagePtr image, const IntRect*)
|
| {
|
| if (!parent())
|
| return;
|
|
|
| - if (isRenderInline() || style()->borderImage().image() && style()->borderImage().image()->data() == image ||
|
| + if (style()->borderImage().image() && style()->borderImage().image()->data() == image ||
|
| style()->maskBoxImage().image() && style()->maskBoxImage().image()->data() == image) {
|
| repaint();
|
| return;
|
| }
|
|
|
| bool didFullRepaint = repaintLayerRectsForImage(image, style()->backgroundLayers(), true);
|
| - if (!didFullRepaint) {
|
| + if (!didFullRepaint)
|
| repaintLayerRectsForImage(image, style()->maskLayers(), false);
|
| - }
|
| }
|
|
|
| bool RenderBox::repaintLayerRectsForImage(WrappedImagePtr image, const FillLayer* layers, bool drawingBackground)
|
| @@ -983,256 +827,6 @@
|
| return false;
|
| }
|
|
|
| -void RenderBox::calculateBackgroundImageGeometry(const FillLayer* bgLayer, int tx, int ty, int w, int h, IntRect& destRect, IntPoint& phase, IntSize& tileSize)
|
| -{
|
| - int pw;
|
| - int ph;
|
| - int left = 0;
|
| - int right = 0;
|
| - int top = 0;
|
| - int bottom = 0;
|
| - int cx;
|
| - int cy;
|
| - int rw = 0;
|
| - int rh = 0;
|
| -
|
| - // CSS2 chapter 14.2.1
|
| -
|
| - if (bgLayer->attachment()) {
|
| - // Scroll
|
| - if (bgLayer->origin() != BorderFillBox) {
|
| - left = borderLeft();
|
| - right = borderRight();
|
| - top = borderTop();
|
| - bottom = borderBottom();
|
| - if (bgLayer->origin() == ContentFillBox) {
|
| - left += paddingLeft();
|
| - right += paddingRight();
|
| - top += paddingTop();
|
| - bottom += paddingBottom();
|
| - }
|
| - }
|
| -
|
| - // The background of the box generated by the root element covers the entire canvas including
|
| - // its margins. Since those were added in already, we have to factor them out when computing the
|
| - // box used by background-origin/size/position.
|
| - if (isRoot()) {
|
| - rw = width() - left - right;
|
| - rh = height() - top - bottom;
|
| - left += marginLeft();
|
| - right += marginRight();
|
| - top += marginTop();
|
| - bottom += marginBottom();
|
| - }
|
| - cx = tx;
|
| - cy = ty;
|
| - pw = w - left - right;
|
| - ph = h - top - bottom;
|
| - } else {
|
| - // Fixed
|
| - IntRect vr = viewRect();
|
| - cx = vr.x();
|
| - cy = vr.y();
|
| - pw = vr.width();
|
| - ph = vr.height();
|
| - }
|
| -
|
| - int sx = 0;
|
| - int sy = 0;
|
| - int cw;
|
| - int ch;
|
| -
|
| - IntSize scaledImageSize;
|
| - if (isRoot() && bgLayer->attachment())
|
| - scaledImageSize = calculateBackgroundSize(bgLayer, rw, rh);
|
| - else
|
| - scaledImageSize = calculateBackgroundSize(bgLayer, pw, ph);
|
| -
|
| - int scaledImageWidth = scaledImageSize.width();
|
| - int scaledImageHeight = scaledImageSize.height();
|
| -
|
| - EFillRepeat backgroundRepeat = bgLayer->repeat();
|
| -
|
| - int xPosition;
|
| - if (isRoot() && bgLayer->attachment())
|
| - xPosition = bgLayer->xPosition().calcMinValue(rw - scaledImageWidth, true);
|
| - else
|
| - xPosition = bgLayer->xPosition().calcMinValue(pw - scaledImageWidth, true);
|
| - if (backgroundRepeat == RepeatFill || backgroundRepeat == RepeatXFill) {
|
| - cw = pw + left + right;
|
| - sx = scaledImageWidth ? scaledImageWidth - (xPosition + left) % scaledImageWidth : 0;
|
| - } else {
|
| - cx += max(xPosition + left, 0);
|
| - sx = -min(xPosition + left, 0);
|
| - cw = scaledImageWidth + min(xPosition + left, 0);
|
| - }
|
| -
|
| - int yPosition;
|
| - if (isRoot() && bgLayer->attachment())
|
| - yPosition = bgLayer->yPosition().calcMinValue(rh - scaledImageHeight, true);
|
| - else
|
| - yPosition = bgLayer->yPosition().calcMinValue(ph - scaledImageHeight, true);
|
| - if (backgroundRepeat == RepeatFill || backgroundRepeat == RepeatYFill) {
|
| - ch = ph + top + bottom;
|
| - sy = scaledImageHeight ? scaledImageHeight - (yPosition + top) % scaledImageHeight : 0;
|
| - } else {
|
| - cy += max(yPosition + top, 0);
|
| - sy = -min(yPosition + top, 0);
|
| - ch = scaledImageHeight + min(yPosition + top, 0);
|
| - }
|
| -
|
| - if (!bgLayer->attachment()) {
|
| - sx += max(tx - cx, 0);
|
| - sy += max(ty - cy, 0);
|
| - }
|
| -
|
| - destRect = IntRect(cx, cy, cw, ch);
|
| - destRect.intersect(IntRect(tx, ty, w, h));
|
| - phase = IntPoint(sx, sy);
|
| - tileSize = IntSize(scaledImageWidth, scaledImageHeight);
|
| -}
|
| -
|
| -void RenderBox::paintFillLayerExtended(const PaintInfo& paintInfo, const Color& c, const FillLayer* bgLayer, int clipY, int clipH,
|
| - int tx, int ty, int w, int h, InlineFlowBox* box, CompositeOperator op)
|
| -{
|
| - GraphicsContext* context = paintInfo.context;
|
| - bool includeLeftEdge = box ? box->includeLeftEdge() : true;
|
| - bool includeRightEdge = box ? box->includeRightEdge() : true;
|
| - int bLeft = includeLeftEdge ? borderLeft() : 0;
|
| - int bRight = includeRightEdge ? borderRight() : 0;
|
| - int pLeft = includeLeftEdge ? paddingLeft() : 0;
|
| - int pRight = includeRightEdge ? paddingRight() : 0;
|
| -
|
| - bool clippedToBorderRadius = false;
|
| - if (style()->hasBorderRadius() && (includeLeftEdge || includeRightEdge)) {
|
| - context->save();
|
| - context->addRoundedRectClip(IntRect(tx, ty, w, h),
|
| - includeLeftEdge ? style()->borderTopLeftRadius() : IntSize(),
|
| - includeRightEdge ? style()->borderTopRightRadius() : IntSize(),
|
| - includeLeftEdge ? style()->borderBottomLeftRadius() : IntSize(),
|
| - includeRightEdge ? style()->borderBottomRightRadius() : IntSize());
|
| - clippedToBorderRadius = true;
|
| - }
|
| -
|
| - if (bgLayer->clip() == PaddingFillBox || bgLayer->clip() == ContentFillBox) {
|
| - // Clip to the padding or content boxes as necessary.
|
| - bool includePadding = bgLayer->clip() == ContentFillBox;
|
| - int x = tx + bLeft + (includePadding ? pLeft : 0);
|
| - int y = ty + borderTop() + (includePadding ? paddingTop() : 0);
|
| - int width = w - bLeft - bRight - (includePadding ? pLeft + pRight : 0);
|
| - int height = h - borderTop() - borderBottom() - (includePadding ? paddingTop() + paddingBottom() : 0);
|
| - context->save();
|
| - context->clip(IntRect(x, y, width, height));
|
| - } else if (bgLayer->clip() == TextFillBox) {
|
| - // We have to draw our text into a mask that can then be used to clip background drawing.
|
| - // First figure out how big the mask has to be. It should be no bigger than what we need
|
| - // to actually render, so we should intersect the dirty rect with the border box of the background.
|
| - IntRect maskRect(tx, ty, w, h);
|
| - maskRect.intersect(paintInfo.rect);
|
| -
|
| - // Now create the mask.
|
| - auto_ptr<ImageBuffer> maskImage = ImageBuffer::create(maskRect.size(), false);
|
| - if (!maskImage.get())
|
| - return;
|
| -
|
| - GraphicsContext* maskImageContext = maskImage->context();
|
| - maskImageContext->translate(-maskRect.x(), -maskRect.y());
|
| -
|
| - // Now add the text to the clip. We do this by painting using a special paint phase that signals to
|
| - // InlineTextBoxes that they should just add their contents to the clip.
|
| - PaintInfo info(maskImageContext, maskRect, PaintPhaseTextClip, true, 0, 0);
|
| - if (box)
|
| - box->paint(info, tx - box->xPos(), ty - box->yPos());
|
| - else
|
| - paint(info, tx, ty);
|
| -
|
| - // The mask has been created. Now we just need to clip to it.
|
| - context->save();
|
| - context->clipToImageBuffer(maskRect, maskImage.get());
|
| - }
|
| -
|
| - StyleImage* bg = bgLayer->image();
|
| - bool shouldPaintBackgroundImage = bg && bg->canRender(style()->effectiveZoom());
|
| - Color bgColor = c;
|
| -
|
| - // When this style flag is set, change existing background colors and images to a solid white background.
|
| - // If there's no bg color or image, leave it untouched to avoid affecting transparency.
|
| - // We don't try to avoid loading the background images, because this style flag is only set
|
| - // when printing, and at that point we've already loaded the background images anyway. (To avoid
|
| - // loading the background images we'd have to do this check when applying styles rather than
|
| - // while rendering.)
|
| - if (style()->forceBackgroundsToWhite()) {
|
| - // Note that we can't reuse this variable below because the bgColor might be changed
|
| - bool shouldPaintBackgroundColor = !bgLayer->next() && bgColor.isValid() && bgColor.alpha() > 0;
|
| - if (shouldPaintBackgroundImage || shouldPaintBackgroundColor) {
|
| - bgColor = Color::white;
|
| - shouldPaintBackgroundImage = false;
|
| - }
|
| - }
|
| -
|
| - // Only fill with a base color (e.g., white) if we're the root document, since iframes/frames with
|
| - // no background in the child document should show the parent's background.
|
| - bool isTransparent = false;
|
| - if (!bgLayer->next() && isRoot() && !(bgColor.isValid() && bgColor.alpha() > 0) && view()->frameView()) {
|
| - Node* elt = document()->ownerElement();
|
| - if (elt) {
|
| - if (!elt->hasTagName(frameTag)) {
|
| - // Locate the <body> element using the DOM. This is easier than trying
|
| - // to crawl around a render tree with potential :before/:after content and
|
| - // anonymous blocks created by inline <body> tags etc. We can locate the <body>
|
| - // render object very easily via the DOM.
|
| - HTMLElement* body = document()->body();
|
| - isTransparent = !body || !body->hasLocalName(framesetTag); // Can't scroll a frameset document anyway.
|
| - }
|
| - } else
|
| - isTransparent = view()->frameView()->isTransparent();
|
| -
|
| - // FIXME: This needs to be dynamic. We should be able to go back to blitting if we ever stop being transparent.
|
| - if (isTransparent)
|
| - view()->frameView()->setUseSlowRepaints(); // The parent must show behind the child.
|
| - }
|
| -
|
| - // Paint the color first underneath all images.
|
| - if (!bgLayer->next()) {
|
| - IntRect rect(tx, clipY, w, clipH);
|
| - // If we have an alpha and we are painting the root element, go ahead and blend with the base background color.
|
| - if (isRoot() && (!bgColor.isValid() || bgColor.alpha() < 0xFF) && !isTransparent) {
|
| - Color baseColor = view()->frameView()->baseBackgroundColor();
|
| - if (baseColor.alpha() > 0) {
|
| - context->save();
|
| - context->setCompositeOperation(CompositeCopy);
|
| - context->fillRect(rect, baseColor);
|
| - context->restore();
|
| - } else
|
| - context->clearRect(rect);
|
| - }
|
| -
|
| - if (bgColor.isValid() && bgColor.alpha() > 0)
|
| - context->fillRect(rect, bgColor);
|
| - }
|
| -
|
| - // no progressive loading of the background image
|
| - if (shouldPaintBackgroundImage) {
|
| - IntRect destRect;
|
| - IntPoint phase;
|
| - IntSize tileSize;
|
| -
|
| - calculateBackgroundImageGeometry(bgLayer, tx, ty, w, h, destRect, phase, tileSize);
|
| - if (!destRect.isEmpty()) {
|
| - CompositeOperator compositeOp = op == CompositeSourceOver ? bgLayer->composite() : op;
|
| - context->drawTiledImage(bg->image(this, tileSize), destRect, phase, tileSize, compositeOp);
|
| - }
|
| - }
|
| -
|
| - if (bgLayer->clip() != BorderFillBox)
|
| - // Undo the background clip
|
| - context->restore();
|
| -
|
| - if (clippedToBorderRadius)
|
| - // Undo the border radius clip
|
| - context->restore();
|
| -}
|
| -
|
| #if PLATFORM(MAC)
|
|
|
| void RenderBox::paintCustomHighlight(int tx, int ty, const AtomicString& type, bool behindText)
|
| @@ -1962,7 +1556,7 @@
|
| case Fixed:
|
| return calcContentBoxWidth(width.value());
|
| case Percent: {
|
| - const int cw = isPositioned() ? containingBlockWidthForPositioned(container()) : containingBlockWidth();
|
| + const int cw = isPositioned() ? containingBlockWidthForPositioned(toRenderBoxModelObject(container())) : containingBlockWidth();
|
| if (cw > 0)
|
| return calcContentBoxWidth(width.calcMinValue(cw));
|
| }
|
| @@ -2004,7 +1598,7 @@
|
| return calcContentBoxHeight(height.calcValue(newHeight));
|
| }
|
|
|
| - int availableHeight = isPositioned() ? containingBlockHeightForPositioned(cb) : toRenderBox(cb)->availableHeight();
|
| + int availableHeight = isPositioned() ? containingBlockHeightForPositioned(toRenderBoxModelObject(cb)) : toRenderBox(cb)->availableHeight();
|
|
|
| // It is necessary to use the border-box to match WinIE's broken
|
| // box model. This is essential for sizing inside
|
| @@ -2074,48 +1668,46 @@
|
| m_marginBottom = style()->marginBottom().calcMinValue(cw);
|
| }
|
|
|
| -int RenderBox::containingBlockWidthForPositioned(const RenderObject* containingBlock) const
|
| +int RenderBox::containingBlockWidthForPositioned(const RenderBoxModelObject* containingBlock) const
|
| {
|
| - if (containingBlock->isRenderInline()) {
|
| - ASSERT(containingBlock->isRelPositioned());
|
| + if (containingBlock->isBox()) {
|
| + const RenderBox* containingBlockBox = toRenderBox(containingBlock);
|
| + return containingBlockBox->width() - containingBlockBox->borderLeft() - containingBlockBox->borderRight() - containingBlockBox->verticalScrollbarWidth();
|
| + }
|
| +
|
| + ASSERT(containingBlock->isRenderInline() && containingBlock->isRelPositioned());
|
|
|
| - const RenderInline* flow = toRenderInline(containingBlock);
|
| - InlineFlowBox* first = flow->firstLineBox();
|
| - InlineFlowBox* last = flow->lastLineBox();
|
| + const RenderInline* flow = toRenderInline(containingBlock);
|
| + InlineFlowBox* first = flow->firstLineBox();
|
| + InlineFlowBox* last = flow->lastLineBox();
|
|
|
| - // If the containing block is empty, return a width of 0.
|
| - if (!first || !last)
|
| - return 0;
|
| + // If the containing block is empty, return a width of 0.
|
| + if (!first || !last)
|
| + return 0;
|
|
|
| - int fromLeft;
|
| - int fromRight;
|
| - if (containingBlock->style()->direction() == LTR) {
|
| - fromLeft = first->xPos() + first->borderLeft();
|
| - fromRight = last->xPos() + last->width() - last->borderRight();
|
| - } else {
|
| - fromRight = first->xPos() + first->width() - first->borderRight();
|
| - fromLeft = last->xPos() + last->borderLeft();
|
| - }
|
| -
|
| - return max(0, (fromRight - fromLeft));
|
| + int fromLeft;
|
| + int fromRight;
|
| + if (containingBlock->style()->direction() == LTR) {
|
| + fromLeft = first->xPos() + first->borderLeft();
|
| + fromRight = last->xPos() + last->width() - last->borderRight();
|
| + } else {
|
| + fromRight = first->xPos() + first->width() - first->borderRight();
|
| + fromLeft = last->xPos() + last->borderLeft();
|
| }
|
|
|
| - const RenderBox* containingBlockBox = toRenderBox(containingBlock);
|
| - return containingBlockBox->width() - containingBlockBox->borderLeft() - containingBlockBox->borderRight() - containingBlockBox->verticalScrollbarWidth();
|
| + return max(0, (fromRight - fromLeft));
|
| }
|
|
|
| -int RenderBox::containingBlockHeightForPositioned(const RenderObject* containingBlock) const
|
| -{
|
| - const RenderBox* containingBlockBox = toRenderBox(containingBlock);
|
| -
|
| - int heightResult;
|
| - if (containingBlock->isRenderInline()) {
|
| +int RenderBox::containingBlockHeightForPositioned(const RenderBoxModelObject* containingBlock) const
|
| +{
|
| + int heightResult = 0;
|
| + if (containingBlock->isBox())
|
| + heightResult = toRenderBox(containingBlock)->height();
|
| + else if (containingBlock->isRenderInline()) {
|
| ASSERT(containingBlock->isRelPositioned());
|
| heightResult = toRenderInline(containingBlock)->linesBoundingBox().height();
|
| - } else
|
| - heightResult = containingBlockBox->height();
|
| -
|
| - return heightResult - containingBlockBox->borderTop() - containingBlockBox->borderBottom();
|
| + }
|
| + return heightResult - containingBlock->borderTop() - containingBlock->borderBottom();
|
| }
|
|
|
| void RenderBox::calcAbsoluteHorizontal()
|
| @@ -2152,7 +1744,7 @@
|
|
|
| // We don't use containingBlock(), since we may be positioned by an enclosing
|
| // relative positioned inline.
|
| - const RenderBox* containerBlock = toRenderBox(container());
|
| + const RenderBoxModelObject* containerBlock = toRenderBoxModelObject(container());
|
|
|
| const int containerWidth = containingBlockWidthForPositioned(containerBlock);
|
|
|
| @@ -2196,15 +1788,21 @@
|
| if (containerDirection == LTR) {
|
| // 'staticX' should already have been set through layout of the parent.
|
| int staticPosition = layer()->staticX() - containerBlock->borderLeft();
|
| - for (RenderBox* po = parentBox(); po && po != containerBlock; po = po->parentBox())
|
| - staticPosition += po->x();
|
| + for (RenderObject* po = parent(); po && po != containerBlock; po = po->parent()) {
|
| + if (po->isBox())
|
| + staticPosition += toRenderBox(po)->x();
|
| + }
|
| left.setValue(Fixed, staticPosition);
|
| } else {
|
| - RenderBox* po = parentBox();
|
| + RenderObject* po = parent();
|
| // 'staticX' should already have been set through layout of the parent.
|
| - int staticPosition = layer()->staticX() + containerWidth + containerBlock->borderRight() - po->width();
|
| - for (; po && po != containerBlock; po = po->parentBox())
|
| - staticPosition -= po->x();
|
| + int staticPosition = layer()->staticX() + containerWidth + containerBlock->borderRight();
|
| + if (po->isBox())
|
| + staticPosition -= toRenderBox(po)->width();
|
| + for (; po && po != containerBlock; po = po->parent()) {
|
| + if (po->isBox())
|
| + staticPosition -= toRenderBox(po)->x();
|
| + }
|
| right.setValue(Fixed, staticPosition);
|
| }
|
| }
|
| @@ -2272,7 +1870,7 @@
|
| setWidth(width() + bordersPlusPadding);
|
| }
|
|
|
| -void RenderBox::calcAbsoluteHorizontalValues(Length width, const RenderBox* containerBlock, TextDirection containerDirection,
|
| +void RenderBox::calcAbsoluteHorizontalValues(Length width, const RenderBoxModelObject* containerBlock, TextDirection containerDirection,
|
| const int containerWidth, const int bordersPlusPadding,
|
| const Length left, const Length right, const Length marginLeft, const Length marginRight,
|
| int& widthValue, int& marginLeftValue, int& marginRightValue, int& xPos)
|
| @@ -2459,7 +2057,7 @@
|
|
|
|
|
| // We don't use containingBlock(), since we may be positioned by an enclosing relpositioned inline.
|
| - const RenderBox* containerBlock = toRenderBox(container());
|
| + const RenderBoxModelObject* containerBlock = toRenderBoxModelObject(container());
|
|
|
| const int containerHeight = containingBlockHeightForPositioned(containerBlock);
|
|
|
| @@ -2491,9 +2089,9 @@
|
| if (top.isAuto() && bottom.isAuto()) {
|
| // staticY should already have been set through layout of the parent()
|
| int staticTop = layer()->staticY() - containerBlock->borderTop();
|
| - for (RenderBox* po = parentBox(); po && po != containerBlock; po = po->parentBox()) {
|
| - if (!po->isTableRow())
|
| - staticTop += po->y();
|
| + for (RenderObject* po = parent(); po && po != containerBlock; po = po->parent()) {
|
| + if (po->isBox() && !po->isTableRow())
|
| + staticTop += toRenderBox(po)->y();
|
| }
|
| top.setValue(Fixed, staticTop);
|
| }
|
| @@ -2553,7 +2151,7 @@
|
| setHeight(h + bordersPlusPadding);
|
| }
|
|
|
| -void RenderBox::calcAbsoluteVerticalValues(Length h, const RenderBox* containerBlock,
|
| +void RenderBox::calcAbsoluteVerticalValues(Length h, const RenderBoxModelObject* containerBlock,
|
| const int containerHeight, const int bordersPlusPadding,
|
| const Length top, const Length bottom, const Length marginTop, const Length marginBottom,
|
| int& heightValue, int& marginTopValue, int& marginBottomValue, int& yPos)
|
| @@ -2682,7 +2280,7 @@
|
|
|
| // We don't use containingBlock(), since we may be positioned by an enclosing
|
| // relative positioned inline.
|
| - const RenderBox* containerBlock = toRenderBox(container());
|
| + const RenderBoxModelObject* containerBlock = toRenderBoxModelObject(container());
|
|
|
| const int containerWidth = containingBlockWidthForPositioned(containerBlock);
|
|
|
| @@ -2718,15 +2316,21 @@
|
| if (containerDirection == LTR) {
|
| // 'staticX' should already have been set through layout of the parent.
|
| int staticPosition = layer()->staticX() - containerBlock->borderLeft();
|
| - for (RenderBox* po = parentBox(); po && po != containerBlock; po = po->parentBox())
|
| - staticPosition += po->x();
|
| + for (RenderObject* po = parent(); po && po != containerBlock; po = po->parent()) {
|
| + if (po->isBox())
|
| + staticPosition += toRenderBox(po)->x();
|
| + }
|
| left.setValue(Fixed, staticPosition);
|
| } else {
|
| - RenderBox* po = parentBox();
|
| + RenderObject* po = parent();
|
| // 'staticX' should already have been set through layout of the parent.
|
| - int staticPosition = layer()->staticX() + containerWidth + containerBlock->borderRight() - po->width();
|
| - for (; po && po != containerBlock; po = po->parentBox())
|
| - staticPosition -= po->x();
|
| + int staticPosition = layer()->staticX() + containerWidth + toRenderBoxModelObject(containerBlock)->borderRight();
|
| + if (po->isBox())
|
| + po -= toRenderBox(po)->width();
|
| + for ( ; po && po != containerBlock; po = po->parent()) {
|
| + if (po->isBox())
|
| + staticPosition += toRenderBox(po)->x();
|
| + }
|
| right.setValue(Fixed, staticPosition);
|
| }
|
| }
|
| @@ -2855,7 +2459,7 @@
|
| // the numbers correspond to numbers in spec)
|
|
|
| // We don't use containingBlock(), since we may be positioned by an enclosing relpositioned inline.
|
| - const RenderBox* containerBlock = toRenderBox(container());
|
| + const RenderBoxModelObject* containerBlock = toRenderBoxModelObject(container());
|
|
|
| const int containerHeight = containingBlockHeightForPositioned(containerBlock);
|
|
|
| @@ -2884,9 +2488,9 @@
|
| if (top.isAuto() && bottom.isAuto()) {
|
| // staticY should already have been set through layout of the parent().
|
| int staticTop = layer()->staticY() - containerBlock->borderTop();
|
| - for (RenderBox* po = parentBox(); po && po != containerBlock; po = po->parentBox()) {
|
| - if (!po->isTableRow())
|
| - staticTop += po->y();
|
| + for (RenderObject* po = parent(); po && po != containerBlock; po = po->parent()) {
|
| + if (po->isBox() && !po->isTableRow())
|
| + staticTop += toRenderBox(po)->y();
|
| }
|
| top.setValue(Fixed, staticTop);
|
| }
|
| @@ -3092,9 +2696,9 @@
|
|
|
| RenderBox* renderer = toRenderBox(renderObject);
|
|
|
| - int top = borderTop() + paddingTop() + (isTableRow() ? 0 : renderer->y());
|
| + int top = renderer->borderTop() + renderer->paddingTop() + (isTableRow() ? 0 : renderer->y());
|
| int bottom = top + renderer->contentHeight();
|
| - int left = borderLeft() + paddingLeft() + (isTableRow() ? 0 : renderer->x());
|
| + int left = renderer->borderLeft() + renderer->paddingLeft() + (isTableRow() ? 0 : renderer->x());
|
| int right = left + renderer->contentWidth();
|
|
|
| if (xPos <= right && xPos >= left && yPos <= top && yPos >= bottom) {
|
|
|