reworked the .runtime feature detection (now Electron works, though with an odd bug)...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2017-10-04 08:08:40 +03:00
parent 9a0649a9b1
commit 6b16ce2cc3
10 changed files with 42 additions and 49 deletions

View File

@ -20,12 +20,13 @@ var url = require('url')
var win var win
function createWindow () { function createWindow() {
// Create the browser window. // Create the browser window.
win = new BrowserWindow({width: 800, height: 600}) win = new BrowserWindow({width: 800, height: 600})
// and load the index.html of the app. // and load the index.html of the app.
win.loadURL(url.format({ win.loadURL(url.format({
// XXX for some reason the system is loaded twice...
pathname: path.join(__dirname, 'index.html'), pathname: path.join(__dirname, 'index.html'),
protocol: 'file:', protocol: 'file:',
slashes: true slashes: true

View File

@ -197,7 +197,7 @@ module.AppControl = core.ImageGridFeatures.Feature({
// - chrome app // - chrome app
// - nw // - nw
// - mobile // - mobile
isApplicable: function(){ return this.runtime == 'nw' }, isApplicable: function(){ return this.runtime.nw },
// XXX show main window... // XXX show main window...
handlers: [ handlers: [

View File

@ -91,8 +91,9 @@ module.CLI = core.ImageGridFeatures.Feature({
'lifecycle' 'lifecycle'
], ],
// XXX should this be ONLY node???
isApplicable: function(){ isApplicable: function(){
return this.runtime == 'node' /*|| this.runtime == 'nw'*/ }, return this.runtime.node && !this.runtime.browser },
actions: CLIActions, actions: CLIActions,
@ -101,7 +102,7 @@ module.CLI = core.ImageGridFeatures.Feature({
function(){ function(){
var that = this var that = this
// get the arguments... // get the arguments...
if(this.runtime == 'nw'){ if(this.runtime.nw){
var argv = nw.App.argv var argv = nw.App.argv
// XXX appears to have a stray '--help' lodged in // XXX appears to have a stray '--help' lodged in
@ -109,7 +110,7 @@ module.CLI = core.ImageGridFeatures.Feature({
// ...need to test this with a packed exec... // ...need to test this with a packed exec...
console.log('>>>>', argv) console.log('>>>>', argv)
} else if(this.runtime == 'node'){ } else if(this.runtime.node){
var argv = process.argv var argv = process.argv
} }

View File

@ -162,17 +162,27 @@ ImageGridFeatures.__actions__ =
//--------------------------------------------------------------------- //---------------------------------------------------------------------
// Setup runtime info... // Setup runtime info...
// XXX add test if chrome-app...
// XXX add test if cordova...
// XXX add test if mobile...
// XXX should this contain feature versions???
var runtime = ImageGridFeatures.runtime = {}
// nw or node... // nw or node...
if(typeof(process) != 'undefined'){ if(typeof(process) != 'undefined'){
// node...
runtime.node = true
// Electron... // Electron...
if(process.versions['electron'] != null){ if(process.versions['electron'] != null){
ImageGridFeatures.runtime = 'electron' runtime.electron = true
runtime.desktop = true
// nw.js 0.13+ // nw.js 0.13+
} else if(typeof(nw) != 'undefined'){ } else if(typeof(nw) != 'undefined'){
ImageGridFeatures.runtime = 'nw' runtime.nw = true
runtime.desktop = true
// NOTE: jli is patching the Date object and with two separate // NOTE: jli is patching the Date object and with two separate
// instances we'll need to sync things up... // instances we'll need to sync things up...
@ -187,25 +197,19 @@ if(typeof(process) != 'undefined'){
// node... // node...
} else { } else {
ImageGridFeatures.runtime = 'node'
// XXX patch Date... // XXX patch Date...
// XXX this will not work directly as we will need to explicitly // XXX this will not work directly as we will need to explicitly
// require jli... // require jli...
//patchDate(global.Date) //patchDate(global.Date)
} }
}
// browser... // browser...
// NOTE: we're avoiding detecting browser specifics for as long as possible, // NOTE: we're avoiding detecting browser specifics for as long as possible,
// this will minimize the headaches of supporting several non-standard // this will minimize the headaches of supporting several non-standard
// versions of code... // versions of code...
} else if(typeof(window) != 'undefined'){ if(typeof(window) != 'undefined'){
ImageGridFeatures.runtime = 'browser' runtime.browser = true
// unknown...
// XXX do we need to detect chrome app???
} else {
ImageGridFeatures.runtime = 'unknown'
} }
@ -353,7 +357,7 @@ var LifeCycleActions = actions.Actions({
var runtime = this.runtime = ImageGridFeatures.runtime var runtime = this.runtime = ImageGridFeatures.runtime
// nw.js... // nw.js...
if(runtime == 'nw'){ if(runtime.nw){
// this handles both reload and close... // this handles both reload and close...
$(window).on('beforeunload', stop) $(window).on('beforeunload', stop)
@ -386,12 +390,12 @@ var LifeCycleActions = actions.Actions({
nw.Window.get().on('close', this.__nw_stop_handler) nw.Window.get().on('close', this.__nw_stop_handler)
// node.js... // node...
} else if(runtime == 'node'){ } else if(runtime.node){
process.on('exit', stop) process.on('exit', stop)
// browser... // browser...
} else if(runtime == 'browser'){ } else if(runtime.browser){
$(window).on('beforeunload', stop) $(window).on('beforeunload', stop)
// other... // other...
@ -400,17 +404,11 @@ var LifeCycleActions = actions.Actions({
console.warn('Unknown runtime:', runtime) console.warn('Unknown runtime:', runtime)
} }
// handler ready event... // handle ready event...
// ...if no one requested to do it. // ...if no one requested to do it.
if(this.__ready_announce_requested == null if(this.__ready_announce_requested == null
|| this.__ready_announce_requested <= 0){ || this.__ready_announce_requested <= 0){
if(runtime == 'nw'){ if(runtime.browser){
$(function(){ that.declareReady() })
} else if(runtime == 'node'){
this.declareReady()
} else if(runtime == 'browser'){
$(function(){ that.declareReady() }) $(function(){ that.declareReady() })
} else { } else {
@ -503,20 +501,19 @@ var LifeCycleActions = actions.Actions({
handlers can run cleanly. handlers can run cleanly.
`, `,
function(){ function(){
// browser & nw... // browser...
if(this.__stop_handler if(this.__stop_handler && this.runtime.browser){
&& (this.runtime == 'browser' || this.runtime == 'nw')){
$(window).off('beforeunload', this.__stop_handler) $(window).off('beforeunload', this.__stop_handler)
} }
// nw... // nw...
if(this.__nw_stop_handler && this.runtime == 'nw'){ if(this.__nw_stop_handler && this.runtime.nw){
nw.Window.get().removeAllListeners('close') nw.Window.get().removeAllListeners('close')
delete this.__nw_stop_handler delete this.__nw_stop_handler
} }
// node... // node...
if(this.__stop_handler && this.runtime == 'node'){ if(this.__stop_handler && this.runtime.node){
process.removeAllListeners('exit') process.removeAllListeners('exit')
} }

View File

@ -122,8 +122,7 @@ module.ExternalEditor = core.ImageGridFeatures.Feature({
'ui-external-editor', 'ui-external-editor',
], ],
isApplicable: function(){ isApplicable: function(){ return this.runtime.node },
return this.runtime == 'nw' || this.runtime == 'node' },
actions: ExternalEditorActions, actions: ExternalEditorActions,
}) })

View File

@ -215,8 +215,7 @@ module.FileSystemInfo = core.ImageGridFeatures.Feature({
actions: FileSystemInfoActions, actions: FileSystemInfoActions,
isApplicable: function(){ isApplicable: function(){ return this.runtime.node },
return this.runtime == 'node' || this.runtime == 'nw' },
}) })
@ -762,8 +761,7 @@ module.FileSystemLoader = core.ImageGridFeatures.Feature({
actions: FileSystemLoaderActions, actions: FileSystemLoaderActions,
isApplicable: function(){ isApplicable: function(){ return this.runtime.node },
return this.runtime == 'node' || this.runtime == 'nw' },
handlers: [ handlers: [
// clear changes when loading an index... // clear changes when loading an index...
@ -2085,8 +2083,7 @@ module.FileSystemWriter = core.ImageGridFeatures.Feature({
actions: FileSystemWriterActions, actions: FileSystemWriterActions,
isApplicable: function(){ isApplicable: function(){ return this.runtime.node },
return this.runtime == 'node' || this.runtime == 'nw' },
// monitor changes... // monitor changes...
// XXX should we use .load(..) to trigger changes instead of .loadURLs(..)??? // XXX should we use .load(..) to trigger changes instead of .loadURLs(..)???

View File

@ -212,8 +212,7 @@ module.MetadataReader = core.ImageGridFeatures.Feature({
'metadata', 'metadata',
], ],
isApplicable: function(){ isApplicable: function(){ return this.runtime.node },
return this.runtime == 'nw' || this.runtime == 'node' },
actions: MetadataReaderActions, actions: MetadataReaderActions,

View File

@ -372,8 +372,7 @@ module.ChildProcessPeer = core.ImageGridFeatures.Feature({
'peer', 'peer',
], ],
isApplicable: function(){ isApplicable: function(){ return this.runtime.node },
return this.runtime == 'nw' || this.runtime == 'node' },
actions: ChildProcessPeerActions, actions: ChildProcessPeerActions,

View File

@ -619,9 +619,9 @@ module.UIScale = core.ImageGridFeatures.Feature({
// XXX test if in: // XXX test if in:
// - chrome app // - chrome app
// - nw // - desktop
// - mobile // - mobile
isApplicable: function(){ return this.runtime == 'nw' }, isApplicable: function(){ return this.runtime.desktop },
// XXX show main window... // XXX show main window...
handlers: [ handlers: [

View File

@ -708,7 +708,7 @@ module.Viewer = core.ImageGridFeatures.Feature({
// check if we are running in a UI context... // check if we are running in a UI context...
// NOTE: this will prevent loading of any features dependant on the // NOTE: this will prevent loading of any features dependant on the
// UI in a non UI context... // UI in a non UI context...
isApplicable: function(){ return typeof(window) == typeof({}) }, isApplicable: function(){ return this.runtime.browser },
handlers: [ handlers: [
['start', ['start',
@ -976,7 +976,7 @@ module.URLHash = core.ImageGridFeatures.Feature({
//isApplicable: function(){ //isApplicable: function(){
// return typeof(location) != 'undefined' && location.hash != null }, // return typeof(location) != 'undefined' && location.hash != null },
isApplicable: function(){ return this.runtime == 'browser' }, isApplicable: function(){ return this.runtime.browser },
handlers: [ handlers: [
// hanlde window.onhashchange event... // hanlde window.onhashchange event...