Skip to content

Commit

Permalink
refactor: pass internal flag via IPC message struct for consistency
Browse files Browse the repository at this point in the history
  • Loading branch information
miniak committed Jan 22, 2019
1 parent cd25dde commit d9c32b3
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 47 deletions.
26 changes: 20 additions & 6 deletions atom/browser/api/atom_api_web_contents.cc
Expand Up @@ -279,10 +279,12 @@ struct WebContents::FrameDispatchHelper {
api_web_contents->OnGetZoomLevel(rfh, reply_msg);
}

void OnRendererMessageSync(const std::string& channel,
void OnRendererMessageSync(bool internal,
const std::string& channel,
const base::ListValue& args,
IPC::Message* message) {
api_web_contents->OnRendererMessageSync(rfh, channel, args, message);
api_web_contents->OnRendererMessageSync(rfh, internal, channel, args,
message);
}
};

Expand Down Expand Up @@ -1070,6 +1072,7 @@ bool WebContents::OnMessageReceived(const IPC::Message& message,
IPC_MESSAGE_FORWARD_DELAY_REPLY(AtomFrameHostMsg_Message_Sync, &helper,
FrameDispatchHelper::OnRendererMessageSync)
IPC_MESSAGE_HANDLER(AtomFrameHostMsg_Message_To, OnRendererMessageTo)
IPC_MESSAGE_HANDLER(AtomFrameHostMsg_Message_Host, OnRendererMessageHost)
IPC_MESSAGE_FORWARD_DELAY_REPLY(
AtomFrameHostMsg_SetTemporaryZoomLevel, &helper,
FrameDispatchHelper::OnSetTemporaryZoomLevel)
Expand Down Expand Up @@ -2204,18 +2207,22 @@ AtomBrowserContext* WebContents::GetBrowserContext() const {
}

void WebContents::OnRendererMessage(content::RenderFrameHost* frame_host,
bool internal,
const std::string& channel,
const base::ListValue& args) {
// webContents.emit(channel, new Event(), args...);
EmitWithSender(channel, frame_host, nullptr, args);
// webContents.emit('-ipc-message', new Event(), internal, channel, args);
EmitWithSender("-ipc-message", frame_host, nullptr, internal, channel, args);
}

void WebContents::OnRendererMessageSync(content::RenderFrameHost* frame_host,
bool internal,
const std::string& channel,
const base::ListValue& args,
IPC::Message* message) {
// webContents.emit(channel, new Event(sender, message), args...);
EmitWithSender(channel, frame_host, message, args);
// webContents.emit('-ipc-message-sync', new Event(sender, message), internal,
// channel, args);
EmitWithSender("-ipc-message-sync", frame_host, message, internal, channel,
args);
}

void WebContents::OnRendererMessageTo(content::RenderFrameHost* frame_host,
Expand All @@ -2233,6 +2240,13 @@ void WebContents::OnRendererMessageTo(content::RenderFrameHost* frame_host,
}
}

void WebContents::OnRendererMessageHost(content::RenderFrameHost* frame_host,
const std::string& channel,
const base::ListValue& args) {
// webContents.emit('ipc-message-host', new Event(), channel, args);
EmitWithSender("ipc-message-host", frame_host, nullptr, channel, args);
}

// static
mate::Handle<WebContents> WebContents::Create(v8::Isolate* isolate,
const mate::Dictionary& options) {
Expand Down
7 changes: 7 additions & 0 deletions atom/browser/api/atom_api_web_contents.h
Expand Up @@ -479,11 +479,13 @@ class WebContents : public mate::TrackableObject<WebContents>,

// Called when received a message from renderer.
void OnRendererMessage(content::RenderFrameHost* frame_host,
bool internal,
const std::string& channel,
const base::ListValue& args);

// Called when received a synchronous message from renderer.
void OnRendererMessageSync(content::RenderFrameHost* frame_host,
bool internal,
const std::string& channel,
const base::ListValue& args,
IPC::Message* message);
Expand All @@ -496,6 +498,11 @@ class WebContents : public mate::TrackableObject<WebContents>,
const std::string& channel,
const base::ListValue& args);

// Called when received a message from renderer to host.
void OnRendererMessageHost(content::RenderFrameHost* frame_host,
const std::string& channel,
const base::ListValue& args);

// Called when received a synchronous message from renderer to
// set temporary zoom level.
void OnSetTemporaryZoomLevel(content::RenderFrameHost* frame_host,
Expand Down
10 changes: 8 additions & 2 deletions atom/common/api/api_messages.h
Expand Up @@ -25,11 +25,13 @@ IPC_STRUCT_TRAITS_BEGIN(atom::DraggableRegion)
IPC_STRUCT_TRAITS_MEMBER(bounds)
IPC_STRUCT_TRAITS_END()

IPC_MESSAGE_ROUTED2(AtomFrameHostMsg_Message,
IPC_MESSAGE_ROUTED3(AtomFrameHostMsg_Message,
bool /* internal */,
std::string /* channel */,
base::ListValue /* arguments */)

IPC_SYNC_MESSAGE_ROUTED2_1(AtomFrameHostMsg_Message_Sync,
IPC_SYNC_MESSAGE_ROUTED3_1(AtomFrameHostMsg_Message_Sync,
bool /* internal */,
std::string /* channel */,
base::ListValue /* arguments */,
base::ListValue /* result */)
Expand All @@ -41,6 +43,10 @@ IPC_MESSAGE_ROUTED5(AtomFrameHostMsg_Message_To,
std::string /* channel */,
base::ListValue /* arguments */)

IPC_MESSAGE_ROUTED2(AtomFrameHostMsg_Message_Host,
std::string /* channel */,
base::ListValue /* arguments */)

IPC_MESSAGE_ROUTED5(AtomFrameMsg_Message,
bool /* internal */,
bool /* send_to_all */,
Expand Down
5 changes: 2 additions & 3 deletions atom/common/api/remote_object_freer.cc
Expand Up @@ -56,13 +56,12 @@ void RemoteObjectFreer::RunDestructor() {
if (!render_frame)
return;

auto* channel = "ipc-internal-message";
auto* channel = "ELECTRON_BROWSER_DEREFERENCE";
base::ListValue args;
args.AppendString("ELECTRON_BROWSER_DEREFERENCE");
args.AppendString(context_id_);
args.AppendInteger(object_id_);
render_frame->Send(new AtomFrameHostMsg_Message(render_frame->GetRoutingID(),
channel, args));
true, channel, args));
}

} // namespace atom
22 changes: 19 additions & 3 deletions atom/renderer/api/atom_api_renderer_ipc.cc
Expand Up @@ -5,7 +5,6 @@
#include <string>

#include "atom/common/api/api_messages.h"
#include "atom/common/native_mate_converters/string16_converter.h"
#include "atom/common/native_mate_converters/value_converter.h"
#include "atom/common/node_bindings.h"
#include "atom/common/node_includes.h"
Expand All @@ -29,20 +28,22 @@ RenderFrame* GetCurrentRenderFrame() {
}

void Send(mate::Arguments* args,
bool internal,
const std::string& channel,
const base::ListValue& arguments) {
RenderFrame* render_frame = GetCurrentRenderFrame();
if (render_frame == nullptr)
return;

bool success = render_frame->Send(new AtomFrameHostMsg_Message(
render_frame->GetRoutingID(), channel, arguments));
render_frame->GetRoutingID(), internal, channel, arguments));

if (!success)
args->ThrowError("Unable to send AtomFrameHostMsg_Message");
}

base::ListValue SendSync(mate::Arguments* args,
bool internal,
const std::string& channel,
const base::ListValue& arguments) {
base::ListValue result;
Expand All @@ -52,7 +53,7 @@ base::ListValue SendSync(mate::Arguments* args,
return result;

IPC::SyncMessage* message = new AtomFrameHostMsg_Message_Sync(
render_frame->GetRoutingID(), channel, arguments, &result);
render_frame->GetRoutingID(), internal, channel, arguments, &result);
bool success = render_frame->Send(message);

if (!success)
Expand All @@ -79,6 +80,20 @@ void SendTo(mate::Arguments* args,
args->ThrowError("Unable to send AtomFrameHostMsg_Message_To");
}

void SendToHost(mate::Arguments* args,
const std::string& channel,
const base::ListValue& arguments) {
RenderFrame* render_frame = GetCurrentRenderFrame();
if (render_frame == nullptr)
return;

bool success = render_frame->Send(new AtomFrameHostMsg_Message_Host(
render_frame->GetRoutingID(), channel, arguments));

if (!success)
args->ThrowError("Unable to send AtomFrameHostMsg_Message_Host");
}

void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Value> unused,
v8::Local<v8::Context> context,
Expand All @@ -87,6 +102,7 @@ void Initialize(v8::Local<v8::Object> exports,
dict.SetMethod("send", &Send);
dict.SetMethod("sendSync", &SendSync);
dict.SetMethod("sendTo", &SendTo);
dict.SetMethod("sendToHost", &SendToHost);
}

} // namespace
Expand Down
3 changes: 1 addition & 2 deletions atom/renderer/atom_render_frame_observer.cc
Expand Up @@ -212,11 +212,10 @@ void AtomRenderFrameObserver::OnTakeHeapSnapshot(
bool success = TakeHeapSnapshot(blink::MainThreadIsolate(), &file);

base::ListValue args;
args.AppendString(channel);
args.AppendBoolean(success);

render_frame_->Send(new AtomFrameHostMsg_Message(
render_frame_->GetRoutingID(), "ipc-internal-message", args));
render_frame_->GetRoutingID(), true, channel, args));
}

void AtomRenderFrameObserver::EmitIPCEvent(blink::WebLocalFrame* frame,
Expand Down
34 changes: 14 additions & 20 deletions lib/browser/api/web-contents.js
Expand Up @@ -342,34 +342,28 @@ WebContents.prototype._init = function () {
this.capturePage = deprecate.promisify(this.capturePage, 2)

// Dispatch IPC messages to the ipc module.
this.on('-ipc-message', function (event, [channel, ...args]) {
this.emit('ipc-message', event, channel, ...args)
ipcMain.emit(channel, event, ...args)
})

this.on('-ipc-message-sync', function (event, [channel, ...args]) {
Object.defineProperty(event, 'returnValue', {
set: function (value) {
return event.sendReply([value])
},
get: function () {}
})
this.emit('ipc-message-sync', event, channel, ...args)
ipcMain.emit(channel, event, ...args)
})

this.on('ipc-internal-message', function (event, [channel, ...args]) {
ipcMainInternal.emit(channel, event, ...args)
this.on('-ipc-message', function (event, internal, channel, args) {
if (internal) {
ipcMainInternal.emit(channel, event, ...args)
} else {
this.emit('ipc-message', event, channel, ...args)
ipcMain.emit(channel, event, ...args)
}
})

this.on('ipc-internal-message-sync', function (event, [channel, ...args]) {
this.on('-ipc-message-sync', function (event, internal, channel, args) {
Object.defineProperty(event, 'returnValue', {
set: function (value) {
return event.sendReply([value])
},
get: function () {}
})
ipcMainInternal.emit(channel, event, ...args)
if (internal) {
ipcMainInternal.emit(channel, event, ...args)
} else {
this.emit('ipc-message-sync', event, channel, ...args)
ipcMain.emit(channel, event, ...args)
}
})

// Handle context menu action request from pepper plugin.
Expand Down
2 changes: 1 addition & 1 deletion lib/browser/guest-view-manager.js
Expand Up @@ -140,7 +140,7 @@ const createGuest = function (embedder, params) {
}

// Dispatch guest's IPC messages to embedder.
guest.on('ipc-message-host', function (_, [channel, ...args]) {
guest.on('ipc-message-host', function (_, channel, args) {
sendToEmbedder('ELECTRON_GUEST_VIEW_INTERNAL_IPC_MESSAGE', channel, ...args)
})

Expand Down
12 changes: 6 additions & 6 deletions lib/renderer/api/ipc-renderer.js
Expand Up @@ -7,16 +7,16 @@ const v8Util = process.atomBinding('v8_util')
const ipcRenderer = v8Util.getHiddenValue(global, 'ipc')
const internal = false

ipcRenderer.send = function (...args) {
return binding.send('-ipc-message', args)
ipcRenderer.send = function (channel, ...args) {
return binding.send(internal, channel, args)
}

ipcRenderer.sendSync = function (...args) {
return binding.sendSync('-ipc-message-sync', args)[0]
ipcRenderer.sendSync = function (channel, ...args) {
return binding.sendSync(internal, channel, args)[0]
}

ipcRenderer.sendToHost = function (...args) {
return binding.send('ipc-message-host', args)
ipcRenderer.sendToHost = function (channel, ...args) {
return binding.sendToHost(channel, args)
}

ipcRenderer.sendTo = function (webContentsId, channel, ...args) {
Expand Down
8 changes: 4 additions & 4 deletions lib/renderer/ipc-renderer-internal.js
Expand Up @@ -7,12 +7,12 @@ const v8Util = process.atomBinding('v8_util')
const ipcRenderer = v8Util.getHiddenValue(global, 'ipc-internal')
const internal = true

ipcRenderer.send = function (...args) {
return binding.send('ipc-internal-message', args)
ipcRenderer.send = function (channel, ...args) {
return binding.send(internal, channel, args)
}

ipcRenderer.sendSync = function (...args) {
return binding.sendSync('ipc-internal-message-sync', args)[0]
ipcRenderer.sendSync = function (channel, ...args) {
return binding.sendSync(internal, channel, args)[0]
}

ipcRenderer.sendTo = function (webContentsId, channel, ...args) {
Expand Down

0 comments on commit d9c32b3

Please sign in to comment.