diff --git a/atom/browser/lib/guest-window-manager.coffee b/atom/browser/lib/guest-window-manager.coffee index 9ed75c225f54..1e9ee13c71d7 100644 --- a/atom/browser/lib/guest-window-manager.coffee +++ b/atom/browser/lib/guest-window-manager.coffee @@ -74,23 +74,19 @@ 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 - -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 + guestContents?.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 diff --git a/atom/renderer/lib/override.coffee b/atom/renderer/lib/override.coffee index 333acc82739d..ba15c7b3f61a 100644 --- a/atom/renderer/lib/override.coffee +++ b/atom/renderer/lib/override.coffee @@ -91,21 +91,17 @@ window.confirm = (message, title='') -> window.prompt = -> throw new Error('prompt() is and will not be supported.') -# Implement window.postMessage if current window is a guest window. -guestId = ipcRenderer.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID' -if guestId? - window.opener = - postMessage: (message, targetOrigin='*') -> - ipcRenderer.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', guestId, message, targetOrigin, location.origin +openerId = ipcRenderer.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_OPENER_ID' +window.opener = BrowserWindowProxy.getOrCreate(openerId) if openerId? -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. diff --git a/spec/chromium-spec.coffee b/spec/chromium-spec.coffee index 2cc2237385be..c456a6919b47 100644 --- a/spec/chromium-spec.coffee +++ b/spec/chromium-spec.coffee @@ -116,11 +116,16 @@ describe 'chromium feature', -> b = window.open url, '', 'show=no' describe 'window.postMessage', -> - it 'sets the origin correctly', (done) -> + it 'sets the source and origin correctly', (done) -> + sourceId = remote.getCurrentWindow().id listener = (event) -> window.removeEventListener 'message', listener b.close() - assert.equal event.data, 'file://testing' + message = JSON.parse(event.data) + assert.equal message.data, 'testing' + assert.equal message.origin, 'file://' + assert.equal message.sourceEqualsOpener, true + assert.equal message.sourceId, sourceId assert.equal event.origin, 'file://' done() window.addEventListener 'message', listener diff --git a/spec/fixtures/pages/window-open-postMessage.html b/spec/fixtures/pages/window-open-postMessage.html index e547fa2a6090..0e7e4d8cce0c 100644 --- a/spec/fixtures/pages/window-open-postMessage.html +++ b/spec/fixtures/pages/window-open-postMessage.html @@ -2,7 +2,12 @@