refactor: allocate api::Session on cpp heap (#48141)

This commit is contained in:
Robo 2025-08-25 18:52:06 +09:00 committed by GitHub
commit 3ccb1bc0a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 632 additions and 293 deletions

View file

@ -44,68 +44,80 @@ void ElectronApiIPCHandlerImpl::OnConnectionError() {
void ElectronApiIPCHandlerImpl::Message(bool internal,
const std::string& channel,
blink::CloneableMessage arguments) {
auto* session = GetSession();
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event = MakeIPCEvent(isolate, session, internal);
if (event.IsEmpty())
return;
session->Message(event, channel, std::move(arguments));
gin::WeakCell<api::Session>* session = GetSession();
if (session && session->Get()) {
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event = MakeIPCEvent(isolate, session->Get(), internal);
if (event.IsEmpty())
return;
session->Get()->Message(event, channel, std::move(arguments));
}
}
void ElectronApiIPCHandlerImpl::Invoke(bool internal,
const std::string& channel,
blink::CloneableMessage arguments,
InvokeCallback callback) {
auto* session = GetSession();
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event = MakeIPCEvent(isolate, session, internal, std::move(callback));
if (event.IsEmpty())
return;
session->Invoke(event, channel, std::move(arguments));
gin::WeakCell<api::Session>* session = GetSession();
if (session && session->Get()) {
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event =
MakeIPCEvent(isolate, session->Get(), internal, std::move(callback));
if (event.IsEmpty())
return;
session->Get()->Invoke(event, channel, std::move(arguments));
}
}
void ElectronApiIPCHandlerImpl::ReceivePostMessage(
const std::string& channel,
blink::TransferableMessage message) {
auto* session = GetSession();
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event = MakeIPCEvent(isolate, session, false);
if (event.IsEmpty())
return;
session->ReceivePostMessage(event, channel, std::move(message));
gin::WeakCell<api::Session>* session = GetSession();
if (session && session->Get()) {
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event = MakeIPCEvent(isolate, session->Get(), false);
if (event.IsEmpty())
return;
session->Get()->ReceivePostMessage(event, channel, std::move(message));
}
}
void ElectronApiIPCHandlerImpl::MessageSync(bool internal,
const std::string& channel,
blink::CloneableMessage arguments,
MessageSyncCallback callback) {
auto* session = GetSession();
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event = MakeIPCEvent(isolate, session, internal, std::move(callback));
if (event.IsEmpty())
return;
session->MessageSync(event, channel, std::move(arguments));
gin::WeakCell<api::Session>* session = GetSession();
if (session && session->Get()) {
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event =
MakeIPCEvent(isolate, session->Get(), internal, std::move(callback));
if (event.IsEmpty())
return;
session->Get()->MessageSync(event, channel, std::move(arguments));
}
}
void ElectronApiIPCHandlerImpl::MessageHost(const std::string& channel,
blink::CloneableMessage arguments) {
auto* session = GetSession();
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event = MakeIPCEvent(isolate, session, false);
if (event.IsEmpty())
return;
session->MessageHost(event, channel, std::move(arguments));
gin::WeakCell<api::Session>* session = GetSession();
if (session && session->Get()) {
v8::Isolate* isolate = electron::JavascriptEnvironment::GetIsolate();
v8::HandleScope handle_scope(isolate);
auto event = MakeIPCEvent(isolate, session->Get(), false);
if (event.IsEmpty())
return;
session->Get()->MessageHost(event, channel, std::move(arguments));
}
}
content::RenderFrameHost* ElectronApiIPCHandlerImpl::GetRenderFrameHost() {
return content::RenderFrameHost::FromID(render_frame_host_id_);
}
api::Session* ElectronApiIPCHandlerImpl::GetSession() {
gin::WeakCell<api::Session>* ElectronApiIPCHandlerImpl::GetSession() {
auto* rfh = GetRenderFrameHost();
return rfh ? api::Session::FromBrowserContext(rfh->GetBrowserContext())
: nullptr;