From 99f6a5678ac1106bb7d6c525ff529edd79917418 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Sat, 27 Apr 2013 19:06:41 +0800 Subject: [PATCH] Add remote.getCurrentWindow() API in renderer. --- browser/atom/objects_registry.coffee | 9 +++++++++ browser/atom/rpc_server.coffee | 10 ++++++++++ renderer/api/lib/remote.coffee | 5 +++++ 3 files changed, 24 insertions(+) diff --git a/browser/atom/objects_registry.coffee b/browser/atom/objects_registry.coffee index 89eba86..680e5a7 100644 --- a/browser/atom/objects_registry.coffee +++ b/browser/atom/objects_registry.coffee @@ -40,6 +40,8 @@ objectsWeakMap.add = (obj) -> enumerable: true, writable: false, value: id id +windowsWeakMap = new IDWeakMap + process.on 'ATOM_BROWSER_INTERNAL_NEW', (obj) -> # It's possible that user created a object in browser side and then want to # get it in renderer via remote.getObject. So we must add every native object @@ -47,6 +49,9 @@ process.on 'ATOM_BROWSER_INTERNAL_NEW', (obj) -> # renderer. objectsWeakMap.add obj + # Also remember all windows. + windowsWeakMap.add obj if obj.constructor.name is 'Window' + exports.add = (process_id, routing_id, obj) -> # Some native objects may already been added to objectsWeakMap, be care not # to add it twice. @@ -61,5 +66,9 @@ exports.add = (process_id, routing_id, obj) -> exports.get = (id) -> objectsWeakMap.get id +exports.getAllWindows = () -> + keys = windowsWeakMap.keys() + windowsWeakMap.get key for key in keys + exports.remove = (process_id, routing_id, storeId) -> ObjectsStore.forRenderView(process_id, routing_id).remove storeId diff --git a/browser/atom/rpc_server.coffee b/browser/atom/rpc_server.coffee index 6c0b955..d4da3e9 100644 --- a/browser/atom/rpc_server.coffee +++ b/browser/atom/rpc_server.coffee @@ -34,6 +34,16 @@ ipc.on 'ATOM_INTERNAL_REQUIRE', (event, process_id, routing_id, module) -> catch e event.result = type: 'error', value: e.message +ipc.on 'ATOM_INTERNAL_CURRENT_WINDOW', (event, process_id, routing_id) -> + try + windows = objectsRegistry.getAllWindows() + for window in windows + break if window.getProcessID() == process_id and + window.getRoutingID() == routing_id + event.result = new Meta(process_id, routing_id, window) + catch e + event.result = type: 'error', value: e.message + ipc.on 'ATOM_INTERNAL_CONSTRUCTOR', (event, process_id, routing_id, id, args) -> try constructor = objectsRegistry.get id diff --git a/renderer/api/lib/remote.coffee b/renderer/api/lib/remote.coffee index e2ef151..bee625d 100644 --- a/renderer/api/lib/remote.coffee +++ b/renderer/api/lib/remote.coffee @@ -62,3 +62,8 @@ exports.require = (module) -> exports.getObject = (id) -> meta = ipc.sendChannelSync 'ATOM_INTERNAL_REFERENCE', id metaToValue meta + +# Get current window object. +exports.getCurrentWindow = -> + meta = ipc.sendChannelSync 'ATOM_INTERNAL_CURRENT_WINDOW' + metaToValue meta -- 2.7.4