Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(265)

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp

Issue 1365853003: LayoutBox::scrollRectToVisible doesn't respect overflow:hidden property. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after
631 void PaintLayerScrollableArea::computeScrollDimensions() 631 void PaintLayerScrollableArea::computeScrollDimensions()
632 { 632 {
633 m_overflowRect = box().layoutOverflowRect(); 633 m_overflowRect = box().layoutOverflowRect();
634 box().flipForWritingMode(m_overflowRect); 634 box().flipForWritingMode(m_overflowRect);
635 635
636 int scrollableLeftOverflow = m_overflowRect.x() - box().borderLeft() - (box( ).style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft() ? box().verticalScr ollbarWidth() : 0); 636 int scrollableLeftOverflow = m_overflowRect.x() - box().borderLeft() - (box( ).style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft() ? box().verticalScr ollbarWidth() : 0);
637 int scrollableTopOverflow = m_overflowRect.y() - box().borderTop(); 637 int scrollableTopOverflow = m_overflowRect.y() - box().borderTop();
638 setScrollOrigin(IntPoint(-scrollableLeftOverflow, -scrollableTopOverflow)); 638 setScrollOrigin(IntPoint(-scrollableLeftOverflow, -scrollableTopOverflow));
639 } 639 }
640 640
641 void PaintLayerScrollableArea::scrollToPosition(const DoublePoint& scrollPositio n, ScrollOffsetClamping clamp, ScrollBehavior scrollBehavior) 641 void PaintLayerScrollableArea::scrollToPosition(const DoublePoint& scrollPositio n, ScrollOffsetClamping clamp, ScrollBehavior scrollBehavior, ScrollType scrollT ype)
642 { 642 {
643 cancelProgrammaticScrollAnimation(); 643 cancelProgrammaticScrollAnimation();
644 644
645 DoublePoint newScrollPosition = clamp == ScrollOffsetClamped ? clampScrollPo sition(scrollPosition) : scrollPosition; 645 DoublePoint newScrollPosition = clamp == ScrollOffsetClamped ? clampScrollPo sition(scrollPosition) : scrollPosition;
646 if (newScrollPosition != scrollPositionDouble()) 646 if (newScrollPosition != scrollPositionDouble())
647 ScrollableArea::setScrollPosition(newScrollPosition, ProgrammaticScroll, scrollBehavior); 647 ScrollableArea::setScrollPosition(newScrollPosition, scrollType, scrollB ehavior);
648 } 648 }
649 649
650 void PaintLayerScrollableArea::updateScrollDimensions(DoubleSize& scrollOffset, bool& autoHorizontalScrollBarChanged, bool& autoVerticalScrollBarChanged) 650 void PaintLayerScrollableArea::updateScrollDimensions(DoubleSize& scrollOffset, bool& autoHorizontalScrollBarChanged, bool& autoVerticalScrollBarChanged)
651 { 651 {
652 ASSERT(box().hasOverflowClip()); 652 ASSERT(box().hasOverflowClip());
653 653
654 if (needsScrollbarReconstruction()) { 654 if (needsScrollbarReconstruction()) {
655 m_scrollbarManager.setCanDetachScrollbars(false); 655 m_scrollbarManager.setCanDetachScrollbars(false);
656 setHasHorizontalScrollbar(false); 656 setHasHorizontalScrollbar(false);
657 setHasVerticalScrollbar(false); 657 setHasVerticalScrollbar(false);
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after
994 // If the <body> didn't have a custom style, then the root element m ight. 994 // If the <body> didn't have a custom style, then the root element m ight.
995 Element* docElement = doc.documentElement(); 995 Element* docElement = doc.documentElement();
996 if (docElement && docElement->layoutObject() && docElement->layoutOb ject()->style()->hasPseudoStyle(SCROLLBAR)) 996 if (docElement && docElement->layoutObject() && docElement->layoutOb ject()->style()->hasPseudoStyle(SCROLLBAR))
997 return *docElement->layoutObject(); 997 return *docElement->layoutObject();
998 998
999 // If we have an owning ipage/LocalFrame element, then it can set th e custom scrollbar also. 999 // If we have an owning ipage/LocalFrame element, then it can set th e custom scrollbar also.
1000 LayoutPart* frameLayoutObject = node->document().frame()->ownerLayou tObject(); 1000 LayoutPart* frameLayoutObject = node->document().frame()->ownerLayou tObject();
1001 if (frameLayoutObject && frameLayoutObject->style()->hasPseudoStyle( SCROLLBAR)) 1001 if (frameLayoutObject && frameLayoutObject->style()->hasPseudoStyle( SCROLLBAR))
1002 return *frameLayoutObject; 1002 return *frameLayoutObject;
1003 } 1003 }
1004
1005 if (layoutObject.styleRef().hasPseudoStyle(SCROLLBAR))
1006 return layoutObject;
1007
1004 if (ShadowRoot* shadowRoot = node->containingShadowRoot()) { 1008 if (ShadowRoot* shadowRoot = node->containingShadowRoot()) {
1005 if (shadowRoot->type() == ShadowRootType::UserAgent) 1009 if (shadowRoot->type() == ShadowRootType::UserAgent)
1006 return *shadowRoot->host()->layoutObject(); 1010 return *shadowRoot->host()->layoutObject();
1007 } 1011 }
1008 } 1012 }
1009 1013
1010 return layoutObject; 1014 return layoutObject;
1011 } 1015 }
1012 1016
1013 bool PaintLayerScrollableArea::needsScrollbarReconstruction() const 1017 bool PaintLayerScrollableArea::needsScrollbarReconstruction() const
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
1344 LayoutUnit baseHeight = box().size().height() - (isBoxSizingBorder ? Lay outUnit() : box().borderAndPaddingHeight()); 1348 LayoutUnit baseHeight = box().size().height() - (isBoxSizingBorder ? Lay outUnit() : box().borderAndPaddingHeight());
1345 baseHeight = baseHeight / zoomFactor; 1349 baseHeight = baseHeight / zoomFactor;
1346 element->setInlineStyleProperty(CSSPropertyHeight, roundToInt(baseHeight + difference.height()), CSSPrimitiveValue::UnitType::Pixels); 1350 element->setInlineStyleProperty(CSSPropertyHeight, roundToInt(baseHeight + difference.height()), CSSPrimitiveValue::UnitType::Pixels);
1347 } 1351 }
1348 1352
1349 document.updateLayout(); 1353 document.updateLayout();
1350 1354
1351 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to keep the point under the cursor in view. 1355 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to keep the point under the cursor in view.
1352 } 1356 }
1353 1357
1354 LayoutRect PaintLayerScrollableArea::scrollIntoView(const LayoutRect& rect, cons t ScrollAlignment& alignX, const ScrollAlignment& alignY) 1358 LayoutRect PaintLayerScrollableArea::scrollIntoView(const LayoutRect& rect, cons t ScrollAlignment& alignX, const ScrollAlignment& alignY, ScrollType scrollType)
1355 { 1359 {
1356 LayoutRect localExposeRect(box().absoluteToLocalQuad(FloatQuad(FloatRect(rec t)), UseTransforms).boundingBox()); 1360 LayoutRect localExposeRect(box().absoluteToLocalQuad(FloatQuad(FloatRect(rec t)), UseTransforms).boundingBox());
1357 localExposeRect.move(-box().borderLeft(), -box().borderTop()); 1361 localExposeRect.move(-box().borderLeft(), -box().borderTop());
1358 LayoutRect layerBounds(0, 0, box().clientWidth(), box().clientHeight()); 1362 LayoutRect layerBounds(0, 0, box().clientWidth(), box().clientHeight());
1359 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect , alignX, alignY); 1363 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect , alignX, alignY);
1360 1364
1361 DoublePoint clampedScrollPosition = clampScrollPosition(scrollPositionDouble () + roundedIntSize(r.location())); 1365 DoublePoint clampedScrollPosition = clampScrollPosition(scrollPositionDouble () + roundedIntSize(r.location()));
1362 if (clampedScrollPosition == scrollPositionDouble()) 1366 if (clampedScrollPosition == scrollPositionDouble())
1363 return rect; 1367 return rect;
1364 1368
1365 DoubleSize oldScrollOffset = adjustedScrollOffset(); 1369 DoubleSize oldScrollOffset = adjustedScrollOffset();
1366 scrollToPosition(clampedScrollPosition); 1370 scrollToPosition(clampedScrollPosition, ScrollOffsetUnclamped, ScrollBehavio rInstant, scrollType);
1367 DoubleSize scrollOffsetDifference = adjustedScrollOffset() - oldScrollOffset ; 1371 DoubleSize scrollOffsetDifference = adjustedScrollOffset() - oldScrollOffset ;
1368 localExposeRect.move(-LayoutSize(scrollOffsetDifference)); 1372 localExposeRect.move(-LayoutSize(scrollOffsetDifference));
1369 return LayoutRect(box().localToAbsoluteQuad(FloatQuad(FloatRect(localExposeR ect)), UseTransforms).boundingBox()); 1373 return LayoutRect(box().localToAbsoluteQuad(FloatQuad(FloatRect(localExposeR ect)), UseTransforms).boundingBox());
1370 } 1374 }
1371 1375
1372 void PaintLayerScrollableArea::updateScrollableAreaSet(bool hasOverflow) 1376 void PaintLayerScrollableArea::updateScrollableAreaSet(bool hasOverflow)
1373 { 1377 {
1374 LocalFrame* frame = box().frame(); 1378 LocalFrame* frame = box().frame();
1375 if (!frame) 1379 if (!frame)
1376 return; 1380 return;
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 } 1566 }
1563 1567
1564 DEFINE_TRACE(PaintLayerScrollableArea::ScrollbarManager) 1568 DEFINE_TRACE(PaintLayerScrollableArea::ScrollbarManager)
1565 { 1569 {
1566 visitor->trace(m_scrollableArea); 1570 visitor->trace(m_scrollableArea);
1567 visitor->trace(m_hBar); 1571 visitor->trace(m_hBar);
1568 visitor->trace(m_vBar); 1572 visitor->trace(m_vBar);
1569 } 1573 }
1570 1574
1571 } // namespace blink 1575 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698