110 lines
3.7 KiB
CoffeeScript
110 lines
3.7 KiB
CoffeeScript
EventEmitter = require('events').EventEmitter
|
|
NavigationController = require './navigation-controller'
|
|
binding = process.atomBinding 'web_contents'
|
|
ipc = require 'ipc'
|
|
|
|
nextId = 0
|
|
getNextId = -> ++nextId
|
|
|
|
wrapWebContents = (webContents) ->
|
|
# webContents is an EventEmitter.
|
|
webContents.__proto__ = EventEmitter.prototype
|
|
|
|
# WebContents::send(channel, args..)
|
|
webContents.send = (channel, args...) ->
|
|
@_send channel, [args...]
|
|
|
|
# Make sure webContents.executeJavaScript would run the code only when the
|
|
# web contents has been loaded.
|
|
webContents.loaded = false
|
|
webContents.once 'did-finish-load', -> @loaded = true
|
|
webContents.executeJavaScript = (code) ->
|
|
if @loaded
|
|
@_executeJavaScript code
|
|
else
|
|
webContents.once 'did-finish-load', @_executeJavaScript.bind(this, code)
|
|
|
|
# The processId and routingId and identify a webContents.
|
|
webContents.getId = -> "#{@getProcessId()}-#{@getRoutingId()}"
|
|
webContents.equal = (other) -> @getId() is other.getId()
|
|
|
|
# The navigation controller.
|
|
controller = new NavigationController(webContents)
|
|
for name, method of NavigationController.prototype when method instanceof Function
|
|
do (name, method) ->
|
|
webContents[name] = -> method.apply controller, arguments
|
|
|
|
# Translate |disposition| to string for 'new-window' event.
|
|
webContents.on '-new-window', (args..., disposition) ->
|
|
disposition =
|
|
switch disposition
|
|
when 2 then 'default'
|
|
when 4 then 'foreground-tab'
|
|
when 5 then 'background-tab'
|
|
when 6, 7 then 'new-window'
|
|
else 'other'
|
|
@emit 'new-window', args..., disposition
|
|
|
|
# Tell the rpc server that a render view has been deleted and we need to
|
|
# release all objects owned by it.
|
|
webContents.on 'render-view-deleted', (event, processId, routingId) ->
|
|
process.emit 'ATOM_BROWSER_RELEASE_RENDER_VIEW', "#{processId}-#{routingId}"
|
|
|
|
# Dispatch IPC messages to the ipc module.
|
|
webContents.on 'ipc-message', (event, packed) ->
|
|
[channel, args...] = packed
|
|
Object.defineProperty event, 'sender', value: webContents
|
|
ipc.emit channel, event, args...
|
|
webContents.on 'ipc-message-sync', (event, packed) ->
|
|
[channel, args...] = packed
|
|
Object.defineProperty event, 'returnValue', set: (value) -> event.sendReply JSON.stringify(value)
|
|
Object.defineProperty event, 'sender', value: webContents
|
|
ipc.emit channel, event, args...
|
|
|
|
webContents.printToPDF = (options, callback) ->
|
|
printingSetting =
|
|
pageRage:[],
|
|
mediaSize:
|
|
height_microns:297000,
|
|
is_default:true,
|
|
name:"ISO_A4",
|
|
width_microns:210000,
|
|
custom_display_name:"A4",
|
|
landscape:false,
|
|
color:2,
|
|
headerFooterEnabled:false,
|
|
marginsType:0,
|
|
isFirstRequest:false,
|
|
requestID: getNextId(),
|
|
previewModifiable:true,
|
|
printToPDF:true,
|
|
printWithCloudPrint:false,
|
|
printWithPrivet:false,
|
|
printWithExtension:false,
|
|
deviceName:"Save as PDF",
|
|
generateDraftData:true,
|
|
fitToPageEnabled:false,
|
|
duplex:0,
|
|
copies:1,
|
|
collate:true,
|
|
shouldPrintBackgrounds:false,
|
|
shouldPrintSelectionOnly:false
|
|
|
|
if options.landscape
|
|
printingSetting.landscape = options.landscape
|
|
if options.marginsType
|
|
printingSetting.marginsType = options.marginsType
|
|
if options.printSelectionOnly
|
|
printingSetting.shouldPrintSelectionOnly = options.printSelectionOnly
|
|
if options.printBackgrounds
|
|
printingSetting.shouldPrintBackgrounds = options.printBackground
|
|
|
|
webContents._printToPDF printingSetting, callback
|
|
|
|
webContents
|
|
|
|
binding._setWrapWebContents wrapWebContents
|
|
process.once 'exit', binding._clearWrapWebContents
|
|
|
|
module.exports.create = (options={}) ->
|
|
binding.create(options)
|