80 lines
2.4 KiB
CoffeeScript
80 lines
2.4 KiB
CoffeeScript
process = global.process
|
|
ipc = require 'ipc'
|
|
remote = require 'remote'
|
|
|
|
# Window object returned by "window.open".
|
|
class FakeWindow
|
|
constructor: (@guestId) ->
|
|
that = this
|
|
|
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED', (guestId) ->
|
|
if guestId is that.guestId
|
|
that.closed = true
|
|
|
|
close: ->
|
|
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', @guestId
|
|
|
|
focus: ->
|
|
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', @guestId, 'focus'
|
|
|
|
blur: ->
|
|
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', @guestId, 'blur'
|
|
|
|
postMessage: (args...) ->
|
|
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', @guestId, 'postMessage', args[0], args[1]
|
|
|
|
eval: (args...) ->
|
|
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', @guestId, 'executeJavaScript', args...
|
|
|
|
unless process.guestInstanceId?
|
|
# Override default window.close.
|
|
window.close = ->
|
|
remote.getCurrentWindow().close()
|
|
|
|
# Make the browser window or guest view emit "new-window" event.
|
|
window.open = (url, frameName='', features='') ->
|
|
options = {}
|
|
for feature in features.split ','
|
|
[name, value] = feature.split '='
|
|
options[name] =
|
|
if value is 'yes'
|
|
true
|
|
else if value is 'no'
|
|
false
|
|
else
|
|
value
|
|
options.x ?= options.left
|
|
options.y ?= options.top
|
|
options.title ?= name
|
|
options.width ?= 800
|
|
options.height ?= 600
|
|
|
|
guestId = ipc.sendSync 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, frameName, options
|
|
if guestId
|
|
new FakeWindow(guestId)
|
|
else
|
|
console.error 'It is not allowed to open new window from this WebContents'
|
|
null
|
|
|
|
# Use the dialog API to implement alert().
|
|
window.alert = (message, title='') ->
|
|
dialog = remote.require 'dialog'
|
|
buttons = ['OK']
|
|
dialog.showMessageBox remote.getCurrentWindow(), {message, title, buttons}
|
|
|
|
# And the confirm().
|
|
window.confirm = (message, title='') ->
|
|
dialog = remote.require 'dialog'
|
|
buttons = ['OK', 'Cancel']
|
|
not dialog.showMessageBox remote.getCurrentWindow(), {message, title, buttons}
|
|
|
|
# But we do not support prompt().
|
|
window.prompt = ->
|
|
throw new Error('prompt() is and will not be supported in atom-shell.')
|
|
|
|
window.opener =
|
|
postMessage: (args...) ->
|
|
ipc.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', 'postMessage', args[0], args[1]
|
|
|
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', (data, origin) ->
|
|
window.postMessage(data, origin)
|