From ae1c079b95be0b83ba634cc82280d7c6d2fd92f3 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Fri, 3 Mar 2017 23:06:47 +0900 Subject: [PATCH 01/13] Stop using dist directory to build --- .gitignore | 2 +- package.json | 3 +-- src/browser/components/MattermostView.jsx | 6 ++++-- src/browser/index.html | 4 ++-- src/browser/settings.html | 4 ++-- src/package.json | 2 +- webpack.config.main.js | 2 +- webpack.config.renderer.js | 4 ++-- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 9832f528..af4067ba 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ Thumbs.db *.log node_modules/ -dist/ +*_bundle.js release/ npm-debug.log* diff --git a/package.json b/package.json index 59b9848b..0c655180 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,7 @@ "build": "npm-run-all build:*", "build:main": "cross-env NODE_ENV=production webpack --bail --config webpack.config.main.js", "build:renderer": "cross-env NODE_ENV=production webpack --bail --config webpack.config.renderer.js", - "build:others": "gulp build", - "start": "electron dist", + "start": "electron src", "watch": "gulp watch", "serve": "gulp watch", "test": "npm-run-all build test:* lint:*", diff --git a/src/browser/components/MattermostView.jsx b/src/browser/components/MattermostView.jsx index 34d5b1cd..2bd91606 100644 --- a/src/browser/components/MattermostView.jsx +++ b/src/browser/components/MattermostView.jsx @@ -1,6 +1,6 @@ const React = require('react'); const {findDOMNode} = require('react-dom'); -const {ipcRenderer, shell} = require('electron'); +const {ipcRenderer, remote, shell} = require('electron'); const fs = require('fs'); const url = require('url'); const osLocale = require('os-locale'); @@ -8,6 +8,8 @@ const electronContextMenu = require('electron-context-menu'); const ErrorView = require('./ErrorView.jsx'); +const preloadJS = `file://${remote.app.getAppPath()}/browser/webview/mattermost_bundle.js`; + const MattermostView = React.createClass({ propTypes: { disablewebsecurity: React.PropTypes.bool, @@ -228,7 +230,7 @@ const MattermostView = React.createClass({ id={this.props.id} className='mattermostView' style={this.props.style} - preload='webview/mattermost.js' + preload={preloadJS} src={this.props.src} ref='webview' nodeintegration='false' diff --git a/src/browser/index.html b/src/browser/index.html index 99cb3b8f..85cdb400 100644 --- a/src/browser/index.html +++ b/src/browser/index.html @@ -3,13 +3,13 @@ - +
- + diff --git a/src/browser/settings.html b/src/browser/settings.html index e8aef706..03be9a29 100644 --- a/src/browser/settings.html +++ b/src/browser/settings.html @@ -4,14 +4,14 @@ Settings - +
- + diff --git a/src/package.json b/src/package.json index 57aea406..5ef9d414 100644 --- a/src/package.json +++ b/src/package.json @@ -4,7 +4,7 @@ "desktopName": "Mattermost.desktop", "version": "3.6.0", "description": "Mattermost", - "main": "main.js", + "main": "main_bundle.js", "author": { "name": "Yuya Ochiai", "email": "yuya0321@gmail.com" diff --git a/webpack.config.main.js b/webpack.config.main.js index 0e7c2b43..8a88b038 100644 --- a/webpack.config.main.js +++ b/webpack.config.main.js @@ -6,7 +6,7 @@ const base = require('./webpack.config.base'); module.exports = merge(base, { entry: './src/main.js', output: { - filename: './dist/main.js' + filename: './src/[name]_bundle.js' }, node: { __filename: false, diff --git a/webpack.config.renderer.js b/webpack.config.renderer.js index 1033d086..99f1e73c 100644 --- a/webpack.config.renderer.js +++ b/webpack.config.renderer.js @@ -10,8 +10,8 @@ module.exports = merge(base, { 'webview/mattermost': './src/browser/webview/mattermost.js' }, output: { - path: './dist/browser', - filename: '[name].js' + path: './src/browser', + filename: '[name]_bundle.js' }, module: { rules: [{ From 6f4010edf297a0aab48770a92cde1d168a29ec5b Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Sun, 5 Mar 2017 00:27:40 +0900 Subject: [PATCH 02/13] Use webpack-dev-server --- package.json | 4 +++- src/browser/index.jsx | 5 +++++ src/browser/settings.jsx | 4 ++++ src/main.js | 21 ++++++--------------- src/package.json | 1 + webpack.config.renderer.js | 11 +++++++++-- 6 files changed, 28 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 0c655180..d22bae4c 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "build:main": "cross-env NODE_ENV=production webpack --bail --config webpack.config.main.js", "build:renderer": "cross-env NODE_ENV=production webpack --bail --config webpack.config.renderer.js", "start": "electron src", - "watch": "gulp watch", + "watch": "run-s watch:*", + "watch:renderer": "webpack-dev-server --config webpack.config.renderer.js", "serve": "gulp watch", "test": "npm-run-all build test:* lint:*", "test:app": "mocha --reporter mocha-circleci-reporter --recursive test/specs", @@ -59,6 +60,7 @@ "npm-run-all": "^4.0.2", "spectron": "~3.6.0", "webpack": "^2.2.1", + "webpack-dev-server": "^2.4.1", "webpack-merge": "^3.0.0" } } diff --git a/src/browser/index.jsx b/src/browser/index.jsx index e6972e59..64c11d4b 100644 --- a/src/browser/index.jsx +++ b/src/browser/index.jsx @@ -103,3 +103,8 @@ ReactDOM.render( />, document.getElementById('content') ); + +// Deny drag&drop navigation in mainWindow. +// Drag&drop is allowed in webview of index.html. +document.addEventListener('dragover', (event) => event.preventDefault()); +document.addEventListener('drop', (event) => event.preventDefault()); diff --git a/src/browser/settings.jsx b/src/browser/settings.jsx index f54cb1a9..2fc71e63 100644 --- a/src/browser/settings.jsx +++ b/src/browser/settings.jsx @@ -20,3 +20,7 @@ ReactDOM.render( , document.getElementById('content') ); + +// Deny drag&drop navigation in mainWindow. +document.addEventListener('dragover', (event) => event.preventDefault()); +document.addEventListener('drop', (event) => event.preventDefault()); diff --git a/src/main.js b/src/main.js index d52aa23f..22189c8f 100644 --- a/src/main.js +++ b/src/main.js @@ -11,6 +11,7 @@ const { systemPreferences, session } = require('electron'); +const isDev = require('electron-is-dev'); const AutoLaunch = require('auto-launch'); @@ -489,7 +490,11 @@ app.on('ready', () => { } // and load the index.html of the app. - mainWindow.loadURL('file://' + __dirname + '/browser/index.html'); + if (isDev) { + mainWindow.loadURL('http://localhost:8080/browser/index.html'); + } else { + mainWindow.loadURL('file://' + __dirname + '/browser/index.html'); + } // Set application menu ipcMain.on('update-menu', (event, configData) => { @@ -571,18 +576,4 @@ app.on('ready', () => { // when you should delete the corresponding element. mainWindow = null; }); - - // Deny drag&drop navigation in mainWindow. - // Drag&drop is allowed in webview of index.html. - mainWindow.webContents.on('will-navigate', (event, url) => { - var dirname = __dirname; - if (process.platform === 'win32') { - dirname = '/' + dirname.replace(/\\/g, '/'); - } - - var index = url.indexOf('file://' + dirname); - if (index !== 0) { - event.preventDefault(); - } - }); }); diff --git a/src/package.json b/src/package.json index 5ef9d414..6263983d 100644 --- a/src/package.json +++ b/src/package.json @@ -18,6 +18,7 @@ "auto-launch": "^5.0.1", "bootstrap": "^3.3.7", "electron-context-menu": "^0.8.0", + "electron-is-dev": "^0.1.2", "electron-squirrel-startup": "^1.0.0", "os-locale": "^2.0.0", "react": "^15.4.2", diff --git a/webpack.config.renderer.js b/webpack.config.renderer.js index 99f1e73c..877fae39 100644 --- a/webpack.config.renderer.js +++ b/webpack.config.renderer.js @@ -1,5 +1,6 @@ 'use strict'; +const path = require('path'); const merge = require('webpack-merge'); const base = require('./webpack.config.base'); @@ -10,7 +11,8 @@ module.exports = merge(base, { 'webview/mattermost': './src/browser/webview/mattermost.js' }, output: { - path: './src/browser', + path: path.join(__dirname, 'src/browser'), + publicPath: 'browser', filename: '[name]_bundle.js' }, module: { @@ -29,5 +31,10 @@ module.exports = merge(base, { __filename: false, __dirname: false }, - target: 'electron-renderer' + target: 'electron-renderer', + devServer: { + contentBase: path.join(__dirname, 'src'), + inline: true, + publicPath: '/browser/' + } }); From 83b84f9fbd03d66f967271746b9e643c49dc8997 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Sun, 5 Mar 2017 00:58:26 +0900 Subject: [PATCH 03/13] Watch main.js sources --- package.json | 3 ++- scripts/watch_main_and_preload.js | 34 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 scripts/watch_main_and_preload.js diff --git a/package.json b/package.json index d22bae4c..62a6b976 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ "build:main": "cross-env NODE_ENV=production webpack --bail --config webpack.config.main.js", "build:renderer": "cross-env NODE_ENV=production webpack --bail --config webpack.config.renderer.js", "start": "electron src", - "watch": "run-s watch:*", + "watch": "run-p watch:*", + "watch:main": "node scripts/watch_main_and_preload.js", "watch:renderer": "webpack-dev-server --config webpack.config.renderer.js", "serve": "gulp watch", "test": "npm-run-all build test:* lint:*", diff --git a/scripts/watch_main_and_preload.js b/scripts/watch_main_and_preload.js new file mode 100644 index 00000000..a5a3c1a4 --- /dev/null +++ b/scripts/watch_main_and_preload.js @@ -0,0 +1,34 @@ +const webpack = require('webpack'); +const mainConfig = require('../webpack.config.main.js'); +const rendererConfig = require('../webpack.config.renderer.js'); +const electron = require('electron-connect').server.create({path: 'src'}); + +let started = false; + +const mainCompiler = webpack(mainConfig); +mainCompiler.watch({}, (err, stats) => { + process.stdout.write(stats.toString({colors: true})); + process.stdout.write('\n'); + if (!stats.hasErrors()) { + if (started) { + electron.restart(); + } else { + electron.start(); + started = true; + } + } +}); + +for (const key in rendererConfig.entry) { + if (!key.startsWith('webview/')) { + if ({}.hasOwnProperty.call(rendererConfig.entry, key)) { + delete rendererConfig.entry[key]; + } + } +} +const preloadCompiler = webpack(rendererConfig); +preloadCompiler.watch({}, (err) => { + if (err) { + console.log(err); + } +}); From 82bcd44f8f421c0df6ac340749b69dfdb3246d83 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Sun, 5 Mar 2017 01:02:01 +0900 Subject: [PATCH 04/13] Remove old live-reload mechanism --- gulpfile.js | 129 ----------------------------------------------- package.json | 3 -- src/main.js | 9 ---- src/package.json | 3 -- 4 files changed, 144 deletions(-) delete mode 100644 gulpfile.js diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 2b167e7c..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -var gulp = require('gulp'); -var prettify = require('gulp-jsbeautifier'); -var diff = require('gulp-diff'); -var electron = require('electron-connect').server.create({ - path: './dist' -}); - -const fs = require('fs'); -const path = require('path'); -const spawn = require('child_process').spawn; - -const distPackageAuthor = 'Mattermost, Inc.'; - -var sources = ['**/*.js', '**/*.json', '**/*.css', '**/*.html', '!**/node_modules/**', '!dist/**', '!release/**', '!**/test_config.json']; - -gulp.task('prettify', ['prettify:sources']); -gulp.task('prettify:verify', ['prettify:sources:verify']); - -var prettifyOptions = { - html: { - indent_size: 2, - end_with_newline: true - }, - css: { - indent_size: 2, - end_with_newline: true - }, - js: { - indent_size: 2, - brace_style: 'end-expand', - end_with_newline: true - } -}; - -gulp.task('prettify:sources', ['sync-meta'], () => { - return gulp.src(sources). - pipe(prettify(prettifyOptions)). - pipe(prettify.reporter()). - pipe(diff()). - pipe(diff.reporter({ - quiet: true, - fail: false - })). - pipe(gulp.dest('.')); -}); - -gulp.task('prettify:sources:verify', () => { - return gulp.src(sources). - pipe(prettify(prettifyOptions)). - pipe(prettify.reporter()). - pipe(diff()). - pipe(diff.reporter({ - quiet: true, - fail: true - })); -}); - -gulp.task('build', ['sync-meta', 'copy'], (cb) => { - const appPackageJson = require('./src/package.json'); - const distPackageJson = Object.assign({}, appPackageJson, { - author: { - name: distPackageAuthor, - email: 'noreply' - } - }); - fs.writeFile('./dist/package.json', JSON.stringify(distPackageJson, null, ' '), cb); -}); - -gulp.task('copy', ['copy:assets', 'copy:html/css', 'copy:modules']); - -gulp.task('copy:assets', () => { - return gulp.src('src/assets/**'). - pipe(gulp.dest('dist/assets')); -}); - -gulp.task('copy:html/css', () => { - return gulp.src(['src/browser/**/*.html', 'src/browser/**/*.css']). - pipe(gulp.dest('dist/browser')); -}); - -gulp.task('copy:modules', () => { - return gulp.src(['src/node_modules/bootstrap/dist/**']). - pipe(gulp.dest('dist/browser/modules/bootstrap')); -}); - -function spawnWebpack(config, cb) { - const ext = process.platform === 'win32' ? '.cmd' : ''; - spawn(path.resolve(`./node_modules/.bin/webpack${ext}`), ['--config', config], { - stdio: 'inherit' - }).on('exit', (code) => { - cb(code); - }); -} - -gulp.task('webpack:main', (cb) => { - spawnWebpack('webpack.config.main.js', cb); -}); - -gulp.task('webpack:renderer', (cb) => { - spawnWebpack('webpack.config.renderer.js', cb); -}); - -gulp.task('watch', ['build', 'webpack:main', 'webpack:renderer'], () => { - var options = ['--livereload']; - electron.start(options); - - gulp.watch(['src/main.js', 'src/main/**/*.js', 'src/common/**/*.js'], ['webpack:main']); - gulp.watch(['src/browser/**/*.js', 'src/browser/**/*.jsx'], ['webpack:renderer']); - gulp.watch(['src/browser/**/*.css', 'src/browser/**/*.html', 'src/assets/**/*.png'], ['copy']); - - gulp.watch(['dist/main.js', 'dist/assets/**'], () => { - electron.restart(options); - }); - gulp.watch(['dist/browser/*.js'], electron.reload); -}); - -gulp.task('sync-meta', () => { - var appPackageJson = require('./src/package.json'); - var packageJson = require('./package.json'); - appPackageJson.name = packageJson.name; - appPackageJson.productName = packageJson.productName; - appPackageJson.version = packageJson.version; - appPackageJson.description = packageJson.description; - appPackageJson.author = packageJson.author; - appPackageJson.license = packageJson.license; - fs.writeFileSync('./src/package.json', JSON.stringify(appPackageJson, null, ' ') + '\n'); -}); diff --git a/package.json b/package.json index 62a6b976..6a550568 100644 --- a/package.json +++ b/package.json @@ -53,9 +53,6 @@ "electron-connect": "^0.6.1", "eslint": "^3.16.1", "eslint-plugin-react": "^6.10.0", - "gulp": "^3.9.1", - "gulp-diff": "^1.0.0", - "gulp-jsbeautifier": "^2.0.4", "mocha": "^3.2.0", "mocha-circleci-reporter": "0.0.2", "npm-run-all": "^4.0.2", diff --git a/src/main.js b/src/main.js index 22189c8f..6e00cf99 100644 --- a/src/main.js +++ b/src/main.js @@ -77,15 +77,6 @@ if (process.platform === 'win32') { var argv = require('yargs').parse(process.argv.slice(1)); -const electronConnect = argv.livereload ? require('electron-connect') : null; -var client; -if (argv.livereload) { - client = electronConnect.client.create(); - client.on('reload', () => { - mainWindow.reload(); - }); -} - var hideOnStartup; if (argv.hidden) { hideOnStartup = true; diff --git a/src/package.json b/src/package.json index 6263983d..22535726 100644 --- a/src/package.json +++ b/src/package.json @@ -11,9 +11,6 @@ }, "homepage": "https://about.mattermost.com", "license": "Apache-2.0", - "devDependencies": { - "electron-connect": "^0.6.1" - }, "dependencies": { "auto-launch": "^5.0.1", "bootstrap": "^3.3.7", From 5b26c9cf6930bf0469c62705221c481e53919d27 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Mon, 6 Mar 2017 21:15:50 +0900 Subject: [PATCH 05/13] Package with src/ --- electron-builder.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/electron-builder.json b/electron-builder.json index 114428c9..4f06cdd0 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -2,9 +2,15 @@ "appId": "com.mattermost.desktop", "directories": { "buildResources": "resources", - "app": "dist", + "app": "src", "output": "release" }, + "files": [ + "main_bundle.js", + "browser/**/*.{html,css,_bundle.js}", + "assets/**/*", + "node_modules/bootstrap/dist/**" + ], "deb": { "synopsis": "Mattermost" }, From d8abb4b9c73a68b11044c08b1c9d477a4ae68551 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Mon, 6 Mar 2017 21:31:17 +0900 Subject: [PATCH 06/13] Fix tests --- .eslintignore | 2 +- src/main.js | 2 +- test/modules/environment.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.eslintignore b/.eslintignore index 4a002ec5..66d14433 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,4 @@ -dist/ +**/*_bundle.js node_modules/ release/ src/node_modules/ diff --git a/src/main.js b/src/main.js index 6e00cf99..880b3861 100644 --- a/src/main.js +++ b/src/main.js @@ -481,7 +481,7 @@ app.on('ready', () => { } // and load the index.html of the app. - if (isDev) { + if (isDev && !argv.testMode) { mainWindow.loadURL('http://localhost:8080/browser/index.html'); } else { mainWindow.loadURL('file://' + __dirname + '/browser/index.html'); diff --git a/test/modules/environment.js b/test/modules/environment.js index f45e8d3b..46b3b963 100644 --- a/test/modules/environment.js +++ b/test/modules/environment.js @@ -44,7 +44,7 @@ module.exports = { getSpectronApp() { const app = new Application({ path: electronBinaryPath, - args: [`${path.join(sourceRootDir, 'dist')}`, `--data-dir=${userDataDir}`] + args: [`${path.join(sourceRootDir, 'src')}`, `--data-dir=${userDataDir}`, '--test-mode'] }); chaiAsPromised.transferPromiseness = app.transferPromiseness; return app; @@ -52,7 +52,7 @@ module.exports = { addClientCommands(client) { client.addCommand('loadSettingsPage', function async() { - return this.url('file://' + path.join(sourceRootDir, 'dist/browser/settings.html')).waitUntilWindowLoaded(); + return this.url('file://' + path.join(sourceRootDir, 'src/browser/settings.html')).waitUntilWindowLoaded(); }); client.addCommand('isNodeEnabled', function async() { return this.execute(() => { From 8c851f089606b68526991e5facbd6e19616be4e2 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Mon, 6 Mar 2017 22:00:21 +0900 Subject: [PATCH 07/13] Use http:// links when dev mode --- src/browser/components/SettingsPage.jsx | 3 ++- src/main.js | 13 ++++++------- src/main/menus/app.js | 12 +++++++----- src/main/menus/tray.js | 9 +++++---- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/browser/components/SettingsPage.jsx b/src/browser/components/SettingsPage.jsx index 40ec8b3e..87c86f20 100644 --- a/src/browser/components/SettingsPage.jsx +++ b/src/browser/components/SettingsPage.jsx @@ -18,7 +18,8 @@ const appLauncher = new AutoLaunch({ function backToIndex(index) { const target = typeof index === 'undefined' ? 0 : index; - remote.getCurrentWindow().loadURL(`file://${__dirname}/index.html?index=${target}`); + const indexURL = remote.getGlobal('isDev') ? 'http://localhost:8080/browser/index.html' : `file://${__dirname}/index.html`; + remote.getCurrentWindow().loadURL(`${indexURL}?index=${target}`); } const SettingsPage = React.createClass({ diff --git a/src/main.js b/src/main.js index 880b3861..3d8734c9 100644 --- a/src/main.js +++ b/src/main.js @@ -86,6 +86,8 @@ if (argv['data-dir']) { app.setPath('userData', path.resolve(argv['data-dir'])); } +global.isDev = isDev && !argv.testMode; + var config = {}; try { const configFile = app.getPath('userData') + '/config.json'; @@ -481,20 +483,17 @@ app.on('ready', () => { } // and load the index.html of the app. - if (isDev && !argv.testMode) { - mainWindow.loadURL('http://localhost:8080/browser/index.html'); - } else { - mainWindow.loadURL('file://' + __dirname + '/browser/index.html'); - } + const indexURL = global.isDev ? 'http://localhost:8080/browser/index.html' : 'file://' + __dirname + '/browser/index.html'; + mainWindow.loadURL(indexURL); // Set application menu ipcMain.on('update-menu', (event, configData) => { - var aMenu = appMenu.createMenu(mainWindow, configData); + var aMenu = appMenu.createMenu(mainWindow, configData, global.isDev); Menu.setApplicationMenu(aMenu); // set up context menu for tray icon if (shouldShowTrayIcon()) { - const tMenu = trayMenu.createMenu(mainWindow, configData); + const tMenu = trayMenu.createMenu(mainWindow, configData, global.isDev); trayIcon.setContextMenu(tMenu); if (process.platform === 'darwin' || process.platform === 'linux') { // store the information, if the tray was initialized, for checking in the settings, if the application diff --git a/src/main/menus/app.js b/src/main/menus/app.js index 784bb090..a79c35ba 100644 --- a/src/main/menus/app.js +++ b/src/main/menus/app.js @@ -3,7 +3,9 @@ const electron = require('electron'); const Menu = electron.Menu; -function createTemplate(mainWindow, config) { +function createTemplate(mainWindow, config, isDev) { + const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : 'file://' + __dirname + '/browser/settings.html'; + const separatorItem = { type: 'separator' }; @@ -25,7 +27,7 @@ function createTemplate(mainWindow, config) { label: 'Preferences...', accelerator: 'CmdOrCtrl+,', click() { - mainWindow.loadURL('file://' + __dirname + '/browser/settings.html'); + mainWindow.loadURL(settingsURL); } }, { label: 'Sign in to Another Server', @@ -44,7 +46,7 @@ function createTemplate(mainWindow, config) { label: 'Settings...', accelerator: 'CmdOrCtrl+,', click() { - mainWindow.loadURL('file://' + __dirname + '/browser/settings.html'); + mainWindow.loadURL(settingsURL); } }, { label: 'Sign in to Another Server', @@ -217,8 +219,8 @@ function createTemplate(mainWindow, config) { return template; } -function createMenu(mainWindow, config) { - return Menu.buildFromTemplate(createTemplate(mainWindow, config)); +function createMenu(mainWindow, config, isDev) { + return Menu.buildFromTemplate(createTemplate(mainWindow, config, isDev)); } module.exports = { diff --git a/src/main/menus/tray.js b/src/main/menus/tray.js index 844fac95..6f142dfc 100644 --- a/src/main/menus/tray.js +++ b/src/main/menus/tray.js @@ -5,7 +5,8 @@ const { Menu } = require('electron'); -function createTemplate(mainWindow, config) { +function createTemplate(mainWindow, config, isDev) { + const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${__dirname}/browser/settings.html`; var template = [ ...config.teams.slice(0, 9).map((team, i) => { return { @@ -25,7 +26,7 @@ function createTemplate(mainWindow, config) { }, { label: process.platform === 'darwin' ? 'Preferences...' : 'Settings', click: () => { - mainWindow.loadURL('file://' + __dirname + '/browser/settings.html'); + mainWindow.loadURL(settingsURL); showOrRestore(mainWindow); if (process.platform === 'darwin') { @@ -42,8 +43,8 @@ function createTemplate(mainWindow, config) { return template; } -function createMenu(mainWindow, config) { - return Menu.buildFromTemplate(createTemplate(mainWindow, config)); +function createMenu(mainWindow, config, isDev) { + return Menu.buildFromTemplate(createTemplate(mainWindow, config, isDev)); } function showOrRestore(window) { From 3b4a1dfca97930c05461482ab36c4a118a9a927b Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Mon, 6 Mar 2017 23:29:56 +0900 Subject: [PATCH 08/13] Add React Developer Tools --- src/main.js | 7 +++++++ src/package.json | 1 + 2 files changed, 8 insertions(+) diff --git a/src/main.js b/src/main.js index 3d8734c9..31665b21 100644 --- a/src/main.js +++ b/src/main.js @@ -12,6 +12,7 @@ const { session } = require('electron'); const isDev = require('electron-is-dev'); +const installExtension = require('electron-devtools-installer'); const AutoLaunch = require('auto-launch'); @@ -315,6 +316,12 @@ app.on('ready', () => { if (willAppQuit) { return; } + if (global.isDev) { + installExtension.default(installExtension.REACT_DEVELOPER_TOOLS). + then((name) => console.log(`Added Extension: ${name}`)). + catch((err) => console.log('An error occurred: ', err)); + } + ipcMain.on('notified', () => { if (process.platform === 'win32' || process.platform === 'linux') { if (config.notifications.flashWindow === 2) { diff --git a/src/package.json b/src/package.json index 22535726..aefbd56b 100644 --- a/src/package.json +++ b/src/package.json @@ -15,6 +15,7 @@ "auto-launch": "^5.0.1", "bootstrap": "^3.3.7", "electron-context-menu": "^0.8.0", + "electron-devtools-installer": "^2.1.0", "electron-is-dev": "^0.1.2", "electron-squirrel-startup": "^1.0.0", "os-locale": "^2.0.0", From 1ab0859ac1cb44f823c2cb79cc05ad476531db1d Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Mon, 6 Mar 2017 23:31:06 +0900 Subject: [PATCH 09/13] Stop using __dirname to avoid confusing --- src/browser/components/MattermostView.jsx | 2 +- src/browser/components/SettingsPage.jsx | 2 +- src/main.js | 2 +- src/main/menus/app.js | 2 +- src/main/menus/tray.js | 2 +- webpack.config.main.js | 4 ++-- webpack.config.renderer.js | 4 ++-- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/browser/components/MattermostView.jsx b/src/browser/components/MattermostView.jsx index 2bd91606..5816f1b6 100644 --- a/src/browser/components/MattermostView.jsx +++ b/src/browser/components/MattermostView.jsx @@ -100,7 +100,7 @@ const MattermostView = React.createClass({ osLocale().then((locale) => { if (locale === 'ja_JP') { - applyCssFile(__dirname + '/css/jp_fonts.css'); + applyCssFile(remote.app.getAppPath() + '/css/jp_fonts.css'); } }); } diff --git a/src/browser/components/SettingsPage.jsx b/src/browser/components/SettingsPage.jsx index 87c86f20..0c5f089c 100644 --- a/src/browser/components/SettingsPage.jsx +++ b/src/browser/components/SettingsPage.jsx @@ -18,7 +18,7 @@ const appLauncher = new AutoLaunch({ function backToIndex(index) { const target = typeof index === 'undefined' ? 0 : index; - const indexURL = remote.getGlobal('isDev') ? 'http://localhost:8080/browser/index.html' : `file://${__dirname}/index.html`; + const indexURL = remote.getGlobal('isDev') ? 'http://localhost:8080/browser/index.html' : `file://${remote.app.getAppPath()}/browser/index.html`; remote.getCurrentWindow().loadURL(`${indexURL}?index=${target}`); } diff --git a/src/main.js b/src/main.js index 31665b21..89c39b0f 100644 --- a/src/main.js +++ b/src/main.js @@ -490,7 +490,7 @@ app.on('ready', () => { } // and load the index.html of the app. - const indexURL = global.isDev ? 'http://localhost:8080/browser/index.html' : 'file://' + __dirname + '/browser/index.html'; + const indexURL = global.isDev ? 'http://localhost:8080/browser/index.html' : `file://${app.getAppPath()}/browser/index.html`; mainWindow.loadURL(indexURL); // Set application menu diff --git a/src/main/menus/app.js b/src/main/menus/app.js index a79c35ba..4ec3355e 100644 --- a/src/main/menus/app.js +++ b/src/main/menus/app.js @@ -4,7 +4,7 @@ const electron = require('electron'); const Menu = electron.Menu; function createTemplate(mainWindow, config, isDev) { - const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : 'file://' + __dirname + '/browser/settings.html'; + const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${electron.app.getAppPath()}/browser/settings.html`; const separatorItem = { type: 'separator' diff --git a/src/main/menus/tray.js b/src/main/menus/tray.js index 6f142dfc..1de7615f 100644 --- a/src/main/menus/tray.js +++ b/src/main/menus/tray.js @@ -6,7 +6,7 @@ const { } = require('electron'); function createTemplate(mainWindow, config, isDev) { - const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${__dirname}/browser/settings.html`; + const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`; var template = [ ...config.teams.slice(0, 9).map((team, i) => { return { diff --git a/webpack.config.main.js b/webpack.config.main.js index 8a88b038..504ca58b 100644 --- a/webpack.config.main.js +++ b/webpack.config.main.js @@ -9,8 +9,8 @@ module.exports = merge(base, { filename: './src/[name]_bundle.js' }, node: { - __filename: false, - __dirname: false + __filename: true, + __dirname: true }, target: 'electron-main', externals: { diff --git a/webpack.config.renderer.js b/webpack.config.renderer.js index 877fae39..eecfee9a 100644 --- a/webpack.config.renderer.js +++ b/webpack.config.renderer.js @@ -28,8 +28,8 @@ module.exports = merge(base, { }] }, node: { - __filename: false, - __dirname: false + __filename: true, + __dirname: true }, target: 'electron-renderer', devServer: { From 60429a9622d3b696e4f745dd81efa56c53d88441 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Mon, 6 Mar 2017 23:37:35 +0900 Subject: [PATCH 10/13] Disable dev mode in npm start --- package.json | 2 +- src/main.js | 2 +- test/modules/environment.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 6a550568..c49735bc 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "build": "npm-run-all build:*", "build:main": "cross-env NODE_ENV=production webpack --bail --config webpack.config.main.js", "build:renderer": "cross-env NODE_ENV=production webpack --bail --config webpack.config.renderer.js", - "start": "electron src", + "start": "electron src --disable-dev-mode", "watch": "run-p watch:*", "watch:main": "node scripts/watch_main_and_preload.js", "watch:renderer": "webpack-dev-server --config webpack.config.renderer.js", diff --git a/src/main.js b/src/main.js index 89c39b0f..6579d0f1 100644 --- a/src/main.js +++ b/src/main.js @@ -87,7 +87,7 @@ if (argv['data-dir']) { app.setPath('userData', path.resolve(argv['data-dir'])); } -global.isDev = isDev && !argv.testMode; +global.isDev = isDev && !argv.disableDevMode; var config = {}; try { diff --git a/test/modules/environment.js b/test/modules/environment.js index 46b3b963..cd05b1ea 100644 --- a/test/modules/environment.js +++ b/test/modules/environment.js @@ -44,7 +44,7 @@ module.exports = { getSpectronApp() { const app = new Application({ path: electronBinaryPath, - args: [`${path.join(sourceRootDir, 'src')}`, `--data-dir=${userDataDir}`, '--test-mode'] + args: [`${path.join(sourceRootDir, 'src')}`, `--data-dir=${userDataDir}`, '--disable-dev-mode'] }); chaiAsPromised.transferPromiseness = app.transferPromiseness; return app; From 3f5d0722d7939499b614a992e75035e50920021b Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Mon, 6 Mar 2017 23:44:51 +0900 Subject: [PATCH 11/13] Remove unnecessary webpack config --- webpack.config.main.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/webpack.config.main.js b/webpack.config.main.js index 504ca58b..dceed770 100644 --- a/webpack.config.main.js +++ b/webpack.config.main.js @@ -12,8 +12,5 @@ module.exports = merge(base, { __filename: true, __dirname: true }, - target: 'electron-main', - externals: { - remote: true // for electron-connect - } + target: 'electron-main' }); From 09046b7a7510b65f5fdbdcaac8178678383179d0 Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Mon, 6 Mar 2017 23:47:18 +0900 Subject: [PATCH 12/13] Stop using npm run build in postinstall --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index c49735bc..21e59b24 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,7 @@ "url": "git://github.com/mattermost/desktop.git" }, "scripts": { - "install": "cd src && npm install", - "postinstall": "npm run build", + "postinstall": "install-app-deps", "build": "npm-run-all build:*", "build:main": "cross-env NODE_ENV=production webpack --bail --config webpack.config.main.js", "build:renderer": "cross-env NODE_ENV=production webpack --bail --config webpack.config.renderer.js", From b318bcf7de9b78f00cd7167e0b0cba549afdb2cd Mon Sep 17 00:00:00 2001 From: Yuya Ochiai Date: Tue, 7 Mar 2017 00:02:46 +0900 Subject: [PATCH 13/13] Add "npm run build" for circle.yml --- circle.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/circle.yml b/circle.yml index a229b755..cd3e9ac3 100644 --- a/circle.yml +++ b/circle.yml @@ -19,6 +19,7 @@ dependencies: - sudo apt-get install --no-install-recommends -y gcc-multilib g++-multilib - unset DISPLAY && wineboot --init + - npm run build - npm run package:all - sh -x ./scripts/cp_artifacts.sh release $CIRCLE_ARTIFACTS