Merge pull request #3848 from atom/no-sync-message-on-start

Remove usages of synchronous messages on startup
This commit is contained in:
Cheng Zhao 2015-12-17 22:31:33 +08:00
commit fe016d393f
11 changed files with 55 additions and 43 deletions

View file

@ -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

View file

@ -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

View file

@ -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'

View file

@ -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

View file

@ -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'

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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