blob: 6b2b509ed9c035f66bbd09e799c26a0546841b1a [file] [log] [blame]
/*
* Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCROLL_SCROLL_TYPES_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCROLL_SCROLL_TYPES_H_
#include "third_party/blink/public/platform/web_gesture_event.h"
#include "third_party/blink/renderer/platform/geometry/float_point.h"
#include "third_party/blink/renderer/platform/wtf/assertions.h"
namespace blink {
// A ScrollOffset represents an offset from the scroll origin of a
// ScrollableArea. Note that "scroll origin" is not the same as the layout
// concept of "location", nor is it necessarily coincident with the top/left of
// the ScrollableArea's overflow rect. See core/layout/README.md for more
// information.
typedef FloatSize ScrollOffset;
inline ScrollOffset ToScrollOffset(const FloatPoint& p) {
return ScrollOffset(p.X(), p.Y());
}
// Platform overlay scrollbars are controlled and painted by the operating
// system (e.g., OSX and Android). CSS overlay scrollbars are created by
// setting overflow:overlay, and they are painted by chromium.
enum OverlayScrollbarClipBehavior {
kIgnorePlatformOverlayScrollbarSize,
kIgnorePlatformAndCSSOverlayScrollbarSize,
kExcludeOverlayScrollbarSizeForHitTesting
};
enum ScrollDirection {
kScrollUpIgnoringWritingMode,
kScrollDownIgnoringWritingMode,
kScrollLeftIgnoringWritingMode,
kScrollRightIgnoringWritingMode,
kScrollBlockDirectionBackward,
kScrollBlockDirectionForward,
kScrollInlineDirectionBackward,
kScrollInlineDirectionForward
};
enum ScrollDirectionPhysical {
kScrollUp,
kScrollDown,
kScrollLeft,
kScrollRight
};
enum ScrollType {
kUserScroll,
kProgrammaticScroll,
kClampingScroll,
kCompositorScroll,
kAnchoringScroll,
// These are programmatic sequenced scrolls from SmoothScrollSequencer.
// SetScrollOffset called with kSequencedScroll should not abort the smooth
// scroll sequence.
kSequencedScroll
};
// An explicit scroll is one that was requested by the user or the webpage.
// An implicit scroll is a side effect of a layout change.
inline bool IsExplicitScrollType(ScrollType scroll_type) {
return scroll_type == kUserScroll || scroll_type == kProgrammaticScroll ||
scroll_type == kCompositorScroll || scroll_type == kSequencedScroll;
}
// Convert logical scroll direction to physical. Physical scroll directions are
// unaffected.
inline ScrollDirectionPhysical ToPhysicalDirection(ScrollDirection direction,
bool is_vertical,
bool is_flipped) {
switch (direction) {
case kScrollBlockDirectionBackward: {
if (is_vertical) {
if (!is_flipped)
return kScrollUp;
return kScrollDown;
}
if (!is_flipped)
return kScrollLeft;
return kScrollRight;
}
case kScrollBlockDirectionForward: {
if (is_vertical) {
if (!is_flipped)
return kScrollDown;
return kScrollUp;
}
if (!is_flipped)
return kScrollRight;
return kScrollLeft;
}
case kScrollInlineDirectionBackward: {
if (is_vertical) {
if (!is_flipped)
return kScrollLeft;
return kScrollRight;
}
if (!is_flipped)
return kScrollUp;
return kScrollDown;
}
case kScrollInlineDirectionForward: {
if (is_vertical) {
if (!is_flipped)
return kScrollRight;
return kScrollLeft;
}
if (!is_flipped)
return kScrollDown;
return kScrollUp;
}
// Direction is already physical
case kScrollUpIgnoringWritingMode:
return kScrollUp;
case kScrollDownIgnoringWritingMode:
return kScrollDown;
case kScrollLeftIgnoringWritingMode:
return kScrollLeft;
case kScrollRightIgnoringWritingMode:
return kScrollRight;
default:
NOTREACHED();
break;
}
return kScrollUp;
}
inline ScrollDirection ToScrollDirection(ScrollDirectionPhysical direction) {
switch (direction) {
case kScrollUp:
return kScrollUpIgnoringWritingMode;
case kScrollDown:
return kScrollDownIgnoringWritingMode;
case kScrollLeft:
return kScrollLeftIgnoringWritingMode;
case kScrollRight:
return kScrollRightIgnoringWritingMode;
default:
NOTREACHED();
break;
}
return kScrollUpIgnoringWritingMode;
}
enum ScrollGranularity {
kScrollByLine,
kScrollByPage,
kScrollByDocument,
kScrollByPixel,
kScrollByPrecisePixel
};
enum ScrollInertialPhase {
kScrollInertialPhaseUnknown,
kScrollInertialPhaseNonMomentum,
kScrollInertialPhaseMomentum
};
enum ScrollbarOrientation { kHorizontalScrollbar, kVerticalScrollbar };
enum ScrollOrientation { kHorizontalScroll, kVerticalScroll };
enum ScrollbarMode { kScrollbarAuto, kScrollbarAlwaysOff, kScrollbarAlwaysOn };
enum ScrollbarControlSize { kRegularScrollbar, kSmallScrollbar };
typedef unsigned ScrollbarControlState;
enum ScrollbarControlStateMask {
kActiveScrollbarState = 1,
kEnabledScrollbarState = 1 << 1,
kPressedScrollbarState = 1 << 2
};
enum ScrollbarPart {
kNoPart = 0,
kBackButtonStartPart = 1,
kForwardButtonStartPart = 1 << 1,
kBackTrackPart = 1 << 2,
kThumbPart = 1 << 3,
kForwardTrackPart = 1 << 4,
kBackButtonEndPart = 1 << 5,
kForwardButtonEndPart = 1 << 6,
kScrollbarBGPart = 1 << 7,
kTrackBGPart = 1 << 8,
kAllParts = 0xffffffff
};
enum ScrollbarOverlayColorTheme {
kScrollbarOverlayColorThemeDark,
kScrollbarOverlayColorThemeLight
};
enum ScrollBehavior {
kScrollBehaviorAuto,
kScrollBehaviorInstant,
kScrollBehaviorSmooth,
};
// The result of an attempt to scroll. If didScroll is true, then
// unusedScrollDelta gives the amount of the scroll delta that was not consumed
// by scrolling.
struct ScrollResult {
STACK_ALLOCATED();
explicit ScrollResult()
: did_scroll_x(false),
did_scroll_y(false),
unused_scroll_delta_x(0),
unused_scroll_delta_y(0) {}
ScrollResult(bool did_scroll_x,
bool did_scroll_y,
float unused_scroll_delta_x,
float unused_scroll_delta_y)
: did_scroll_x(did_scroll_x),
did_scroll_y(did_scroll_y),
unused_scroll_delta_x(unused_scroll_delta_x),
unused_scroll_delta_y(unused_scroll_delta_y) {}
bool DidScroll() { return did_scroll_x || did_scroll_y; }
bool did_scroll_x;
bool did_scroll_y;
// In pixels.
float unused_scroll_delta_x;
float unused_scroll_delta_y;
};
inline ScrollOffset ToScrollDelta(ScrollbarOrientation orientation,
float delta) {
return orientation == kHorizontalScrollbar ? ScrollOffset(delta, 0.0f)
: ScrollOffset(0.0f, delta);
}
inline ScrollOffset ToScrollDelta(ScrollDirectionPhysical dir, float delta) {
if (dir == kScrollUp || dir == kScrollLeft)
delta = -delta;
return (dir == kScrollLeft || dir == kScrollRight) ? ScrollOffset(delta, 0)
: ScrollOffset(0, delta);
}
inline ScrollGranularity ToPlatformScrollGranularity(
WebGestureEvent::ScrollUnits units) {
switch (units) {
case WebGestureEvent::ScrollUnits::kPrecisePixels:
return ScrollGranularity::kScrollByPrecisePixel;
case WebGestureEvent::ScrollUnits::kPixels:
return ScrollGranularity::kScrollByPixel;
case WebGestureEvent::ScrollUnits::kPage:
return ScrollGranularity::kScrollByPage;
default:
NOTREACHED();
return ScrollGranularity::kScrollByPrecisePixel;
}
}
typedef unsigned ScrollbarControlPartMask;
} // namespace blink
#endif