refactor: use separate ipc-renderer-internal / ipc-main-internal APIs for Electron internals (#13940)

This commit is contained in:
Milan Burda 2018-10-06 13:48:00 +02:00 committed by Samuel Attard
parent f7122610cc
commit b50f86ef43
49 changed files with 322 additions and 133 deletions

View file

@ -61,6 +61,7 @@ base::ListValue SendSync(mate::Arguments* args,
}
void SendTo(mate::Arguments* args,
bool internal,
bool send_to_all,
int32_t web_contents_id,
const std::string& channel,
@ -69,9 +70,9 @@ void SendTo(mate::Arguments* args,
if (render_frame == nullptr)
return;
bool success = render_frame->Send(
new AtomFrameHostMsg_Message_To(render_frame->GetRoutingID(), send_to_all,
web_contents_id, channel, arguments));
bool success = render_frame->Send(new AtomFrameHostMsg_Message_To(
render_frame->GetRoutingID(), internal, send_to_all, web_contents_id,
channel, arguments));
if (!success)
args->ThrowError("Unable to send AtomFrameHostMsg_Message_To");

View file

@ -23,6 +23,7 @@ base::ListValue SendSync(mate::Arguments* args,
const base::ListValue& arguments);
void SendTo(mate::Arguments* args,
bool internal,
bool send_to_all,
int32_t web_contents_id,
const std::string& channel,

View file

@ -35,8 +35,10 @@ namespace {
bool GetIPCObject(v8::Isolate* isolate,
v8::Local<v8::Context> context,
bool internal,
v8::Local<v8::Object>* ipc) {
v8::Local<v8::String> key = mate::StringToV8(isolate, "ipc");
v8::Local<v8::String> key =
mate::StringToV8(isolate, internal ? "ipc-internal" : "ipc");
v8::Local<v8::Private> privateKey = v8::Private::ForApi(isolate, key);
v8::Local<v8::Object> global_object = context->Global();
v8::Local<v8::Value> value;
@ -170,7 +172,8 @@ bool AtomRenderFrameObserver::OnMessageReceived(const IPC::Message& message) {
return handled;
}
void AtomRenderFrameObserver::OnBrowserMessage(bool send_to_all,
void AtomRenderFrameObserver::OnBrowserMessage(bool internal,
bool send_to_all,
const std::string& channel,
const base::ListValue& args,
int32_t sender_id) {
@ -186,14 +189,15 @@ void AtomRenderFrameObserver::OnBrowserMessage(bool send_to_all,
if (!frame || !render_frame_->IsMainFrame())
return;
EmitIPCEvent(frame, channel, args, sender_id);
EmitIPCEvent(frame, internal, channel, args, sender_id);
// Also send the message to all sub-frames.
if (send_to_all) {
for (blink::WebFrame* child = frame->FirstChild(); child;
child = child->NextSibling())
if (child->IsWebLocalFrame()) {
EmitIPCEvent(child->ToWebLocalFrame(), channel, args, sender_id);
EmitIPCEvent(child->ToWebLocalFrame(), internal, channel, args,
sender_id);
}
}
}
@ -215,6 +219,7 @@ void AtomRenderFrameObserver::OnTakeHeapSnapshot(
}
void AtomRenderFrameObserver::EmitIPCEvent(blink::WebLocalFrame* frame,
bool internal,
const std::string& channel,
const base::ListValue& args,
int32_t sender_id) {
@ -233,7 +238,7 @@ void AtomRenderFrameObserver::EmitIPCEvent(blink::WebLocalFrame* frame,
return;
v8::Local<v8::Object> ipc;
if (GetIPCObject(isolate, context, &ipc)) {
if (GetIPCObject(isolate, context, internal, &ipc)) {
TRACE_EVENT0("devtools.timeline", "FunctionCall");
auto args_vector = ListValueToVector(isolate, args);
// Insert the Event object, event.sender is ipc.

View file

@ -45,6 +45,7 @@ class AtomRenderFrameObserver : public content::RenderFrameObserver {
protected:
virtual void EmitIPCEvent(blink::WebLocalFrame* frame,
bool internal,
const std::string& channel,
const base::ListValue& args,
int32_t sender_id);
@ -54,7 +55,8 @@ class AtomRenderFrameObserver : public content::RenderFrameObserver {
void CreateIsolatedWorldContext();
bool IsMainWorld(int world_id);
bool IsIsolatedWorld(int world_id);
void OnBrowserMessage(bool send_to_all,
void OnBrowserMessage(bool internal,
bool send_to_all,
const std::string& channel,
const base::ListValue& args,
int32_t sender_id);

View file

@ -103,6 +103,7 @@ class AtomSandboxedRenderFrameObserver : public AtomRenderFrameObserver {
protected:
void EmitIPCEvent(blink::WebLocalFrame* frame,
bool internal,
const std::string& channel,
const base::ListValue& args,
int32_t sender_id) override {
@ -117,7 +118,7 @@ class AtomSandboxedRenderFrameObserver : public AtomRenderFrameObserver {
mate::ConvertToV8(isolate, args),
mate::ConvertToV8(isolate, sender_id)};
renderer_client_->InvokeIpcCallback(
context, "onMessage",
context, internal ? "onInternalMessage" : "onMessage",
std::vector<v8::Local<v8::Value>>(argv, argv + node::arraysize(argv)));
}