From 33737498ec009a9fa67eb9350b6ca3e355a400e1 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 24 Aug 2015 16:17:15 +0800 Subject: [PATCH] Make sure guest view is destroyed immediately when embeder is closed --- atom/browser/lib/guest-view-manager.coffee | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/atom/browser/lib/guest-view-manager.coffee b/atom/browser/lib/guest-view-manager.coffee index 971c15cb1b..398cdb5d94 100644 --- a/atom/browser/lib/guest-view-manager.coffee +++ b/atom/browser/lib/guest-view-manager.coffee @@ -30,6 +30,10 @@ guestInstances = {} embedderElementsMap = {} reverseEmbedderElementsMap = {} +# Moves the last element of array to the first one. +moveLastToFirst = (list) -> + list.unshift list.pop() + # Generate guestInstanceId. getNextInstanceId = (webContents) -> ++nextInstanceId @@ -46,7 +50,13 @@ createGuest = (embedder, params) -> destroyEvents = ['destroyed', 'crashed', 'did-navigate-to-different-page'] destroy = -> destroyGuest embedder, id if guestInstances[id]? - embedder.once event, destroy for event in destroyEvents + for event in destroyEvents + embedder.once event, destroy + # Users might also listen to the crashed event, so We must ensure the guest + # is destroyed before users' listener gets called. It is done by moving our + # listener to the first one in queue. + listeners = embedder._events[event] + moveLastToFirst listeners if Array.isArray listeners guest.once 'destroyed', -> embedder.removeListener event, destroy for event in destroyEvents