File: exclusive_access_bubble_views.h

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (136 lines) | stat: -rw-r--r-- 4,766 bytes parent folder | download
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
124
125
126
127
128
129
130
131
132
133
134
135
136
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_UI_VIEWS_EXCLUSIVE_ACCESS_BUBBLE_VIEWS_H_
#define CHROME_BROWSER_UI_VIEWS_EXCLUSIVE_ACCESS_BUBBLE_VIEWS_H_

#include <memory>

#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ui/exclusive_access/exclusive_access_bubble.h"
#include "chrome/browser/ui/exclusive_access/exclusive_access_bubble_hide_callback.h"
#include "chrome/browser/ui/exclusive_access/fullscreen_controller.h"
#include "chrome/browser/ui/exclusive_access/fullscreen_observer.h"
#include "ui/views/widget/widget_observer.h"

class ExclusiveAccessBubbleViewsContext;
class GURL;
namespace gfx {
class SlideAnimation;
}
namespace views {
class View;
class Widget;
}

class SubtleNotificationView;

// ExclusiveAccessBubbleViews is responsible for showing a bubble atop the
// screen in fullscreen/mouse lock mode, telling users how to exit and providing
// a click target. The bubble auto-hides, and re-shows when the user moves to
// the screen top.
class ExclusiveAccessBubbleViews : public ExclusiveAccessBubble,
                                   public FullscreenObserver,
                                   public views::WidgetObserver {
 public:
  ExclusiveAccessBubbleViews(
      ExclusiveAccessBubbleViewsContext* context,
      const GURL& url,
      ExclusiveAccessBubbleType bubble_type,
      bool notify_download,
      ExclusiveAccessBubbleHideCallback bubble_first_hide_callback);

  ExclusiveAccessBubbleViews(const ExclusiveAccessBubbleViews&) = delete;
  ExclusiveAccessBubbleViews& operator=(const ExclusiveAccessBubbleViews&) =
      delete;

  ~ExclusiveAccessBubbleViews() override;

  // |force_update| indicates the caller wishes to show the bubble contents
  // regardless of whether the contents have changed. |notify_download|
  // indicates if the notification should be about a new download. Note that
  // bubble_type may be an invalid one for notify_download, as we want to
  // preserve the current type.
  void UpdateContent(
      const GURL& url,
      ExclusiveAccessBubbleType bubble_type,
      ExclusiveAccessBubbleHideCallback bubble_first_hide_callback,
      bool notify_download,
      bool force_update);

  // Repositions |popup_| if it is visible.
  void RepositionIfVisible();

  // If popup is visible, hides |popup_| before the bubble automatically hides
  // itself.
  void HideImmediately();

  // Returns true if the popup is being shown (and not fully shown).
  bool IsShowing() const;

  views::View* GetView();

  gfx::SlideAnimation* animation_for_test() { return animation_.get(); }

  bool IsVisibleForTesting() const { return IsVisible(); }

 private:
  // Starts or stops polling the mouse location based on |popup_| and
  // |bubble_type_|.
  void UpdateMouseWatcher();

  // Updates |popup|'s bounds given |animation_| and |animated_attribute_|.
  void UpdateBounds();

  void UpdateViewContent(ExclusiveAccessBubbleType bubble_type);

  // Returns whether the popup is visible.
  bool IsVisible() const;

  // Returns the root view containing |browser_view_|.
  views::View* GetBrowserRootView() const;

  // ExclusiveAccessBubble:
  void AnimationProgressed(const gfx::Animation* animation) override;
  void AnimationEnded(const gfx::Animation* animation) override;
  gfx::Rect GetPopupRect() const override;
  gfx::Point GetCursorScreenPoint() override;
  bool WindowContainsPoint(gfx::Point pos) override;
  bool IsWindowActive() override;
  void Hide() override;
  void Show() override;
  bool IsAnimating() override;
  bool CanTriggerOnMouse() const override;

  // FullscreenObserver:
  void OnFullscreenStateChanged() override;

  // views::WidgetObserver:
  void OnWidgetDestroyed(views::Widget* widget) override;
  void OnWidgetVisibilityChanged(views::Widget* widget, bool visible) override;

  void RunHideCallbackIfNeeded(ExclusiveAccessBubbleHideReason reason);

  const raw_ptr<ExclusiveAccessBubbleViewsContext> bubble_view_context_;

  raw_ptr<views::Widget> popup_;

  // Classic mode: Bubble may show & hide multiple times. The callback only runs
  // for the first hide.
  // Simplified mode: Bubble only hides once.
  ExclusiveAccessBubbleHideCallback bubble_first_hide_callback_;

  // Animation controlling showing/hiding of the exit bubble.
  std::unique_ptr<gfx::SlideAnimation> animation_;

  // The contents of the popup.
  raw_ptr<SubtleNotificationView> view_;
  std::u16string browser_fullscreen_exit_accelerator_;

  base::ScopedObservation<FullscreenController, FullscreenObserver>
      fullscreen_observation_{this};
};

#endif  // CHROME_BROWSER_UI_VIEWS_EXCLUSIVE_ACCESS_BUBBLE_VIEWS_H_