Use GuestWindowManager to mange windows created by window.open
This commit is contained in:
parent
9c92f2e692
commit
6f41598962
7 changed files with 77 additions and 10 deletions
60
atom/browser/lib/guest-window-manager.coffee
Normal file
60
atom/browser/lib/guest-window-manager.coffee
Normal file
|
@ -0,0 +1,60 @@
|
|||
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()
|
Loading…
Add table
Add a link
Reference in a new issue