• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
shouldCenterOnThumb(blink::WebScrollbarBehavior::Button mouseButton,bool shiftKeyPressed,bool altKeyPressed)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 
shouldSnapBackToDragOrigin(const blink::WebPoint & eventPoint,const blink::WebRect & scrollbarRect,bool isHorizontal)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   static const int kDefaultWinScrollbarThickness = 17;
35 
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
43   // straighter.
44   thickness = std::max(thickness, kDefaultWinScrollbarThickness);
45   noSnapRect.Inset(
46       (isHorizontal ? kOffEndMultiplier : kOffSideMultiplier) * -thickness,
47       (isHorizontal ? kOffSideMultiplier : kOffEndMultiplier) * -thickness);
48 
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))
53   return isHorizontal ?
54       (eventPoint.y < noSnapRect.y() || eventPoint.y >= noSnapRect.bottom()) :
55       (eventPoint.x < noSnapRect.x() || eventPoint.x >= noSnapRect.right());
56 #else
57   return !noSnapRect.Contains(eventPoint);
58 #endif
59 }
60 
61 }  // namespace content
62