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

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

Issue 22893055: Split computeScrollDimensions() out of RenderLayer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Updated after Ian's comment. Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerScrollableArea.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 #include "core/rendering/RenderLayer.h" 45 #include "core/rendering/RenderLayer.h"
46 46
47 #include "CSSPropertyNames.h" 47 #include "CSSPropertyNames.h"
48 #include "HTMLNames.h" 48 #include "HTMLNames.h"
49 #include "RuntimeEnabledFeatures.h" 49 #include "RuntimeEnabledFeatures.h"
50 #include "SVGNames.h" 50 #include "SVGNames.h"
51 #include "core/css/PseudoStyleRequest.h" 51 #include "core/css/PseudoStyleRequest.h"
52 #include "core/dom/Document.h" 52 #include "core/dom/Document.h"
53 #include "core/dom/DocumentEventQueue.h" 53 #include "core/dom/DocumentEventQueue.h"
54 #include "core/dom/shadow/ShadowRoot.h" 54 #include "core/dom/shadow/ShadowRoot.h"
55 #include "core/editing/FrameSelection.h"
56 #include "core/html/HTMLFrameElement.h" 55 #include "core/html/HTMLFrameElement.h"
57 #include "core/html/HTMLFrameOwnerElement.h" 56 #include "core/html/HTMLFrameOwnerElement.h"
58 #include "core/inspector/InspectorInstrumentation.h"
59 #include "core/page/EventHandler.h" 57 #include "core/page/EventHandler.h"
60 #include "core/page/FocusController.h" 58 #include "core/page/FocusController.h"
61 #include "core/page/Frame.h" 59 #include "core/page/Frame.h"
62 #include "core/page/FrameView.h" 60 #include "core/page/FrameView.h"
63 #include "core/page/Page.h" 61 #include "core/page/Page.h"
64 #include "core/page/Settings.h" 62 #include "core/page/Settings.h"
65 #include "core/page/UseCounter.h" 63 #include "core/page/UseCounter.h"
66 #include "core/page/animation/AnimationController.h" 64 #include "core/page/animation/AnimationController.h"
67 #include "core/page/scrolling/ScrollingCoordinator.h" 65 #include "core/page/scrolling/ScrollingCoordinator.h"
68 #include "core/platform/HistogramSupport.h" 66 #include "core/platform/HistogramSupport.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 const int MinimumHeightWhileResizing = 40; 116 const int MinimumHeightWhileResizing = 40;
119 const int ResizerControlExpandRatioForTouch = 2; 117 const int ResizerControlExpandRatioForTouch = 2;
120 118
121 bool ClipRect::intersects(const HitTestLocation& hitTestLocation) const 119 bool ClipRect::intersects(const HitTestLocation& hitTestLocation) const
122 { 120 {
123 return hitTestLocation.intersects(m_rect); 121 return hitTestLocation.intersects(m_rect);
124 } 122 }
125 123
126 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) 124 RenderLayer::RenderLayer(RenderLayerModelObject* renderer)
127 : m_inResizeMode(false) 125 : m_inResizeMode(false)
128 , m_scrollDimensionsDirty(true)
129 , m_normalFlowListDirty(true) 126 , m_normalFlowListDirty(true)
130 , m_hasSelfPaintingLayerDescendant(false) 127 , m_hasSelfPaintingLayerDescendant(false)
131 , m_hasSelfPaintingLayerDescendantDirty(false) 128 , m_hasSelfPaintingLayerDescendantDirty(false)
132 , m_hasOutOfFlowPositionedDescendant(false) 129 , m_hasOutOfFlowPositionedDescendant(false)
133 , m_hasOutOfFlowPositionedDescendantDirty(true) 130 , m_hasOutOfFlowPositionedDescendantDirty(true)
134 , m_hasUnclippedDescendant(false) 131 , m_hasUnclippedDescendant(false)
135 , m_isUnclippedDescendant(false) 132 , m_isUnclippedDescendant(false)
136 , m_needsCompositedScrolling(false) 133 , m_needsCompositedScrolling(false)
137 , m_canBePromotedToStackingContainer(false) 134 , m_canBePromotedToStackingContainer(false)
138 , m_canBePromotedToStackingContainerDirty(true) 135 , m_canBePromotedToStackingContainerDirty(true)
(...skipping 2032 matching lines...) Expand 10 before | Expand all | Expand 10 after
2171 { 2168 {
2172 if (delta.isZero()) 2169 if (delta.isZero())
2173 return; 2170 return;
2174 2171
2175 bool restrictedByLineClamp = false; 2172 bool restrictedByLineClamp = false;
2176 if (renderer()->parent()) 2173 if (renderer()->parent())
2177 restrictedByLineClamp = !renderer()->parent()->style()->lineClamp().isNo ne(); 2174 restrictedByLineClamp = !renderer()->parent()->style()->lineClamp().isNo ne();
2178 2175
2179 if (renderer()->hasOverflowClip() && !restrictedByLineClamp) { 2176 if (renderer()->hasOverflowClip() && !restrictedByLineClamp) {
2180 IntSize newScrollOffset = adjustedScrollOffset() + delta; 2177 IntSize newScrollOffset = adjustedScrollOffset() + delta;
2181 scrollToOffset(newScrollOffset, clamp); 2178 m_scrollableArea->scrollToOffset(newScrollOffset, clamp);
2182 2179
2183 // If this layer can't do the scroll we ask the next layer up that can s croll to try 2180 // If this layer can't do the scroll we ask the next layer up that can s croll to try
2184 IntSize remainingScrollOffset = newScrollOffset - adjustedScrollOffset() ; 2181 IntSize remainingScrollOffset = newScrollOffset - adjustedScrollOffset() ;
2185 if (!remainingScrollOffset.isZero() && renderer()->parent()) { 2182 if (!remainingScrollOffset.isZero() && renderer()->parent()) {
2186 if (RenderLayer* scrollableLayer = enclosingScrollableLayer()) 2183 if (RenderLayer* scrollableLayer = enclosingScrollableLayer())
2187 scrollableLayer->scrollByRecursively(remainingScrollOffset, clam p); 2184 scrollableLayer->scrollByRecursively(remainingScrollOffset, clam p);
2188 2185
2189 Frame* frame = renderer()->frame(); 2186 Frame* frame = renderer()->frame();
2190 if (frame && frame->page()) 2187 if (frame && frame->page())
2191 frame->page()->updateAutoscrollRenderer(); 2188 frame->page()->updateAutoscrollRenderer();
2192 } 2189 }
2193 } else if (renderer()->view()->frameView()) { 2190 } else if (renderer()->view()->frameView()) {
2194 // If we are here, we were called on a renderer that can be programmatic ally scrolled, but doesn't 2191 // If we are here, we were called on a renderer that can be programmatic ally scrolled, but doesn't
2195 // have an overflow clip. Which means that it is a document node that ca n be scrolled. 2192 // have an overflow clip. Which means that it is a document node that ca n be scrolled.
2196 renderer()->view()->frameView()->scrollBy(delta); 2193 renderer()->view()->frameView()->scrollBy(delta);
2197 2194
2198 // FIXME: If we didn't scroll the whole way, do we want to try looking a t the frames ownerElement? 2195 // FIXME: If we didn't scroll the whole way, do we want to try looking a t the frames ownerElement?
2199 // https://bugs.webkit.org/show_bug.cgi?id=28237 2196 // https://bugs.webkit.org/show_bug.cgi?id=28237
2200 } 2197 }
2201 } 2198 }
2202 2199
2203 IntSize RenderLayer::clampScrollOffset(const IntSize& scrollOffset) const
2204 {
2205 RenderBox* box = renderBox();
2206 ASSERT(box);
2207
2208 int maxX = scrollWidth() - box->pixelSnappedClientWidth();
2209 int maxY = scrollHeight() - box->pixelSnappedClientHeight();
2210
2211 int x = max(min(scrollOffset.width(), maxX), 0);
2212 int y = max(min(scrollOffset.height(), maxY), 0);
2213 return IntSize(x, y);
2214 }
2215
2216 void RenderLayer::scrollToOffset(const IntSize& scrollOffset, ScrollOffsetClampi ng clamp) 2200 void RenderLayer::scrollToOffset(const IntSize& scrollOffset, ScrollOffsetClampi ng clamp)
2217 { 2201 {
2218 IntSize newScrollOffset = clamp == ScrollOffsetClamped ? clampScrollOffset(s crollOffset) : scrollOffset; 2202 m_scrollableArea->scrollToOffset(scrollOffset, clamp);
2219 if (newScrollOffset != adjustedScrollOffset())
2220 m_scrollableArea->scrollToOffsetWithoutAnimation(-scrollOrigin() + newSc rollOffset);
2221 }
2222
2223 void RenderLayer::setScrollOffset(const IntPoint& newScrollOffset)
2224 {
2225 RenderBox* box = renderBox();
2226 if (!box)
2227 return;
2228
2229 if (!box->isMarquee()) {
2230 // Ensure that the dimensions will be computed if they need to be (for o verflow:hidden blocks).
2231 if (m_scrollDimensionsDirty)
2232 computeScrollDimensions();
2233 }
2234
2235 if (m_scrollableArea->scrollOffset() == toIntSize(newScrollOffset))
2236 return;
2237 m_scrollableArea->setScrollOffset(toIntSize(newScrollOffset));
2238
2239 Frame* frame = renderer()->frame();
2240 InspectorInstrumentation::willScrollLayer(renderer());
2241
2242 RenderView* view = renderer()->view();
2243
2244 // We should have a RenderView if we're trying to scroll.
2245 ASSERT(view);
2246
2247 // Update the positions of our child layers (if needed as only fixed layers should be impacted by a scroll).
2248 // We don't update compositing layers, because we need to do a deep update f rom the compositing ancestor.
2249 bool inLayout = view ? view->frameView()->isInLayout() : false;
2250 if (!inLayout) {
2251 // If we're in the middle of layout, we'll just update layers once layou t has finished.
2252 updateLayerPositionsAfterOverflowScroll();
2253 if (view) {
2254 // Update regions, scrolling may change the clip of a particular reg ion.
2255 view->frameView()->updateAnnotatedRegions();
2256 view->updateWidgetPositions();
2257 }
2258
2259 updateCompositingLayersAfterScroll();
2260 }
2261
2262 RenderLayerModelObject* repaintContainer = renderer()->containerForRepaint() ;
2263 if (frame) {
2264 // The caret rect needs to be invalidated after scrolling
2265 frame->selection().setCaretRectNeedsUpdate();
2266
2267 FloatQuad quadForFakeMouseMoveEvent = FloatQuad(m_repaintRect);
2268 if (repaintContainer)
2269 quadForFakeMouseMoveEvent = repaintContainer->localToAbsoluteQuad(qu adForFakeMouseMoveEvent);
2270 frame->eventHandler()->dispatchFakeMouseMoveEventSoonInQuad(quadForFakeM ouseMoveEvent);
2271 }
2272
2273 bool requiresRepaint = true;
2274
2275 if (compositor()->inCompositingMode() && usesCompositedScrolling())
2276 requiresRepaint = false;
2277
2278 // Just schedule a full repaint of our object.
2279 if (view && requiresRepaint)
2280 renderer()->repaintUsingContainer(repaintContainer, pixelSnappedIntRect( m_repaintRect));
2281
2282 // Schedule the scroll DOM event.
2283 if (renderer()->node())
2284 renderer()->node()->document().eventQueue()->enqueueOrDispatchScrollEven t(renderer()->node(), DocumentEventQueue::ScrollEventElementTarget);
2285
2286 InspectorInstrumentation::didScrollLayer(renderer());
2287 } 2203 }
2288 2204
2289 static inline bool frameElementAndViewPermitScroll(HTMLFrameElementBase* frameEl ementBase, FrameView* frameView) 2205 static inline bool frameElementAndViewPermitScroll(HTMLFrameElementBase* frameEl ementBase, FrameView* frameView)
2290 { 2206 {
2291 // If scrollbars aren't explicitly forbidden, permit scrolling. 2207 // If scrollbars aren't explicitly forbidden, permit scrolling.
2292 if (frameElementBase && frameElementBase->scrollingMode() != ScrollbarAlways Off) 2208 if (frameElementBase && frameElementBase->scrollingMode() != ScrollbarAlways Off)
2293 return true; 2209 return true;
2294 2210
2295 // If scrollbars are forbidden, user initiated scrolls should obviously be i gnored. 2211 // If scrollbars are forbidden, user initiated scrolls should obviously be i gnored.
2296 if (frameView->wasScrolledByUser()) 2212 if (frameView->wasScrolledByUser())
(...skipping 26 matching lines...) Expand all
2323 2239
2324 if (renderer()->hasOverflowClip() && !restrictedByLineClamp) { 2240 if (renderer()->hasOverflowClip() && !restrictedByLineClamp) {
2325 // Don't scroll to reveal an overflow layer that is restricted by the -w ebkit-line-clamp property. 2241 // Don't scroll to reveal an overflow layer that is restricted by the -w ebkit-line-clamp property.
2326 // This will prevent us from revealing text hidden by the slider in Safa ri RSS. 2242 // This will prevent us from revealing text hidden by the slider in Safa ri RSS.
2327 RenderBox* box = renderBox(); 2243 RenderBox* box = renderBox();
2328 ASSERT(box); 2244 ASSERT(box);
2329 LayoutRect localExposeRect(box->absoluteToLocalQuad(FloatQuad(FloatRect( rect)), UseTransforms).boundingBox()); 2245 LayoutRect localExposeRect(box->absoluteToLocalQuad(FloatQuad(FloatRect( rect)), UseTransforms).boundingBox());
2330 LayoutRect layerBounds(0, 0, box->clientWidth(), box->clientHeight()); 2246 LayoutRect layerBounds(0, 0, box->clientWidth(), box->clientHeight());
2331 LayoutRect r = getRectToExpose(layerBounds, localExposeRect, alignX, ali gnY); 2247 LayoutRect r = getRectToExpose(layerBounds, localExposeRect, alignX, ali gnY);
2332 2248
2333 IntSize clampedScrollOffset = clampScrollOffset(adjustedScrollOffset() + toIntSize(roundedIntRect(r).location())); 2249 IntSize clampedScrollOffset = m_scrollableArea->clampScrollOffset(adjust edScrollOffset() + toIntSize(roundedIntRect(r).location()));
2334 if (clampedScrollOffset != adjustedScrollOffset()) { 2250 if (clampedScrollOffset != adjustedScrollOffset()) {
2335 IntSize oldScrollOffset = adjustedScrollOffset(); 2251 IntSize oldScrollOffset = adjustedScrollOffset();
2336 scrollToOffset(clampedScrollOffset); 2252 m_scrollableArea->scrollToOffset(clampedScrollOffset);
2337 IntSize scrollOffsetDifference = adjustedScrollOffset() - oldScrollO ffset; 2253 IntSize scrollOffsetDifference = adjustedScrollOffset() - oldScrollO ffset;
2338 localExposeRect.move(-scrollOffsetDifference); 2254 localExposeRect.move(-scrollOffsetDifference);
2339 newRect = LayoutRect(box->localToAbsoluteQuad(FloatQuad(FloatRect(lo calExposeRect)), UseTransforms).boundingBox()); 2255 newRect = LayoutRect(box->localToAbsoluteQuad(FloatQuad(FloatRect(lo calExposeRect)), UseTransforms).boundingBox());
2340 } 2256 }
2341 } else if (!parentLayer && renderer()->isBox() && renderBox()->canBePrograma ticallyScrolled()) { 2257 } else if (!parentLayer && renderer()->isBox() && renderBox()->canBePrograma ticallyScrolled()) {
2342 if (frameView) { 2258 if (frameView) {
2343 Element* ownerElement = renderer()->document().ownerElement(); 2259 Element* ownerElement = renderer()->document().ownerElement();
2344 2260
2345 if (ownerElement && ownerElement->renderer()) { 2261 if (ownerElement && ownerElement->renderer()) {
2346 HTMLFrameElementBase* frameElementBase = 0; 2262 HTMLFrameElementBase* frameElementBase = 0;
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
2569 element->setInlineStyleProperty(CSSPropertyHeight, roundToInt(baseHeight + difference.height()), CSSPrimitiveValue::CSS_PX); 2485 element->setInlineStyleProperty(CSSPropertyHeight, roundToInt(baseHeight + difference.height()), CSSPrimitiveValue::CSS_PX);
2570 } 2486 }
2571 2487
2572 document.updateLayout(); 2488 document.updateLayout();
2573 2489
2574 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to keep the point under the cursor in view. 2490 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to keep the point under the cursor in view.
2575 } 2491 }
2576 2492
2577 int RenderLayer::scrollSize(ScrollbarOrientation orientation) const 2493 int RenderLayer::scrollSize(ScrollbarOrientation orientation) const
2578 { 2494 {
2579 IntSize scrollDimensions = maximumScrollPosition() - minimumScrollPosition() ; 2495 IntSize scrollDimensions = scrollableArea()->maximumScrollPosition() - scrol lableArea()->minimumScrollPosition();
2580 return (orientation == HorizontalScrollbar) ? scrollDimensions.width() : scr ollDimensions.height(); 2496 return (orientation == HorizontalScrollbar) ? scrollDimensions.width() : scr ollDimensions.height();
2581 } 2497 }
2582 2498
2583 IntPoint RenderLayer::minimumScrollPosition() const
2584 {
2585 return -scrollOrigin();
2586 }
2587
2588 IntPoint RenderLayer::maximumScrollPosition() const
2589 {
2590 RenderBox* box = renderBox();
2591 if (!box || !box->hasOverflowClip())
2592 return -scrollOrigin();
2593
2594 return -scrollOrigin() + enclosingIntRect(m_overflowRect).size() - enclosing IntRect(box->clientBoxRect()).size();
2595 }
2596
2597 IntSize RenderLayer::overhangAmount() const 2499 IntSize RenderLayer::overhangAmount() const
2598 { 2500 {
2599 return IntSize(); 2501 return IntSize();
2600 } 2502 }
2601 2503
2602 bool RenderLayer::isActive() const 2504 bool RenderLayer::isActive() const
2603 { 2505 {
2604 Page* page = renderer()->frame()->page(); 2506 Page* page = renderer()->frame()->page();
2605 return page && page->focusController().isActive(); 2507 return page && page->focusController().isActive();
2606 } 2508 }
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2726 RenderView* view = renderer()->view(); 2628 RenderView* view = renderer()->view();
2727 if (!view) 2629 if (!view)
2728 return parentPoint; 2630 return parentPoint;
2729 2631
2730 IntPoint point = view->frameView()->convertToRenderer(renderer(), parentPoin t); 2632 IntPoint point = view->frameView()->convertToRenderer(renderer(), parentPoin t);
2731 2633
2732 point.move(-scrollbarOffset(scrollbar)); 2634 point.move(-scrollbarOffset(scrollbar));
2733 return point; 2635 return point;
2734 } 2636 }
2735 2637
2736 IntSize RenderLayer::contentsSize() const
2737 {
2738 return IntSize(scrollWidth(), scrollHeight());
2739 }
2740
2741 int RenderLayer::visibleHeight() const 2638 int RenderLayer::visibleHeight() const
2742 { 2639 {
2743 return m_layerSize.height(); 2640 return m_layerSize.height();
2744 } 2641 }
2745 2642
2746 int RenderLayer::visibleWidth() const 2643 int RenderLayer::visibleWidth() const
2747 { 2644 {
2748 return m_layerSize.width(); 2645 return m_layerSize.width();
2749 } 2646 }
2750 2647
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
3028 m_scrollCorner->setFrameRect(scrollCorner); 2925 m_scrollCorner->setFrameRect(scrollCorner);
3029 if (m_resizer) 2926 if (m_resizer)
3030 m_resizer->setFrameRect(resizerCornerRect(borderBox, ResizerForPointer)) ; 2927 m_resizer->setFrameRect(resizerCornerRect(borderBox, ResizerForPointer)) ;
3031 2928
3032 if (isComposited()) 2929 if (isComposited())
3033 backing()->positionOverflowControlsLayers(offsetFromRoot); 2930 backing()->positionOverflowControlsLayers(offsetFromRoot);
3034 } 2931 }
3035 2932
3036 int RenderLayer::scrollWidth() const 2933 int RenderLayer::scrollWidth() const
3037 { 2934 {
3038 ASSERT(renderBox()); 2935 return m_scrollableArea->scrollWidth();
3039 if (m_scrollDimensionsDirty)
3040 const_cast<RenderLayer*>(this)->computeScrollDimensions();
3041 return snapSizeToPixel(m_overflowRect.width(), renderBox()->clientLeft() + r enderBox()->x());
3042 } 2936 }
3043 2937
3044 int RenderLayer::scrollHeight() const 2938 int RenderLayer::scrollHeight() const
3045 { 2939 {
3046 ASSERT(renderBox()); 2940 return m_scrollableArea->scrollHeight();
3047 if (m_scrollDimensionsDirty)
3048 const_cast<RenderLayer*>(this)->computeScrollDimensions();
3049 return snapSizeToPixel(m_overflowRect.height(), renderBox()->clientTop() + r enderBox()->y());
3050 }
3051
3052 void RenderLayer::computeScrollDimensions()
3053 {
3054 RenderBox* box = renderBox();
3055 ASSERT(box);
3056
3057 m_scrollDimensionsDirty = false;
3058
3059 m_overflowRect = box->layoutOverflowRect();
3060 box->flipForWritingMode(m_overflowRect);
3061
3062 int scrollableLeftOverflow = m_overflowRect.x() - box->borderLeft();
3063 int scrollableTopOverflow = m_overflowRect.y() - box->borderTop();
3064 m_scrollableArea->setScrollOrigin(IntPoint(-scrollableLeftOverflow, -scrolla bleTopOverflow));
3065 }
3066
3067 bool RenderLayer::hasScrollableHorizontalOverflow() const
3068 {
3069 return hasHorizontalOverflow() && renderBox()->scrollsOverflowX();
3070 }
3071
3072 bool RenderLayer::hasScrollableVerticalOverflow() const
3073 {
3074 return hasVerticalOverflow() && renderBox()->scrollsOverflowY();
3075 }
3076
3077 bool RenderLayer::hasHorizontalOverflow() const
3078 {
3079 ASSERT(!m_scrollDimensionsDirty);
3080
3081 return scrollWidth() > renderBox()->pixelSnappedClientWidth();
3082 }
3083
3084 bool RenderLayer::hasVerticalOverflow() const
3085 {
3086 ASSERT(!m_scrollDimensionsDirty);
3087
3088 return scrollHeight() > renderBox()->pixelSnappedClientHeight();
3089 } 2941 }
3090 2942
3091 void RenderLayer::updateScrollbarsAfterLayout() 2943 void RenderLayer::updateScrollbarsAfterLayout()
3092 { 2944 {
3093 RenderBox* box = renderBox(); 2945 RenderBox* box = renderBox();
3094 ASSERT(box); 2946 ASSERT(box);
3095 2947
3096 // List box parts handle the scrollbars by themselves so we have nothing to do. 2948 // List box parts handle the scrollbars by themselves so we have nothing to do.
3097 if (box->style()->appearance() == ListboxPart) 2949 if (box->style()->appearance() == ListboxPart)
3098 return; 2950 return;
3099 2951
3100 bool hasHorizontalOverflow = this->hasHorizontalOverflow(); 2952 bool hasHorizontalOverflow = m_scrollableArea->hasHorizontalOverflow();
3101 bool hasVerticalOverflow = this->hasVerticalOverflow(); 2953 bool hasVerticalOverflow = m_scrollableArea->hasVerticalOverflow();
3102 2954
3103 // overflow:scroll should just enable/disable. 2955 // overflow:scroll should just enable/disable.
3104 if (renderer()->style()->overflowX() == OSCROLL) 2956 if (renderer()->style()->overflowX() == OSCROLL)
3105 m_hBar->setEnabled(hasHorizontalOverflow); 2957 m_hBar->setEnabled(hasHorizontalOverflow);
3106 if (renderer()->style()->overflowY() == OSCROLL) 2958 if (renderer()->style()->overflowY() == OSCROLL)
3107 m_vBar->setEnabled(hasVerticalOverflow); 2959 m_vBar->setEnabled(hasVerticalOverflow);
3108 2960
3109 // overflow:auto may need to lay out again if scrollbars got added/removed. 2961 // overflow:auto may need to lay out again if scrollbars got added/removed.
3110 bool autoHorizontalScrollBarChanged = box->hasAutoHorizontalScrollbar() && ( hasHorizontalScrollbar() != hasHorizontalOverflow); 2962 bool autoHorizontalScrollBarChanged = box->hasAutoHorizontalScrollbar() && ( hasHorizontalScrollbar() != hasHorizontalOverflow);
3111 bool autoVerticalScrollBarChanged = box->hasAutoVerticalScrollbar() && (hasV erticalScrollbar() != hasVerticalOverflow); 2963 bool autoVerticalScrollBarChanged = box->hasAutoVerticalScrollbar() && (hasV erticalScrollbar() != hasVerticalOverflow);
(...skipping 25 matching lines...) Expand all
3137 } else 2989 } else
3138 renderer()->layout(); 2990 renderer()->layout();
3139 m_inOverflowRelayout = false; 2991 m_inOverflowRelayout = false;
3140 } 2992 }
3141 } 2993 }
3142 } 2994 }
3143 2995
3144 // Set up the range (and page step/line step). 2996 // Set up the range (and page step/line step).
3145 if (m_hBar) { 2997 if (m_hBar) {
3146 int clientWidth = box->pixelSnappedClientWidth(); 2998 int clientWidth = box->pixelSnappedClientWidth();
3147 m_hBar->setProportion(clientWidth, m_overflowRect.width()); 2999 m_hBar->setProportion(clientWidth, m_scrollableArea->overflowRect().widt h());
3148 } 3000 }
3149 if (m_vBar) { 3001 if (m_vBar) {
3150 int clientHeight = box->pixelSnappedClientHeight(); 3002 int clientHeight = box->pixelSnappedClientHeight();
3151 m_vBar->setProportion(clientHeight, m_overflowRect.height()); 3003 m_vBar->setProportion(clientHeight, m_scrollableArea->overflowRect().hei ght());
3152 } 3004 }
3153 3005
3154 updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollableVe rticalOverflow()); 3006 updateScrollableAreaSet(m_scrollableArea->hasScrollableHorizontalOverflow() || m_scrollableArea->hasScrollableVerticalOverflow());
3155 } 3007 }
3156 3008
3157 void RenderLayer::updateScrollInfoAfterLayout() 3009 void RenderLayer::updateScrollInfoAfterLayout()
3158 { 3010 {
3159 RenderBox* box = renderBox(); 3011 RenderBox* box = renderBox();
3160 if (!box) 3012 if (!box)
3161 return; 3013 return;
3162 3014
3163 m_scrollDimensionsDirty = true; 3015 m_scrollableArea->updateAfterLayout();
3164 IntSize originalScrollOffset = adjustedScrollOffset();
3165
3166 computeScrollDimensions();
3167
3168 if (!box->isMarquee()) {
3169 // Layout may cause us to be at an invalid scroll position. In this case we need
3170 // to pull our scroll offsets back to the max (or push them up to the mi n).
3171 IntSize clampedScrollOffset = clampScrollOffset(adjustedScrollOffset());
3172 if (clampedScrollOffset != adjustedScrollOffset())
3173 scrollToOffset(clampedScrollOffset);
3174 }
3175
3176 updateScrollbarsAfterLayout(); 3016 updateScrollbarsAfterLayout();
3177 3017
3178 if (originalScrollOffset != adjustedScrollOffset())
3179 scrollableArea()->scrollToOffsetWithoutAnimation(-scrollOrigin() + adjus tedScrollOffset());
3180
3181 // Composited scrolling may need to be enabled or disabled if the amount of overflow changed. 3018 // Composited scrolling may need to be enabled or disabled if the amount of overflow changed.
3182 if (renderer()->view() && compositor()->updateLayerCompositingState(this)) 3019 if (renderer()->view() && compositor()->updateLayerCompositingState(this))
3183 compositor()->setCompositingLayersNeedRebuild(); 3020 compositor()->setCompositingLayersNeedRebuild();
3184 } 3021 }
3185 3022
3186 bool RenderLayer::overflowControlsIntersectRect(const IntRect& localRect) const 3023 bool RenderLayer::overflowControlsIntersectRect(const IntRect& localRect) const
3187 { 3024 {
3188 const IntRect borderBox = renderBox()->pixelSnappedBorderBoxRect(); 3025 const IntRect borderBox = renderBox()->pixelSnappedBorderBoxRect();
3189 3026
3190 if (rectForHorizontalScrollbar(borderBox).intersects(localRect)) 3027 if (rectForHorizontalScrollbar(borderBox).intersects(localRect))
(...skipping 2798 matching lines...) Expand 10 before | Expand all | Expand 10 after
5989 if (needsHorizontalScrollbar && oldStyle && oldStyle->overflowX() == OSCROLL && overflowX != OSCROLL) { 5826 if (needsHorizontalScrollbar && oldStyle && oldStyle->overflowX() == OSCROLL && overflowX != OSCROLL) {
5990 ASSERT(hasHorizontalScrollbar()); 5827 ASSERT(hasHorizontalScrollbar());
5991 m_hBar->setEnabled(true); 5828 m_hBar->setEnabled(true);
5992 } 5829 }
5993 5830
5994 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL & & overflowY != OSCROLL) { 5831 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL & & overflowY != OSCROLL) {
5995 ASSERT(hasVerticalScrollbar()); 5832 ASSERT(hasVerticalScrollbar());
5996 m_vBar->setEnabled(true); 5833 m_vBar->setEnabled(true);
5997 } 5834 }
5998 5835
5999 if (!m_scrollDimensionsDirty) 5836 m_scrollableArea->updateAfterStyleChange(oldStyle);
6000 updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollab leVerticalOverflow());
6001 } 5837 }
6002 5838
6003 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle) 5839 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle)
6004 { 5840 {
6005 if (oldStyle && (renderer()->style()->position() == oldStyle->position())) 5841 if (oldStyle && (renderer()->style()->position() == oldStyle->position()))
6006 return; 5842 return;
6007 5843
6008 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP osition || oldStyle->position() == FixedPosition); 5844 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP osition || oldStyle->position() == FixedPosition);
6009 bool isOutOfFlowPositioned = renderer()->isOutOfFlowPositioned(); 5845 bool isOutOfFlowPositioned = renderer()->isOutOfFlowPositioned();
6010 if (!wasOutOfFlowPositioned && !isOutOfFlowPositioned) 5846 if (!wasOutOfFlowPositioned && !isOutOfFlowPositioned)
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after
6404 6240
6405 void RenderLayer::addLayerHitTestRects(LayerHitTestRects& rects) const 6241 void RenderLayer::addLayerHitTestRects(LayerHitTestRects& rects) const
6406 { 6242 {
6407 if (!size().isEmpty()) { 6243 if (!size().isEmpty()) {
6408 Vector<LayoutRect> rect; 6244 Vector<LayoutRect> rect;
6409 6245
6410 if (renderBox() && renderBox()->scrollsOverflow()) { 6246 if (renderBox() && renderBox()->scrollsOverflow()) {
6411 // For scrolling layers, rects are taken to be in the space of the c ontents. 6247 // For scrolling layers, rects are taken to be in the space of the c ontents.
6412 // We need to include both the entire contents, and also the boundin g box 6248 // We need to include both the entire contents, and also the boundin g box
6413 // of the layer in the space of it's parent (eg. for border / scroll bars). 6249 // of the layer in the space of it's parent (eg. for border / scroll bars).
6414 rect.append(m_overflowRect); 6250 rect.append(m_scrollableArea->overflowRect());
6415 rects.set(this, rect); 6251 rects.set(this, rect);
6416 if (const RenderLayer* parentLayer = parent()) { 6252 if (const RenderLayer* parentLayer = parent()) {
6417 LayerHitTestRects::iterator iter = rects.find(parentLayer); 6253 LayerHitTestRects::iterator iter = rects.find(parentLayer);
6418 if (iter == rects.end()) 6254 if (iter == rects.end())
6419 iter = rects.add(parentLayer, Vector<LayoutRect>()).iterator ; 6255 iter = rects.add(parentLayer, Vector<LayoutRect>()).iterator ;
6420 iter->value.append(boundingBox(parentLayer)); 6256 iter->value.append(boundingBox(parentLayer));
6421 } 6257 }
6422 } else { 6258 } else {
6423 rect.append(localBoundingBox()); 6259 rect.append(localBoundingBox());
6424 rects.set(this, rect); 6260 rects.set(this, rect);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
6473 } 6309 }
6474 } 6310 }
6475 6311
6476 void showLayerTree(const WebCore::RenderObject* renderer) 6312 void showLayerTree(const WebCore::RenderObject* renderer)
6477 { 6313 {
6478 if (!renderer) 6314 if (!renderer)
6479 return; 6315 return;
6480 showLayerTree(renderer->enclosingLayer()); 6316 showLayerTree(renderer->enclosingLayer());
6481 } 6317 }
6482 #endif 6318 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerScrollableArea.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698