Don't send ATOM_BROWSER_DEREFERENCE message if context is already gone.

It's possible that the object gets destructed after reloading, however
since we already released all objects in browser when unloading, it
would cause troubles when sending message in an unexist context. We just
rely on the closure to mark whether the context is gone.

A more suitable solution, however, is to restart renderer process when
doing reloading.
This commit is contained in:
Cheng Zhao 2013-05-04 23:00:57 +08:00
parent 35441ad8fb
commit d377cbfa74

View file

@ -1,6 +1,8 @@
ipc = require 'ipc' ipc = require 'ipc'
v8_util = process.atomBinding 'v8_util' v8_util = process.atomBinding 'v8_util'
currentContextExist = true
class CallbacksRegistry class CallbacksRegistry
@nextId = 0 @nextId = 0
@callbacks = {} @callbacks = {}
@ -73,6 +75,7 @@ metaToValue = (meta) ->
# Track delegate object's life time, and tell the browser to clean up # Track delegate object's life time, and tell the browser to clean up
# when the object is GCed. # when the object is GCed.
v8_util.setDestructor ret, -> v8_util.setDestructor ret, ->
return unless currentContextExist
ipc.sendChannel 'ATOM_BROWSER_DEREFERENCE', meta.storeId ipc.sendChannel 'ATOM_BROWSER_DEREFERENCE', meta.storeId
# Mark this is a remote object. # Mark this is a remote object.
@ -90,6 +93,7 @@ ipc.on 'ATOM_RENDERER_RELEASE_CALLBACK', (id) ->
# Release all resources of current render view when it's going to be unloaded. # Release all resources of current render view when it's going to be unloaded.
window.addEventListener 'unload', (event) -> window.addEventListener 'unload', (event) ->
currentContextExist = false
ipc.sendChannelSync 'ATOM_BROWSER_RELEASE_RENDER_VIEW' ipc.sendChannelSync 'ATOM_BROWSER_RELEASE_RENDER_VIEW'
# Get remote module. # Get remote module.