File: tab_sharing_infobar_delegate.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 (169 lines) | stat: -rw-r--r-- 6,082 bytes parent folder | download | duplicates (5)
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
// Copyright 2019 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_TAB_SHARING_TAB_SHARING_INFOBAR_DELEGATE_H_
#define CHROME_BROWSER_UI_TAB_SHARING_TAB_SHARING_INFOBAR_DELEGATE_H_

#include <optional>
#include <string>

#include "base/memory/raw_ptr.h"
#include "components/infobars/core/infobar_delegate.h"
#include "content/public/browser/global_routing_id.h"

namespace content {
class WebContents;
}

namespace infobars {
class InfoBarManager;
class InfoBar;
}  // namespace infobars

class TabSharingUI;

// Creates an infobar for sharing a tab using desktopCapture() API; one delegate
// per tab.
//
// 1. Layout for currently shared tab:
// "Sharing this tab to |capturer_name_| [Stop]"
//
// 2. Layout for capturing/captured tab:
// "Sharing |shared_tab_name_| to |capturer_name_| [Stop] [Switch-Label]"
// Where [Switch-Label] is "Switch to tab <hostname>", with the hostname in
// the captured tab being the capturer's, and vice versa.
//
// 3a. Layout for all other tabs:
// "Sharing |shared_tab_name_| to |capturer_name_| [Stop] [Share this tab
// instead]"
// 3b. Or if |shared_tab_name_| is empty:
// "Sharing a tab to |capturer_name_| [Stop] [Share this tab instead]"
class TabSharingInfoBarDelegate : public infobars::InfoBarDelegate {
 public:
  enum TabSharingInfoBarButton {
    kNone = 0,
    kStop = 1 << 0,
    kShareThisTabInstead = 1 << 1,
    kQuickNav = 1 << 2,
    kCapturedSurfaceControlIndicator = 1 << 3,
  };

  enum class ButtonState {
    ENABLED,
    DISABLED,
    NOT_SHOWN,
  };

  // The user-facing mechanism that initiated the tab capture influences the UX
  // elements and language that should be presented to the user.
  // CAPTURE: getDisplayMedia, usually goes with "share".
  // CAST: Chromecasting, usually goes with "cast".
  enum class TabShareType {
    CAPTURE,
    CAST,
  };

  enum class TabRole {
    kCapturingTab,
    kCapturedTab,
    kSelfCapturingTab,  // kCapturingTab && kCapturedTab
    kOtherTab,
  };

  static bool IsCapturedTab(TabRole role);
  static bool IsCapturingTab(TabRole role);

  class TabSharingInfoBarDelegateButton;
  class StopButton;
  class ShareTabInsteadButton;
  class SwitchToTabButton;
  class CscIndicatorButton;

  // Creates a tab sharing infobar, which has 1-2 buttons.
  //
  // The primary button is for stopping the capture. It is always present.
  //
  // The infobar replaces any non-null `old_infobar`, or will be added if that
  // is null.
  //
  // |role| denotes whether the infobar is associated with the capturing
  // and/or captured tab.
  //
  // If |focus_target| has a value, the secondary button switches focus.
  // The image on the secondary button is derived from |focus_target|.
  // Else, if |can_share_instead|, the secondary button changes the
  // capture target to be the tab associated with |this| object.
  // Otherwise, there is no secondary button.
  static infobars::InfoBar* Create(
      infobars::InfoBarManager* infobar_manager,
      infobars::InfoBar* old_infobar,
      content::GlobalRenderFrameHostId shared_tab_id,
      content::GlobalRenderFrameHostId capturer_id,
      const std::u16string& shared_tab_name,
      const std::u16string& capturer_name,
      content::WebContents* web_contents,
      TabRole role,
      ButtonState share_this_tab_instead_button_state,
      content::GlobalRenderFrameHostId focus_target,
      bool captured_surface_control_active,
      TabSharingUI* ui,
      TabShareType capture_type);

  ~TabSharingInfoBarDelegate() override;

  // TODO(crbug.com/40188004): Inline these methods into TabSharingInfoBar where
  // feasible or add comments to document their function better.
  std::u16string GetButtonLabel(TabSharingInfoBarButton button) const;
  ui::ImageModel GetButtonImage(TabSharingInfoBarButton button) const;
  bool IsButtonEnabled(TabSharingInfoBarButton button) const;
  std::u16string GetButtonTooltip(TabSharingInfoBarButton button) const;
  int GetButtons() const;

  void Stop();
  void ShareThisTabInstead();
  void QuickNav();
  void OnCapturedSurfaceControlActivityIndicatorPressed();

  // InfoBarDelegate:
  infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
  const gfx::VectorIcon& GetVectorIcon() const override;
  bool EqualsDelegate(InfoBarDelegate* delegate) const override;
  bool ShouldExpire(const NavigationDetails& details) const override;
  bool IsCloseable() const override;

 private:
  TabSharingInfoBarDelegate(content::WebContents* web_contents,
                            TabRole role,
                            ButtonState share_this_tab_instead_button_state,
                            content::GlobalRenderFrameHostId focus_target,
                            bool captured_surface_control_active,
                            TabSharingUI* ui,
                            TabShareType capture_type);

  const TabSharingInfoBarDelegateButton& GetButton(
      TabSharingInfoBarButton button) const;
  TabSharingInfoBarDelegateButton& GetButton(TabSharingInfoBarButton button);

  // Creates and removes delegate's infobar; outlives delegate.
  const raw_ptr<TabSharingUI, AcrossTasksDanglingUntriaged> ui_;

  // Indicates whether this instance is used for casting or capturing.
  const TabShareType capture_type_;

  std::unique_ptr<StopButton> stop_button_;
  std::unique_ptr<ShareTabInsteadButton> share_this_tab_instead_button_;
  std::unique_ptr<SwitchToTabButton> quick_nav_button_;
  std::unique_ptr<CscIndicatorButton> csc_indicator_button_;
};

std::unique_ptr<infobars::InfoBar> CreateTabSharingInfoBar(
    std::unique_ptr<TabSharingInfoBarDelegate> delegate,
    content::GlobalRenderFrameHostId shared_tab_id,
    content::GlobalRenderFrameHostId capturer_id,
    const std::u16string& shared_tab_name,
    const std::u16string& capturer_name,
    TabSharingInfoBarDelegate::TabRole role,
    TabSharingInfoBarDelegate::TabShareType capture_type);

#endif  // CHROME_BROWSER_UI_TAB_SHARING_TAB_SHARING_INFOBAR_DELEGATE_H_