Reuse the window of same frame name
This commit is contained in:
parent
8359c8e194
commit
c71aa0995a
2 changed files with 15 additions and 11 deletions
|
@ -3,6 +3,7 @@ v8Util = process.atomBinding 'v8_util'
|
||||||
BrowserWindow = require 'browser-window'
|
BrowserWindow = require 'browser-window'
|
||||||
|
|
||||||
guestWindows = new WeakMap
|
guestWindows = new WeakMap
|
||||||
|
frameToGuest = {}
|
||||||
|
|
||||||
# Callback that registered to "closed" event of guest.
|
# Callback that registered to "closed" event of guest.
|
||||||
guestUserCloseCallback = ->
|
guestUserCloseCallback = ->
|
||||||
|
@ -25,6 +26,8 @@ getGuestsFromEmbedder = (embedderWindow) ->
|
||||||
|
|
||||||
# Remove a guest window.
|
# Remove a guest window.
|
||||||
removeGuest = (embedderId, guestId) ->
|
removeGuest = (embedderId, guestId) ->
|
||||||
|
for frameName, value of frameToGuest when guestId == value
|
||||||
|
delete frameToGuest[frameName]
|
||||||
guests = getGuestsFromEmbedder BrowserWindow.windows.get(embedderId)
|
guests = getGuestsFromEmbedder BrowserWindow.windows.get(embedderId)
|
||||||
for guest, i in guests
|
for guest, i in guests
|
||||||
if guest.id == guestId
|
if guest.id == guestId
|
||||||
|
@ -32,7 +35,9 @@ removeGuest = (embedderId, guestId) ->
|
||||||
return guest
|
return guest
|
||||||
|
|
||||||
# Create a new guest created by |embedder| with |options|.
|
# Create a new guest created by |embedder| with |options|.
|
||||||
createGuest = (embedder, url, options) ->
|
createGuest = (embedder, url, frameName, options) ->
|
||||||
|
return frameToGuest[frameName] if frameName and frameToGuest[frameName]?
|
||||||
|
|
||||||
embedderWindow = BrowserWindow.fromWebContents embedder
|
embedderWindow = BrowserWindow.fromWebContents embedder
|
||||||
guests = getGuestsFromEmbedder embedderWindow
|
guests = getGuestsFromEmbedder embedderWindow
|
||||||
|
|
||||||
|
@ -43,8 +48,9 @@ createGuest = (embedder, url, options) ->
|
||||||
v8Util.setHiddenValue guest, 'embedderId', embedderWindow.id
|
v8Util.setHiddenValue guest, 'embedderId', embedderWindow.id
|
||||||
guest.on 'closed', guestUserCloseCallback
|
guest.on 'closed', guestUserCloseCallback
|
||||||
|
|
||||||
|
frameToGuest[frameName] = guest.id if frameName
|
||||||
guests.push guest
|
guests.push guest
|
||||||
[embedderWindow.id, guest.id]
|
guest.id
|
||||||
|
|
||||||
# Routed window.open messages.
|
# Routed window.open messages.
|
||||||
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) ->
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) ->
|
||||||
|
@ -52,12 +58,11 @@ ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) ->
|
||||||
if event.sender.isGuest() or event.defaultPrevented
|
if event.sender.isGuest() or event.defaultPrevented
|
||||||
event.returnValue = null
|
event.returnValue = null
|
||||||
else
|
else
|
||||||
[url, frameName, options] = args
|
event.returnValue = createGuest event.sender, args...
|
||||||
event.returnValue = createGuest event.sender, url, options
|
|
||||||
|
|
||||||
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', (event, embedderId, guestId) ->
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', (event, guestId) ->
|
||||||
return unless BrowserWindow.windows.has guestId
|
return unless BrowserWindow.windows.has guestId
|
||||||
guest = removeGuest embedderId, guestId
|
guest = removeGuest BrowserWindow.fromWebContents(event.sender).id, guestId
|
||||||
guest.destroy()
|
guest.destroy()
|
||||||
|
|
||||||
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', (event, guestId, method, args...) ->
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', (event, guestId, method, args...) ->
|
||||||
|
@ -66,5 +71,4 @@ ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', (event, guestId, method,
|
||||||
|
|
||||||
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) ->
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) ->
|
||||||
return unless BrowserWindow.windows.has guestId
|
return unless BrowserWindow.windows.has guestId
|
||||||
guest = BrowserWindow.windows.get guestId
|
|
||||||
BrowserWindow.windows.get(guestId).webContents?[method] args...
|
BrowserWindow.windows.get(guestId).webContents?[method] args...
|
||||||
|
|
|
@ -4,10 +4,10 @@ remote = require 'remote'
|
||||||
|
|
||||||
# Window object returned by "window.open".
|
# Window object returned by "window.open".
|
||||||
class FakeWindow
|
class FakeWindow
|
||||||
constructor: (@embedderId, @guestId) ->
|
constructor: (@guestId) ->
|
||||||
|
|
||||||
close: ->
|
close: ->
|
||||||
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', @embedderId, @guestId
|
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', @guestId
|
||||||
|
|
||||||
focus: ->
|
focus: ->
|
||||||
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', @guestId, 'focus'
|
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', @guestId, 'focus'
|
||||||
|
@ -41,8 +41,8 @@ window.open = (url, frameName='', features='') ->
|
||||||
options.width ?= 800
|
options.width ?= 800
|
||||||
options.height ?= 600
|
options.height ?= 600
|
||||||
|
|
||||||
[embedderId, guestId] = ipc.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, options
|
guestId = ipc.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, options
|
||||||
new FakeWindow(embedderId, guestId)
|
new FakeWindow(guestId)
|
||||||
|
|
||||||
# Use the dialog API to implement alert().
|
# Use the dialog API to implement alert().
|
||||||
window.alert = (message, title='') ->
|
window.alert = (message, title='') ->
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue