// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/renderer/webscrollbarbehavior_impl_gtkoraura.h" #include "third_party/WebKit/public/platform/WebPoint.h" #include "third_party/WebKit/public/platform/WebRect.h" namespace content { bool WebScrollbarBehaviorImpl::shouldCenterOnThumb( blink::WebScrollbarBehavior::Button mouseButton, bool shiftKeyPressed, bool altKeyPressed) { #if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) if (mouseButton == blink::WebScrollbarBehavior::ButtonMiddle) return true; #endif return (mouseButton == blink::WebScrollbarBehavior::ButtonLeft) && shiftKeyPressed; } bool WebScrollbarBehaviorImpl::shouldSnapBackToDragOrigin( const blink::WebPoint& eventPoint, const blink::WebRect& scrollbarRect, bool isHorizontal) { // Constants used to figure the drag rect outside which we should snap the // scrollbar thumb back to its origin. These calculations are based on // observing the behavior of the MSVC8 main window scrollbar + some // guessing/extrapolation. static const int kOffEndMultiplier = 3; static const int kOffSideMultiplier = 8; static const int kDefaultWinScrollbarThickness = 17; // Find the rect within which we shouldn't snap, by expanding the track rect // in both dimensions. gfx::Rect noSnapRect(scrollbarRect); int thickness = isHorizontal ? noSnapRect.height() : noSnapRect.width(); // Even if the platform's scrollbar is narrower than the default Windows one, // we still want to provide at least as much slop area, since a slightly // narrower scrollbar doesn't necessarily imply that users will drag // straighter. thickness = std::max(thickness, kDefaultWinScrollbarThickness); noSnapRect.Inset( (isHorizontal ? kOffEndMultiplier : kOffSideMultiplier) * -thickness, (isHorizontal ? kOffSideMultiplier : kOffEndMultiplier) * -thickness); // On most platforms, we should snap iff the event is outside our calculated // rect. On Linux, however, we should not snap for events off the ends, but // not the sides, of the rect. #if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) return isHorizontal ? (eventPoint.y < noSnapRect.y() || eventPoint.y >= noSnapRect.bottom()) : (eventPoint.x < noSnapRect.x() || eventPoint.x >= noSnapRect.right()); #else return !noSnapRect.Contains(eventPoint); #endif } } // namespace content