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

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

Issue 14767007: A div can be pan-scrolled beyond its overflow (Windows only) (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: WIP, not for review Created 7 years, 7 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
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 2136 matching lines...) Expand 10 before | Expand all | Expand 10 after
2147 if (abs(delta.width()) <= ScrollView::noPanScrollRadius) // at the center we let the space for the icon 2147 if (abs(delta.width()) <= ScrollView::noPanScrollRadius) // at the center we let the space for the icon
2148 delta.setWidth(0); 2148 delta.setWidth(0);
2149 if (abs(delta.height()) <= ScrollView::noPanScrollRadius) 2149 if (abs(delta.height()) <= ScrollView::noPanScrollRadius)
2150 delta.setHeight(0); 2150 delta.setHeight(0);
2151 2151
2152 scrollByRecursively(adjustedScrollDelta(delta), ScrollOffsetClamped); 2152 scrollByRecursively(adjustedScrollDelta(delta), ScrollOffsetClamped);
2153 } 2153 }
2154 2154
2155 void RenderLayer::scrollByRecursively(const IntSize& delta, ScrollOffsetClamping clamp) 2155 void RenderLayer::scrollByRecursively(const IntSize& delta, ScrollOffsetClamping clamp)
2156 { 2156 {
2157 scrollBy(delta, clamp, ShouldPropagateScroll);
2158 }
2159
2160 bool RenderLayer::scrollBy(const IntSize& delta, ScrollOffsetClamping clamp, Scr ollPropagation shouldPropagate)
2161 {
2157 if (delta.isZero()) 2162 if (delta.isZero())
2158 return; 2163 return false;
2159 2164
2160 bool restrictedByLineClamp = false; 2165 bool restrictedByLineClamp = false;
2161 if (renderer()->parent()) 2166 if (renderer()->parent())
2162 restrictedByLineClamp = !renderer()->parent()->style()->lineClamp().isNo ne(); 2167 restrictedByLineClamp = !renderer()->parent()->style()->lineClamp().isNo ne();
2163 2168
2164 if (renderer()->hasOverflowClip() && !restrictedByLineClamp) { 2169 if (renderer()->hasOverflowClip() && !restrictedByLineClamp) {
2165 IntSize newScrollOffset = adjustedScrollOffset() + delta; 2170 IntSize newScrollOffset = adjustedScrollOffset() + delta;
2166 scrollToOffset(newScrollOffset, clamp); 2171 scrollToOffset(newScrollOffset, clamp);
2167 2172
2173 if (shouldPropagate == DontPropagateScroll)
2174 return true;
2175
2168 // If this layer can't do the scroll we ask the next layer up that can s croll to try 2176 // If this layer can't do the scroll we ask the next layer up that can s croll to try
2169 IntSize remainingScrollOffset = newScrollOffset - adjustedScrollOffset() ; 2177 IntSize remainingScrollOffset = newScrollOffset - adjustedScrollOffset() ;
2178 bool didScroll = true;
2170 if (!remainingScrollOffset.isZero() && renderer()->parent()) { 2179 if (!remainingScrollOffset.isZero() && renderer()->parent()) {
2171 if (RenderLayer* scrollableLayer = enclosingScrollableLayer()) 2180 if (RenderLayer* scrollableLayer = enclosingScrollableLayer())
2172 scrollableLayer->scrollByRecursively(remainingScrollOffset); 2181 didScroll = scrollableLayer->scrollBy(remainingScrollOffset, cla mp, shouldPropagate);
2173 2182
2174 Frame* frame = renderer()->frame(); 2183 Frame* frame = renderer()->frame();
2175 if (frame) 2184 if (frame)
2176 frame->eventHandler()->updateAutoscrollRenderer(); 2185 frame->eventHandler()->updateAutoscrollRenderer();
2177 } 2186 }
2187 return didScroll;
2178 } else if (renderer()->view()->frameView()) { 2188 } else if (renderer()->view()->frameView()) {
2179 // If we are here, we were called on a renderer that can be programmatic ally scrolled, but doesn't 2189 // If we are here, we were called on a renderer that can be programmatic ally scrolled, but doesn't
2180 // have an overflow clip. Which means that it is a document node that ca n be scrolled. 2190 // have an overflow clip. Which means that it is a document node that ca n be scrolled.
2181 renderer()->view()->frameView()->scrollBy(delta); 2191 FrameView* view = renderer()->view()->frameView();
2192 IntPoint scrollPositionBefore = view->scrollPosition();
2193 if (view->isScrollable())
2194 view->scrollBy(delta);
2195 IntPoint scrollPositionAfter = view->scrollPosition();
2196 return scrollPositionBefore != scrollPositionAfter;
2182 2197
2183 // FIXME: If we didn't scroll the whole way, do we want to try looking a t the frames ownerElement? 2198 // FIXME: If we didn't scroll the whole way, do we want to try looking a t the frames ownerElement?
2184 // https://bugs.webkit.org/show_bug.cgi?id=28237 2199 // https://bugs.webkit.org/show_bug.cgi?id=28237
2185 } 2200 }
2201
2202 return false;
2186 } 2203 }
2187 2204
2188 IntSize RenderLayer::clampScrollOffset(const IntSize& scrollOffset) const 2205 IntSize RenderLayer::clampScrollOffset(const IntSize& scrollOffset) const
2189 { 2206 {
2190 RenderBox* box = renderBox(); 2207 RenderBox* box = renderBox();
2191 ASSERT(box); 2208 ASSERT(box);
2192 2209
2193 int maxX = scrollWidth() - box->pixelSnappedClientWidth(); 2210 int maxX = scrollWidth() - box->pixelSnappedClientWidth();
2194 int maxY = scrollHeight() - box->pixelSnappedClientHeight(); 2211 int maxY = scrollHeight() - box->pixelSnappedClientHeight();
2195 2212
(...skipping 4292 matching lines...) Expand 10 before | Expand all | Expand 10 after
6488 } 6505 }
6489 } 6506 }
6490 6507
6491 void showLayerTree(const WebCore::RenderObject* renderer) 6508 void showLayerTree(const WebCore::RenderObject* renderer)
6492 { 6509 {
6493 if (!renderer) 6510 if (!renderer)
6494 return; 6511 return;
6495 showLayerTree(renderer->enclosingLayer()); 6512 showLayerTree(renderer->enclosingLayer());
6496 } 6513 }
6497 #endif 6514 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698