diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 8416b9ad37e03..114dfc43dbb52 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -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); } }; @@ -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) @@ -2204,18 +2207,23 @@ 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(event_name, new Event(), channel, args); + auto* event_name = internal ? "ipc-internal-message" : "ipc-message"; + EmitWithSender(event_name, frame_host, nullptr, 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(event_name, new Event(sender, message), channel, args); + auto* event_name = + internal ? "ipc-internal-message-sync" : "ipc-message-sync"; + EmitWithSender(event_name, frame_host, message, channel, args); } void WebContents::OnRendererMessageTo(content::RenderFrameHost* frame_host, @@ -2233,6 +2241,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::Create(v8::Isolate* isolate, const mate::Dictionary& options) { diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index ebf75ead1879f..24e48175767fd 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -479,11 +479,13 @@ class WebContents : public mate::TrackableObject, // 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); @@ -496,6 +498,11 @@ class WebContents : public mate::TrackableObject, 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, diff --git a/atom/common/api/api_messages.h b/atom/common/api/api_messages.h index 6bf95afe423a6..4ea3c12111872 100644 --- a/atom/common/api/api_messages.h +++ b/atom/common/api/api_messages.h @@ -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 */) @@ -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 */, diff --git a/atom/common/api/remote_object_freer.cc b/atom/common/api/remote_object_freer.cc index 9712e19cbb4a3..da6ba6de8f657 100644 --- a/atom/common/api/remote_object_freer.cc +++ b/atom/common/api/remote_object_freer.cc @@ -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 diff --git a/atom/renderer/api/atom_api_renderer_ipc.cc b/atom/renderer/api/atom_api_renderer_ipc.cc index 6db9c8e51732d..ea7388e7b05b6 100644 --- a/atom/renderer/api/atom_api_renderer_ipc.cc +++ b/atom/renderer/api/atom_api_renderer_ipc.cc @@ -2,22 +2,22 @@ // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. -#include "atom/renderer/api/atom_api_renderer_ipc.h" +#include + #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" +#include "base/values.h" #include "content/public/renderer/render_frame.h" +#include "native_mate/arguments.h" #include "native_mate/dictionary.h" #include "third_party/blink/public/web/web_local_frame.h" using blink::WebLocalFrame; using content::RenderFrame; -namespace atom { - -namespace api { +namespace { RenderFrame* GetCurrentRenderFrame() { WebLocalFrame* frame = WebLocalFrame::FrameForCurrentContext(); @@ -28,6 +28,7 @@ RenderFrame* GetCurrentRenderFrame() { } void Send(mate::Arguments* args, + bool internal, const std::string& channel, const base::ListValue& arguments) { RenderFrame* render_frame = GetCurrentRenderFrame(); @@ -35,13 +36,14 @@ void Send(mate::Arguments* args, 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; @@ -51,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) @@ -78,20 +80,29 @@ void SendTo(mate::Arguments* args, args->ThrowError("Unable to send AtomFrameHostMsg_Message_To"); } -} // namespace api +void SendToHost(mate::Arguments* args, + const std::string& channel, + const base::ListValue& arguments) { + RenderFrame* render_frame = GetCurrentRenderFrame(); + if (render_frame == nullptr) + return; -} // namespace atom + bool success = render_frame->Send(new AtomFrameHostMsg_Message_Host( + render_frame->GetRoutingID(), channel, arguments)); -namespace { + if (!success) + args->ThrowError("Unable to send AtomFrameHostMsg_Message_Host"); +} void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { mate::Dictionary dict(context->GetIsolate(), exports); - dict.SetMethod("send", &atom::api::Send); - dict.SetMethod("sendSync", &atom::api::SendSync); - dict.SetMethod("sendTo", &atom::api::SendTo); + dict.SetMethod("send", &Send); + dict.SetMethod("sendSync", &SendSync); + dict.SetMethod("sendTo", &SendTo); + dict.SetMethod("sendToHost", &SendToHost); } } // namespace diff --git a/atom/renderer/api/atom_api_renderer_ipc.h b/atom/renderer/api/atom_api_renderer_ipc.h deleted file mode 100644 index ab243da52234a..0000000000000 --- a/atom/renderer/api/atom_api_renderer_ipc.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2016 GitHub, Inc. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -#ifndef ATOM_RENDERER_API_ATOM_API_RENDERER_IPC_H_ -#define ATOM_RENDERER_API_ATOM_API_RENDERER_IPC_H_ - -#include - -#include "base/values.h" -#include "native_mate/arguments.h" - -namespace atom { - -namespace api { - -void Send(mate::Arguments* args, - const std::string& channel, - const base::ListValue& arguments); - -base::ListValue SendSync(mate::Arguments* args, - const std::string& channel, - const base::ListValue& arguments); - -void SendTo(mate::Arguments* args, - bool internal, - bool send_to_all, - int32_t web_contents_id, - const std::string& channel, - const base::ListValue& arguments); - -} // namespace api - -} // namespace atom - -#endif // ATOM_RENDERER_API_ATOM_API_RENDERER_IPC_H_ diff --git a/atom/renderer/atom_render_frame_observer.cc b/atom/renderer/atom_render_frame_observer.cc index 753a4362749c2..da7d74e227cec 100644 --- a/atom/renderer/atom_render_frame_observer.cc +++ b/atom/renderer/atom_render_frame_observer.cc @@ -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-message", args)); + render_frame_->GetRoutingID(), true, channel, args)); } void AtomRenderFrameObserver::EmitIPCEvent(blink::WebLocalFrame* frame, diff --git a/atom/renderer/atom_sandboxed_renderer_client.cc b/atom/renderer/atom_sandboxed_renderer_client.cc index dad1a667f0386..92b48aa717aad 100644 --- a/atom/renderer/atom_sandboxed_renderer_client.cc +++ b/atom/renderer/atom_sandboxed_renderer_client.cc @@ -11,7 +11,6 @@ #include "atom/common/native_mate_converters/value_converter.h" #include "atom/common/node_bindings.h" #include "atom/common/options_switches.h" -#include "atom/renderer/api/atom_api_renderer_ipc.h" #include "atom/renderer/atom_render_frame_observer.h" #include "base/base_paths.h" #include "base/command_line.h" diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 846cc39ff27f5..65b4d152ba89b 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -673,6 +673,26 @@ Returns: Emitted when the preload script `preloadPath` throws an unhandled exception `error`. +#### Event: 'ipc-message' + +Returns: + +* `event` Event +* `channel` String +* `args` Array + +Emitted when `ipcRenderer.send(channel, ...args)` is called in the renderer process. + +#### Event: 'ipc-message-sync' + +Returns: + +* `event` Event +* `channel` String +* `args` Array + +Emitted when `ipcRenderer.sendSync(channel, ...args)` is called in the renderer process. + #### Event: 'desktop-capturer-get-sources' Returns: diff --git a/filenames.gni b/filenames.gni index 4004edccf1334..be477813cf245 100644 --- a/filenames.gni +++ b/filenames.gni @@ -629,7 +629,6 @@ filenames = { "atom/common/platform_util_win.cc", "atom/common/promise_util.h", "atom/common/promise_util.cc", - "atom/renderer/api/atom_api_renderer_ipc.h", "atom/renderer/api/atom_api_renderer_ipc.cc", "atom/renderer/api/atom_api_spell_check_client.cc", "atom/renderer/api/atom_api_spell_check_client.h", diff --git a/lib/browser/api/web-contents.js b/lib/browser/api/web-contents.js index 26c4d49577d2f..91d04b0569ad1 100644 --- a/lib/browser/api/web-contents.js +++ b/lib/browser/api/web-contents.js @@ -212,7 +212,7 @@ WebContents.prototype.executeJavaScript = function (code, hasUserGesture, callba WebContents.prototype.takeHeapSnapshot = function (filePath) { return new Promise((resolve, reject) => { const channel = `ELECTRON_TAKE_HEAP_SNAPSHOT_RESULT_${getNextId()}` - ipcMain.once(channel, (event, success) => { + ipcMainInternal.once(channel, (event, success) => { if (success) { resolve() } else { @@ -220,7 +220,7 @@ WebContents.prototype.takeHeapSnapshot = function (filePath) { } }) if (!this._takeHeapSnapshot(filePath, channel)) { - ipcMain.emit(channel, false) + ipcMainInternal.emit(channel, false) } }) } @@ -337,11 +337,11 @@ 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.on('ipc-message', function (event, channel, args) { ipcMain.emit(channel, event, ...args) }) - this.on('ipc-message-sync', function (event, [channel, ...args]) { + this.on('ipc-message-sync', function (event, channel, args) { Object.defineProperty(event, 'returnValue', { set: function (value) { return event.sendReply([value]) @@ -351,11 +351,11 @@ WebContents.prototype._init = function () { ipcMain.emit(channel, event, ...args) }) - this.on('ipc-internal-message', function (event, [channel, ...args]) { + this.on('ipc-internal-message', function (event, channel, args) { ipcMainInternal.emit(channel, event, ...args) }) - this.on('ipc-internal-message-sync', function (event, [channel, ...args]) { + this.on('ipc-internal-message-sync', function (event, channel, args) { Object.defineProperty(event, 'returnValue', { set: function (value) { return event.sendReply([value]) diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index bc23335c63044..16bef16876b56 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -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) }) diff --git a/lib/renderer/api/ipc-renderer.js b/lib/renderer/api/ipc-renderer.js index 7705f9f9ae77c..95b90280b06fd 100644 --- a/lib/renderer/api/ipc-renderer.js +++ b/lib/renderer/api/ipc-renderer.js @@ -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) { diff --git a/lib/renderer/ipc-renderer-internal.js b/lib/renderer/ipc-renderer-internal.js index a8dda32632b6c..b3da4d8887f4a 100644 --- a/lib/renderer/ipc-renderer-internal.js +++ b/lib/renderer/ipc-renderer-internal.js @@ -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) {