Release resources in browser when renderer view is gonna unloaded.
authorCheng Zhao <zcbenz@gmail.com>
Wed, 1 May 2013 02:59:29 +0000 (10:59 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Wed, 1 May 2013 02:59:29 +0000 (10:59 +0800)
browser/atom/objects_registry.coffee
browser/atom/rpc_server.coffee
renderer/api/lib/remote.coffee

index fb886eb..f921eb6 100644 (file)
@@ -31,6 +31,10 @@ class ObjectsStore
     @stores[key] = new ObjectsStore unless @stores[key]?
     @stores[key]
 
+  @releaseForRenderView: (processId, routingId) ->
+    key = "#{processId}_#{routingId}"
+    delete @stores[key]
+
 # Objects in weak map will be not referenced (so we won't leak memory), and
 # every object created in browser will have a unique id in weak map.
 objectsWeakMap = new IDWeakMap
@@ -72,3 +76,6 @@ exports.getAllWindows = () ->
 
 exports.remove = (processId, routingId, storeId) ->
   ObjectsStore.forRenderView(processId, routingId).remove storeId
+
+exports.clear = (processId, routingId) ->
+  ObjectsStore.releaseForRenderView processId, routingId
index 8c8eed6..bbcc2f3 100644 (file)
@@ -43,6 +43,9 @@ ipc.on 'ATOM_BROWSER_GLOBAL', (event, processId, routingId, name) ->
   catch e
     event.result = type: 'error', value: e.message
 
+ipc.on 'ATOM_BROWSER_RELEASE_RENDER_VIEW', (event, processId, routingId) ->
+  objectsRegistry.clear processId, routingId
+
 ipc.on 'ATOM_BROWSER_CURRENT_WINDOW', (event, processId, routingId) ->
   try
     windows = objectsRegistry.getAllWindows()
index 4b74be8..23f5c6b 100644 (file)
@@ -53,6 +53,10 @@ metaToValue = (meta) ->
 
       ret
 
+# Release all resources of current render view when it's going to be unloaded.
+window.addEventListener 'unload', (event) ->
+  ipc.sendChannelSync 'ATOM_BROWSER_RELEASE_RENDER_VIEW'
+
 # Get remote module.
 exports.require = (module) ->
   meta = ipc.sendChannelSync 'ATOM_BROWSER_REQUIRE', module