From 1e1fec15b656dfc5531120762795c6ecbf1808dd Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 5 Oct 2013 20:21:57 +0800 Subject: [PATCH] Make objects registry code more structured. --- browser/api/lib/app.coffee | 3 +- browser/atom/objects-registry.coffee | 98 ++++++++++++++++++++---------------- 2 files changed, 56 insertions(+), 45 deletions(-) diff --git a/browser/api/lib/app.coffee b/browser/api/lib/app.coffee index b76f8f3..5e0d7e9 100644 --- a/browser/api/lib/app.coffee +++ b/browser/api/lib/app.coffee @@ -1,5 +1,4 @@ bindings = process.atomBinding 'app' -objectsRegistry = require '../../atom/objects-registry.js' EventEmitter = require('events').EventEmitter Application = bindings.Application @@ -11,7 +10,7 @@ app.getHomeDir = -> process.env[if process.platform is 'win32' then 'USERPROFILE' else 'HOME'] app.getBrowserWindows = -> - objectsRegistry.getAllWindows() + require('../../atom/objects-registry.js').getAllWindows() app.setApplicationMenu = (menu) -> require('menu').setApplicationMenu menu diff --git a/browser/atom/objects-registry.coffee b/browser/atom/objects-registry.coffee index c600931..b107d0f 100644 --- a/browser/atom/objects-registry.coffee +++ b/browser/atom/objects-registry.coffee @@ -1,7 +1,9 @@ BrowserWindow = require 'browser-window' +EventEmitter = require('events').EventEmitter IDWeakMap = require 'id-weak-map' v8Util = process.atomBinding 'v8_util' +# Class to reference all objects. class ObjectsStore @stores = {} @@ -37,46 +39,56 @@ class ObjectsStore 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 -objectsWeakMap.add = (obj) -> - id = IDWeakMap::add.call this, obj - v8Util.setHiddenValue obj, 'atomId', id - id - -windowsWeakMap = new IDWeakMap - -process.on 'ATOM_BROWSER_INTERNAL_NEW', (obj) -> - # Remember all windows. - if obj.constructor is BrowserWindow - id = windowsWeakMap.add obj - obj.on 'destroyed', -> - windowsWeakMap.remove id - -exports.add = (processId, routingId, obj) -> - # Some native objects may already been added to objectsWeakMap, be care not - # to add it twice. - objectsWeakMap.add obj unless v8Util.getHiddenValue obj, 'atomId' - id = v8Util.getHiddenValue obj, 'atomId' - - # Store and reference the object, then return the storeId which points to - # where the object is stored. The caller can later dereference the object - # with the storeId. - store = ObjectsStore.forRenderView processId, routingId - storeId = store.add obj - - [id, storeId] - -exports.get = (id) -> - objectsWeakMap.get id - -exports.getAllWindows = () -> - keys = windowsWeakMap.keys() - windowsWeakMap.get key for key in keys - -exports.remove = (processId, routingId, storeId) -> - ObjectsStore.forRenderView(processId, routingId).remove storeId - -exports.clear = (processId, routingId) -> - ObjectsStore.releaseForRenderView processId, routingId +class ObjectsRegistry + constructor: -> + # 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 + @objectsWeakMap.add = (obj) -> + id = IDWeakMap::add.call this, obj + v8Util.setHiddenValue obj, 'atomId', id + id + + # Remember all windows in the weak map. + @windowsWeakMap = new IDWeakMap + process.on 'ATOM_BROWSER_INTERNAL_NEW', (obj) => + if obj.constructor is BrowserWindow + id = @windowsWeakMap.add obj + obj.on 'destroyed', => @windowsWeakMap.remove id + + # Register a new object, the object would be kept referenced until you release + # it explicitly. + add: (processId, routingId, obj) -> + # Some native objects may already been added to objectsWeakMap, be care not + # to add it twice. + @objectsWeakMap.add obj unless v8Util.getHiddenValue obj, 'atomId' + id = v8Util.getHiddenValue obj, 'atomId' + + # Store and reference the object, then return the storeId which points to + # where the object is stored. The caller can later dereference the object + # with the storeId. + # We use a difference key because the same object can be referenced for + # multiple times by the same renderer view. + store = ObjectsStore.forRenderView processId, routingId + storeId = store.add obj + + [id, storeId] + + # Get an object according to its id. + get: (id) -> + @objectsWeakMap.get id + + # Remove an object according to its storeId. + remove: (processId, routingId, storeId) -> + ObjectsStore.forRenderView(processId, routingId).remove storeId + + # Clear all references to objects from renderer view. + clear: (processId, routingId) -> + ObjectsStore.releaseForRenderView processId, routingId + + # Return an array of all browser windows. + getAllWindows: -> + keys = @windowsWeakMap.keys() + @windowsWeakMap.get key for key in keys + +module.exports = new ObjectsRegistry -- 2.7.4