File: glic_profile_manager.h

package info (click to toggle)
chromium 140.0.7339.127-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 6,192,880 kB
  • sloc: cpp: 35,093,808; ansic: 7,161,670; javascript: 4,199,694; python: 1,441,797; asm: 949,904; xml: 747,503; pascal: 187,748; perl: 88,691; sh: 88,248; objc: 79,953; sql: 52,714; cs: 44,599; fortran: 24,137; makefile: 22,114; tcl: 15,277; php: 13,980; yacc: 9,000; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (175 lines) | stat: -rw-r--r-- 5,973 bytes parent folder | download | duplicates (4)
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
170
171
172
173
174
175
// Copyright 2024 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_GLIC_GLIC_PROFILE_MANAGER_H_
#define CHROME_BROWSER_GLIC_GLIC_PROFILE_MANAGER_H_

#include "base/callback_list.h"
#include "base/memory/memory_pressure_monitor.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list_types.h"
#include "chrome/browser/glic/public/glic_keyed_service.h"
#include "chrome/browser/profiles/profile_manager_observer.h"
#include "services/network/public/cpp/network_connection_tracker.h"

class Profile;

namespace glic {

enum class GlicPrewarmingChecksResult;

// GlicProfileManager is a GlobalFeature that manages multi-profile Glic state.
// Among other things it is used for determining which profile to launch from an
// OS Entry point and ensuring that just one panel is shown across all profiles.
class GlicProfileManager : public ProfileManagerObserver {
 public:
  GlicProfileManager();
  ~GlicProfileManager() override;

  class Observer : public base::CheckedObserver {
   public:
    virtual void OnLastActiveGlicProfileChanged(Profile* profile) = 0;
  };

  // Returns the global instance.
  static GlicProfileManager* GetInstance();

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

  // Return the profile that should be used to open glic. May be null if there
  // is no eligible profile.
  Profile* GetProfileForLaunch() const;

  // Called by GlicKeyedService.
  void SetActiveGlic(GlicKeyedService* glic);

  // Called by GlicKeyedService.
  void OnServiceShutdown(GlicKeyedService* glic);

  // Called by GlobalFeatures.
  void Shutdown();

  // Called when the web client for the GlicWindowController or the FRE
  // controller will be torn down.
  void OnLoadingClientForService(GlicKeyedService* glic);

  // Called by GlicWindowController and the GlicFreController when their
  // respective web clients are being torn down.
  void OnUnloadingClientForService(GlicKeyedService* glic);

  // Callback will be invoked with kSuccess if the given profile should be
  // considered for preloading.
  using ShouldPreloadCallback =
      base::OnceCallback<void(GlicPrewarmingChecksResult)>;
  void ShouldPreloadForProfile(Profile* profile,
                               ShouldPreloadCallback callback);

  // Callback will be invoked with true if the given profile should be
  // considered for preloading the FRE.
  void ShouldPreloadFreForProfile(Profile* profile,
                                  base::OnceCallback<void(bool)> callback);

  // Returns the active Glic service, nullptr if there is none.
  GlicKeyedService* GetLastActiveGlic() const;

  // Opens the panel if the "glic-open-on-startup" command line switch was used
  // and glic has not already opened like this.
  void MaybeAutoOpenGlicPanel();

  void ShowProfilePicker();

  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);

  bool IsShowing() const;

  // ProfileManagerObserver:
  void OnProfileMarkedForPermanentDeletion(Profile* profile) override;

  // Static in order to permit setting forced values before the manager is
  // constructed.
  static void ForceProfileForLaunchForTesting(std::optional<Profile*> profile);
  static void ForceMemoryPressureForTesting(
      std::optional<base::MemoryPressureMonitor::MemoryPressureLevel> level);
  static void ForceConnectionTypeForTesting(
      std::optional<network::mojom::ConnectionType> type);

  base::WeakPtr<GlicProfileManager> GetWeakPtr();

 private:
  // Callback from ProfilePicker::Show().
  void DidSelectProfile(Profile* profile);

  bool IsUnderMemoryPressure() const;

  // Checks whether preloading is possible for the profile for either the fre
  // or the glic panel (i.e., this excludes specific checks for those two
  // surfaces).
  void CanPreloadForProfile(Profile* profile, ShouldPreloadCallback callback);

  bool IsLastActiveGlicProfile(Profile* profile) const;
  bool IsLastLoadedGlicProfile(Profile* profile) const;

  base::ObserverList<Observer> observers_;
  base::WeakPtr<GlicKeyedService> last_active_glic_;
  base::WeakPtr<GlicKeyedService> last_loaded_glic_;
  bool did_auto_open_ = false;
  base::WeakPtrFactory<GlicProfileManager> weak_ptr_factory_{this};
};

// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused. This enum should be kept in sync with
// GlicPrewarmingChecksResult in enums.xml.
// LINT.IfChange(GlicPrewarmingChecksResult)
enum class GlicPrewarmingChecksResult {
  // Preloading is happening.
  kSuccess = 0,

  // Warming was disabled by the feature configuration.
  kWarmingDisabled = 1,

  // The profile doesn't exist or is marked for deletion.
  kProfileGone = 2,

  // The profile is not ready for Glic, for an unknown reason.
  kProfileNotReadyUnknown = 3,

  // The account state is paused, and requires sign in.
  kProfileRequiresSignIn = 4,

  // The profile is not eligible for Glic.
  kProfileNotEligible = 5,

  // Glic is not rolled out to the user.
  kProfileNotRolledOut = 6,

  // The profile is disallowed by admin policy.
  kProfileDisallowedByAdmin = 7,

  // The profile is not enabled for Glic for some other reason.
  kProfileNotEnabledOther = 8,

  // The profile is already the last loaded profile.
  kProfileIsLastLoaded = 9,

  // The profile is already the last active profile.
  kProfileIsLastActive = 10,

  // Preloading is blocked because another Glic is already showing.
  kBlockedByShownGlic = 11,

  // The system is under memory pressure.
  kUnderMemoryPressure = 12,

  // The device has a cellular connection.
  kCellularConnection = 13,

  kMaxValue = kCellularConnection,
};
// LINT.ThenChange(//tools/metrics/histograms/metadata/glic/enums.xml:GlicPrewarmingChecksResult)

}  // namespace glic

#endif  // CHROME_BROWSER_GLIC_GLIC_PROFILE_MANAGER_H_