1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/renderer/webscrollbarbehavior_impl_gtkoraura.h" 6 7 #include "third_party/WebKit/public/platform/WebPoint.h" 8 #include "third_party/WebKit/public/platform/WebRect.h" 9 10 namespace content { 11 12 bool WebScrollbarBehaviorImpl::shouldCenterOnThumb( 13 blink::WebScrollbarBehavior::Button mouseButton, 14 bool shiftKeyPressed, 15 bool altKeyPressed) { 16 #if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) 17 if (mouseButton == blink::WebScrollbarBehavior::ButtonMiddle) 18 return true; 19 #endif 20 return (mouseButton == blink::WebScrollbarBehavior::ButtonLeft) && 21 shiftKeyPressed; 22 } 23 24 bool WebScrollbarBehaviorImpl::shouldSnapBackToDragOrigin( 25 const blink::WebPoint& eventPoint, 26 const blink::WebRect& scrollbarRect, 27 bool isHorizontal) { 28 // Constants used to figure the drag rect outside which we should snap the 29 // scrollbar thumb back to its origin. These calculations are based on 30 // observing the behavior of the MSVC8 main window scrollbar + some 31 // guessing/extrapolation. 32 static const int kOffEndMultiplier = 3; 33 static const int kOffSideMultiplier = 8; 34 35 // Find the rect within which we shouldn't snap, by expanding the track rect 36 // in both dimensions. 37 gfx::Rect noSnapRect(scrollbarRect); 38 const int thickness = isHorizontal ? noSnapRect.height() : noSnapRect.width(); 39 noSnapRect.Inset( 40 (isHorizontal ? kOffEndMultiplier : kOffSideMultiplier) * -thickness, 41 (isHorizontal ? kOffSideMultiplier : kOffEndMultiplier) * -thickness); 42 43 // We should snap iff the event is outside our calculated rect. 44 return !noSnapRect.Contains(eventPoint); 45 } 46 47 } // namespace content 48