diff --git a/main.js b/main.js index 92f887f..bb106ae 100644 --- a/main.js +++ b/main.js @@ -6,9 +6,12 @@ const consts = require('./src/consts.js') const client = require('./src/client.js').init() const rl = require('readline').createInterface({input: client.socket}) -let elements = {} -let menus = {} -let quittingApp = false +let callbacks = {}; +let counters = {}; +let elements = {}; +let menus = {}; +let quittingApp = false; +let reload = null; // Command line switches let idx = 3; @@ -206,6 +209,11 @@ app.on('ready',() => { client.write(json.targetID, consts.eventNames.trayEventImageSet) break; + // Web contents + case consts.eventNames.webContentsEventLoginCallback: + executeCallback(consts.callbackNames.webContentsLogin, json, [json.username, json.password]); + break; + // Window case consts.eventNames.windowCmdBlur: elements[json.targetID].blur() @@ -352,9 +360,9 @@ function trayCreate(json) { if (typeof json.trayOptions.tooltip !== "undefined") { elements[json.targetID].setToolTip(json.trayOptions.tooltip); } - elements[json.targetID].on('click', () => { client.write(json.targetID, consts.eventNames.trayEventClicked) }) - elements[json.targetID].on('double-click', () => { client.write(json.targetID, consts.eventNames.trayEventDoubleClicked) }) - elements[json.targetID].on('right-click', () => { client.write(json.targetID, consts.eventNames.trayEventRightClicked) }) + elements[json.targetID].on('click', (index, event) => { client.write(json.targetID, consts.eventNames.trayEventClicked, {"bounds":{x:event.x, y:event.y,width:event.width,height:event.height}})}) + elements[json.targetID].on('double-click', (index, event) => { client.write(json.targetID, consts.eventNames.trayEventDoubleClicked, {"bounds":{x:event.x, y:event.y,width:event.width,height:event.height}})}) + elements[json.targetID].on('right-click', (index, event) => { client.write(json.targetID, consts.eventNames.trayEventRightClicked, {"bounds":{x:event.x, y:event.y,width:event.width,height:event.height}})}) client.write(json.targetID, consts.eventNames.trayEventCreated) } @@ -372,9 +380,14 @@ function windowCreate(json) { return } } - if (json.windowOptions.minimizeOnClose && !quittingApp) { - e.preventDefault(); - elements[json.targetID].minimize(); + if (!quittingApp) { + if (json.windowOptions.minimizeOnClose) { + e.preventDefault(); + elements[json.targetID].minimize(); + } else if (json.windowOptions.hideOnClose) { + e.preventDefault(); + elements[json.targetID].hide(); + } } }) elements[json.targetID].on('closed', () => { @@ -392,17 +405,22 @@ function windowCreate(json) { elements[json.targetID].on('show', () => { client.write(json.targetID, consts.eventNames.windowEventShow) }) elements[json.targetID].on('unmaximize', () => { client.write(json.targetID, consts.eventNames.windowEventUnmaximize) }) elements[json.targetID].on('unresponsive', () => { client.write(json.targetID, consts.eventNames.windowEventUnresponsive) }) + elements[json.targetID].webContents.on('did-fail-load', () => { + reload = setInterval(() => { + elements[json.targetID].reload(); + }, 3000) + }) elements[json.targetID].webContents.on('did-finish-load', () => { + if (reload !== null) { + clearInterval(reload); + } elements[json.targetID].webContents.executeJavaScript( `const {ipcRenderer} = require('electron') const {dialog} = require('electron').remote - ipcRenderer.on('`+ consts.eventNames.ipcCmdLog+`', function(event, message) { - console.log(message) - }) - var onMessageOnce = false; var astilectron = { + onMessageOnce: false, onMessage: function(callback) { - if (onMessageOnce) { + if (astilectron.onMessageOnce) { return } ipcRenderer.on('`+ consts.eventNames.ipcCmdMessage +`', function(event, message) { @@ -413,20 +431,29 @@ function windowCreate(json) { ipcRenderer.send('`+ consts.eventNames.ipcEventMessageCallback +`', e) } }) - onMessageOnce = true + astilectron.onMessageOnce = true }, - callbackIdCounter: 1, - sendMessage: function(message, callback) { - let e = {message: message, targetID: '`+ json.targetID +`'} - if (typeof callback !== "undefined") { - e.callbackId = String(astilectron.callbackIdCounter++) - ipcRenderer.on('`+ consts.eventNames.ipcCmdMessageCallback +`', function(event, message) { - if (message.callbackId === e.callbackId) { - callback(message.message) - } - }); + callbacks: {}, + counters: {}, + registerCallback: function(k, e, c, n) { + e.targetID = '`+ json.targetID +`'; + if (typeof astilectron.counters[k] === "undefined") { + astilectron.counters[k] = 1; + } + e.callbackId = String(astilectron.counters[k]++); + if (typeof astilectron.callbacks[k] === "undefined") { + astilectron.callbacks[k] = {}; } - ipcRenderer.send('`+ consts.eventNames.ipcEventMessage +`', e) + astilectron.callbacks[k][e.callbackId] = c; + ipcRenderer.send(n, e); + }, + executeCallback: function(k, message, args) { + if (typeof astilectron.callbacks[k][message.callbackId] !== "undefined") { + astilectron.callbacks[k][message.callbackId].apply(null, args); + } + }, + sendMessage: function(message, callback) { + astilectron.registerCallback('` + consts.callbackNames.webContentsMessage + `', {message: message}, callback, '`+ consts.eventNames.ipcEventMessage +`'); }, showErrorBox: function(title, content) { dialog.showErrorBox(title, content) @@ -440,7 +467,13 @@ function windowCreate(json) { showSaveDialog: function(options, callback) { dialog.showSaveDialog(null, options, callback) } - } + }; + ipcRenderer.on('`+ consts.eventNames.ipcCmdMessageCallback +`', function(event, message) { + astilectron.executeCallback('` + consts.callbackNames.webContentsMessage + `', message, [message.message]); + }); + ipcRenderer.on('`+ consts.eventNames.ipcCmdLog+`', function(event, message) { + console.log(message) + }) document.dispatchEvent(new Event('astilectron-ready'))` ) sessionCreate(elements[json.targetID].webContents, json.sessionId) @@ -452,6 +485,10 @@ function windowCreate(json) { oldUrl: oldUrl }) }) + elements[json.targetID].webContents.on('login', (event, request, authInfo, callback) => { + event.preventDefault(); + registerCallback(json, consts.callbackNames.webContentsLogin, {authInfo: authInfo, request: request}, consts.eventNames.webContentsEventLogin, callback); + }) elements[json.targetID].webContents.on('will-navigate', (event, url) => { client.write(json.targetID, consts.eventNames.windowEventWillNavigate, { url: url @@ -459,6 +496,24 @@ function windowCreate(json) { }) } +function registerCallback(json, k, e, n, c) { + if (typeof counters[k] === "undefined") { + counters[k] = 1; + } + e.callbackId = String(counters[k]++); + if (typeof callbacks[k] === "undefined") { + callbacks[k] = {}; + } + callbacks[k][e.callbackId] = c; + client.write(json.targetID, n, e); +} + +function executeCallback(k, json, args) { + if (typeof callbacks[k][json.callbackId] !== "undefined") { + callbacks[k][json.callbackId].apply(null, args); + } +} + function sessionCreate(webContents, sessionId) { elements[sessionId] = webContents.session elements[sessionId].on('will-download', () => { client.write(sessionId, consts.eventNames.sessionEventWillDownload) }) diff --git a/src/consts.js b/src/consts.js index 30ead32..a3cd3be 100644 --- a/src/consts.js +++ b/src/consts.js @@ -1,6 +1,10 @@ 'use strict' module.exports = { + callbackNames: { + webContentsLogin: "web.contents.login", + webContentsMessage: "web.contents.message", + }, eventNames: { appCmdQuit: "app.cmd.quit", appEventReady: "app.event.ready", @@ -67,6 +71,8 @@ module.exports = { trayEventDoubleClicked: "tray.event.double.clicked", trayEventImageSet: "tray.event.image.set", trayEventRightClicked: "tray.event.right.clicked", + webContentsEventLogin: "web.contents.event.login", + webContentsEventLoginCallback: "web.contents.event.login.callback", windowCmdBlur: "window.cmd.blur", windowCmdCenter: "window.cmd.center", windowCmdClose: "window.cmd.close",