File: cursor_manager.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (93 lines) | stat: -rw-r--r-- 3,573 bytes parent folder | download | duplicates (9)
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
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_INPUT_CURSOR_MANAGER_H_
#define COMPONENTS_INPUT_CURSOR_MANAGER_H_

#include <map>
#include <vector>

#include "base/functional/callback_helpers.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/component_export.h"
#include "ui/base/cursor/cursor.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"

namespace input {

class RenderWidgetHostViewInput;

// CursorManager coordinates mouse cursors for multiple RenderWidgetHostViews
// on a single page. It is owned by the top-level RenderWidgetHostView and
// calls back to its DisplayCursor method when the cursor needs to change,
// either because the mouse moved over a different view or because a cursor
// update was received for the current view.
class COMPONENT_EXPORT(INPUT) CursorManager {
 public:
  explicit CursorManager(RenderWidgetHostViewInput* root);
  ~CursorManager();

  // Called for any RenderWidgetHostView that received an UpdateCursor message
  // from its renderer process.
  void UpdateCursor(RenderWidgetHostViewInput*, const ui::Cursor&);

  // Called when the mouse moves over a different RenderWidgetHostView.
  void UpdateViewUnderCursor(RenderWidgetHostViewInput*);

  // Notification of a RenderWidgetHostView being destroyed, so that its
  // cursor map entry can be removed if it has one. If it is the current
  // view_under_cursor_, then the root_view_'s cursor will be displayed.
  void ViewBeingDestroyed(RenderWidgetHostViewInput*);

  // Called by any RenderWidgetHostView before updating the tooltip text to
  // validate that the tooltip text being updated is for the view under the
  // cursor. This is only used for cursor triggered tooltips.
  bool IsViewUnderCursor(RenderWidgetHostViewInput*) const;

  // Disallows custom cursors whose height or width are larger or equal to
  // `max_dimension` DIPs.
  [[nodiscard]] base::ScopedClosureRunner CreateDisallowCustomCursorScope(
      int max_dimension_dips);

  // Accessor for browser tests, enabling verification of the cursor_map_.
  // Returns false if the provided View is not in the map, and outputs
  // the cursor otherwise.
  bool GetCursorForTesting(RenderWidgetHostViewInput*, ui::Cursor&);

  ui::mojom::CursorType GetLastSetCursorTypeForTesting() {
    return last_set_cursor_type_for_testing_;
  }

 private:
  bool IsCursorAllowed(const ui::Cursor&) const;
  void DisallowCustomCursorScopeExpired(int max_dimension_dips);
  void UpdateCursor();

  // Stores the last received cursor from each RenderWidgetHostView.
  std::map<RenderWidgetHostViewInput*, ui::Cursor> cursor_map_;

  // The view currently underneath the cursor, which corresponds to the cursor
  // currently displayed.
  // TODO(crbug.com/324115585): Fix FlakyDanglingUntriaged.
  raw_ptr<RenderWidgetHostViewInput, FlakyDanglingUntriaged>
      view_under_cursor_;

  // The root view is the target for DisplayCursor calls whenever the active
  // cursor needs to change.
  const raw_ptr<RenderWidgetHostViewInput> root_view_;

  // Restrictions on the maximum dimension (either width or height) imposed
  // on custom cursors.
  // Restrictions can be created by `CreateDisallowCustomCursorScope`.
  std::vector<int> dimension_restrictions_;

  ui::mojom::CursorType last_set_cursor_type_for_testing_;

  base::WeakPtrFactory<CursorManager> weak_factory_{this};
};

}  // namespace input

#endif  // COMPONENTS_INPUT_CURSOR_MANAGER_H_