diff --git a/atom/browser/api/lib/exports/electron.coffee b/atom/browser/api/lib/exports/electron.coffee index 3f7d9b1a13..9c61a55070 100644 --- a/atom/browser/api/lib/exports/electron.coffee +++ b/atom/browser/api/lib/exports/electron.coffee @@ -1,7 +1,9 @@ -# Import common modules. -module.exports = require '../../../../common/api/lib/exports/electron' +common = require '../../../../common/api/lib/exports/electron' -Object.defineProperties module.exports, +# Import common modules. +common.defineProperties exports + +Object.defineProperties exports, # Browser side modules, please sort with alphabet order. app: enumerable: true diff --git a/atom/browser/lib/guest-window-manager.coffee b/atom/browser/lib/guest-window-manager.coffee index 1e9ee13c71..af73db5c78 100644 --- a/atom/browser/lib/guest-window-manager.coffee +++ b/atom/browser/lib/guest-window-manager.coffee @@ -30,12 +30,13 @@ createGuest = (embedder, url, frameName, options) -> guest.loadURL url return guest.id + # Remember the embedder window's id. + options.webPreferences ?= {} + options.webPreferences.openerId = BrowserWindow.fromWebContents(embedder)?.id + guest = new BrowserWindow(options) guest.loadURL url - # Remember the embedder, will be used by window.opener methods. - v8Util.setHiddenValue guest.webContents, 'embedder', embedder - # When |embedder| is destroyed we should also destroy attached guest, and if # guest is closed by user then we should prevent |embedder| from double # closing guest. @@ -83,10 +84,3 @@ ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', (event, guestId ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) -> BrowserWindow.fromId(guestId)?.webContents?[method] args... - -ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_OPENER_ID', (event) -> - embedder = v8Util.getHiddenValue event.sender, 'embedder' - openerId = null - if embedder? - openerId = BrowserWindow.fromWebContents(embedder)?.id - event.returnValue = openerId diff --git a/atom/browser/lib/rpc-server.coffee b/atom/browser/lib/rpc-server.coffee index e388a0fd57..e0256081e6 100644 --- a/atom/browser/lib/rpc-server.coffee +++ b/atom/browser/lib/rpc-server.coffee @@ -219,9 +219,6 @@ ipcMain.on 'ATOM_BROWSER_GUEST_WEB_CONTENTS', (event, guestInstanceId) -> catch e event.returnValue = exceptionToMeta e -ipcMain.on 'ATOM_BROWSER_LIST_MODULES', (event) -> - event.returnValue = (name for name of electron) - ipcMain.on 'ATOM_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', (event, guestInstanceId, method, args...) -> try guestViewManager = require './guest-view-manager' diff --git a/atom/browser/web_contents_preferences.cc b/atom/browser/web_contents_preferences.cc index 3d86df96dd..382c28951d 100644 --- a/atom/browser/web_contents_preferences.cc +++ b/atom/browser/web_contents_preferences.cc @@ -132,6 +132,12 @@ void WebContentsPreferences::AppendExtraCommandLineSwitches( if (web_preferences.GetInteger(options::kGuestInstanceID, &guest_instance_id)) command_line->AppendSwitchASCII(switches::kGuestInstanceID, base::IntToString(guest_instance_id)); + + // Pass the opener's window id. + int opener_id; + if (web_preferences.GetInteger(options::kOpenerID, &opener_id)) + command_line->AppendSwitchASCII(switches::kOpenerID, + base::IntToString(opener_id)); } // static diff --git a/atom/common/api/lib/exports/electron.coffee b/atom/common/api/lib/exports/electron.coffee index e981443065..7598f9ee32 100644 --- a/atom/common/api/lib/exports/electron.coffee +++ b/atom/common/api/lib/exports/electron.coffee @@ -5,23 +5,25 @@ exports.hideInternalModules = -> # Remove the "common/api/lib" and "browser-or-renderer/api/lib". globalPaths.splice 0, 2 -Object.defineProperties exports, - # Common modules, please sort with alphabet order. - clipboard: - # Must be enumerable, otherwise it woulde be invisible to remote module. - enumerable: true - get: -> require '../clipboard' - crashReporter: - enumerable: true - get: -> require '../crash-reporter' - nativeImage: - enumerable: true - get: -> require '../native-image' - shell: - enumerable: true - get: -> require '../shell' - # The internal modules, invisible unless you know their names. - CallbacksRegistry: - get: -> require '../callbacks-registry' - deprecate: - get: -> require '../deprecate' +# Attaches properties to |exports|. +exports.defineProperties = (exports) -> + Object.defineProperties exports, + # Common modules, please sort with alphabet order. + clipboard: + # Must be enumerable, otherwise it woulde be invisible to remote module. + enumerable: true + get: -> require '../clipboard' + crashReporter: + enumerable: true + get: -> require '../crash-reporter' + nativeImage: + enumerable: true + get: -> require '../native-image' + shell: + enumerable: true + get: -> require '../shell' + # The internal modules, invisible unless you know their names. + CallbacksRegistry: + get: -> require '../callbacks-registry' + deprecate: + get: -> require '../deprecate' diff --git a/atom/common/options_switches.cc b/atom/common/options_switches.cc index 0303cf5469..fe279bbf04 100644 --- a/atom/common/options_switches.cc +++ b/atom/common/options_switches.cc @@ -91,6 +91,9 @@ const char kPageVisibility[] = "pageVisibility"; // Enable DirectWrite on Windows. const char kDirectWrite[] = "directWrite"; +// Opener window's ID. +const char kOpenerID[] = "openerId"; + // Web runtime features. const char kExperimentalFeatures[] = "experimentalFeatures"; const char kExperimentalCanvasFeatures[] = "experimentalCanvasFeatures"; @@ -143,6 +146,7 @@ const char kExperimentalCanvasFeatures[] = "experimental-canvas-features"; const char kOverlayScrollbars[] = "overlay-scrollbars"; const char kSharedWorker[] = "shared-worker"; const char kPageVisibility[] = "page-visiblity"; +const char kOpenerID[] = "opener-id"; } // namespace switches diff --git a/atom/common/options_switches.h b/atom/common/options_switches.h index 36c2be1431..d85e789c7b 100644 --- a/atom/common/options_switches.h +++ b/atom/common/options_switches.h @@ -52,6 +52,7 @@ extern const char kExperimentalCanvasFeatures[]; extern const char kOverlayScrollbars[]; extern const char kSharedWorker[]; extern const char kPageVisibility[]; +extern const char kOpenerID[]; } // namespace options @@ -81,6 +82,7 @@ extern const char kExperimentalCanvasFeatures[]; extern const char kOverlayScrollbars[]; extern const char kSharedWorker[]; extern const char kPageVisibility[]; +extern const char kOpenerID[]; } // namespace switches diff --git a/atom/renderer/api/lib/exports/electron.coffee b/atom/renderer/api/lib/exports/electron.coffee index a224818e5f..d0b3af3c55 100644 --- a/atom/renderer/api/lib/exports/electron.coffee +++ b/atom/renderer/api/lib/exports/electron.coffee @@ -1,7 +1,9 @@ -# Import common modules. -module.exports = require '../../../../common/api/lib/exports/electron' +common = require '../../../../common/api/lib/exports/electron' -Object.defineProperties module.exports, +# Import common modules. +common.defineProperties exports + +Object.defineProperties exports, # Renderer side modules, please sort with alphabet order. desktopCapturer: enumerable: true diff --git a/atom/renderer/api/lib/remote.coffee b/atom/renderer/api/lib/remote.coffee index 48cdd937fb..2828586849 100644 --- a/atom/renderer/api/lib/remote.coffee +++ b/atom/renderer/api/lib/remote.coffee @@ -126,9 +126,9 @@ ipcRenderer.on 'ATOM_RENDERER_RELEASE_CALLBACK', (event, id) -> callbacksRegistry.remove id # List all built-in modules in browser process. -browserModules = ipcRenderer.sendSync 'ATOM_BROWSER_LIST_MODULES' +browserModules = require '../../../browser/api/lib/exports/electron' # And add a helper receiver for each one. -for name in browserModules +for name of browserModules do (name) -> Object.defineProperty exports, name, get: -> exports.getBuiltin name diff --git a/atom/renderer/lib/init.coffee b/atom/renderer/lib/init.coffee index d9f104f8d4..b9028f2dd6 100644 --- a/atom/renderer/lib/init.coffee +++ b/atom/renderer/lib/init.coffee @@ -30,6 +30,9 @@ for arg in process.argv if arg.indexOf('--guest-instance-id=') == 0 # This is a guest web view. process.guestInstanceId = parseInt arg.substr(arg.indexOf('=') + 1) + else if arg.indexOf('--opener-id=') == 0 + # This is a guest BrowserWindow. + process.openerId = parseInt arg.substr(arg.indexOf('=') + 1) else if arg.indexOf('--node-integration=') == 0 nodeIntegration = arg.substr arg.indexOf('=') + 1 else if arg.indexOf('--preload=') == 0 diff --git a/atom/renderer/lib/override.coffee b/atom/renderer/lib/override.coffee index ba15c7b3f6..7279b232a9 100644 --- a/atom/renderer/lib/override.coffee +++ b/atom/renderer/lib/override.coffee @@ -91,8 +91,8 @@ window.confirm = (message, title='') -> window.prompt = -> throw new Error('prompt() is and will not be supported.') -openerId = ipcRenderer.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_OPENER_ID' -window.opener = BrowserWindowProxy.getOrCreate(openerId) if openerId? +if process.openerId? + window.opener = BrowserWindowProxy.getOrCreate process.openerId ipcRenderer.on 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', (event, sourceId, message, sourceOrigin) -> # Manually dispatch event instead of using postMessage because we also need to