diff --git a/.travis.yml b/.travis.yml index 7135afbf6b..9e4879d995 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,7 +56,7 @@ script: - set -e - ./setup.sh - yarn lint -- npm install electron spectron ava +- npm install electron spectron ava optimist tmp - xvfb-run node_modules/.bin/ava --timeout=60s tests/electron_tests - prove -Isrc/perl5 -r -j3 tests/perl_tests; - utils/jb_run.js -p 9000 & sleep 2 diff --git a/browser/main.js b/browser/main.js index f09bfde756..4ead3e81bd 100644 --- a/browser/main.js +++ b/browser/main.js @@ -4,34 +4,23 @@ const BrowserWindow = electron.BrowserWindow; const Menu = electron.Menu; var menu = require('./menu'); +var argv = require('optimist').argv; -// Keep a global reference of the window object, if you don't, the window will -// be closed automatically when the JavaScript object is garbage collected. -let mainWindow; - - -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. +let mainWindow; app.on('ready', function() { - // Create the browser window. mainWindow = new BrowserWindow({ center: true, title: 'JBrowseDesktop', width: 1024, height: 768 }); + var queryString = Object.keys(argv).map(key => key + '=' + argv[key]).join('&'); - // and load the index.html of the app. - mainWindow.loadURL('file://' + require('path').resolve(__dirname, '..', 'index.html')); - // Emitted when the window is closed. + mainWindow.loadURL('file://' + require('path').resolve(__dirname, '../index.html?'+queryString)); Menu.setApplicationMenu(Menu.buildFromTemplate(menu)); mainWindow.on('closed', function () { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. mainWindow = null; }); }); diff --git a/src/JBrowse/Browser.js b/src/JBrowse/Browser.js index 5548f9833c..4a3d05f4ba 100644 --- a/src/JBrowse/Browser.js +++ b/src/JBrowse/Browser.js @@ -485,9 +485,8 @@ fatalError: function( error ) { loadSessions: function() { var fs = electronRequire('fs'); var app = electronRequire('electron').remote.app; - - var path = app.getPath('userData') + "/sessions.json"; - var obj = JSON.parse( fs.readFileSync( path, 'utf8' ) ); + console.log(this.config); + var obj = JSON.parse( fs.readFileSync( this.config.electronData + '/sessions.json', 'utf8' ) ); var table = dojo.create( 'table', { id: 'previousSessionsTable', style: { overflow: 'hidden', width: '90%' } }, dojo.byId('previousSessions') ); var thisB = this; @@ -1074,8 +1073,7 @@ renderDatasetSelect: function( parent ) { saveSessionDir: function( directory ) { var fs = electronRequire('fs'); - var app = electronRequire('electron').remote.app; - var path = app.getPath('userData')+"/sessions.json"; + var path = this.config.electronData + '/sessions.json'; var obj = []; try { @@ -1084,7 +1082,7 @@ saveSessionDir: function( directory ) { catch(e) {} var dir = Util.replacePath( directory ); - if( array.every(obj, function(elt) { return elt.session!=dir; }) ) + if( array.every(obj, function(elt) { return elt.session != dir; }) ) obj.push({ session: dir }); fs.writeFileSync(path, JSON.stringify( obj, null, 2 ), 'utf8'); @@ -1208,14 +1206,14 @@ openFastaElectron: function() { refSeqOrder: results.refSeqOrder }; - // fix dix to be user data if we are accessing a url for fasta - var dir = app.getPath('userData')+"/"+confs[0].label; + // fix dir to be user data if we are accessing a url for fasta + var dir = this.config.electronData + '/' + confs[0].label; try { fs.existsSync(dir) || fs.mkdirSync(dir); fs.writeFileSync( dir + "/trackList.json", JSON.stringify(trackList, null, 2)); - fs.closeSync( fs.openSync( dir+"/tracks.conf", 'w' ) ); + fs.closeSync( fs.openSync( dir + "/tracks.conf", 'w' ) ); this.saveSessionDir( dir ); window.location = window.location.href.split('?')[0] + "?data=" + Util.replacePath( dir ); } catch(e) { alert(e); } @@ -1241,7 +1239,7 @@ openFastaElectron: function() { refSeqOrder: results.refSeqOrder }; try { - var dir = app.getPath('userData')+"/"+confs[0].label; + var dir = thisB.config.electronData + '/' + confs[0].label; fs.existsSync(dir) || fs.mkdirSync(dir); fs.writeFileSync(dir + "/trackList.json", JSON.stringify(trackList, null, 2)); fs.closeSync(fs.openSync( dir+"/tracks.conf", 'w' )); @@ -1279,10 +1277,10 @@ openFastaElectron: function() { refSeqOrder: results.refSeqOrder }; try { - var dir = app.getPath('userData')+"/"+confs[0].label; + var dir = thisB.config.electronData + '/' + confs[0].label; fs.existsSync(dir) || fs.mkdirSync(dir); - fs.writeFileSync(dir + "/trackList.json", JSON.stringify(trackList, null, 2)); - fs.closeSync(fs.openSync( dir+"/tracks.conf", 'w' )); + fs.writeFileSync(dir + '/trackList.json', JSON.stringify(trackList, null, 2)); + fs.closeSync(fs.openSync( dir + '/tracks.conf', 'w' )); thisB.saveSessionDir( dir ); window.location = window.location.href.split('?')[0] + "?data=" + Util.replacePath( dir ); } catch(e) { alert(e); } diff --git a/src/JBrowse/main.js b/src/JBrowse/main.js index edbdfa4e14..184fb7c1af 100644 --- a/src/JBrowse/main.js +++ b/src/JBrowse/main.js @@ -2,6 +2,7 @@ import 'babel-polyfill' require([ 'JBrowse/Browser', + 'JBrowse/Util', 'JBrowse/QueryParamConfigMapper', 'dojo/io-query', 'dojo/json', @@ -13,6 +14,7 @@ require([ ], function ( Browser, + Util, QueryParamConfigMapper, ioQuery, JSON, @@ -60,7 +62,8 @@ function ( return browser.makeCurrentViewURL({ nav: 1, tracklist: 1, overview: 1 }); }, - updateBrowserURL: true + updateBrowserURL: true, + electronData: queryParams.electronData || (Util.isElectron() && electronRequire('electron').remote.app.getPath('userData')) }; //if there is ?addFeatures in the query params, diff --git a/tests/electron_tests/spec.js b/tests/electron_tests/spec.js index 8e79b6ba1c..e3a932f4a2 100644 --- a/tests/electron_tests/spec.js +++ b/tests/electron_tests/spec.js @@ -2,12 +2,14 @@ import test from 'ava'; import {Application} from 'spectron'; import electronPath from 'electron'; import path from 'path'; - +import os from 'os'; +var tmp = require('tmp'); +var tmpobj = tmp.dirSync(); test.beforeEach(async t => { t.context.app = new Application({ path: electronPath, - args: [path.join(__dirname, '../..')], + args: [path.join(__dirname, '../..'), '--electronData', tmpobj.name], env: {SPECTRON: '1'}, requireName: 'electronRequire' }); @@ -51,5 +53,11 @@ test('shows window', async t => { await app.client.waitUntilWindowLoaded() text = await app.client.getText("#previousSessionsTable"); t.true(text != null); + await app.client.click("#previousSessionsTable"); + var tracklabel = app.client.element( "//label[contains(@class,'tracklist-label')]/span[contains(.,'FASTA')]"); + await tracklabel.click(); + var trackPath = "//div[contains(@class,'track-label')][contains(.,'FASTA')]"; + var track = app.client.element(trackPath); + console.log(track); });