Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/LayoutBox.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
| index 3bc1709ebb82d41630deda811a4c8265d7b1c927..7203d3d9ded29f0c4627fae5de9abcb948962546 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp |
| @@ -255,14 +255,16 @@ void LayoutBox::styleDidChange(StyleDifference diff, const ComputedStyle* oldSty |
| // If our zoom factor changes and we have a defined scrollLeft/Top, we need to adjust that value into the |
| // new zoomed coordinate space. |
| - if (hasOverflowClip() && oldStyle && oldStyle->effectiveZoom() != newStyle.effectiveZoom() && layer()) { |
| - if (int left = layer()->scrollableArea()->scrollXOffset()) { |
| + if (hasOverflowClip() && oldStyle && oldStyle->effectiveZoom() != newStyle.effectiveZoom()) { |
| + PaintLayerScrollableArea* scrollableArea = this->scrollableArea(); |
| + ASSERT(scrollableArea); |
| + if (int left = scrollableArea->scrollXOffset()) { |
| left = (left / oldStyle->effectiveZoom()) * newStyle.effectiveZoom(); |
| - layer()->scrollableArea()->scrollToXOffset(left); |
| + scrollableArea->scrollToXOffset(left); |
| } |
| - if (int top = layer()->scrollableArea()->scrollYOffset()) { |
| + if (int top = scrollableArea->scrollYOffset()) { |
| top = (top / oldStyle->effectiveZoom()) * newStyle.effectiveZoom(); |
| - layer()->scrollableArea()->scrollToYOffset(top); |
| + scrollableArea->scrollToYOffset(top); |
| } |
| } |
| @@ -376,31 +378,7 @@ void LayoutBox::updateFromStyle() |
| LayoutBoxModelObject::updateFromStyle(); |
| const ComputedStyle& styleToUse = styleRef(); |
| - bool isViewObject = isLayoutView(); |
| - bool rootLayerScrolls = document().settings() && document().settings()->rootLayerScrolls(); |
| - |
| - // LayoutView of the main frame is resposible from painting base background. |
| - if (isViewObject && !document().ownerElement()) |
| - setHasBoxDecorationBackground(true); |
|
Xianzhu
2016/02/26 20:12:57
BTW the above three lines are moved into LayoutVie
|
| - |
| setFloating(!isOutOfFlowPositioned() && styleToUse.isFloating()); |
| - |
| - bool boxHasOverflowClip = false; |
| - if (!styleToUse.isOverflowVisible() && isLayoutBlock() && (rootLayerScrolls || !isViewObject)) { |
| - // If overflow has been propagated to the viewport, it has no effect here. |
| - if (node() != document().viewportDefiningElement()) |
| - boxHasOverflowClip = true; |
| - } |
| - |
| - if (boxHasOverflowClip != hasOverflowClip()) { |
| - // FIXME: This shouldn't be required if we tracked the visual overflow |
| - // generated by positioned children or self painting layers. crbug.com/345403 |
| - for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibling()) |
| - child->setMayNeedPaintInvalidation(); |
| - } |
| - |
| - setHasOverflowClip(boxHasOverflowClip); |
| - |
| setHasTransformRelatedProperty(styleToUse.hasTransformRelatedProperty()); |
| setHasReflection(styleToUse.boxReflect()); |
| } |
| @@ -461,7 +439,7 @@ int LayoutBox::pixelSnappedOffsetHeight() const |
| LayoutUnit LayoutBox::scrollWidth() const |
| { |
| if (hasOverflowClip()) |
| - return layer()->scrollableArea()->scrollWidth(); |
| + return scrollableArea()->scrollWidth(); |
| // For objects with visible overflow, this matches IE. |
| // FIXME: Need to work right with writing modes. |
| if (style()->isLeftToRightDirection()) |
| @@ -472,7 +450,7 @@ LayoutUnit LayoutBox::scrollWidth() const |
| LayoutUnit LayoutBox::scrollHeight() const |
| { |
| if (hasOverflowClip()) |
| - return layer()->scrollableArea()->scrollHeight(); |
| + return scrollableArea()->scrollHeight(); |
| // For objects with visible overflow, this matches IE. |
| // FIXME: Need to work right with writing modes. |
| return std::max(clientHeight(), layoutOverflowRect().maxY() - borderTop()); |
| @@ -480,12 +458,12 @@ LayoutUnit LayoutBox::scrollHeight() const |
| LayoutUnit LayoutBox::scrollLeft() const |
| { |
| - return hasOverflowClip() ? LayoutUnit(layer()->scrollableArea()->scrollXOffset()) : LayoutUnit(); |
| + return hasOverflowClip() ? LayoutUnit(scrollableArea()->scrollXOffset()) : LayoutUnit(); |
| } |
| LayoutUnit LayoutBox::scrollTop() const |
| { |
| - return hasOverflowClip() ? LayoutUnit(layer()->scrollableArea()->scrollYOffset()) : LayoutUnit(); |
| + return hasOverflowClip() ? LayoutUnit(scrollableArea()->scrollYOffset()) : LayoutUnit(); |
| } |
| int LayoutBox::pixelSnappedScrollWidth() const |
| @@ -496,7 +474,7 @@ int LayoutBox::pixelSnappedScrollWidth() const |
| int LayoutBox::pixelSnappedScrollHeight() const |
| { |
| if (hasOverflowClip()) |
| - return snapSizeToPixel(layer()->scrollableArea()->scrollHeight(), location().y() + clientTop()); |
| + return snapSizeToPixel(scrollableArea()->scrollHeight(), location().y() + clientTop()); |
| // For objects with visible overflow, this matches IE. |
| // FIXME: Need to work right with writing modes. |
| return snapSizeToPixel(scrollHeight(), location().y() + clientTop()); |
| @@ -509,7 +487,7 @@ void LayoutBox::setScrollLeft(LayoutUnit newLeft) |
| DisableCompositingQueryAsserts disabler; |
| if (hasOverflowClip()) |
| - layer()->scrollableArea()->scrollToXOffset(newLeft, ScrollOffsetClamped, ScrollBehaviorAuto); |
| + scrollableArea()->scrollToXOffset(newLeft, ScrollOffsetClamped, ScrollBehaviorAuto); |
| } |
| void LayoutBox::setScrollTop(LayoutUnit newTop) |
| @@ -518,7 +496,7 @@ void LayoutBox::setScrollTop(LayoutUnit newTop) |
| DisableCompositingQueryAsserts disabler; |
| if (hasOverflowClip()) |
| - layer()->scrollableArea()->scrollToYOffset(newTop, ScrollOffsetClamped, ScrollBehaviorAuto); |
| + scrollableArea()->scrollToYOffset(newTop, ScrollOffsetClamped, ScrollBehaviorAuto); |
| } |
| void LayoutBox::scrollToOffset(const DoubleSize& offset, ScrollBehavior scrollBehavior) |
| @@ -528,7 +506,7 @@ void LayoutBox::scrollToOffset(const DoubleSize& offset, ScrollBehavior scrollBe |
| DisableCompositingQueryAsserts disabler; |
| if (hasOverflowClip()) |
| - layer()->scrollableArea()->scrollToOffset(offset, ScrollOffsetClamped, scrollBehavior); |
| + scrollableArea()->scrollToOffset(offset, ScrollOffsetClamped, scrollBehavior); |
| } |
| // Returns true iff we are attempting an autoscroll inside an iframe with scrolling="no". |
| @@ -562,7 +540,7 @@ void LayoutBox::scrollRectToVisible(const LayoutRect& rect, const ScrollAlignmen |
| if (hasOverflowClip() && !restrictedByLineClamp) { |
| // Don't scroll to reveal an overflow layer that is restricted by the -webkit-line-clamp property. |
| // This will prevent us from revealing text hidden by the slider in Safari RSS. |
| - newRect = layer()->scrollableArea()->scrollIntoView(rect, alignX, alignY, scrollType); |
| + newRect = scrollableArea()->scrollIntoView(rect, alignX, alignY, scrollType); |
| } else if (!parentBox && canBeProgramaticallyScrolled()) { |
| if (FrameView* frameView = this->frameView()) { |
| HTMLFrameOwnerElement* ownerElement = document().ownerElement(); |
| @@ -759,7 +737,7 @@ int LayoutBox::verticalScrollbarWidth() const |
| if (!hasOverflowClip() || style()->overflowY() == OOVERLAY) |
| return 0; |
| - return layer()->scrollableArea()->verticalScrollbarWidth(); |
| + return scrollableArea()->verticalScrollbarWidth(); |
| } |
| int LayoutBox::horizontalScrollbarHeight() const |
| @@ -767,7 +745,7 @@ int LayoutBox::horizontalScrollbarHeight() const |
| if (!hasOverflowClip() || style()->overflowX() == OOVERLAY) |
| return 0; |
| - return layer()->scrollableArea()->horizontalScrollbarHeight(); |
| + return scrollableArea()->horizontalScrollbarHeight(); |
| } |
| int LayoutBox::intrinsicScrollbarLogicalWidth() const |
| @@ -775,16 +753,16 @@ int LayoutBox::intrinsicScrollbarLogicalWidth() const |
| if (!hasOverflowClip()) |
| return 0; |
| + ASSERT(scrollableArea()); |
| + |
| if (isHorizontalWritingMode() && style()->overflowY() == OSCROLL) { |
| - ASSERT(layer()->scrollableArea()); |
| // Even with OSCROLL, the scrollbar may not exist (crbug.com/415031). |
| - return layer()->scrollableArea()->hasVerticalScrollbar() ? verticalScrollbarWidth() : 0; |
| + return scrollableArea()->hasVerticalScrollbar() ? verticalScrollbarWidth() : 0; |
| } |
| if (!isHorizontalWritingMode() && style()->overflowX() == OSCROLL) { |
| - ASSERT(layer()->scrollableArea()); |
| // Even with OSCROLL, the scrollbar may not exist (crbug.com/415031). |
| - return layer()->scrollableArea()->hasHorizontalScrollbar() ? horizontalScrollbarHeight() : 0; |
| + return scrollableArea()->hasHorizontalScrollbar() ? horizontalScrollbarHeight() : 0; |
| } |
| return 0; |
| @@ -795,10 +773,10 @@ ScrollResultOneDimensional LayoutBox::scroll(ScrollDirectionPhysical direction, |
| // Presumably the same issue as in setScrollTop. See crbug.com/343132. |
| DisableCompositingQueryAsserts disabler; |
| - if (!layer() || !layer()->scrollableArea()) |
| + if (!scrollableArea()) |
| return ScrollResultOneDimensional(false); |
| - return layer()->scrollableArea()->userScroll(direction, granularity, delta); |
| + return scrollableArea()->userScroll(direction, granularity, delta); |
| } |
| bool LayoutBox::canBeScrolledAndHasScrollableArea() const |
| @@ -942,11 +920,14 @@ void LayoutBox::scrollByRecursively(const DoubleSize& delta, ScrollOffsetClampin |
| restrictedByLineClamp = !parent()->style()->lineClamp().isNone(); |
| if (hasOverflowClip() && !restrictedByLineClamp) { |
| - DoubleSize newScrollOffset = layer()->scrollableArea()->adjustedScrollOffset() + delta; |
| - layer()->scrollableArea()->scrollToOffset(newScrollOffset, clamp); |
| + PaintLayerScrollableArea* scrollableArea = this->scrollableArea(); |
| + ASSERT(scrollableArea); |
| + |
| + DoubleSize newScrollOffset = scrollableArea->adjustedScrollOffset() + delta; |
| + scrollableArea->scrollToOffset(newScrollOffset, clamp); |
| // If this layer can't do the scroll we ask the next layer up that can scroll to try |
| - DoubleSize remainingScrollOffset = newScrollOffset - layer()->scrollableArea()->adjustedScrollOffset(); |
| + DoubleSize remainingScrollOffset = newScrollOffset - scrollableArea->adjustedScrollOffset(); |
| if (!remainingScrollOffset.isZero() && parent()) { |
| if (LayoutBox* scrollableBox = enclosingScrollableBox()) |
| scrollableBox->scrollByRecursively(remainingScrollOffset, clamp); |
| @@ -976,7 +957,7 @@ IntSize LayoutBox::scrolledContentOffset() const |
| ASSERT(hasOverflowClip()); |
| ASSERT(hasLayer()); |
| // FIXME: Return DoubleSize here. crbug.com/414283. |
| - return flooredIntSize(layer()->scrollableArea()->scrollOffset()); |
| + return flooredIntSize(scrollableArea()->scrollOffset()); |
| } |
| void LayoutBox::mapScrollingContentsRectToBoxSpace(LayoutRect& rect) const |
| @@ -1562,9 +1543,11 @@ LayoutRect LayoutBox::overflowClipRect(const LayoutPoint& location, OverlayScrol |
| void LayoutBox::excludeScrollbars(LayoutRect& rect, OverlayScrollbarSizeRelevancy relevancy) const |
| { |
| - if (shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) |
| - rect.move(layer()->scrollableArea()->verticalScrollbarWidth(relevancy), 0); |
| - rect.contract(layer()->scrollableArea()->verticalScrollbarWidth(relevancy), layer()->scrollableArea()->horizontalScrollbarHeight(relevancy)); |
| + if (PaintLayerScrollableArea* scrollableArea = this->scrollableArea()) { |
| + if (shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) |
| + rect.move(scrollableArea->verticalScrollbarWidth(relevancy), 0); |
| + rect.contract(scrollableArea->verticalScrollbarWidth(relevancy), scrollableArea->horizontalScrollbarHeight(relevancy)); |
| + } |
| } |
| LayoutRect LayoutBox::clipRect(const LayoutPoint& location) const |
| @@ -3761,13 +3744,11 @@ bool LayoutBox::avoidsFloats() const |
| bool LayoutBox::hasNonCompositedScrollbars() const |
| { |
| - if (PaintLayer* layer = this->layer()) { |
| - if (PaintLayerScrollableArea* scrollableArea = layer->scrollableArea()) { |
| - if (scrollableArea->hasHorizontalScrollbar() && !scrollableArea->layerForHorizontalScrollbar()) |
| - return true; |
| - if (scrollableArea->hasVerticalScrollbar() && !scrollableArea->layerForVerticalScrollbar()) |
| - return true; |
| - } |
| + if (PaintLayerScrollableArea* scrollableArea = this->scrollableArea()) { |
| + if (scrollableArea->hasHorizontalScrollbar() && !scrollableArea->layerForHorizontalScrollbar()) |
| + return true; |
| + if (scrollableArea->hasVerticalScrollbar() && !scrollableArea->layerForVerticalScrollbar()) |
| + return true; |
| } |
| return false; |
| } |