61 lines
2 KiB
CoffeeScript
61 lines
2 KiB
CoffeeScript
|
ipc = require 'ipc'
|
||
|
v8Util = process.atomBinding 'v8_util'
|
||
|
BrowserWindow = require 'browser-window'
|
||
|
|
||
|
guestWindows = new WeakMap
|
||
|
|
||
|
# Callback that registered to "closed" event of guest.
|
||
|
guestUserCloseCallback = ->
|
||
|
embedderId = v8Util.getHiddenValue this, 'embedderId'
|
||
|
removeGuest embedderId, @id
|
||
|
|
||
|
# Get all guests created in a window.
|
||
|
getGuestsFromEmbedder = (embedderWindow) ->
|
||
|
unless guestWindows.has embedderWindow
|
||
|
guests = []
|
||
|
guestWindows.set embedderWindow, guests
|
||
|
# Close all guests when window is closed.
|
||
|
embedderWindow.on 'closed', ->
|
||
|
for guest in guests
|
||
|
# Avoid double removing window from guests.
|
||
|
guest.removeListener 'closed', guestUserCloseCallback
|
||
|
# Just close without emitting "beforeunload" event.
|
||
|
guest.destroy()
|
||
|
guestWindows.get embedderWindow
|
||
|
|
||
|
# Remove a guest window.
|
||
|
removeGuest = (embedderId, guestId) ->
|
||
|
guests = getGuestsFromEmbedder BrowserWindow.windows.get(embedderId)
|
||
|
for guest, i in guests
|
||
|
if guest.id == guestId
|
||
|
guests.splice i, 1
|
||
|
return guest
|
||
|
|
||
|
# Create a new guest created by |embedder| with |options|.
|
||
|
createGuest = (embedder, url, options) ->
|
||
|
embedderWindow = BrowserWindow.fromWebContents embedder
|
||
|
guests = getGuestsFromEmbedder embedderWindow
|
||
|
|
||
|
guest = new BrowserWindow(options)
|
||
|
guest.loadUrl url
|
||
|
|
||
|
# Remove self from guest list when user closes guest window.
|
||
|
v8Util.setHiddenValue guest, 'embedderId', embedderWindow.id
|
||
|
guest.on 'closed', guestUserCloseCallback
|
||
|
|
||
|
guests.push guest
|
||
|
[embedderWindow.id, guest.id]
|
||
|
|
||
|
# Routed window.open messages.
|
||
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) ->
|
||
|
event.sender.emit 'new-window', event, args...
|
||
|
if event.sender.isGuest() or event.defaultPrevented
|
||
|
event.returnValue = null
|
||
|
else
|
||
|
[url, frameName, options] = args
|
||
|
event.returnValue = createGuest event.sender, url, options
|
||
|
|
||
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', (event, args...) ->
|
||
|
guest = removeGuest args...
|
||
|
guest.destroy()
|