refactor: decouple api::WebRequest from api::BrowserContext (#48848)

* refactor: rename api::Session::CreateFrom() to api::Session::FromOrCreate()

This is both clearer and more consistent with other classes

* refactor: add Session::FromOrCreate(content::BrowserContext*)

* refactor: reimplement api::WebRequest::FromOrCreate() using api::Session::FromOrCreate()

* refactor: use base::PassKey to ensure WebRequest is only instantiated by Session

* refactor: remove WebRequest::From()

no longer needed; Session already guarantees uniqueness

* refactor: remove unused isolate arg from WebRequest ctor

* refactor: do not attach WebRequest to BrowserContext

no longer needed now that access goes through Session
This commit is contained in:
Charles Kerr
2025-11-09 08:07:25 -06:00
committed by GitHub
parent ab0ff5dffc
commit 519187db1d
5 changed files with 44 additions and 72 deletions

View File

@@ -72,14 +72,6 @@ namespace electron::api {
namespace {
const char kUserDataKey[] = "WebRequest";
// BrowserContext <=> WebRequest relationship.
struct UserData : public base::SupportsUserData::Data {
explicit UserData(WebRequest* data) : data(data) {}
raw_ptr<WebRequest> data;
};
extensions::WebRequestResourceType ParseResourceType(std::string_view value) {
if (auto iter = ResourceTypes.find(value); iter != ResourceTypes.end())
return iter->second;
@@ -312,15 +304,8 @@ WebRequest::ResponseListenerInfo::ResponseListenerInfo(
WebRequest::ResponseListenerInfo::ResponseListenerInfo() = default;
WebRequest::ResponseListenerInfo::~ResponseListenerInfo() = default;
WebRequest::WebRequest(v8::Isolate* isolate,
content::BrowserContext* browser_context)
: browser_context_(browser_context) {
browser_context_->SetUserData(kUserDataKey, std::make_unique<UserData>(this));
}
WebRequest::~WebRequest() {
browser_context_->RemoveUserData(kUserDataKey);
}
WebRequest::WebRequest(base::PassKey<Session>) {}
WebRequest::~WebRequest() = default;
gin::ObjectTemplateBuilder WebRequest::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
@@ -736,40 +721,19 @@ void WebRequest::HandleSimpleEvent(SimpleEvent event,
gin_helper::Handle<WebRequest> WebRequest::FromOrCreate(
v8::Isolate* isolate,
content::BrowserContext* browser_context) {
gin_helper::Handle<WebRequest> handle = From(isolate, browser_context);
if (handle.IsEmpty()) {
// Make sure the |Session| object has the |webRequest| property created.
v8::Local<v8::Value> web_request =
Session::CreateFrom(
isolate, static_cast<ElectronBrowserContext*>(browser_context))
->WebRequest(isolate);
gin::ConvertFromV8(isolate, web_request, &handle);
}
v8::Local<v8::Value> web_request =
Session::FromOrCreate(isolate, browser_context)->WebRequest(isolate);
gin_helper::Handle<WebRequest> handle;
gin::ConvertFromV8(isolate, web_request, &handle);
DCHECK(!handle.IsEmpty());
return handle;
}
// static
gin_helper::Handle<WebRequest> WebRequest::Create(
v8::Isolate* isolate,
content::BrowserContext* browser_context) {
DCHECK(From(isolate, browser_context).IsEmpty())
<< "WebRequest already created";
return gin_helper::CreateHandle(isolate,
new WebRequest(isolate, browser_context));
}
// static
gin_helper::Handle<WebRequest> WebRequest::From(
v8::Isolate* isolate,
content::BrowserContext* browser_context) {
if (!browser_context)
return {};
auto* user_data =
static_cast<UserData*>(browser_context->GetUserData(kUserDataKey));
if (!user_data)
return {};
return gin_helper::CreateHandle(isolate, user_data->data.get());
base::PassKey<Session> passkey,
v8::Isolate* isolate) {
return gin_helper::CreateHandle(isolate, new WebRequest{std::move(passkey)});
}
} // namespace electron::api