0

Use a PassKey to restrict access to URLRequest's ctor

This allows us to make the URLRequest ctor public (to use
std::make_unique instead of new & base::WrapUnique) without allowing
any callers outside of URLRequestContext. It also allows us to remove
the `friend` directive.

Change-Id: I2d0ed2042e7a17246c736510d7d9315827e66d6c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4152592
Commit-Queue: Matt Menke <mmenke@chromium.org>
Reviewed-by: Matt Menke <mmenke@chromium.org>
Auto-Submit: Chris Fredrickson <cfredric@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1090970}
This commit is contained in:
Chris Fredrickson
2023-01-10 20:20:14 +00:00
committed by Chromium LUCI CQ
parent 761e18164c
commit 03e7a8a044
3 changed files with 18 additions and 14 deletions

@ -15,6 +15,7 @@
#include "base/strings/utf_string_conversions.h"
#include "base/synchronization/lock.h"
#include "base/task/single_thread_task_runner.h"
#include "base/types/pass_key.h"
#include "base/values.h"
#include "net/base/auth.h"
#include "net/base/io_buffer.h"
@ -574,7 +575,8 @@ void URLRequest::Start() {
///////////////////////////////////////////////////////////////////////////////
URLRequest::URLRequest(const GURL& url,
URLRequest::URLRequest(base::PassKey<URLRequestContext> pass_key,
const GURL& url,
RequestPriority priority,
Delegate* delegate,
const URLRequestContext* context,

@ -18,6 +18,7 @@
#include "base/supports_user_data.h"
#include "base/threading/thread_checker.h"
#include "base/time/time.h"
#include "base/types/pass_key.h"
#include "net/base/auth.h"
#include "net/base/completion_repeating_callback.h"
#include "net/base/idempotency.h"
@ -206,6 +207,16 @@ class NET_EXPORT URLRequest : public base::SupportsUserData {
virtual ~Delegate() = default;
};
// URLRequests are always created by calling URLRequestContext::CreateRequest.
URLRequest(base::PassKey<URLRequestContext> pass_key,
const GURL& url,
RequestPriority priority,
Delegate* delegate,
const URLRequestContext* context,
NetworkTrafficAnnotationTag traffic_annotation,
bool is_for_websockets,
absl::optional<net::NetLogSource> net_log_source);
URLRequest(const URLRequest&) = delete;
URLRequest& operator=(const URLRequest&) = delete;
@ -861,21 +872,11 @@ class NET_EXPORT URLRequest : public base::SupportsUserData {
private:
friend class URLRequestJob;
friend class URLRequestContext;
// For testing purposes.
// TODO(maksims): Remove this.
friend class TestNetworkDelegate;
// URLRequests are always created by calling URLRequestContext::CreateRequest.
URLRequest(const GURL& url,
RequestPriority priority,
Delegate* delegate,
const URLRequestContext* context,
NetworkTrafficAnnotationTag traffic_annotation,
bool is_for_websockets,
absl::optional<net::NetLogSource> net_log_source);
// Resumes or blocks a request paused by the NetworkDelegate::OnBeforeRequest
// handler. If |blocked| is true, the request is blocked and an error page is
// returned indicating so. This should only be called after Start is called

@ -13,6 +13,7 @@
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/string_util.h"
#include "base/types/pass_key.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "net/base/http_user_agent_settings.h"
@ -125,9 +126,9 @@ std::unique_ptr<URLRequest> URLRequestContext::CreateRequest(
NetworkTrafficAnnotationTag traffic_annotation,
bool is_for_websockets,
const absl::optional<net::NetLogSource> net_log_source) const {
return base::WrapUnique(new URLRequest(url, priority, delegate, this,
traffic_annotation, is_for_websockets,
net_log_source));
return std::make_unique<URLRequest>(
base::PassKey<URLRequestContext>(), url, priority, delegate, this,
traffic_annotation, is_for_websockets, net_log_source);
}
void URLRequestContext::AssertNoURLRequests() const {