File: background_application_list_model.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 (204 lines) | stat: -rw-r--r-- 7,975 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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
// 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_BACKGROUND_EXTENSIONS_BACKGROUND_APPLICATION_LIST_MODEL_H_
#define CHROME_BROWSER_BACKGROUND_EXTENSIONS_BACKGROUND_APPLICATION_LIST_MODEL_H_

#include <stddef.h>

#include <map>
#include <memory>
#include <string>

#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/scoped_observation.h"
#include "chrome/browser/background/background_contents_service.h"
#include "chrome/browser/background/background_contents_service_observer.h"
#include "extensions/browser/extension_registry_observer.h"
#include "extensions/browser/permissions_manager.h"
#include "extensions/browser/process_manager.h"
#include "extensions/browser/process_manager_observer.h"
#include "extensions/common/extension.h"

class Profile;

namespace gfx {
class ImageSkia;
}

namespace extensions {
class ExtensionRegistry;
}  // namespace extensions

// Model for list of Background Applications associated with a Profile (i.e.
// extensions with kBackgroundPermission set, or hosted apps with a
// BackgroundContents).
class BackgroundApplicationListModel
    : public extensions::ExtensionRegistryObserver,
      public BackgroundContentsServiceObserver,
      public extensions::ProcessManagerObserver,
      public extensions::PermissionsManager::Observer {
 public:
  // Observer is informed of changes to the model.  Users of the
  // BackgroundApplicationListModel should anticipate that associated data,
  // e. g. the Icon, may exist and yet not be immediately available.  When the
  // data becomes available, OnApplicationDataChanged will be invoked for all
  // Observers of the model.
  class Observer {
   public:
    // Invoked when data that the model associates with an extension, such as
    // the Icon, has changed.
    virtual void OnApplicationDataChanged();

    // Invoked when the model detects a previously unknown extension and/or when
    // it no longer detects a previously known extension.
    virtual void OnApplicationListChanged(const Profile* profile);

   protected:
    virtual ~Observer();
  };

  // Create a new model associated with profile.
  explicit BackgroundApplicationListModel(Profile* profile);

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

  ~BackgroundApplicationListModel() override;

  // Associate observer with this model.
  void AddObserver(Observer* observer);

  // Return the icon associated with |extension|.  If the result isNull(),
  // there is no icon associated with the extension, or a pending task to
  // retrieve the icon has not completed.  See the Observer class above.
  //
  // NOTE: All icons are currently sized as
  //       ExtensionIconSet::EXTENSION_ICON_BITTY.
  gfx::ImageSkia GetIcon(const extensions::Extension* extension);

  // Return the position of |extension| within this list model.
  int GetPosition(const extensions::Extension* extension) const;

  // Return the extension at the specified |position| in this list model.
  const extensions::Extension* GetExtension(int position) const;

  // Returns true if the passed extension is a background app.
  static bool IsBackgroundApp(const extensions::Extension& extension,
                              Profile* profile) {
    return IsPersistentBackgroundApp(extension, profile) ||
           IsTransientBackgroundApp(extension, profile);
  }

  // Returns true if the passed extension is a persistent background app.
  static bool IsPersistentBackgroundApp(const extensions::Extension& extension,
                                        Profile* profile);

  // Returns true if the passed extension is a transient background app.
  // Transient background apps should only be treated as background apps while
  // their background page is active.
  static bool IsTransientBackgroundApp(const extensions::Extension& extension,
                                       Profile* profile);

  // Dissociate observer from this model.
  void RemoveObserver(Observer* observer);

  extensions::ExtensionList::const_iterator begin() const {
    return extensions_.begin();
  }

  extensions::ExtensionList::const_iterator end() const {
    return extensions_.end();
  }

  size_t size() const { return extensions_.size(); }

  // Returns true if all startup notifications have already been issued.
  bool startup_done() const { return startup_done_; }

  bool HasPersistentBackgroundApps() const;

 private:
  // Contains data associated with a background application that is not
  // represented by the Extension class.
  class Application;

  // Identifies and caches data related to the extension.
  void AssociateApplicationData(const extensions::Extension* extension);

  // Clears cached data related to |extension|.
  void DissociateApplicationData(const extensions::Extension* extension);

  // Returns the Application associated with |extension| or NULL.
  const Application* FindApplication(
      const extensions::Extension* extension) const;

  // Returns the Application associated with |extension| or NULL.
  Application* FindApplication(const extensions::Extension* extension);

  // extensions::ExtensionRegistryObserver:
  void OnExtensionLoaded(content::BrowserContext* browser_context,
                         const extensions::Extension* extension) override;
  void OnExtensionUnloaded(content::BrowserContext* browser_context,
                           const extensions::Extension* extension,
                           extensions::UnloadedExtensionReason reason) override;
  void OnShutdown(extensions::ExtensionRegistry* registry) override;

  // BackgroundContentsServiceObserver:
  void OnBackgroundContentsServiceChanged() override;
  void OnBackgroundContentsServiceDestroying() override;

  // extensions::PermissionsManager::Observer:
  void OnExtensionPermissionsUpdated(
      const extensions::Extension& extension,
      const extensions::PermissionSet& permissions,
      extensions::PermissionsManager::UpdateReason reason) override;

  // Intended to be called when extension system is ready.
  void OnExtensionSystemReady();

  // Notifies observers that some of the data associated with this background
  // application, e.g. the Icon, has changed.
  void SendApplicationDataChangedNotifications();

  // Refresh the list of background applications and generate notifications.
  void Update();

  // ProcessManagerObserver:
  void OnBackgroundHostCreated(extensions::ExtensionHost* host) override;
  void OnBackgroundHostClose(const std::string& extension_id) override;

  // Associates extension id strings with Application objects.
  std::map<std::string, std::unique_ptr<Application>> applications_;

  extensions::ExtensionList extensions_;
  base::ObserverList<Observer, true>::Unchecked observers_;
  const raw_ptr<Profile> profile_;
  bool startup_done_ = false;

  // Listens to extension load, unload notifications.
  base::ScopedObservation<extensions::ExtensionRegistry,
                          extensions::ExtensionRegistryObserver>
      extension_registry_observation_{this};

  base::ScopedObservation<BackgroundContentsService,
                          BackgroundContentsServiceObserver>
      background_contents_service_observation_{this};

  base::ScopedObservation<extensions::ProcessManager,
                          extensions::ProcessManagerObserver>
      process_manager_observation_{this};

  base::ScopedObservation<extensions::PermissionsManager,
                          extensions::PermissionsManager::Observer>
      permissions_manager_observation_{this};

  base::WeakPtrFactory<BackgroundApplicationListModel> weak_ptr_factory_{this};
};

#endif  // CHROME_BROWSER_BACKGROUND_EXTENSIONS_BACKGROUND_APPLICATION_LIST_MODEL_H_