![trop[bot]](/assets/img/avatar_default.png)
* 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 |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 |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 |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 |6449682
Reland "[document pip] Restrict the size that a website can request" |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 |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 QwacWebContentsObserver6624719
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Remove host delegate OnMainFrameCreatedForBackgroundPage6631123
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Extensions: Rename GetResourceURL to ResolveExtensionURL6625053
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Consolidate NativeFrameViewMac6614239
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * ICWYU Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Remove dead code WidgetAXTreeIDMap6619701
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Reland "extensions: Add `WillPrepareForEvaluation` to setup MojoJS"6630056
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * NavigationThrottleRunner2: Remove MaybeAddThrottle6628079
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Tuck picture-in-picture windows when a file dialog is open6449682
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 |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 |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. |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 builds6638830
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 version6493969
(cherry picked from commit 3e7cbe912d8fe1062d68ed06968aaee22013985f) Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Use default window styling on Mac6648665
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * Reland "Force the unintentional renderer process creation check by default"6626905
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org> * fixup: Reland "Force the unintentional renderer process creation check by default6626905
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 default6626905
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 target6638187
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 API6652910
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>
212 lines
7.4 KiB
C++
212 lines
7.4 KiB
C++
// 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"
|
|
#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
|