Skip to content

Commit 98f7520

Browse files
authored
Merge pull request #27856 from brave/pr27548_tor-leak-background-download_1.77.x
Use browser context specific URLLoaderFactory for InMemoryDownloadService (Cherry-picked) (uplift to 1.77.x)
2 parents 268c8dd + 77b7773 commit 98f7520

14 files changed

+712
-5
lines changed

chromium_src/check_chromium_src_config.json5

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"chrome/install_static/brave_restore_google_update_integration.h",
3838
"chrome/install_static/brave_stash_google_update_integration.h",
3939
"chrome/install_static/brave_user_data_dir_win_unittest.cc",
40+
"components/download/public/background_service/url_loader_factory_getter.h",
4041
"components/privacy_sandbox/privacy_sandbox_settings_unittest.cc",
4142
"components/search_engines/brave_template_url_prepopulate_data_unittest.cc",
4243
"components/search_engines/brave_template_url_service_util_unittest.cc",

chromium_src/chrome/browser/download/background_download_service_factory.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,17 @@ std::unique_ptr<BackgroundDownloadService> BuildInMemoryDownloadServiceOverride(
5454
const base::FilePath& storage_dir,
5555
BlobContextGetterFactoryPtr blob_context_getter_factory,
5656
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
57-
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
57+
URLLoaderFactoryGetterPtr url_loader_factory_getter) {
5858
clients->insert(std::make_pair(
5959
download::DownloadClient::CUSTOM_LIST_SUBSCRIPTIONS,
6060
std::make_unique<download::DeferredClientWrapper>(
6161
base::BindOnce(&CreateAdBlockSubscriptionDownloadClient),
6262
simple_factory_key)));
6363

64-
return BuildInMemoryDownloadService(simple_factory_key, std::move(clients),
65-
network_connection_tracker, storage_dir,
66-
std::move(blob_context_getter_factory),
67-
io_task_runner, url_loader_factory);
64+
return BuildInMemoryDownloadService(
65+
simple_factory_key, std::move(clients), network_connection_tracker,
66+
storage_dir, std::move(blob_context_getter_factory), io_task_runner,
67+
std::move(url_loader_factory_getter));
6868
}
6969

7070
} // namespace download
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/* Copyright (c) 2025 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at https://mozilla.org/MPL/2.0/. */
5+
6+
#ifndef BRAVE_CHROMIUM_SRC_COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_URL_LOADER_FACTORY_GETTER_H_
7+
#define BRAVE_CHROMIUM_SRC_COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_URL_LOADER_FACTORY_GETTER_H_
8+
9+
#include "base/component_export.h"
10+
#include "base/functional/callback.h"
11+
#include "base/memory/scoped_refptr.h"
12+
13+
namespace network {
14+
class SharedURLLoaderFactory;
15+
} // namespace network
16+
17+
namespace download {
18+
19+
using URLLoaderFactoryGetterCallback =
20+
base::OnceCallback<void(scoped_refptr<network::SharedURLLoaderFactory>)>;
21+
22+
class COMPONENT_EXPORT(COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE)
23+
URLLoaderFactoryGetter {
24+
public:
25+
virtual void RetrieveURLLoaderFactory(
26+
URLLoaderFactoryGetterCallback callback) = 0;
27+
28+
URLLoaderFactoryGetter(const URLLoaderFactoryGetter&) = delete;
29+
URLLoaderFactoryGetter& operator=(const URLLoaderFactoryGetter&) = delete;
30+
31+
virtual ~URLLoaderFactoryGetter() = default;
32+
33+
protected:
34+
URLLoaderFactoryGetter() = default;
35+
};
36+
37+
using URLLoaderFactoryGetterPtr = std::unique_ptr<URLLoaderFactoryGetter>;
38+
39+
} // namespace download
40+
41+
#endif // BRAVE_CHROMIUM_SRC_COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_URL_LOADER_FACTORY_GETTER_H_
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
diff --git a/chrome/browser/download/background_download_service_factory.cc b/chrome/browser/download/background_download_service_factory.cc
2+
index 54fbadcbc0d2779bf2317ac4d4dd7dae3835a10d..c4f2ae62b0679cdf8ed072076f33f49c5a068f25 100644
3+
--- a/chrome/browser/download/background_download_service_factory.cc
4+
+++ b/chrome/browser/download/background_download_service_factory.cc
5+
@@ -20,7 +20,6 @@
6+
#include "chrome/browser/download/deferred_client_wrapper.h"
7+
#include "chrome/browser/download/download_manager_utils.h"
8+
#include "chrome/browser/download/simple_download_manager_coordinator_factory.h"
9+
-#include "chrome/browser/net/system_network_context_manager.h"
10+
#include "chrome/browser/optimization_guide/prediction/prediction_model_download_client.h"
11+
#include "chrome/browser/profiles/incognito_helpers.h"
12+
#include "chrome/browser/profiles/profile.h"
13+
@@ -35,6 +34,7 @@
14+
#include "components/download/public/background_service/blob_context_getter_factory.h"
15+
#include "components/download/public/background_service/clients.h"
16+
#include "components/download/public/background_service/features.h"
17+
+#include "components/download/public/background_service/url_loader_factory_getter.h"
18+
#include "components/download/public/common/simple_download_manager_coordinator.h"
19+
#include "components/keyed_service/core/simple_dependency_manager.h"
20+
#include "components/leveldb_proto/public/proto_database_provider.h"
21+
@@ -108,6 +108,33 @@ class DownloadBlobContextGetterFactory
22+
raw_ptr<SimpleFactoryKey> key_;
23+
};
24+
25+
+void OnProfileCreated(download::URLLoaderFactoryGetterCallback callback,
26+
+ Profile* profile) {
27+
+ DCHECK(callback);
28+
+ std::move(callback).Run(profile->GetURLLoaderFactory());
29+
+}
30+
+
31+
+class URLLoaderFactoryGetter : public download::URLLoaderFactoryGetter {
32+
+ public:
33+
+ explicit URLLoaderFactoryGetter(SimpleFactoryKey* key) : key_(key) {
34+
+ DCHECK(key_);
35+
+ }
36+
+
37+
+ URLLoaderFactoryGetter(const URLLoaderFactoryGetter&) = delete;
38+
+ URLLoaderFactoryGetter& operator=(const URLLoaderFactoryGetter&) = delete;
39+
+
40+
+ ~URLLoaderFactoryGetter() override = default;
41+
+
42+
+ private:
43+
+ void RetrieveURLLoaderFactory(
44+
+ download::URLLoaderFactoryGetterCallback callback) override {
45+
+ FullBrowserTransitionManager::Get()->RegisterCallbackOnProfileCreation(
46+
+ key_, base::BindOnce(&OnProfileCreated, std::move(callback)));
47+
+ }
48+
+
49+
+ raw_ptr<SimpleFactoryKey> key_;
50+
+};
51+
+
52+
} // namespace
53+
54+
// static
55+
@@ -169,13 +196,11 @@ BackgroundDownloadServiceFactory::BuildServiceInstanceFor(
56+
std::make_unique<DownloadBlobContextGetterFactory>(key);
57+
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner =
58+
content::GetIOThreadTaskRunner({});
59+
- scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory =
60+
- SystemNetworkContextManager::GetInstance()->GetSharedURLLoaderFactory();
61+
62+
return download::BuildInMemoryDownloadService(
63+
key, std::move(clients), content::GetNetworkConnectionTracker(),
64+
base::FilePath(), std::move(blob_context_getter_factory),
65+
- io_task_runner, url_loader_factory);
66+
+ io_task_runner, std::make_unique<::URLLoaderFactoryGetter>(key));
67+
} else {
68+
// Build download service for normal profile.
69+
base::FilePath storage_dir;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
diff --git a/components/download/content/factory/download_service_factory_helper.cc b/components/download/content/factory/download_service_factory_helper.cc
2+
index f856fff2897d278d7ef083f996558cc8584f12f3..5e7b25d1928904268d910faa5ce7d4ae7cf8221d 100644
3+
--- a/components/download/content/factory/download_service_factory_helper.cc
4+
+++ b/components/download/content/factory/download_service_factory_helper.cc
5+
@@ -111,8 +111,8 @@ std::unique_ptr<BackgroundDownloadService> BuildDownloadService(
6+
std::unique_ptr<TaskScheduler> task_scheduler) {
7+
auto config = Configuration::CreateFromFinch();
8+
9+
- auto driver = std::make_unique<DownloadDriverImpl>(
10+
- download_manager_coordinator);
11+
+ auto driver =
12+
+ std::make_unique<DownloadDriverImpl>(download_manager_coordinator);
13+
14+
auto entry_db_storage_dir = storage_dir.Append(kEntryDBStorageDir);
15+
16+
@@ -139,12 +139,13 @@ std::unique_ptr<BackgroundDownloadService> BuildInMemoryDownloadService(
17+
const base::FilePath& storage_dir,
18+
BlobContextGetterFactoryPtr blob_context_getter_factory,
19+
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
20+
- scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
21+
+ URLLoaderFactoryGetterPtr url_loader_factory_getter) {
22+
auto config = Configuration::CreateFromFinch();
23+
- auto download_factory = std::make_unique<InMemoryDownloadFactory>(
24+
- url_loader_factory.get(), io_task_runner);
25+
+ auto download_factory =
26+
+ std::make_unique<InMemoryDownloadFactory>(io_task_runner);
27+
auto driver = std::make_unique<InMemoryDownloadDriver>(
28+
- std::move(download_factory), std::move(blob_context_getter_factory));
29+
+ std::move(download_factory), std::move(blob_context_getter_factory),
30+
+ std::move(url_loader_factory_getter));
31+
auto store = std::make_unique<NoopStore>();
32+
auto task_scheduler = std::make_unique<EmptyTaskScheduler>();
33+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
diff --git a/components/download/content/factory/download_service_factory_helper.h b/components/download/content/factory/download_service_factory_helper.h
2+
index d6687f6e03ebaf271b3f250571f263bb968720e8..d85c60ec112e9c420dff3b0d50a9ba882a19e847 100644
3+
--- a/components/download/content/factory/download_service_factory_helper.h
4+
+++ b/components/download/content/factory/download_service_factory_helper.h
5+
@@ -13,12 +13,12 @@
6+
#include "base/task/single_thread_task_runner.h"
7+
#include "components/download/public/background_service/blob_context_getter_factory.h"
8+
#include "components/download/public/background_service/clients.h"
9+
+#include "components/download/public/background_service/url_loader_factory_getter.h"
10+
11+
class SimpleFactoryKey;
12+
13+
namespace network {
14+
class NetworkConnectionTracker;
15+
-class SharedURLLoaderFactory;
16+
} // namespace network
17+
18+
namespace leveldb_proto {
19+
@@ -60,7 +60,7 @@ std::unique_ptr<BackgroundDownloadService> BuildInMemoryDownloadService(
20+
const base::FilePath& storage_dir,
21+
BlobContextGetterFactoryPtr blob_context_getter_factory,
22+
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
23+
- scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
24+
+ URLLoaderFactoryGetterPtr url_loader_factory_getter);
25+
26+
} // namespace download
27+
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
diff --git a/components/download/internal/background_service/in_memory_download.cc b/components/download/internal/background_service/in_memory_download.cc
2+
index 4267b39009467edd579ace516b6441999441ff62..b5d7eebe994b0b65d8cc8ea0077b0d69b068edec 100644
3+
--- a/components/download/internal/background_service/in_memory_download.cc
4+
+++ b/components/download/internal/background_service/in_memory_download.cc
5+
@@ -14,6 +14,7 @@
6+
#include "net/base/load_flags.h"
7+
#include "net/traffic_annotation/network_traffic_annotation.h"
8+
#include "services/network/public/cpp/resource_request.h"
9+
+#include "services/network/public/cpp/shared_url_loader_factory.h"
10+
#include "services/network/public/mojom/url_response_head.mojom.h"
11+
#include "storage/browser/blob/blob_data_handle.h"
12+
#include "storage/browser/blob/blob_storage_context.h"
13+
@@ -35,13 +36,11 @@ InMemoryDownloadImpl::InMemoryDownloadImpl(
14+
scoped_refptr<network::ResourceRequestBody> request_body,
15+
const net::NetworkTrafficAnnotationTag& traffic_annotation,
16+
Delegate* delegate,
17+
- network::mojom::URLLoaderFactory* url_loader_factory,
18+
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
19+
: InMemoryDownload(guid),
20+
request_params_(request_params),
21+
request_body_(std::move(request_body)),
22+
traffic_annotation_(traffic_annotation),
23+
- url_loader_factory_(url_loader_factory),
24+
io_task_runner_(io_task_runner),
25+
delegate_(delegate),
26+
completion_notified_(false),
27+
@@ -56,7 +55,16 @@ InMemoryDownloadImpl::~InMemoryDownloadImpl() {
28+
29+
void InMemoryDownloadImpl::Start() {
30+
DCHECK(state_ == State::INITIAL) << "Only call Start() for new download.";
31+
+ state_ = State::RETRIEVE_URL_LOADER_FACTIORY;
32+
+ delegate_->RetrievedURLLoaderFactory(
33+
+ base::BindOnce(&InMemoryDownloadImpl::OnRetrievedURLLoaderFactory,
34+
+ weak_ptr_factory_.GetWeakPtr()));
35+
+}
36+
+
37+
+void InMemoryDownloadImpl::OnRetrievedURLLoaderFactory(
38+
+ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
39+
state_ = State::RETRIEVE_BLOB_CONTEXT;
40+
+ url_loader_factory_ = url_loader_factory;
41+
delegate_->RetrieveBlobContextGetter(
42+
base::BindOnce(&InMemoryDownloadImpl::OnRetrievedBlobContextGetter,
43+
weak_ptr_factory_.GetWeakPtr()));
44+
@@ -72,8 +80,9 @@ void InMemoryDownloadImpl::OnRetrievedBlobContextGetter(
45+
}
46+
47+
void InMemoryDownloadImpl::Pause() {
48+
- if (state_ == State::IN_PROGRESS)
49+
+ if (state_ == State::IN_PROGRESS) {
50+
paused_ = true;
51+
+ }
52+
}
53+
54+
void InMemoryDownloadImpl::Resume() {
55+
@@ -81,12 +90,14 @@ void InMemoryDownloadImpl::Resume() {
56+
57+
switch (state_) {
58+
case State::INITIAL:
59+
+ case State::RETRIEVE_URL_LOADER_FACTIORY:
60+
case State::RETRIEVE_BLOB_CONTEXT:
61+
return;
62+
case State::IN_PROGRESS:
63+
// Let the network pipe continue to read data.
64+
- if (resume_callback_)
65+
+ if (resume_callback_) {
66+
std::move(resume_callback_).Run();
67+
+ }
68+
return;
69+
case State::FAILED:
70+
// Restart the download.
71+
@@ -142,8 +153,9 @@ void InMemoryDownloadImpl::OnComplete(bool success) {
72+
73+
// OnComplete() called without OnResponseStarted(). This will happen when the
74+
// request was aborted.
75+
- if (!started_)
76+
+ if (!started_) {
77+
OnResponseStarted(GURL(), network::mojom::URLResponseHead());
78+
+ }
79+
80+
NotifyDelegateDownloadComplete();
81+
}
82+
@@ -189,8 +201,9 @@ void InMemoryDownloadImpl::OnSaveBlobDone(
83+
}
84+
85+
void InMemoryDownloadImpl::NotifyDelegateDownloadComplete() {
86+
- if (completion_notified_)
87+
+ if (completion_notified_) {
88+
return;
89+
+ }
90+
completion_notified_ = true;
91+
92+
delegate_->OnDownloadComplete(this);
93+
@@ -225,7 +238,7 @@ void InMemoryDownloadImpl::SendRequest() {
94+
95+
// TODO(xingliu): Use SimpleURLLoader's retry when it won't hit CHECK in
96+
// SharedURLLoaderFactory.
97+
- loader_->DownloadAsStream(url_loader_factory_, this);
98+
+ loader_->DownloadAsStream(url_loader_factory_.get(), this);
99+
}
100+
101+
void InMemoryDownloadImpl::OnRedirect(
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
diff --git a/components/download/internal/background_service/in_memory_download.h b/components/download/internal/background_service/in_memory_download.h
2+
index 07f347e0b666219bfbe91f6d891851eebce912fb..d010ebbc5885fd9457b3344e7b5cd02bc17dae21 100644
3+
--- a/components/download/internal/background_service/in_memory_download.h
4+
+++ b/components/download/internal/background_service/in_memory_download.h
5+
@@ -19,6 +19,7 @@
6+
#include "components/download/internal/background_service/blob_task_proxy.h"
7+
#include "components/download/public/background_service/blob_context_getter_factory.h"
8+
#include "components/download/public/background_service/download_params.h"
9+
+#include "components/download/public/background_service/url_loader_factory_getter.h"
10+
#include "services/network/public/cpp/simple_url_loader.h"
11+
#include "services/network/public/cpp/simple_url_loader_stream_consumer.h"
12+
#include "services/network/public/mojom/url_loader_factory.mojom.h"
13+
@@ -58,6 +59,9 @@ class InMemoryDownload {
14+
// Retrieves the blob storage context getter.
15+
virtual void RetrieveBlobContextGetter(
16+
BlobContextGetterCallback callback) = 0;
17+
+ // Retrieves browser context specific URLLoaderFactory
18+
+ virtual void RetrievedURLLoaderFactory(
19+
+ URLLoaderFactoryGetterCallback callback) = 0;
20+
21+
protected:
22+
virtual ~Delegate() = default;
23+
@@ -81,6 +85,9 @@ class InMemoryDownload {
24+
// The object is just created.
25+
INITIAL,
26+
27+
+ // Waiting to retrieve URLLoaderFactory.
28+
+ RETRIEVE_URL_LOADER_FACTIORY,
29+
+
30+
// Waiting to retrieve BlobStorageContextGetter.
31+
RETRIEVE_BLOB_CONTEXT,
32+
33+
@@ -172,7 +179,6 @@ class InMemoryDownloadImpl : public network::SimpleURLLoaderStreamConsumer,
34+
scoped_refptr<network::ResourceRequestBody> request_body,
35+
const net::NetworkTrafficAnnotationTag& traffic_annotation,
36+
Delegate* delegate,
37+
- network::mojom::URLLoaderFactory* url_loader_factory,
38+
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner);
39+
40+
InMemoryDownloadImpl(const InMemoryDownloadImpl&) = delete;
41+
@@ -186,6 +192,10 @@ class InMemoryDownloadImpl : public network::SimpleURLLoaderStreamConsumer,
42+
void Pause() override;
43+
void Resume() override;
44+
45+
+ // Called when browser context specific URLLoaderFactory is ready to use.
46+
+ void OnRetrievedURLLoaderFactory(
47+
+ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
48+
+
49+
// Called when the BlobStorageContextGetter is ready to use.
50+
void OnRetrievedBlobContextGetter(BlobContextGetter blob_context_getter);
51+
52+
@@ -239,7 +249,7 @@ class InMemoryDownloadImpl : public network::SimpleURLLoaderStreamConsumer,
53+
std::unique_ptr<network::SimpleURLLoader> loader_;
54+
55+
// Used to handle network response.
56+
- raw_ptr<network::mojom::URLLoaderFactory> url_loader_factory_;
57+
+ scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
58+
59+
// Worker that does blob related task on IO thread.
60+
std::unique_ptr<BlobTaskProxy> blob_task_proxy_;

0 commit comments

Comments
 (0)