forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbrowser_context.h
465 lines (386 loc) · 19.6 KB
/
browser_context.h
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_PUBLIC_BROWSER_BROWSER_CONTEXT_H_
#define CONTENT_PUBLIC_BROWSER_BROWSER_CONTEXT_H_
#include <stddef.h>
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include <unordered_set>
#include <vector>
#include "base/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/supports_user_data.h"
#include "content/common/content_export.h"
#include "content/public/browser/zoom_level_delegate.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "services/network/public/mojom/network_context.mojom-forward.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/mojom/blob/blob.mojom-forward.h"
#include "third_party/blink/public/mojom/push_messaging/push_messaging.mojom-forward.h"
#include "third_party/blink/public/mojom/push_messaging/push_messaging_status.mojom-forward.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
class GURL;
namespace base {
class FilePath;
} // namespace base
namespace download {
class InProgressDownloadManager;
}
namespace storage {
class ExternalMountPoints;
}
namespace media {
class VideoDecodePerfHistory;
class WebrtcVideoPerfHistory;
namespace learning {
class LearningSession;
}
} // namespace media
namespace storage {
class BlobStorageContext;
class SpecialStoragePolicy;
} // namespace storage
namespace variations {
class VariationsClient;
} // namespace variations
namespace perfetto {
template <typename>
class TracedProto;
namespace protos {
namespace pbzero {
class ChromeBrowserContext;
}
} // namespace protos
} // namespace perfetto
namespace content {
class BackgroundFetchDelegate;
class BackgroundSyncController;
class BlobHandle;
class BrowserContextImpl;
class BrowserPluginGuestManager;
class BrowsingDataRemover;
class BrowsingDataRemoverDelegate;
class ClientHintsControllerDelegate;
class ContentIndexProvider;
class DownloadManager;
class DownloadManagerDelegate;
class FederatedIdentityActiveSessionPermissionContextDelegate;
class FederatedIdentityApiPermissionContextDelegate;
class FederatedIdentitySharingPermissionContextDelegate;
class FileSystemAccessPermissionContext;
class PermissionController;
class PermissionControllerDelegate;
class PlatformNotificationService;
class PushMessagingService;
class ReduceAcceptLanguageControllerDelegate;
class ResourceContext;
class SSLHostStateDelegate;
class SharedCorsOriginAccessList;
class SiteInstance;
class StorageNotificationService;
class StoragePartition;
class StoragePartitionConfig;
// This class holds the context needed for a browsing session.
// It lives on the UI thread. All these methods must only be called on the UI
// thread.
class CONTENT_EXPORT BrowserContext : public base::SupportsUserData {
public:
//////////////////////////////////////////////////////////////////////////////
// The BrowserContext methods below are provided/implemented by the //content
// layer (e.g. there is no need to override these methods in layers above
// //content).
//
// The currently recommended practice is to make the methods in this section
// non-virtual instance methods.
//
// TODO(https://crbug.com/1179776): Consider moving these methods to
// BrowserContextImpl.
BrowserContext();
~BrowserContext() override;
DownloadManager* GetDownloadManager();
// Returns BrowserContext specific external mount points. It may return
// nullptr if the context doesn't have any BrowserContext specific external
// mount points. Currently, non-nullptr value is returned only on ChromeOS.
storage::ExternalMountPoints* GetMountPoints();
// Returns a BrowsingDataRemover that can schedule data deletion tasks
// for this |context|.
BrowsingDataRemover* GetBrowsingDataRemover();
// Returns the PermissionController associated with this context. There's
// always a PermissionController instance for each BrowserContext.
PermissionController* GetPermissionController();
// Returns a StoragePartition for the given SiteInstance. By default this will
// create a new StoragePartition if it doesn't exist, unless |can_create| is
// false.
StoragePartition* GetStoragePartition(SiteInstance* site_instance,
bool can_create = true);
// Returns a StoragePartition for the given StoragePartitionConfig. By
// default this will create a new StoragePartition if it doesn't exist,
// unless |can_create| is false.
StoragePartition* GetStoragePartition(
const StoragePartitionConfig& storage_partition_config,
bool can_create = true);
// Deprecated. Do not add new callers. Use the SiteInstance or
// StoragePartitionConfig methods above instead.
// Returns a StoragePartition for the given URL. By default this will
// create a new StoragePartition if it doesn't exist, unless |can_create| is
// false.
StoragePartition* GetStoragePartitionForUrl(const GURL& url,
bool can_create = true);
using StoragePartitionCallback =
base::RepeatingCallback<void(StoragePartition*)>;
void ForEachStoragePartition(StoragePartitionCallback callback);
// Disposes the given StoragePartition. Only in-memory storage partition
// disposal is supported. Caller needs to be careful that no outstanding
// references are left to access the disposed storage partition.
void DisposeStoragePartition(StoragePartition* storage_partition);
// Returns the number of StoragePartitions that exist for `this`
// BrowserContext.
size_t GetStoragePartitionCount();
// Starts an asynchronous best-effort attempt to delete all on-disk storage
// related to |partition_domain| and synchronously invokes |done_callback|
// once all on-disk storage is deleted.
void AsyncObliterateStoragePartition(const std::string& partition_domain,
base::OnceClosure on_gc_required,
base::OnceClosure done_callback);
// Examines the on-disk storage and removes any entries that are not listed
// in the `active_paths`, or in use by current entries in the storage
// partition.
//
// The `done` closure is executed on the calling thread when garbage
// collection is complete.
void GarbageCollectStoragePartitions(
std::unordered_set<base::FilePath> active_paths,
base::OnceClosure done);
StoragePartition* GetDefaultStoragePartition();
using BlobCallback = base::OnceCallback<void(std::unique_ptr<BlobHandle>)>;
using BlobContextGetter =
base::RepeatingCallback<base::WeakPtr<storage::BlobStorageContext>()>;
// This method should be called on UI thread and calls back on UI thread
// as well. Note that retrieving a blob ptr out of BlobHandle can only be
// done on IO. |callback| returns a nullptr on failure.
void CreateMemoryBackedBlob(base::span<const uint8_t> data,
const std::string& content_type,
BlobCallback callback);
// Get a BlobStorageContext getter that needs to run on IO thread.
BlobContextGetter GetBlobStorageContext();
// Returns a mojom::mojo::PendingRemote<blink::mojom::Blob> for a specific
// blob. If no blob exists with the given UUID, the
// mojo::PendingRemote<blink::mojom::Blob> pipe will close. This method should
// be called on the UI thread.
// TODO(mek): Blob UUIDs should be entirely internal to the blob system, so
// eliminate this method in favor of just passing around the
// mojo::PendingRemote<blink::mojom::Blob> directly.
mojo::PendingRemote<blink::mojom::Blob> GetBlobRemote(
const std::string& uuid);
// Delivers a push message with |data| to the Service Worker identified by
// |origin| and |service_worker_registration_id|.
void DeliverPushMessage(
const GURL& origin,
int64_t service_worker_registration_id,
const std::string& message_id,
absl::optional<std::string> payload,
base::OnceCallback<void(blink::mojom::PushEventStatus)> callback);
// Fires a push subscription change event to the Service Worker identified by
// |origin| and |service_worker_registration_id| with |new_subscription| and
// |old_subscription| as event information.
void FirePushSubscriptionChangeEvent(
const GURL& origin,
int64_t service_worker_registration_id,
blink::mojom::PushSubscriptionPtr new_subscription,
blink::mojom::PushSubscriptionPtr old_subscription,
base::OnceCallback<void(blink::mojom::PushEventStatus)> callback);
void NotifyWillBeDestroyed();
// Ensures that the corresponding ResourceContext is initialized. Normally the
// BrowserContext initializs the corresponding getters when its objects are
// created, but if the embedder wants to pass the ResourceContext to another
// thread before they use BrowserContext, they should call this to make sure
// that the ResourceContext is ready.
void EnsureResourceContextInitialized();
// Tells the HTML5 objects on this context to persist their session state
// across the next restart.
void SaveSessionState();
void SetDownloadManagerForTesting(
std::unique_ptr<DownloadManager> download_manager);
void SetPermissionControllerForTesting(
std::unique_ptr<PermissionController> permission_controller);
// The list of CORS exemptions. This list needs to be 1) replicated when
// creating or re-creating new network::mojom::NetworkContexts (see
// network::mojom::NetworkContextParams::cors_origin_access_list) and 2)
// consulted by CORS-aware factories (e.g. passed when constructing
// FileURLLoaderFactory).
SharedCorsOriginAccessList* GetSharedCorsOriginAccessList();
// Shuts down the storage partitions associated to this browser context.
// This must be called before the browser context is actually destroyed
// and before a clean-up task for its corresponding IO thread residents (e.g.
// ResourceContext) is posted, so that the classes that hung on
// StoragePartition can have time to do necessary cleanups on IO thread.
void ShutdownStoragePartitions();
// Returns true if shutdown has been initiated via a
// NotifyWillBeDestroyed() call. This is a signal that the object will be
// destroyed soon and no new references to this object should be created.
bool ShutdownStarted();
// Returns a unique string associated with this browser context.
virtual const std::string& UniqueId();
// Gets media service for storing/retrieving video decoding performance stats.
// Exposed here rather than StoragePartition because all SiteInstances should
// have similar decode performance and stats are not exposed to the web
// directly, so privacy is not compromised.
media::VideoDecodePerfHistory* GetVideoDecodePerfHistory();
// Gets media service for storing/retrieving WebRTC video performance stats.
// Exposed here rather than StoragePartition because all SiteInstances should
// have similar encode/decode performance and stats are not exposed to the web
// directly, so privacy is not compromised.
media::WebrtcVideoPerfHistory* GetWebrtcVideoPerfHistory();
// Returns a LearningSession associated with |this|. Used as the central
// source from which to retrieve LearningTaskControllers for media machine
// learning.
// Exposed here rather than StoragePartition because learnings will cover
// general media trends rather than SiteInstance specific behavior. The
// learnings are not exposed to the web.
virtual media::learning::LearningSession* GetLearningSession();
// Retrieves the InProgressDownloadManager associated with this object if
// available
virtual download::InProgressDownloadManager*
RetriveInProgressDownloadManager();
// Utility function useful for embedders. Only needs to be called if
// 1) The embedder needs to use a new salt, and
// 2) The embedder saves its salt across restarts.
static std::string CreateRandomMediaDeviceIDSalt();
using TraceProto = perfetto::protos::pbzero::ChromeBrowserContext;
// Write a representation of this object into tracing proto.
// rvalue ensure that the this method can be called without having access
// to the declaration of ChromeBrowserContext proto.
void WriteIntoTrace(perfetto::TracedProto<TraceProto> context) const;
//////////////////////////////////////////////////////////////////////////////
// The //content embedder can override the methods below to change or extend
// how the //content layer interacts with a BrowserContext.
//
// All the methods below should be virtual. Most of the methods should be
// pure (i.e. `= 0`) although it may make sense to provide a default
// implementation for some of the methods.
//
// TODO(https://crbug.com/1179776): Migrate method declarations from this
// section into a separate BrowserContextDelegate class.
// Creates a delegate to initialize a HostZoomMap and persist its information.
// This is called during creation of each StoragePartition.
virtual std::unique_ptr<ZoomLevelDelegate> CreateZoomLevelDelegate(
const base::FilePath& partition_path) = 0;
// Returns the path of the directory where this context's data is stored.
virtual base::FilePath GetPath() = 0;
// Return whether this context is off the record. Default is false.
// Note that for Chrome this does not imply Incognito as Guest sessions are
// also off the record.
virtual bool IsOffTheRecord() = 0;
// Returns the resource context.
virtual ResourceContext* GetResourceContext() = 0;
// Returns the DownloadManagerDelegate for this context. This will be called
// once per context. The embedder owns the delegate and is responsible for
// ensuring that it outlives DownloadManager. Note in particular that it is
// unsafe to destroy the delegate in the destructor of a subclass of
// BrowserContext, since it needs to be alive in ~BrowserContext.
// It's valid to return nullptr.
virtual DownloadManagerDelegate* GetDownloadManagerDelegate() = 0;
// Returns the guest manager for this context.
virtual BrowserPluginGuestManager* GetGuestManager() = 0;
// Returns a special storage policy implementation, or nullptr.
virtual storage::SpecialStoragePolicy* GetSpecialStoragePolicy() = 0;
// Returns the platform notification service, capable of displaying Web
// Notifications to the user. The embedder can return a nullptr if they don't
// support this functionality. Must be called on the UI thread.
virtual PlatformNotificationService* GetPlatformNotificationService() = 0;
// Returns a push messaging service. The embedder owns the service, and is
// responsible for ensuring that it outlives RenderProcessHost. It's valid to
// return nullptr.
virtual PushMessagingService* GetPushMessagingService() = 0;
// Returns a storage notification service associated with that context,
// nullptr otherwise. In the case that nullptr is returned, QuotaManager
// and the rest of the storage layer will have no connection to the Chrome
// layer for UI purposes.
virtual StorageNotificationService* GetStorageNotificationService() = 0;
// Returns the SSL host state decisions for this context. The context may
// return nullptr, implementing the default exception storage strategy.
virtual SSLHostStateDelegate* GetSSLHostStateDelegate() = 0;
// Returns the PermissionControllerDelegate associated with this context if
// any, nullptr otherwise.
//
// Note: if you want to check a permission status, you probably need
// BrowserContext::GetPermissionController() instead.
virtual PermissionControllerDelegate* GetPermissionControllerDelegate() = 0;
// Returns the ReduceAcceptLanguageControllerDelegate associated with that
// context if any, nullptr otherwise.
virtual ReduceAcceptLanguageControllerDelegate*
GetReduceAcceptLanguageControllerDelegate() = 0;
// Returns the ClientHintsControllerDelegate associated with that context if
// any, nullptr otherwise.
virtual ClientHintsControllerDelegate* GetClientHintsControllerDelegate() = 0;
// Returns the BackgroundFetchDelegate associated with that context if any,
// nullptr otherwise.
virtual BackgroundFetchDelegate* GetBackgroundFetchDelegate() = 0;
// Returns the BackgroundSyncController associated with that context if any,
// nullptr otherwise.
virtual BackgroundSyncController* GetBackgroundSyncController() = 0;
// Returns the BrowsingDataRemoverDelegate for this context. This will be
// called once per context. It's valid to return nullptr.
virtual BrowsingDataRemoverDelegate* GetBrowsingDataRemoverDelegate() = 0;
// Returns a random salt string that is used for creating media device IDs.
// Default implementation uses the BrowserContext's UniqueId.
virtual std::string GetMediaDeviceIDSalt();
// Returns the FileSystemAccessPermissionContext associated with this context
// if any, nullptr otherwise.
virtual FileSystemAccessPermissionContext*
GetFileSystemAccessPermissionContext();
// Returns the ContentIndexProvider associated with that context if any,
// nullptr otherwise.
virtual ContentIndexProvider* GetContentIndexProvider();
// Returns true iff the sandboxed file system implementation should be disk
// backed, even if this browser context is off the record. By default this
// returns false, an embedded could override this to return true if for
// example the off-the-record browser context is stored in a in-memory file
// system anyway, in which case using the disk backed sandboxed file system
// API implementation can give some benefits over the in-memory
// implementation.
virtual bool CanUseDiskWhenOffTheRecord();
// Returns the VariationsClient associated with the context if any, or
// nullptr if there isn't one.
virtual variations::VariationsClient* GetVariationsClient();
// Creates the media service for storing/retrieving video decoding performance
// stats. Exposed here rather than StoragePartition because all SiteInstances
// should have similar decode performance and stats are not exposed to the web
// directly, so privacy is not compromised.
virtual std::unique_ptr<media::VideoDecodePerfHistory>
CreateVideoDecodePerfHistory();
// Gets the permission context for determining whether the FedCM API is
// enabled in site settings.
virtual FederatedIdentityApiPermissionContextDelegate*
GetFederatedIdentityApiPermissionContext();
// Gets the permission context for allowing session management capabilities
// between an identity provider and a relying party if one exists, or
// nullptr otherwise.
virtual FederatedIdentityActiveSessionPermissionContextDelegate*
GetFederatedIdentityActiveSessionPermissionContext();
// Gets the permission context for WebID identity token sharing if one
// exists, or nullptr otherwise.
virtual FederatedIdentitySharingPermissionContextDelegate*
GetFederatedIdentitySharingPermissionContext();
private:
// Please don't add more fields to BrowserContext.
//
// Ideally, BrowserContext would be a pure interface (only pure-virtual
// methods and no fields), but currently BrowserContext and BrowserContextImpl
// and BrowserContextDelegate are kind of mixed together in a single class.
//
// TODO(https://crbug.com/1179776): Make BrowserContextImpl to implement
// BrowserContext instead (Removing afterwards the BrowserContextImpl,
// fwd-declaration, `impl_` field, `friend` declaration and `impl` accessor
// below).
friend class BrowserContextImpl;
std::unique_ptr<BrowserContextImpl> impl_;
BrowserContextImpl* impl() { return impl_.get(); }
const BrowserContextImpl* impl() const { return impl_.get(); }
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_BROWSER_CONTEXT_H_