1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INPUT_GESTURE_MANAGER_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_INPUT_GESTURE_MANAGER_H_
#include "third_party/blink/public/common/input/pointer_id.h"
#include "third_party/blink/public/platform/web_input_event_result.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/layout/hit_test_request.h"
#include "third_party/blink/renderer/core/page/event_with_hit_test_results.h"
#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
#include "third_party/blink/renderer/platform/wtf/deque.h"
namespace gfx {
class Point;
}
namespace blink {
class LocalFrame;
class ScrollManager;
class SelectionController;
class PointerEventManager;
class MouseEventManager;
// This class takes care of gestures and delegating the action based on the
// gesture to the responsible class.
class CORE_EXPORT GestureManager final
: public GarbageCollected<GestureManager> {
public:
GestureManager(LocalFrame&,
ScrollManager&,
MouseEventManager&,
PointerEventManager&,
SelectionController&);
GestureManager(const GestureManager&) = delete;
GestureManager& operator=(const GestureManager&) = delete;
void Trace(Visitor*) const;
void Clear();
void ResetLongTapContextMenuStates();
HitTestRequest::HitTestRequestType GetHitTypeForGestureType(
WebInputEvent::Type);
WebInputEventResult HandleGestureEventInFrame(
const GestureEventWithHitTestResults&);
bool GestureContextMenuDeferred() const;
// Dispatches contextmenu event for drag-ends that haven't really dragged
// except for a few pixels.
//
// The reason for handling this in GestureManager is the similarity of the
// interaction with long taps. When a drag ends without a drag offset, it is
// effectively a long tap but with one difference: there is no gesture long
// tap event. This is because the drag controller interrupts current gesture
// sequence (cancelling the gesture) at the moment a drag begins, and the
// gesture recognizer does not know if the drag has ended at the originating
// position.
void SendContextMenuEventTouchDragEnd(const WebMouseEvent&);
private:
WebInputEventResult HandleGestureShowPress();
WebInputEventResult HandleGestureTapDown(
const GestureEventWithHitTestResults&);
WebInputEventResult HandleGestureTap(const GestureEventWithHitTestResults&);
WebInputEventResult HandleGestureShortPress(
const GestureEventWithHitTestResults&);
WebInputEventResult HandleGestureLongPress(
const GestureEventWithHitTestResults&);
WebInputEventResult HandleGestureLongTap(
const GestureEventWithHitTestResults&);
WebInputEventResult HandleGestureTwoFingerTap(
const GestureEventWithHitTestResults&);
WebInputEventResult SendContextMenuEventForGesture(
const GestureEventWithHitTestResults&);
// Shows the Unhandled Tap UI if needed.
void ShowUnhandledTapUIIfNeeded(
bool dom_tree_changed,
bool style_changed,
Node* tapped_node,
const gfx::Point& tapped_position_in_viewport);
// Returns the pointerId associated with the pointerevent sequence
// generated by the gesture sequence of which gesture_event
// is part of or PointerEventFactory::kInvalidId in case there is no
// pointerId associated. This method expects that gesture_event is the
// most recently handled WebGestureEvent.
PointerId GetPointerIdFromWebGestureEvent(
const WebGestureEvent& gesture_event) const;
// NOTE: If adding a new field to this class please ensure that it is
// cleared if needed in |GestureManager::clear()|.
const Member<LocalFrame> frame_;
Member<ScrollManager> scroll_manager_;
Member<MouseEventManager> mouse_event_manager_;
Member<PointerEventManager> pointer_event_manager_;
// Set on GestureTapDown if the |pointerdown| event corresponding to the
// triggering |touchstart| event was canceled. This suppresses mouse event
// firing for the current gesture sequence (i.e. until next GestureTapDown).
bool suppress_mouse_events_from_gestures_;
// Set on GestureTap if the default mouse down behaviour was suppressed. When
// this happens, we also suppress the default selection behaviour of the
// subsequent GestureTapDown if it occurs in the same gesture sequence.
bool suppress_selection_on_repeated_tap_down_ = true;
bool gesture_context_menu_deferred_;
gfx::PointF long_press_position_in_root_frame_;
bool drag_in_progress_;
const Member<SelectionController> selection_controller_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_INPUT_GESTURE_MANAGER_H_
|