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.
5 #include "content/renderer/webscrollbarbehavior_impl_gtkoraura.h"
7 #include "third_party/WebKit/public/platform/WebPoint.h"
8 #include "third_party/WebKit/public/platform/WebRect.h"
12 bool WebScrollbarBehaviorImpl::shouldCenterOnThumb(
13 blink::WebScrollbarBehavior::Button mouseButton
,
16 #if (defined(OS_LINUX) && !defined(OS_CHROMEOS))
17 if (mouseButton
== blink::WebScrollbarBehavior::ButtonMiddle
)
20 return (mouseButton
== blink::WebScrollbarBehavior::ButtonLeft
) &&
24 bool WebScrollbarBehaviorImpl::shouldSnapBackToDragOrigin(
25 const blink::WebPoint
& eventPoint
,
26 const blink::WebRect
& scrollbarRect
,
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 static const int kDefaultWinScrollbarThickness
= 17;
36 // Find the rect within which we shouldn't snap, by expanding the track rect
37 // in both dimensions.
38 gfx::Rect
noSnapRect(scrollbarRect
);
39 int thickness
= isHorizontal
? noSnapRect
.height() : noSnapRect
.width();
40 // Even if the platform's scrollbar is narrower than the default Windows one,
41 // we still want to provide at least as much slop area, since a slightly
42 // narrower scrollbar doesn't necessarily imply that users will drag
44 thickness
= std::max(thickness
, kDefaultWinScrollbarThickness
);
46 (isHorizontal
? kOffEndMultiplier
: kOffSideMultiplier
) * -thickness
,
47 (isHorizontal
? kOffSideMultiplier
: kOffEndMultiplier
) * -thickness
);
49 // On most platforms, we should snap iff the event is outside our calculated
50 // rect. On Linux, however, we should not snap for events off the ends, but
51 // not the sides, of the rect.
52 #if (defined(OS_LINUX) && !defined(OS_CHROMEOS))
54 (eventPoint
.y
< noSnapRect
.y() || eventPoint
.y
>= noSnapRect
.bottom()) :
55 (eventPoint
.x
< noSnapRect
.x() || eventPoint
.x
>= noSnapRect
.right());
57 return !noSnapRect
.Contains(eventPoint
);
61 } // namespace content