electron/shell/browser/electron_api_sw_ipc_handler_impl.cc

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

213 lines
7.4 KiB
C++
Raw Normal View History

// Copyright (c) 2025 Salesforce, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "shell/browser/electron_api_sw_ipc_handler_impl.h"
#include <utility>
#include "base/containers/unique_ptr_adapters.h"
chore: bump chromium to 139.0.7256.0 (38-x-y) (#47615) * chore: bump chromium in DEPS to 139.0.7242.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: update render_widget_host_view_mac.patch no code changes; just updating patch context Do a cleanup pass on the history swiper code | https://chromium-review.googlesource.com/c/chromium/src/+/6604367 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update mas_avoid_private_macos_api_usage.patch.patch no code changes; just updating patch context [tracing] Delete base/trace_event/base_tracing.h | https://chromium-review.googlesource.com/c/chromium/src/+/6624012 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update chore_provide_iswebcontentscreationoverridden_with_full_params.patch no manual changes; just updating patch context [ActorFramework] Refactor Actor Task Management | https://chromium-review.googlesource.com/c/chromium/src/+/6618684 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update fix_move_autopipsettingshelper_behind_branding_buildflag.patch [pip] Tuck picture-in-picture windows when a file dialog is open | https://chromium-review.googlesource.com/c/chromium/src/+/6449682 Reland "[document pip] Restrict the size that a website can request" | https://chromium-review.googlesource.com/c/chromium/src/+/6372104 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update feat_corner_smoothing_css_rule_and_blink_painting.patch Xref: corner-shape: constraint radii based on opposite corner overlap | https://chromium-review.googlesource.com/c/chromium/src/+/6592572 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update revert_code_health_clean_up_stale_macwebcontentsocclusion.patch no manual changes; just updating patch context Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: update fix_rename_sqlite_win32_exports_to_avoid_conflicts_with_node_js.patch no code changes; just updating patch context Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: e patches all Co-authored-by: Charles Kerr <charles@charleskerr.com> * Plumb Verify2QwacBinding and hook it up in QwacWebContentsObserver https://chromium-review.googlesource.com/c/chromium/src/+/6624719 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Remove host delegate OnMainFrameCreatedForBackgroundPage https://chromium-review.googlesource.com/c/chromium/src/+/6631123 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Extensions: Rename GetResourceURL to ResolveExtensionURL https://chromium-review.googlesource.com/c/chromium/src/+/6625053 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Consolidate NativeFrameViewMac https://chromium-review.googlesource.com/c/chromium/src/+/6614239 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * ICWYU Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Remove dead code WidgetAXTreeIDMap https://chromium-review.googlesource.com/c/chromium/src/+/6619701 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Reland "extensions: Add `WillPrepareForEvaluation` to setup MojoJS" https://chromium-review.googlesource.com/c/chromium/src/+/6630056 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * NavigationThrottleRunner2: Remove MaybeAddThrottle https://chromium-review.googlesource.com/c/chromium/src/+/6628079 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Tuck picture-in-picture windows when a file dialog is open https://chromium-review.googlesource.com/c/chromium/src/+/6449682 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * build: fix snapshot_blob.bin build error xref: https://issues.chromium.org/issues/416540976 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: e patches all Co-authored-by: Charles Kerr <charles@charleskerr.com> * build: freeup disk space on macos Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: bump chromium in DEPS to 139.0.7244.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: update printing.patch no manual changes; just updating patch context Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: remove upstreamed ignore_parse_errors_for_resolveshortcutproperties.patch Prevent Windows crash on unexpected shortcut type | https://chromium-review.googlesource.com/c/chromium/src/+/6633298 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: e patches all Co-authored-by: Charles Kerr <charles@charleskerr.com> * Revert "Reland "extensions: Add `WillPrepareForEvaluation` to setup MojoJS"" This reverts commit 77c4f967a637f7e8970114f91311f9fddede0f7c. Revert CL for the high confidence crash culprit for http://crash/28f897bb9743dfe0 | https://chromium-review.googlesource.com/c/chromium/src/+/6641819 Co-authored-by: Charles Kerr <charles@charleskerr.com> * Fix spec's expected base64-encoded PNG strings to match upstream changes. [rust png] Enable by default. | https://chromium-review.googlesource.com/c/chromium/src/+/6085801 Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: bump chromium in DEPS to 139.0.7246.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: e patches all Co-authored-by: Charles Kerr <charles@charleskerr.com> * chore: bump chromium in DEPS to 139.0.7248.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: update patches Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * siso: Enable Siso by default for non-Google builds https://chromium-review.googlesource.com/c/chromium/src/+/6638830 Disabling for now until we are ready to build siso on all platforms. Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Revert "revert Don't use static variable for UseExternalPopupMenus" This reverts commit e91e3894e6c34cc0ffe69ed45417c0ebec882fb1. Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Update mac_sdk_min to match minimum required SDK version https://chromium-review.googlesource.com/c/chromium/src/+/6493969 (cherry picked from commit 3e7cbe912d8fe1062d68ed06968aaee22013985f) Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Use default window styling on Mac https://chromium-review.googlesource.com/c/chromium/src/+/6648665 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Reland "Force the unintentional renderer process creation check by default" https://chromium-review.googlesource.com/c/chromium/src/+/6626905 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * fixup: Reland "Force the unintentional renderer process creation check by default https://chromium-review.googlesource.com/c/chromium/src/+/6626905 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: bump chromium in DEPS to 139.0.7249.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * fixup: Reland "Force the unintentional renderer process creation check by default https://chromium-review.googlesource.com/c/chromium/src/+/6626905 Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: update patches Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * chore: bump chromium in DEPS to 139.0.7250.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: bump chromium in DEPS to 139.0.7252.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: bump chromium in DEPS to 139.0.7254.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * 6638187: browser level TOCTOU check for coordinate target https://chromium-review.googlesource.com/c/chromium/src/+/6638187 Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: fixup patch indices Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: add missing base/notimplemented includes Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * 6652910: [Frame Cleanup] Push down/hide implementation-specific API https://chromium-review.googlesource.com/c/chromium/src/+/6652910 Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: bump chromium in DEPS to 139.0.7256.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * chore: fix lint Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * fixup! 6652910: [Frame Cleanup] Push down/hide implementation-specific API Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * fix: move HandleScope location Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> * chore: bump chromium in DEPS to 139.0.7258.0 Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> * fixup! [NonClientFrameView] Consolidate NativeFrameViewMac Co-authored-by: deepak1556 <hop2deep@gmail.com> * Revert "chore: bump chromium in DEPS to 139.0.7258.0" This reverts commit 264b2e934f4b2705c47d9761010052b95d9dd5de. Co-authored-by: deepak1556 <hop2deep@gmail.com> * chore: update patches --------- Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com> Co-authored-by: Charles Kerr <charles@charleskerr.com> Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> Co-authored-by: deepak1556 <hop2deep@gmail.com> Co-authored-by: patchup[bot] <73610968+patchup[bot]@users.noreply.github.com>
2025-06-30 12:29:54 -04:00
#include "base/notimplemented.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "shell/browser/api/electron_api_session.h"
#include "shell/browser/electron_browser_context.h"
#include "shell/browser/javascript_environment.h"
#include "shell/common/gin_helper/dictionary.h"
namespace electron {
namespace {
const void* const kUserDataKey = &kUserDataKey;
class ServiceWorkerIPCList : public base::SupportsUserData::Data {
public:
std::vector<std::unique_ptr<ElectronApiSWIPCHandlerImpl>> list;
static ServiceWorkerIPCList* Get(
content::RenderProcessHost* render_process_host,
bool create_if_not_exists) {
auto* service_worker_ipc_list = static_cast<ServiceWorkerIPCList*>(
render_process_host->GetUserData(kUserDataKey));
if (!service_worker_ipc_list && !create_if_not_exists) {
return nullptr;
}
if (!service_worker_ipc_list) {
auto new_ipc_list = std::make_unique<ServiceWorkerIPCList>();
service_worker_ipc_list = new_ipc_list.get();
render_process_host->SetUserData(kUserDataKey, std::move(new_ipc_list));
}
return service_worker_ipc_list;
}
};
} // namespace
ElectronApiSWIPCHandlerImpl::ElectronApiSWIPCHandlerImpl(
content::RenderProcessHost* render_process_host,
int64_t version_id,
mojo::PendingAssociatedReceiver<mojom::ElectronApiIPC> receiver)
: render_process_host_(render_process_host), version_id_(version_id) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
receiver_.Bind(std::move(receiver));
receiver_.set_disconnect_handler(
base::BindOnce(&ElectronApiSWIPCHandlerImpl::RemoteDisconnected,
base::Unretained(this)));
render_process_host_->AddObserver(this);
}
ElectronApiSWIPCHandlerImpl::~ElectronApiSWIPCHandlerImpl() {
render_process_host_->RemoveObserver(this);
}
void ElectronApiSWIPCHandlerImpl::RemoteDisconnected() {
receiver_.reset();
Destroy();
}
void ElectronApiSWIPCHandlerImpl::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));
}
void ElectronApiSWIPCHandlerImpl::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));
}
void ElectronApiSWIPCHandlerImpl::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));
}
void ElectronApiSWIPCHandlerImpl::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));
}
void ElectronApiSWIPCHandlerImpl::MessageHost(
const std::string& channel,
blink::CloneableMessage arguments) {
NOTIMPLEMENTED(); // Service workers have no <webview>
}
ElectronBrowserContext* ElectronApiSWIPCHandlerImpl::GetBrowserContext() {
auto* browser_context = static_cast<ElectronBrowserContext*>(
render_process_host_->GetBrowserContext());
return browser_context;
}
api::Session* ElectronApiSWIPCHandlerImpl::GetSession() {
return api::Session::FromBrowserContext(GetBrowserContext());
}
gin::Handle<gin_helper::internal::Event>
ElectronApiSWIPCHandlerImpl::MakeIPCEvent(
v8::Isolate* isolate,
api::Session* session,
bool internal,
electron::mojom::ElectronApiIPC::InvokeCallback callback) {
if (!session) {
if (callback) {
// We must always invoke the callback if present.
gin_helper::internal::ReplyChannel::Create(isolate, std::move(callback))
->SendError("Session does not exist");
}
return {};
}
gin::Handle<gin_helper::internal::Event> event =
gin_helper::internal::Event::New(isolate);
v8::Local<v8::Object> event_object = event.ToV8().As<v8::Object>();
gin_helper::Dictionary dict(isolate, event_object);
dict.Set("type", "service-worker");
dict.Set("versionId", version_id_);
dict.Set("processId", render_process_host_->GetID().GetUnsafeValue());
// Set session to provide context for getting preloads
dict.Set("session", session);
if (callback)
dict.Set("_replyChannel", gin_helper::internal::ReplyChannel::Create(
isolate, std::move(callback)));
if (internal)
dict.SetHidden("internal", internal);
return event;
}
void ElectronApiSWIPCHandlerImpl::Destroy() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
auto* service_worker_ipc_list = ServiceWorkerIPCList::Get(
render_process_host_, /*create_if_not_exists=*/false);
CHECK(service_worker_ipc_list);
// std::erase_if will lead to a call to the destructor for this object.
std::erase_if(service_worker_ipc_list->list, base::MatchesUniquePtr(this));
}
void ElectronApiSWIPCHandlerImpl::RenderProcessExited(
content::RenderProcessHost* host,
const content::ChildProcessTerminationInfo& info) {
CHECK_EQ(host, render_process_host_);
// TODO(crbug.com/1407197): Investigate clearing the user data from
// RenderProcessHostImpl::Cleanup.
Destroy();
// This instance has now been deleted.
}
// static
void ElectronApiSWIPCHandlerImpl::BindReceiver(
int render_process_id,
int64_t version_id,
mojo::PendingAssociatedReceiver<mojom::ElectronApiIPC> receiver) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
auto* render_process_host =
content::RenderProcessHost::FromID(render_process_id);
if (!render_process_host) {
return;
}
auto* service_worker_ipc_list = ServiceWorkerIPCList::Get(
render_process_host, /*create_if_not_exists=*/true);
service_worker_ipc_list->list.push_back(
std::make_unique<ElectronApiSWIPCHandlerImpl>(
render_process_host, version_id, std::move(receiver)));
}
} // namespace electron