0

[CodeHealth] Deprecate SimpleURLLoader unique_ptr string

This CL provides methods that communicate the body response of a request
using optional<string>, while marking as deprecated the existing methods
that rely on unique_ptr<string>.

In general, unique_ptr<string> is less efficient than merely using an
optional<string>, and it is also less ergonomic to use. The occurrence
of unique_ptr<string> in the codebase is usually a historical quirk of
unique_ptr being used as a replacement for optional.

Bug: 1420528
Change-Id: I4ca52f7fa0debc15ac6fe276a4f3deac9e2035ce
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5027601
Reviewed-by: Scott Violet <sky@chromium.org>
Commit-Queue: Claudio DeSouza <cdesouza@chromium.org>
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Reviewed-by: Colin Blundell <blundell@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1225550}
This commit is contained in:
Claudio DeSouza
2023-11-16 16:57:26 +00:00
committed by Chromium LUCI CQ
parent a0c4f2392a
commit fe141dc6e1
10 changed files with 80 additions and 30 deletions

@ -326,10 +326,11 @@ class BackdropURLLoader {
// Starts downloading the proto. |request_body| is a serialized proto and
// will be used as the upload body if it is a POST request.
void Start(std::unique_ptr<network::ResourceRequest> resource_request,
const absl::optional<std::string>& request_body,
const net::NetworkTrafficAnnotationTag& traffic_annotation,
network::SimpleURLLoader::BodyAsStringCallback callback) {
void Start(
std::unique_ptr<network::ResourceRequest> resource_request,
const absl::optional<std::string>& request_body,
const net::NetworkTrafficAnnotationTag& traffic_annotation,
network::SimpleURLLoader::BodyAsStringCallbackDeprecated callback) {
// No ongoing downloading task.
DCHECK(!simple_loader_);
@ -350,8 +351,9 @@ class BackdropURLLoader {
private:
// Called when the download completes.
void OnUrlDownloaded(network::SimpleURLLoader::BodyAsStringCallback callback,
std::unique_ptr<std::string> response_body) {
void OnUrlDownloaded(
network::SimpleURLLoader::BodyAsStringCallbackDeprecated callback,
std::unique_ptr<std::string> response_body) {
loader_factory_.reset();
if (simple_loader_->NetError() == net::OK && response_body) {

@ -197,9 +197,10 @@ void EnhancedNetworkTtsImpl::ProcessNextServerRequest() {
}
const ServerRequestList::iterator first_request_it = server_requests_.begin();
network::SimpleURLLoader::BodyAsStringCallback body_as_string_callback =
base::BindOnce(&EnhancedNetworkTtsImpl::OnServerResponseReceived,
weak_factory_.GetWeakPtr(), first_request_it);
network::SimpleURLLoader::BodyAsStringCallbackDeprecated
body_as_string_callback =
base::BindOnce(&EnhancedNetworkTtsImpl::OnServerResponseReceived,
weak_factory_.GetWeakPtr(), first_request_it);
server_requests_.front().url_loader->DownloadToString(
url_loader_factory_.get(), std::move(body_as_string_callback),
kEnhancedNetworkTtsMaxResponseSize);

@ -50,8 +50,9 @@ void BitmapFetcher::Init(net::ReferrerPolicy referrer_policy,
}
void BitmapFetcher::Start(network::mojom::URLLoaderFactory* loader_factory) {
network::SimpleURLLoader::BodyAsStringCallback callback = base::BindOnce(
&BitmapFetcher::OnSimpleLoaderComplete, weak_factory_.GetWeakPtr());
network::SimpleURLLoader::BodyAsStringCallbackDeprecated callback =
base::BindOnce(&BitmapFetcher::OnSimpleLoaderComplete,
weak_factory_.GetWeakPtr());
// Early exit to handle data URLs.
if (url_.SchemeIs(url::kDataScheme)) {

@ -65,8 +65,9 @@ void CaptivePortalDetector::StartProbe(
simple_loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
traffic_annotation);
simple_loader_->SetAllowHttpErrorResults(true);
network::SimpleURLLoader::BodyAsStringCallback callback = base::BindOnce(
&CaptivePortalDetector::OnSimpleLoaderComplete, base::Unretained(this));
network::SimpleURLLoader::BodyAsStringCallbackDeprecated callback =
base::BindOnce(&CaptivePortalDetector::OnSimpleLoaderComplete,
base::Unretained(this));
state_ = State::kProbe;
simple_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
loader_factory_, std::move(callback));

@ -251,10 +251,10 @@ void EndpointFetcher::PerformRequest(
network::SimpleURLLoader::RETRY_ON_5XX);
simple_url_loader_->SetTimeoutDuration(base::Milliseconds(timeout_ms_));
simple_url_loader_->SetAllowHttpErrorResults(true);
network::SimpleURLLoader::BodyAsStringCallback body_as_string_callback =
base::BindOnce(&EndpointFetcher::OnResponseFetched,
weak_ptr_factory_.GetWeakPtr(),
std::move(endpoint_fetcher_callback));
network::SimpleURLLoader::BodyAsStringCallbackDeprecated
body_as_string_callback = base::BindOnce(
&EndpointFetcher::OnResponseFetched, weak_ptr_factory_.GetWeakPtr(),
std::move(endpoint_fetcher_callback));
simple_url_loader_->DownloadToString(
url_loader_factory_.get(), std::move(body_as_string_callback),
network::SimpleURLLoader::kMaxBoundedStringDownloadSize);

@ -14,7 +14,7 @@ SimpleURLLoaderTestHelper::SimpleURLLoaderTestHelper() {}
SimpleURLLoaderTestHelper::~SimpleURLLoaderTestHelper() {}
network::SimpleURLLoader::BodyAsStringCallback
network::SimpleURLLoader::BodyAsStringCallbackDeprecated
SimpleURLLoaderTestHelper::GetCallback() {
DCHECK(!callback_created_);
callback_created_ = true;

@ -27,9 +27,9 @@ class SimpleURLLoaderTestHelper {
~SimpleURLLoaderTestHelper();
// Returns a BodyAsStringCallback for use with a SimpleURLLoader. May be
// called only once.
network::SimpleURLLoader::BodyAsStringCallback GetCallback();
// Returns a BodyAsStringCallbackDeprecated for use with a SimpleURLLoader.
// May be called only once.
network::SimpleURLLoader::BodyAsStringCallbackDeprecated GetCallback();
// Waits until the callback returned by GetCallback() is invoked.
void WaitForCallback();

@ -40,10 +40,10 @@ void InitializeSharedFactoryOnIOThread(
run_loop.Run();
}
network::SimpleURLLoader::BodyAsStringCallback RunOnUIThread(
network::SimpleURLLoader::BodyAsStringCallback ui_callback) {
network::SimpleURLLoader::BodyAsStringCallbackDeprecated RunOnUIThread(
network::SimpleURLLoader::BodyAsStringCallbackDeprecated ui_callback) {
return base::BindOnce(
[](network::SimpleURLLoader::BodyAsStringCallback callback,
[](network::SimpleURLLoader::BodyAsStringCallbackDeprecated callback,
std::unique_ptr<std::string> response_body) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
GetUIThreadTaskRunner({})->PostTask(
@ -110,7 +110,7 @@ int IOThreadSharedURLLoaderFactoryOwner::LoadBasicRequestOnIOThread(
FROM_HERE, base::BindOnce(
[](network::SimpleURLLoader* loader,
network::mojom::URLLoaderFactory* factory,
network::SimpleURLLoader::BodyAsStringCallback
network::SimpleURLLoader::BodyAsStringCallbackDeprecated
body_as_string_callback) {
loader->DownloadToStringOfUnboundedSizeUntilCrashAndDie(
factory, std::move(body_as_string_callback));

@ -58,6 +58,18 @@ namespace {
// Used by tests to override the tick clock for the timeout timer.
const base::TickClock* timeout_tick_clock_ = nullptr;
// A temporary util adapter to wrap the download callback with the response
// body, and to hop the string content from a unique_ptr<string> into a
// optional<string>.
void GetFromUniquePtrToOptional(
SimpleURLLoader::BodyAsStringCallback body_as_string_callback,
std::unique_ptr<std::string> response_body) {
std::move(body_as_string_callback)
.Run(response_body
? std::make_optional<std::string>(std::move(*response_body))
: std::nullopt);
}
// This file contains SimpleURLLoaderImpl, several BodyHandler implementations,
// BodyReader, and StringUploadDataPipeGetter.
//
@ -210,9 +222,15 @@ class SimpleURLLoaderImpl : public SimpleURLLoader,
~SimpleURLLoaderImpl() override;
// SimpleURLLoader implementation.
void DownloadToString(mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallbackDeprecated body_as_string_callback,
size_t max_body_size) override;
void DownloadToString(mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallback body_as_string_callback,
size_t max_body_size) override;
void DownloadToStringOfUnboundedSizeUntilCrashAndDie(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallbackDeprecated body_as_string_callback) override;
void DownloadToStringOfUnboundedSizeUntilCrashAndDie(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallback body_as_string_callback) override;
@ -681,7 +699,7 @@ class SaveToStringBodyHandler : public BodyHandler,
SaveToStringBodyHandler(
SimpleURLLoaderImpl* simple_url_loader,
bool want_download_progress,
SimpleURLLoader::BodyAsStringCallback body_as_string_callback,
SimpleURLLoader::BodyAsStringCallbackDeprecated body_as_string_callback,
int64_t max_body_size)
: BodyHandler(simple_url_loader, want_download_progress),
max_body_size_(max_body_size),
@ -742,7 +760,7 @@ class SaveToStringBodyHandler : public BodyHandler,
const int64_t max_body_size_;
std::unique_ptr<std::string> body_;
SimpleURLLoader::BodyAsStringCallback body_as_string_callback_;
SimpleURLLoader::BodyAsStringCallbackDeprecated body_as_string_callback_;
const base::Location url_loader_created_from_;
@ -1260,7 +1278,7 @@ SimpleURLLoaderImpl::~SimpleURLLoaderImpl() {}
void SimpleURLLoaderImpl::DownloadToString(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallback body_as_string_callback,
BodyAsStringCallbackDeprecated body_as_string_callback,
size_t max_body_size) {
DCHECK_LE(max_body_size, kMaxBoundedStringDownloadSize);
body_handler_ = std::make_unique<SaveToStringBodyHandler>(
@ -1269,9 +1287,19 @@ void SimpleURLLoaderImpl::DownloadToString(
Start(url_loader_factory);
}
void SimpleURLLoaderImpl::DownloadToString(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallback body_as_string_callback,
size_t max_body_size) {
DownloadToString(url_loader_factory,
base::BindOnce(GetFromUniquePtrToOptional,
std::move(body_as_string_callback)),
max_body_size);
}
void SimpleURLLoaderImpl::DownloadToStringOfUnboundedSizeUntilCrashAndDie(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallback body_as_string_callback) {
BodyAsStringCallbackDeprecated body_as_string_callback) {
body_handler_ = std::make_unique<SaveToStringBodyHandler>(
this, !on_download_progress_callback_.is_null(),
std::move(body_as_string_callback),
@ -1281,6 +1309,14 @@ void SimpleURLLoaderImpl::DownloadToStringOfUnboundedSizeUntilCrashAndDie(
Start(url_loader_factory);
}
void SimpleURLLoaderImpl::DownloadToStringOfUnboundedSizeUntilCrashAndDie(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallback body_as_string_callback) {
DownloadToStringOfUnboundedSizeUntilCrashAndDie(
url_loader_factory, base::BindOnce(GetFromUniquePtrToOptional,
std::move(body_as_string_callback)));
}
void SimpleURLLoaderImpl::DownloadHeadersOnly(
mojom::URLLoaderFactory* url_loader_factory,
HeadersOnlyCallback headers_only_callback) {

@ -97,8 +97,10 @@ class COMPONENT_EXPORT(NETWORK_CPP) SimpleURLLoader {
// like HTTP_OK, which could happen if there's an interruption before the
// full response body is received. It is safe to delete the SimpleURLLoader
// during the callback.
using BodyAsStringCallback =
using BodyAsStringCallbackDeprecated =
base::OnceCallback<void(std::unique_ptr<std::string> response_body)>;
using BodyAsStringCallback =
base::OnceCallback<void(std::optional<std::string> response_body)>;
// Callback used when ignoring the response body. |headers| are the received
// HTTP headers, or nullptr if none were received. It is safe to delete the
@ -172,6 +174,10 @@ class COMPONENT_EXPORT(NETWORK_CPP) SimpleURLLoader {
// invoked on completion. Deleting the SimpleURLLoader before the callback is
// invoked will result in cancelling the request, and the callback will not be
// called.
virtual void DownloadToString(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallbackDeprecated body_as_string_callback,
size_t max_body_size) = 0;
virtual void DownloadToString(mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallback body_as_string_callback,
size_t max_body_size) = 0;
@ -181,6 +187,9 @@ class COMPONENT_EXPORT(NETWORK_CPP) SimpleURLLoader {
// exceeded. It's recommended consumers use one of the other download methods
// instead (DownloadToString if the body is expected to be of reasonable
// length, or DownloadToFile otherwise).
virtual void DownloadToStringOfUnboundedSizeUntilCrashAndDie(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallbackDeprecated body_as_string_callback) = 0;
virtual void DownloadToStringOfUnboundedSizeUntilCrashAndDie(
mojom::URLLoaderFactory* url_loader_factory,
BodyAsStringCallback body_as_string_callback) = 0;