Use id from source window when building proxy for event source
authorKevin Sawicki <kevinsawicki@gmail.com>
Tue, 15 Dec 2015 00:47:33 +0000 (16:47 -0800)
committerKevin Sawicki <kevinsawicki@gmail.com>
Tue, 15 Dec 2015 00:47:33 +0000 (16:47 -0800)
atom/browser/lib/guest-window-manager.coffee
atom/renderer/lib/override.coffee

index 9ed75c2..97c285d 100644 (file)
@@ -74,23 +74,27 @@ ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', (event, guestId, met
   BrowserWindow.fromId(guestId)?[method] args...
 
 ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', (event, guestId, message, targetOrigin, sourceOrigin) ->
+  sourceId = BrowserWindow.fromWebContents(event.sender)?.id
+  return unless sourceId?
+
   guestContents = BrowserWindow.fromId(guestId)?.webContents
   if guestContents?.getURL().indexOf(targetOrigin) is 0 or targetOrigin is '*'
-    guestContents?.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', guestId, message, sourceOrigin
+    guestContents?.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', sourceId, message, sourceOrigin
+
+ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', (event, message, targetOrigin, sourceOrigin) ->
+  sourceId = BrowserWindow.fromWebContents(event.sender)?.id
+  return unless sourceId?
 
-ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', (event, guestId, message, targetOrigin, sourceOrigin) ->
   embedder = v8Util.getHiddenValue event.sender, 'embedder'
   if embedder?.getURL().indexOf(targetOrigin) is 0 or targetOrigin is '*'
-    embedder?.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', guestId, message, sourceOrigin
+    embedder?.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', sourceId, message, sourceOrigin
 
 ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) ->
   BrowserWindow.fromId(guestId)?.webContents?[method] args...
 
-ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID', (event) ->
+ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_OPENER_ID', (event) ->
   embedder = v8Util.getHiddenValue event.sender, 'embedder'
+  openerId = null
   if embedder?
-    guest = BrowserWindow.fromWebContents event.sender
-    if guest?
-      event.returnValue = guest.id
-      return
-  event.returnValue = null
+    openerId = BrowserWindow.fromWebContents(embedder)?.id
+  event.returnValue = openerId
index 213dc49..8b33c6e 100644 (file)
@@ -91,22 +91,20 @@ window.confirm = (message, title='') ->
 window.prompt = ->
   throw new Error('prompt() is and will not be supported.')
 
-guestId = ipcRenderer.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID'
-if guestId?
-  window.opener = BrowserWindowProxy.getOrCreate(guestId)
-  # Remove BrowserWindowProxy API and give it a custom postMessage method
-  Object.setPrototypeOf(window.opener, null)
+openerId = ipcRenderer.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_OPENER_ID'
+if openerId?
+  window.opener = BrowserWindowProxy.getOrCreate(openerId)
   window.opener.postMessage = (message, targetOrigin='*') ->
-    ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', guestId, message, targetOrigin, location.origin
+    ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', message, targetOrigin, location.origin
 
-ipcRenderer.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (event, guestId, message, sourceOrigin) ->
+ipcRenderer.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (event, sourceId, message, sourceOrigin) ->
   # Manually dispatch event instead of using postMessage because we also need to
   # set event.source.
   event = document.createEvent 'Event'
   event.initEvent 'message', false, false
   event.data = message
   event.origin = sourceOrigin
-  event.source = BrowserWindowProxy.getOrCreate(guestId)
+  event.source = BrowserWindowProxy.getOrCreate(sourceId)
   window.dispatchEvent event
 
 # Forward history operations to browser.