File: show_promo_in_page.h

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (122 lines) | stat: -rw-r--r-- 4,916 bytes parent folder | download | duplicates (3)
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
// Copyright 2022 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_USER_EDUCATION_SHOW_PROMO_IN_PAGE_H_
#define CHROME_BROWSER_UI_USER_EDUCATION_SHOW_PROMO_IN_PAGE_H_

#include <optional>
#include <string>

#include "base/callback_list.h"
#include "base/functional/callback_forward.h"
#include "base/functional/callback_helpers.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "chrome/browser/ui/user_education/user_education_types.h"
#include "components/user_education/common/help_bubble/help_bubble_params.h"
#include "ui/base/interaction/element_identifier.h"
#include "url/gurl.h"

namespace user_education {
class HelpBubble;
}  // namespace user_education

class Browser;

// Utility for opening a page (optionally) and showing a help bubble on a
// predetermined element. The object exists only as long as the operation
// is in progress or the help bubble is visible. If a `target_url` is
// defined in the parameters, this page will be opened. If `target_url`
// is omitted, the current page will be used to look for the anchor.
//
// Example:
//
//    // Open security settings page and show a help bubble promoting the
//    // "Enhanced Protection" user setting.
//    ShowPromoInPage::Params params;
//
//    // This WebUI page must be instrumented for help bubbles; see
//    // components/user_education/webui/README.md
//    params.target_url = "chrome://settings/security";
//
//    // This specifies what will be shown in the help bubble and how and where
//    // it will be positioned.
//    params.bubble_anchor_id = kEnhancedSecuritySettingElementId;
//    params.bubble_arrow = user_education::HelpBubbleArrow::kBottomLeft;
//    params.bubble_text =
//        l10n_util::GetStringUTF16(IDS_ENABLE_ENHANCED_PROTECTION_PROMO);
//
//    // Log whenever a user actually sees the promo.
//    params.callback = base::BindOnce(&::MaybeLogEnhancedSecurityPromoShown);
//
//    // Shows the page and the bubble. Because we did not specify
//    // |params.page_open_mode|, the settings page will be opened in a
//    // new tab in |browser_| rather than the current tab.
//    ShowPromoInPage::Start(browser_, std::move(params));
//
class ShowPromoInPage {
 public:
  // Called when the help bubble is shown or if it fails/times out. On failure,
  // `source` is destroyed immediately after this call.
  using Callback =
      base::OnceCallback<void(ShowPromoInPage* source, bool success)>;

  struct Params {
    Params();
    Params(Params&& other) noexcept;
    Params& operator=(Params&& other) noexcept;
    ~Params();

    // The page to open. If not specified, the current page will be used.
    std::optional<GURL> target_url = std::nullopt;

    // How the page should be opened. Default is kNewForegroundTab as most
    // promos are expected to be opened in new tabs to avoid disrupting the
    // user's flow in the current tab and potentially lose what they had open.
    user_education::PageOpenMode page_open_mode =
        user_education::PageOpenMode::kNewForegroundTab;

    // The element to anchor to. See //components/user_education/webui/README.md
    // for an explanation on how to instrument a WebUI page for Help Bubbles and
    // how to associated a ui::ElementIdentifier with an HTML element.
    ui::ElementIdentifier bubble_anchor_id;

    // How the help bubble should anchor to the anchor element.
    user_education::HelpBubbleArrow bubble_arrow;

    // The text of the help bubble.
    std::u16string bubble_text;

    // The id of the text that should be used for the accessibility label of the
    // help bubble's close button. The localized string will be looked up using
    // this identifier.
    std::optional<int> close_button_alt_text_id;

    // Callback that notifies whether the page loaded and the bubble was
    // displayed successfully. Typically used for testing or metrics collection.
    // If the page load is aborted or the anchor not found within a reasonable
    // amount of time, is called with `success` = false.
    Callback callback = base::DoNothing();

    // Overrides the default timeout for the bubble to be shown; only use for
    // integration testing.
    std::optional<base::TimeDelta> timeout_override_for_testing;
  };

  ShowPromoInPage(const ShowPromoInPage&) = delete;
  virtual ~ShowPromoInPage();
  void operator=(const ShowPromoInPage&) = delete;

  // Opens the page in `browser` and displays a Help Bubble as described by
  // `params`. This method must be called on the UI thread.
  static base::WeakPtr<ShowPromoInPage> Start(Browser* browser, Params params);

  // Returns the help bubble if one was created.
  virtual user_education::HelpBubble* GetHelpBubbleForTesting() = 0;

 protected:
  ShowPromoInPage();
};

#endif  // CHROME_BROWSER_UI_USER_EDUCATION_SHOW_PROMO_IN_PAGE_H_