File: extension_info_generator_shared.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 (149 lines) | stat: -rw-r--r-- 5,769 bytes parent folder | download | duplicates (2)
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
// Copyright 2015 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_EXTENSIONS_API_DEVELOPER_PRIVATE_EXTENSION_INFO_GENERATOR_SHARED_H_
#define CHROME_BROWSER_EXTENSIONS_API_DEVELOPER_PRIVATE_EXTENSION_INFO_GENERATOR_SHARED_H_

#include <stddef.h>

#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/profiles/profile_observer.h"
#include "chrome/common/extensions/api/developer_private.h"
#include "components/supervised_user/core/common/buildflags.h"
#include "extensions/browser/blocklist_state.h"
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_prefs_observer.h"
#include "extensions/common/extension_id.h"
#include "extensions/common/url_pattern.h"
#include "extensions/common/url_pattern_set.h"

namespace content {
class BrowserContext;
}

namespace extensions {
class CommandService;
}

namespace gfx {
class Image;
}

namespace extensions {
class ErrorConsole;
class Extension;
class ExtensionPrefs;
class ExtensionSystem;
class ImageLoader;
class WarningService;

// Generates the developerPrivate api's specification for ExtensionInfo.
// This class is designed to only have one generation running at a time!
//
// This class contains ExtensionInfoGenerator's implementation common to all
// platforms. On Android, it is aliased to ExtensionInfoGenerator to provide
// a partial implementation. On other desktop OSes, ExtensionInfoGenerator
// derives from this class to provide a full implementation. As we fill gaps
// between Android and other OSes, more logic in ExtensionInfoGenerator should
// be moved to this class, and finally ExtensionInfoGeneratorShared will be
// renamed to ExtensionInfoGenerator.
class ExtensionInfoGeneratorShared : public ProfileObserver {
 public:
  using ExtensionInfoList = std::vector<api::developer_private::ExtensionInfo>;

  using ExtensionInfosCallback = base::OnceCallback<void(ExtensionInfoList)>;

  explicit ExtensionInfoGeneratorShared(content::BrowserContext* context);

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

  ~ExtensionInfoGeneratorShared() override;

  // ProfileObserver implementation.
  // There's a chance that an instance of this class is owned by a task, which
  // means it could outlive some of the systems cached that would be destroyed
  // when the profile associated with the `browser_context_` is destroyed.
  void OnProfileWillBeDestroyed(Profile* profile) override;

  // Creates and asynchronously returns an ExtensionInfo for the given
  // `extension_id`, if the extension can be found.
  // If the extension cannot be found, an empty vector is passed to `callback`.
  void CreateExtensionInfo(const ExtensionId& id,
                           ExtensionInfosCallback callback);

  // Creates and asynchronously returns a collection of ExtensionInfos,
  // optionally including disabled and terminated.
  void CreateExtensionsInfo(bool include_disabled,
                            bool include_terminated,
                            ExtensionInfosCallback callback);

  // Returns a list of URLPatterns where no pattern is completely contained by
  // another pattern in the list.
  static std::vector<URLPattern> GetDistinctHosts(
      const URLPatternSet& patterns);

 protected:
  // Fills an ExtensionInfo for the given `extension` and `state`, and
  // asynchronously adds it to the `list`.
  //
  // This function fills only a portion of ExtensionInfo that is common to all
  // platforms. Subclasses may override this function to fill more members.
  virtual void FillExtensionInfo(const Extension& extension,
                                 api::developer_private::ExtensionState state,
                                 api::developer_private::ExtensionInfo info);

  // Various systems, cached for convenience.
  raw_ptr<content::BrowserContext> browser_context_;
  raw_ptr<ExtensionSystem> extension_system_;
  raw_ptr<ExtensionPrefs> extension_prefs_;
  raw_ptr<WarningService> warning_service_;
  raw_ptr<ErrorConsole> error_console_;
  raw_ptr<ImageLoader> image_loader_;

 private:
  // Callback for the asynchronous image loading.
  void OnImageLoaded(api::developer_private::ExtensionInfo info,
                     const gfx::Image& image);

  // Returns the icon url for the default icon to use.
  std::string GetDefaultIconUrl(const std::string& name);

  // Returns an icon url from the given image.
  std::string GetIconUrlFromImage(const gfx::Image& image);

  // Construct the needed information for the Extension Safety Check and
  // populate the relevant `extension_info` fields.
  void PopulateSafetyCheckInfo(
      const Extension& extension,
      bool updates_from_webstore,
      api::developer_private::ExtensionState state,
      BitMapBlocklistState blocklist_state,
      api::developer_private::ExtensionInfo& extension_info);

  // The number of pending image loads.
  size_t pending_image_loads_ = 0;

  // The list of extension infos that have been generated.
  ExtensionInfoList list_;

  // The callback to run once all infos have been created.
  ExtensionInfosCallback callback_;

  base::ScopedObservation<Profile, ProfileObserver> profile_observation_{this};

  raw_ptr<CommandService> command_service_;

  base::WeakPtrFactory<ExtensionInfoGeneratorShared> weak_factory_{this};

  friend class ExtensionInfoGeneratorUnitTest;
};

}  // namespace extensions

#endif  // CHROME_BROWSER_EXTENSIONS_API_DEVELOPER_PRIVATE_EXTENSION_INFO_GENERATOR_SHARED_H_