Simplify the GuestWindowManager
Instead of recording guest explicitly in a map, we just make use of closure for bookkeeping.
This commit is contained in:
parent
c71aa0995a
commit
0c21c863d7
3 changed files with 27 additions and 42 deletions
|
@ -131,6 +131,10 @@ void Window::Close() {
|
||||||
window_->Close();
|
window_->Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Window::IsClosed() {
|
||||||
|
return window_->IsClosed();
|
||||||
|
}
|
||||||
|
|
||||||
void Window::Focus() {
|
void Window::Focus() {
|
||||||
window_->Focus(true);
|
window_->Focus(true);
|
||||||
}
|
}
|
||||||
|
@ -379,6 +383,7 @@ void Window::BuildPrototype(v8::Isolate* isolate,
|
||||||
mate::ObjectTemplateBuilder(isolate, prototype)
|
mate::ObjectTemplateBuilder(isolate, prototype)
|
||||||
.SetMethod("destroy", &Window::Destroy)
|
.SetMethod("destroy", &Window::Destroy)
|
||||||
.SetMethod("close", &Window::Close)
|
.SetMethod("close", &Window::Close)
|
||||||
|
.SetMethod("isClosed", &Window::IsClosed)
|
||||||
.SetMethod("focus", &Window::Focus)
|
.SetMethod("focus", &Window::Focus)
|
||||||
.SetMethod("isFocused", &Window::IsFocused)
|
.SetMethod("isFocused", &Window::IsFocused)
|
||||||
.SetMethod("show", &Window::Show)
|
.SetMethod("show", &Window::Show)
|
||||||
|
|
|
@ -59,6 +59,7 @@ class Window : public mate::EventEmitter,
|
||||||
// APIs for NativeWindow.
|
// APIs for NativeWindow.
|
||||||
void Destroy();
|
void Destroy();
|
||||||
void Close();
|
void Close();
|
||||||
|
bool IsClosed();
|
||||||
void Focus();
|
void Focus();
|
||||||
bool IsFocused();
|
bool IsFocused();
|
||||||
void Show();
|
void Show();
|
||||||
|
|
|
@ -1,55 +1,35 @@
|
||||||
ipc = require 'ipc'
|
ipc = require 'ipc'
|
||||||
v8Util = process.atomBinding 'v8_util'
|
|
||||||
BrowserWindow = require 'browser-window'
|
BrowserWindow = require 'browser-window'
|
||||||
|
|
||||||
guestWindows = new WeakMap
|
|
||||||
frameToGuest = {}
|
frameToGuest = {}
|
||||||
|
|
||||||
# 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) ->
|
|
||||||
for frameName, value of frameToGuest when guestId == value
|
|
||||||
delete frameToGuest[frameName]
|
|
||||||
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|.
|
# Create a new guest created by |embedder| with |options|.
|
||||||
createGuest = (embedder, url, frameName, options) ->
|
createGuest = (embedder, url, frameName, options) ->
|
||||||
return frameToGuest[frameName] if frameName and frameToGuest[frameName]?
|
guest = frameToGuest[frameName]
|
||||||
|
if frameName and guest?
|
||||||
embedderWindow = BrowserWindow.fromWebContents embedder
|
guest.loadUrl url
|
||||||
guests = getGuestsFromEmbedder embedderWindow
|
return guest.id
|
||||||
|
|
||||||
guest = new BrowserWindow(options)
|
guest = new BrowserWindow(options)
|
||||||
guest.loadUrl url
|
guest.loadUrl url
|
||||||
|
|
||||||
# Remove self from guest list when user closes guest window.
|
# When |embedder| is destroyed we should also destroy attached guest, and if
|
||||||
v8Util.setHiddenValue guest, 'embedderId', embedderWindow.id
|
# guest is closed by user then we should prevent |embedder| from double
|
||||||
guest.on 'closed', guestUserCloseCallback
|
# closing guest.
|
||||||
|
closedByEmbedder = ->
|
||||||
|
guest.removeListener 'closed', closedByUser
|
||||||
|
guest.destroy() unless guest.isClosed()
|
||||||
|
closedByUser = ->
|
||||||
|
embedder.removeListener 'render-view-deleted', closedByEmbedder
|
||||||
|
embedder.once 'render-view-deleted', closedByEmbedder
|
||||||
|
guest.once 'closed', closedByUser
|
||||||
|
|
||||||
|
if frameName
|
||||||
|
frameToGuest[frameName] = guest
|
||||||
|
guest.frameName = frameName
|
||||||
|
guest.once 'closed', ->
|
||||||
|
delete frameToGuest[frameName]
|
||||||
|
|
||||||
frameToGuest[frameName] = guest.id if frameName
|
|
||||||
guests.push guest
|
|
||||||
guest.id
|
guest.id
|
||||||
|
|
||||||
# Routed window.open messages.
|
# Routed window.open messages.
|
||||||
|
@ -62,8 +42,7 @@ ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) ->
|
||||||
|
|
||||||
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', (event, 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 BrowserWindow.fromWebContents(event.sender).id, guestId
|
BrowserWindow.windows.get(guestId).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...) ->
|
||||||
return unless BrowserWindow.windows.has guestId
|
return unless BrowserWindow.windows.has guestId
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue