Browse Source

fix: do not mutate ipc instances across contexts (#23239)

Samuel Attard 5 years ago
parent
commit
0b3bf1e556
2 changed files with 42 additions and 38 deletions
  1. 28 26
      lib/renderer/api/ipc-renderer.js
  2. 14 12
      lib/renderer/ipc-renderer-internal.ts

+ 28 - 26
lib/renderer/api/ipc-renderer.js

@@ -7,31 +7,33 @@ const v8Util = process.electronBinding('v8_util');
 const ipcRenderer = v8Util.getHiddenValue(global, 'ipc');
 const internal = false;
 
-ipcRenderer.send = function (channel, ...args) {
-  return ipc.send(internal, channel, args);
-};
-
-ipcRenderer.sendSync = function (channel, ...args) {
-  return ipc.sendSync(internal, channel, args)[0];
-};
-
-ipcRenderer.sendToHost = function (channel, ...args) {
-  return ipc.sendToHost(channel, args);
-};
-
-ipcRenderer.sendTo = function (webContentsId, channel, ...args) {
-  return ipc.sendTo(internal, false, webContentsId, channel, args);
-};
-
-ipcRenderer.sendToAll = function (webContentsId, channel, ...args) {
-  return ipc.sendTo(internal, true, webContentsId, channel, args);
-};
-
-ipcRenderer.invoke = function (channel, ...args) {
-  return ipc.invoke(channel, args).then(({ error, result }) => {
-    if (error) { throw new Error(`Error invoking remote method '${channel}': ${error}`); }
-    return result;
-  });
-};
+if (!ipcRenderer.send) {
+  ipcRenderer.send = function (channel, ...args) {
+    return ipc.send(internal, channel, args);
+  };
+
+  ipcRenderer.sendSync = function (channel, ...args) {
+    return ipc.sendSync(internal, channel, args)[0];
+  };
+
+  ipcRenderer.sendToHost = function (channel, ...args) {
+    return ipc.sendToHost(channel, args);
+  };
+
+  ipcRenderer.sendTo = function (webContentsId, channel, ...args) {
+    return ipc.sendTo(internal, false, webContentsId, channel, args);
+  };
+
+  ipcRenderer.sendToAll = function (webContentsId, channel, ...args) {
+    return ipc.sendTo(internal, true, webContentsId, channel, args);
+  };
+
+  ipcRenderer.invoke = function (channel, ...args) {
+    return ipc.invoke(channel, args).then(({ error, result }) => {
+      if (error) { throw new Error(`Error invoking remote method '${channel}': ${error}`); }
+      return result;
+    });
+  };
+}
 
 module.exports = ipcRenderer;

+ 14 - 12
lib/renderer/ipc-renderer-internal.ts

@@ -5,18 +5,20 @@ const v8Util = process.electronBinding('v8_util');
 export const ipcRendererInternal: Electron.IpcRendererInternal = v8Util.getHiddenValue(global, 'ipc-internal');
 const internal = true;
 
-ipcRendererInternal.send = function (channel, ...args) {
-  return binding.ipc.send(internal, channel, args);
-};
+if (!ipcRendererInternal.send) {
+  ipcRendererInternal.send = function (channel, ...args) {
+    return binding.ipc.send(internal, channel, args);
+  };
 
-ipcRendererInternal.sendSync = function (channel, ...args) {
-  return binding.ipc.sendSync(internal, channel, args)[0];
-};
+  ipcRendererInternal.sendSync = function (channel, ...args) {
+    return binding.ipc.sendSync(internal, channel, args)[0];
+  };
 
-ipcRendererInternal.sendTo = function (webContentsId, channel, ...args) {
-  return binding.ipc.sendTo(internal, false, webContentsId, channel, args);
-};
+  ipcRendererInternal.sendTo = function (webContentsId, channel, ...args) {
+    return binding.ipc.sendTo(internal, false, webContentsId, channel, args);
+  };
 
-ipcRendererInternal.sendToAll = function (webContentsId, channel, ...args) {
-  return binding.ipc.sendTo(internal, true, webContentsId, channel, args);
-};
+  ipcRendererInternal.sendToAll = function (webContentsId, channel, ...args) {
+    return binding.ipc.sendTo(internal, true, webContentsId, channel, args);
+  };
+}