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

Side by Side Diff: Source/core/rendering/RenderLayer.cpp

Issue 16982005: Allow objects without scrollbars to be scrollable (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: CR Fixes Created 7 years, 4 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 1300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1311 } 1311 }
1312 1312
1313 return 0; 1313 return 0;
1314 } 1314 }
1315 1315
1316 IntRect RenderLayer::scrollableAreaBoundingBox() const 1316 IntRect RenderLayer::scrollableAreaBoundingBox() const
1317 { 1317 {
1318 return renderer()->absoluteBoundingBoxRect(); 1318 return renderer()->absoluteBoundingBoxRect();
1319 } 1319 }
1320 1320
1321 bool RenderLayer::userInputScrollable(ScrollbarOrientation orientation) const
1322 {
1323 RenderBox* box = renderBox();
1324 ASSERT(box);
1325
1326 EOverflow overflowStyle = (orientation == HorizontalScrollbar) ?
1327 renderer()->style()->overflowX() : renderer()->style()->overflowY();
1328 return (overflowStyle == OSCROLL || overflowStyle == OAUTO);
1329 }
1330
1331 int RenderLayer::pageStep(ScrollbarOrientation orientation) const
1332 {
1333 RenderBox* box = renderBox();
1334 ASSERT(box);
1335
1336 int length = (orientation == HorizontalScrollbar) ?
1337 box->pixelSnappedClientWidth() : box->pixelSnappedClientHeight();
1338 int minPageStep = static_cast<float>(length) * ScrollableArea::minFractionTo StepWhenPaging();
1339 int pageStep = max(minPageStep, length - ScrollableArea::maxOverlapBetweenPa ges());
1340
1341 return max(pageStep, 1);
1342 }
1343
1321 RenderLayer* RenderLayer::enclosingTransformedAncestor() const 1344 RenderLayer* RenderLayer::enclosingTransformedAncestor() const
1322 { 1345 {
1323 RenderLayer* curr = parent(); 1346 RenderLayer* curr = parent();
1324 while (curr && !curr->isRootLayer() && !curr->transform()) 1347 while (curr && !curr->isRootLayer() && !curr->transform())
1325 curr = curr->parent(); 1348 curr = curr->parent();
1326 1349
1327 return curr; 1350 return curr;
1328 } 1351 }
1329 1352
1330 static inline const RenderLayer* compositingContainer(const RenderLayer* layer) 1353 static inline const RenderLayer* compositingContainer(const RenderLayer* layer)
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after
2465 element->setInlineStyleProperty(CSSPropertyHeight, roundToInt(baseHeight + difference.height()), CSSPrimitiveValue::CSS_PX); 2488 element->setInlineStyleProperty(CSSPropertyHeight, roundToInt(baseHeight + difference.height()), CSSPrimitiveValue::CSS_PX);
2466 } 2489 }
2467 2490
2468 document->updateLayout(); 2491 document->updateLayout();
2469 2492
2470 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to keep the point under the cursor in view. 2493 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to keep the point under the cursor in view.
2471 } 2494 }
2472 2495
2473 int RenderLayer::scrollSize(ScrollbarOrientation orientation) const 2496 int RenderLayer::scrollSize(ScrollbarOrientation orientation) const
2474 { 2497 {
2475 Scrollbar* scrollbar = ((orientation == HorizontalScrollbar) ? m_hBar : m_vB ar).get(); 2498 IntSize scrollDimensions = maximumScrollPosition() - minimumScrollPosition() ;
2476 return scrollbar ? (scrollbar->totalSize() - scrollbar->visibleSize()) : 0; 2499 return (orientation == HorizontalScrollbar) ? scrollDimensions.width() : scr ollDimensions.height();
2477 }
2478
2479 int RenderLayer::scrollPosition(Scrollbar* scrollbar) const
2480 {
2481 if (scrollbar->orientation() == HorizontalScrollbar)
2482 return scrollXOffset();
2483 if (scrollbar->orientation() == VerticalScrollbar)
2484 return scrollYOffset();
2485 return 0;
2486 } 2500 }
2487 2501
2488 IntPoint RenderLayer::scrollPosition() const 2502 IntPoint RenderLayer::scrollPosition() const
2489 { 2503 {
2490 return IntPoint(m_scrollOffset); 2504 return IntPoint(m_scrollOffset);
2491 } 2505 }
2492 2506
2493 IntPoint RenderLayer::minimumScrollPosition() const 2507 IntPoint RenderLayer::minimumScrollPosition() const
2494 { 2508 {
2495 return -scrollOrigin(); 2509 return -scrollOrigin();
2496 } 2510 }
2497 2511
2498 IntPoint RenderLayer::maximumScrollPosition() const 2512 IntPoint RenderLayer::maximumScrollPosition() const
2499 { 2513 {
2500 RenderBox* box = renderBox(); 2514 RenderBox* box = renderBox();
2501 if (!box || !box->hasOverflowClip()) 2515 if (!box || !box->hasOverflowClip())
2502 return -scrollOrigin(); 2516 return -scrollOrigin();
2503 2517
2504 LayoutRect overflowRect(box->layoutOverflowRect()); 2518 return -scrollOrigin() + enclosingIntRect(m_overflowRect).size() - enclosing IntRect(box->clientBoxRect()).size();
2505 box->flipForWritingMode(overflowRect);
2506 return -scrollOrigin() + enclosingIntRect(overflowRect).size() - enclosingIn tRect(box->clientBoxRect()).size();
2507 } 2519 }
2508 2520
2509 IntRect RenderLayer::visibleContentRect(VisibleContentRectIncludesScrollbars scr ollbarInclusion) const 2521 IntRect RenderLayer::visibleContentRect(VisibleContentRectIncludesScrollbars scr ollbarInclusion) const
2510 { 2522 {
2511 int verticalScrollbarWidth = 0; 2523 int verticalScrollbarWidth = 0;
2512 int horizontalScrollbarHeight = 0; 2524 int horizontalScrollbarHeight = 0;
2513 if (scrollbarInclusion == IncludeScrollbars) { 2525 if (scrollbarInclusion == IncludeScrollbars) {
2514 verticalScrollbarWidth = (verticalScrollbar() && !verticalScrollbar()->i sOverlayScrollbar()) ? verticalScrollbar()->width() : 0; 2526 verticalScrollbarWidth = (verticalScrollbar() && !verticalScrollbar()->i sOverlayScrollbar()) ? verticalScrollbar()->width() : 0;
2515 horizontalScrollbarHeight = (horizontalScrollbar() && !horizontalScrollb ar()->isOverlayScrollbar()) ? horizontalScrollbar()->height() : 0; 2527 horizontalScrollbarHeight = (horizontalScrollbar() && !horizontalScrollb ar()->isOverlayScrollbar()) ? horizontalScrollbar()->height() : 0;
2516 } 2528 }
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
2836 willRemoveHorizontalScrollbar(scrollbar.get()); 2848 willRemoveHorizontalScrollbar(scrollbar.get());
2837 else 2849 else
2838 willRemoveVerticalScrollbar(scrollbar.get()); 2850 willRemoveVerticalScrollbar(scrollbar.get());
2839 } 2851 }
2840 2852
2841 scrollbar->removeFromParent(); 2853 scrollbar->removeFromParent();
2842 scrollbar->disconnectFromScrollableArea(); 2854 scrollbar->disconnectFromScrollableArea();
2843 scrollbar = 0; 2855 scrollbar = 0;
2844 } 2856 }
2845 2857
2846 bool RenderLayer::scrollsOverflow() const
2847 {
2848 if (!renderer()->isBox())
2849 return false;
2850
2851 return toRenderBox(renderer())->scrollsOverflow();
2852 }
2853
2854 void RenderLayer::setHasHorizontalScrollbar(bool hasScrollbar) 2858 void RenderLayer::setHasHorizontalScrollbar(bool hasScrollbar)
2855 { 2859 {
2856 if (hasScrollbar == hasHorizontalScrollbar()) 2860 if (hasScrollbar == hasHorizontalScrollbar())
2857 return; 2861 return;
2858 2862
2859 if (hasScrollbar) 2863 if (hasScrollbar)
2860 m_hBar = createScrollbar(HorizontalScrollbar); 2864 m_hBar = createScrollbar(HorizontalScrollbar);
2861 else 2865 else
2862 destroyScrollbar(HorizontalScrollbar); 2866 destroyScrollbar(HorizontalScrollbar);
2863 2867
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2965 2969
2966 if (isComposited()) 2970 if (isComposited())
2967 backing()->positionOverflowControlsLayers(offsetFromRoot); 2971 backing()->positionOverflowControlsLayers(offsetFromRoot);
2968 } 2972 }
2969 2973
2970 int RenderLayer::scrollWidth() const 2974 int RenderLayer::scrollWidth() const
2971 { 2975 {
2972 ASSERT(renderBox()); 2976 ASSERT(renderBox());
2973 if (m_scrollDimensionsDirty) 2977 if (m_scrollDimensionsDirty)
2974 const_cast<RenderLayer*>(this)->computeScrollDimensions(); 2978 const_cast<RenderLayer*>(this)->computeScrollDimensions();
2975 return snapSizeToPixel(m_scrollSize.width(), renderBox()->clientLeft() + ren derBox()->x()); 2979 return snapSizeToPixel(m_overflowRect.width(), renderBox()->clientLeft() + r enderBox()->x());
2976 } 2980 }
2977 2981
2978 int RenderLayer::scrollHeight() const 2982 int RenderLayer::scrollHeight() const
2979 { 2983 {
2980 ASSERT(renderBox()); 2984 ASSERT(renderBox());
2981 if (m_scrollDimensionsDirty) 2985 if (m_scrollDimensionsDirty)
2982 const_cast<RenderLayer*>(this)->computeScrollDimensions(); 2986 const_cast<RenderLayer*>(this)->computeScrollDimensions();
2983 return snapSizeToPixel(m_scrollSize.height(), renderBox()->clientTop() + ren derBox()->y()); 2987 return snapSizeToPixel(m_overflowRect.height(), renderBox()->clientTop() + r enderBox()->y());
2984 }
2985
2986 LayoutUnit RenderLayer::overflowTop() const
2987 {
2988 RenderBox* box = renderBox();
2989 LayoutRect overflowRect(box->layoutOverflowRect());
2990 box->flipForWritingMode(overflowRect);
2991 return overflowRect.y();
2992 }
2993
2994 LayoutUnit RenderLayer::overflowBottom() const
2995 {
2996 RenderBox* box = renderBox();
2997 LayoutRect overflowRect(box->layoutOverflowRect());
2998 box->flipForWritingMode(overflowRect);
2999 return overflowRect.maxY();
3000 }
3001
3002 LayoutUnit RenderLayer::overflowLeft() const
3003 {
3004 RenderBox* box = renderBox();
3005 LayoutRect overflowRect(box->layoutOverflowRect());
3006 box->flipForWritingMode(overflowRect);
3007 return overflowRect.x();
3008 }
3009
3010 LayoutUnit RenderLayer::overflowRight() const
3011 {
3012 RenderBox* box = renderBox();
3013 LayoutRect overflowRect(box->layoutOverflowRect());
3014 box->flipForWritingMode(overflowRect);
3015 return overflowRect.maxX();
3016 } 2988 }
3017 2989
3018 void RenderLayer::computeScrollDimensions() 2990 void RenderLayer::computeScrollDimensions()
3019 { 2991 {
3020 RenderBox* box = renderBox(); 2992 RenderBox* box = renderBox();
3021 ASSERT(box); 2993 ASSERT(box);
3022 2994
3023 m_scrollDimensionsDirty = false; 2995 m_scrollDimensionsDirty = false;
3024 2996
3025 m_scrollSize.setWidth(overflowRight() - overflowLeft()); 2997 m_overflowRect = box->layoutOverflowRect();
3026 m_scrollSize.setHeight(overflowBottom() - overflowTop()); 2998 box->flipForWritingMode(m_overflowRect);
3027 2999
3028 int scrollableLeftOverflow = overflowLeft() - box->borderLeft(); 3000 int scrollableLeftOverflow = m_overflowRect.x() - box->borderLeft();
3029 int scrollableTopOverflow = overflowTop() - box->borderTop(); 3001 int scrollableTopOverflow = m_overflowRect.y() - box->borderTop();
3030 setScrollOrigin(IntPoint(-scrollableLeftOverflow, -scrollableTopOverflow)); 3002 setScrollOrigin(IntPoint(-scrollableLeftOverflow, -scrollableTopOverflow));
3031 } 3003 }
3032 3004
3033 bool RenderLayer::hasScrollableHorizontalOverflow() const 3005 bool RenderLayer::hasScrollableHorizontalOverflow() const
3034 { 3006 {
3035 return hasHorizontalOverflow() && renderBox()->scrollsOverflowX(); 3007 return hasHorizontalOverflow() && renderBox()->scrollsOverflowX();
3036 } 3008 }
3037 3009
3038 bool RenderLayer::hasScrollableVerticalOverflow() const 3010 bool RenderLayer::hasScrollableVerticalOverflow() const
3039 { 3011 {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
3102 } else 3074 } else
3103 renderer()->layout(); 3075 renderer()->layout();
3104 m_inOverflowRelayout = false; 3076 m_inOverflowRelayout = false;
3105 } 3077 }
3106 } 3078 }
3107 } 3079 }
3108 3080
3109 // Set up the range (and page step/line step). 3081 // Set up the range (and page step/line step).
3110 if (m_hBar) { 3082 if (m_hBar) {
3111 int clientWidth = box->pixelSnappedClientWidth(); 3083 int clientWidth = box->pixelSnappedClientWidth();
3112 int pageStep = max(max<int>(clientWidth * Scrollbar::minFractionToStepWh enPaging(), clientWidth - Scrollbar::maxOverlapBetweenPages()), 1); 3084 m_hBar->setProportion(clientWidth, m_overflowRect.width());
3113 m_hBar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
3114 m_hBar->setProportion(clientWidth, m_scrollSize.width());
3115 } 3085 }
3116 if (m_vBar) { 3086 if (m_vBar) {
3117 int clientHeight = box->pixelSnappedClientHeight(); 3087 int clientHeight = box->pixelSnappedClientHeight();
3118 int pageStep = max(max<int>(clientHeight * Scrollbar::minFractionToStepW henPaging(), clientHeight - Scrollbar::maxOverlapBetweenPages()), 1); 3088 m_vBar->setProportion(clientHeight, m_overflowRect.height());
3119 m_vBar->setSteps(Scrollbar::pixelsPerLineStep(), pageStep);
3120 m_vBar->setProportion(clientHeight, m_scrollSize.height());
3121 } 3089 }
3122 3090
3123 updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollableVe rticalOverflow()); 3091 updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollableVe rticalOverflow());
3124 } 3092 }
3125 3093
3126 void RenderLayer::updateScrollInfoAfterLayout() 3094 void RenderLayer::updateScrollInfoAfterLayout()
3127 { 3095 {
3128 RenderBox* box = renderBox(); 3096 RenderBox* box = renderBox();
3129 if (!box) 3097 if (!box)
3130 return; 3098 return;
(...skipping 3238 matching lines...) Expand 10 before | Expand all | Expand 10 after
6369 } 6337 }
6370 } 6338 }
6371 6339
6372 void showLayerTree(const WebCore::RenderObject* renderer) 6340 void showLayerTree(const WebCore::RenderObject* renderer)
6373 { 6341 {
6374 if (!renderer) 6342 if (!renderer)
6375 return; 6343 return;
6376 showLayerTree(renderer->enclosingLayer()); 6344 showLayerTree(renderer->enclosingLayer());
6377 } 6345 }
6378 #endif 6346 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698