fix: ensure ElectronBrowser mojo service is only bound to appropriate render frames (#33323)
* fix: ensure ElectronBrowser mojo service is only bound to authorized render frames Notes: no-notes * refactor: extract electron API IPC to its own mojo interface * fix: just check main frame not primary main frame
This commit is contained in:
parent
f2b06324b8
commit
e07c2b84d7
17 changed files with 381 additions and 229 deletions
|
@ -60,16 +60,16 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
weak_context_.SetWeak();
|
||||
|
||||
render_frame->GetRemoteAssociatedInterfaces()->GetInterface(
|
||||
&electron_browser_remote_);
|
||||
&electron_ipc_remote_);
|
||||
}
|
||||
|
||||
void OnDestruct() override { electron_browser_remote_.reset(); }
|
||||
void OnDestruct() override { electron_ipc_remote_.reset(); }
|
||||
|
||||
void WillReleaseScriptContext(v8::Local<v8::Context> context,
|
||||
int32_t world_id) override {
|
||||
if (weak_context_.IsEmpty() ||
|
||||
weak_context_.Get(context->GetIsolate()) == context)
|
||||
electron_browser_remote_.reset();
|
||||
electron_ipc_remote_.reset();
|
||||
}
|
||||
|
||||
// gin::Wrappable:
|
||||
|
@ -92,7 +92,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
bool internal,
|
||||
const std::string& channel,
|
||||
v8::Local<v8::Value> arguments) {
|
||||
if (!electron_browser_remote_) {
|
||||
if (!electron_ipc_remote_) {
|
||||
thrower.ThrowError(kIPCMethodCalledAfterContextReleasedError);
|
||||
return;
|
||||
}
|
||||
|
@ -100,7 +100,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
if (!electron::SerializeV8Value(isolate, arguments, &message)) {
|
||||
return;
|
||||
}
|
||||
electron_browser_remote_->Message(internal, channel, std::move(message));
|
||||
electron_ipc_remote_->Message(internal, channel, std::move(message));
|
||||
}
|
||||
|
||||
v8::Local<v8::Promise> Invoke(v8::Isolate* isolate,
|
||||
|
@ -108,7 +108,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
bool internal,
|
||||
const std::string& channel,
|
||||
v8::Local<v8::Value> arguments) {
|
||||
if (!electron_browser_remote_) {
|
||||
if (!electron_ipc_remote_) {
|
||||
thrower.ThrowError(kIPCMethodCalledAfterContextReleasedError);
|
||||
return v8::Local<v8::Promise>();
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
gin_helper::Promise<blink::CloneableMessage> p(isolate);
|
||||
auto handle = p.GetHandle();
|
||||
|
||||
electron_browser_remote_->Invoke(
|
||||
electron_ipc_remote_->Invoke(
|
||||
internal, channel, std::move(message),
|
||||
base::BindOnce(
|
||||
[](gin_helper::Promise<blink::CloneableMessage> p,
|
||||
|
@ -134,7 +134,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
const std::string& channel,
|
||||
v8::Local<v8::Value> message_value,
|
||||
absl::optional<v8::Local<v8::Value>> transfer) {
|
||||
if (!electron_browser_remote_) {
|
||||
if (!electron_ipc_remote_) {
|
||||
thrower.ThrowError(kIPCMethodCalledAfterContextReleasedError);
|
||||
return;
|
||||
}
|
||||
|
@ -166,8 +166,8 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
}
|
||||
|
||||
transferable_message.ports = std::move(ports);
|
||||
electron_browser_remote_->ReceivePostMessage(
|
||||
channel, std::move(transferable_message));
|
||||
electron_ipc_remote_->ReceivePostMessage(channel,
|
||||
std::move(transferable_message));
|
||||
}
|
||||
|
||||
void SendTo(v8::Isolate* isolate,
|
||||
|
@ -175,7 +175,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
int32_t web_contents_id,
|
||||
const std::string& channel,
|
||||
v8::Local<v8::Value> arguments) {
|
||||
if (!electron_browser_remote_) {
|
||||
if (!electron_ipc_remote_) {
|
||||
thrower.ThrowError(kIPCMethodCalledAfterContextReleasedError);
|
||||
return;
|
||||
}
|
||||
|
@ -183,15 +183,15 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
if (!electron::SerializeV8Value(isolate, arguments, &message)) {
|
||||
return;
|
||||
}
|
||||
electron_browser_remote_->MessageTo(web_contents_id, channel,
|
||||
std::move(message));
|
||||
electron_ipc_remote_->MessageTo(web_contents_id, channel,
|
||||
std::move(message));
|
||||
}
|
||||
|
||||
void SendToHost(v8::Isolate* isolate,
|
||||
gin_helper::ErrorThrower thrower,
|
||||
const std::string& channel,
|
||||
v8::Local<v8::Value> arguments) {
|
||||
if (!electron_browser_remote_) {
|
||||
if (!electron_ipc_remote_) {
|
||||
thrower.ThrowError(kIPCMethodCalledAfterContextReleasedError);
|
||||
return;
|
||||
}
|
||||
|
@ -199,7 +199,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
if (!electron::SerializeV8Value(isolate, arguments, &message)) {
|
||||
return;
|
||||
}
|
||||
electron_browser_remote_->MessageHost(channel, std::move(message));
|
||||
electron_ipc_remote_->MessageHost(channel, std::move(message));
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> SendSync(v8::Isolate* isolate,
|
||||
|
@ -207,7 +207,7 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
bool internal,
|
||||
const std::string& channel,
|
||||
v8::Local<v8::Value> arguments) {
|
||||
if (!electron_browser_remote_) {
|
||||
if (!electron_ipc_remote_) {
|
||||
thrower.ThrowError(kIPCMethodCalledAfterContextReleasedError);
|
||||
return v8::Local<v8::Value>();
|
||||
}
|
||||
|
@ -217,14 +217,13 @@ class IPCRenderer : public gin::Wrappable<IPCRenderer>,
|
|||
}
|
||||
|
||||
blink::CloneableMessage result;
|
||||
electron_browser_remote_->MessageSync(internal, channel, std::move(message),
|
||||
&result);
|
||||
electron_ipc_remote_->MessageSync(internal, channel, std::move(message),
|
||||
&result);
|
||||
return electron::DeserializeV8Value(isolate, result);
|
||||
}
|
||||
|
||||
v8::Global<v8::Context> weak_context_;
|
||||
mojo::AssociatedRemote<electron::mojom::ElectronBrowser>
|
||||
electron_browser_remote_;
|
||||
mojo::AssociatedRemote<electron::mojom::ElectronApiIPC> electron_ipc_remote_;
|
||||
};
|
||||
|
||||
gin::WrapperInfo IPCRenderer::kWrapperInfo = {gin::kEmbedderNativeGin};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue