From 365ebc78ab38dd83df92d7e557dc5df3613fa906 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Tue, 30 Apr 2019 15:16:18 +0200 Subject: [PATCH 1/8] Fix ui tests --- app/package.json | 2 +- backend/src/ConfigStorage.ts | 12 +++++++++--- src/spec/demoVideo.ts | 10 ++++++---- src/spec/util/index.ts | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/package.json b/app/package.json index 09b21bb..2dd4dce 100644 --- a/app/package.json +++ b/app/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "yarn rebuild && webpack --mode production", "dev": "node_modules/.bin/webpack-dev-server --mode development --progress", - "rebuild": "cd node_modules/heapdump && node-gyp rebuild --target=5.0.0 --arch=x64 --dist-url=https://atom.io/download/electron; cd -" + "rebuild": "cd node_modules/heapdump && node-gyp rebuild --target=5.0.0 --arch=x64 --dist-url=https://atom.io/download/electron || echo Could not build heapdump; cd -" }, "author": "", "license": "CC-BY-ND-4.0", diff --git a/backend/src/ConfigStorage.ts b/backend/src/ConfigStorage.ts index 5ea262f..1e48cad 100644 --- a/backend/src/ConfigStorage.ts +++ b/backend/src/ConfigStorage.ts @@ -1,13 +1,15 @@ import * as FileAsync from 'lowdb/adapters/FileAsync' +import * as fs from 'fs-extra' import * as lowdb from 'lowdb' +import * as path from 'path' import { backendEvents } from '../../events' import { + makeStorageAcknowledgementEvent, makeStorageResponseEvent, storageClearEvent, storageLoadEvent, - storageStoreEvent, - makeStorageAcknowledgementEvent -} from '../../events/StorageEvents' + storageStoreEvent + } from '../../events/StorageEvents' export default class ConfigStorage { private file: string @@ -17,6 +19,10 @@ export default class ConfigStorage { } private async getDb() { + const pathInfo = path.parse(this.file) + + // Ensure that Settings dir exists + await fs.mkdirp(pathInfo.dir) const adapter = new FileAsync(this.file) if (!this.database) { this.database = await lowdb(adapter) diff --git a/src/spec/demoVideo.ts b/src/spec/demoVideo.ts index 6e175bc..f29e5e8 100644 --- a/src/spec/demoVideo.ts +++ b/src/spec/demoVideo.ts @@ -24,9 +24,6 @@ import { hideText, showText, sleep, - getHeapDump, - countInstancesOf, - ClassNameMapping } from './util' process.on('unhandledRejection', (error: Error) => { @@ -59,7 +56,12 @@ async function doStuff() { await createFakeMousePointer(browser) // Wait for Username input to be visible - await browser.$(`//label[contains(text(), "Username")]/..//input`) + let inputField = undefined + let start = Date.now() + let maxWaitDuration = 30000 + while ((!inputField || !inputField.isExisting) && ((Date.now() - start) < maxWaitDuration)) { + inputField = await browser.$(`//label[contains(text(), "Username")]/..//input`) + } const scenes = new SceneBuilder() await scenes.record('connect', async () => { await connectTo('127.0.0.1', browser) diff --git a/src/spec/util/index.ts b/src/spec/util/index.ts index 4a5d72f..7389cc5 100644 --- a/src/spec/util/index.ts +++ b/src/spec/util/index.ts @@ -57,7 +57,7 @@ export async function moveToCenterOfElement(element: Element, browser: Bro const js = `window.demo.moveMouse(${targetX}, ${targetY}, ${duration});` await browser.execute(js) await sleep(duration) - await sleep(20, true) + await sleep(250, true) await element.moveTo() } From 931ec0113c7963363fa51dc298fddb03884373e5 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Tue, 30 Apr 2019 17:44:25 +0200 Subject: [PATCH 2/8] Fix ui glitch --- app/src/components/App.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/components/App.tsx b/app/src/components/App.tsx index 9ee6f42..0cde894 100644 --- a/app/src/components/App.tsx +++ b/app/src/components/App.tsx @@ -89,6 +89,12 @@ class App extends React.PureComponent { const styles = (theme: Theme) => { const drawerWidth = 300 + const contentBaseStyle = { + width: '100vw', + overflow: 'hidden' as 'hidden', + backgroundColor: theme.palette.background.default, + } + return { heightProperty: { height: 'calc(100vh - 64px) !important', @@ -106,9 +112,7 @@ const styles = (theme: Theme) => { overflow: 'hidden' as 'hidden', }, content: { - width: '100vw', - overflowX: 'hidden' as 'hidden', - backgroundColor: theme.palette.background.default, + ...contentBaseStyle, transition: theme.transitions.create('transform', { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, @@ -116,9 +120,7 @@ const styles = (theme: Theme) => { transform: 'translateX(0px)', }, contentShift: { - overflowX: 'hidden' as 'hidden', - width: '100vw', - padding: 0, + ...contentBaseStyle, backgroundColor: theme.palette.background.default, transition: theme.transitions.create('transform', { easing: theme.transitions.easing.easeOut, From 817202fc20b937da014f0ce5a40781fd962f2322 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Tue, 30 Apr 2019 17:44:53 +0200 Subject: [PATCH 3/8] Disable electron sandbox due to crashes --- src/electron.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/electron.ts b/src/electron.ts index bac0b4b..4e7f685 100644 --- a/src/electron.ts +++ b/src/electron.ts @@ -42,6 +42,7 @@ async function createWindow() { webPreferences: { nodeIntegration: true, devTools: true, + sandbox: false, }, icon: iconPath, }) From 9e71c3132eda90f855746059413eae8c67cc8366 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Tue, 30 Apr 2019 18:28:25 +0200 Subject: [PATCH 4/8] Use proper provisioning profile for OSX builds --- package.json | 2 +- package.ts | 41 +++++++++++++++++++-------- res/MQTTExplorerdmg.provisionprofile | Bin 0 -> 7604 bytes yarn.lock | 7 +++++ 4 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 res/MQTTExplorerdmg.provisionprofile diff --git a/package.json b/package.json index f615749..ed5246e 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "publish": [ "github" ], - "provisioningProfile": "res/MQTT_Explorer_Store_Distribution_Profile.provisionprofile", "entitlements": "res/entitlements.mas.plist" }, "linux": { @@ -91,6 +90,7 @@ }, "dependencies": { "about-window": "^1.12.1", + "dot-prop": "^5.0.0", "electron-log": "^2.2.17", "electron-telemetry": "git+https://github.com/thomasnordquist/electron-telemetry.git#dist", "electron-updater": "^4.0.6", diff --git a/package.ts b/package.ts index 982bc23..aa07511 100644 --- a/package.ts +++ b/package.ts @@ -1,6 +1,7 @@ import * as builder from 'electron-builder' import * as fs from 'fs' import * as path from 'path' +import * as dotProp from 'dot-prop' const linuxAppImage: builder.CliOptions = { x64: true, @@ -53,7 +54,7 @@ const mac: builder.CliOptions = { armv7l: false, arm64: false, projectDir: './build/clean', - publish: 'always', + publish: 'never', } async function executeBuild() { @@ -88,20 +89,36 @@ type Packages = 'portable' | 'nsis' | 'appx' | 'AppImage' | 'snap' | 'dmg' | 'zi async function buildWithOptions(options: builder.CliOptions, buildInfo: BuildInfo) { fs.writeFileSync(path.join(options.projectDir!, 'buildOptions.json'), JSON.stringify(buildInfo)) - ensureAppNameForPackage(options, buildInfo.package) - await builder.build({ - ...options, - [buildInfo.platform]: [buildInfo.package], - }) -} - -// AppX must hav a different name since the store name is already taken (but not used) -function ensureAppNameForPackage(options: builder.CliOptions, packageOption: Packages) { const jsonLocation = path.join((options.projectDir as string), 'package.json') + const packageJsonStr = fs.readFileSync(jsonLocation).toString() + const packageJson = JSON.parse(fs.readFileSync(jsonLocation).toString()) - packageJson.build.productName = packageOption === 'appx' ? 'MQTT-Explorer' : 'MQTT Explorer' - fs.writeFileSync(jsonLocation, JSON.stringify(packageJson, undefined, ' ')) + + // AppX must have a different name since the store name is already taken (but not used) + if (buildInfo.package === 'appx') { + dotProp.set(packageJson, 'build.productName', 'MQTT-Explorer') + } + + if (buildInfo.platform === 'mac') { + console.log(buildInfo.package) + const provisioningProfile = (buildInfo.package === 'mas') ? 'res/MQTT_Explorer_Store_Distribution_Profile.provisionprofile' : 'res/MQTTExplorerdmg.provisionprofile' + dotProp.set(packageJson, 'build.mac.provisioningProfile', provisioningProfile) + } + + try { + // Write modified package.json + fs.writeFileSync(jsonLocation, JSON.stringify(packageJson)) + await builder.build({ + ...options, + [buildInfo.platform]: [buildInfo.package], + }) + } catch (error) { + throw error + } finally { + // Roll back changes to package.json + fs.writeFileSync(jsonLocation, packageJsonStr) + } } function build() { diff --git a/res/MQTTExplorerdmg.provisionprofile b/res/MQTTExplorerdmg.provisionprofile new file mode 100644 index 0000000000000000000000000000000000000000..0221c36b671d751e09b91c8a5170f055206fe1ad GIT binary patch literal 7604 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 bq{X=Bmw$WvY%kSH>T`@AwlT@OU!M9G!qrAb literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock index 48c3892..1ddd166 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1131,6 +1131,13 @@ dot-prop@^4.1.0: dependencies: is-obj "^1.0.0" +dot-prop@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.0.0.tgz#64b7968af349c3a9f966aa12658dbd5829f6b953" + integrity sha512-RTmaF2jx3nOBO2GvtFqjnDLycjFUMqt+2pwRx7JVYa81lDauoj9aNkyrJI2ikR58FbBIchiIlRiGG+muLJ4oHQ== + dependencies: + is-obj "^1.0.0" + dotenv-expand@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275" From 86544c13340573906335bc828a67d72a647c8f54 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Tue, 30 Apr 2019 18:35:29 +0200 Subject: [PATCH 5/8] Disable sandbox --- src/electron.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/electron.ts b/src/electron.ts index 4e7f685..cf74c95 100644 --- a/src/electron.ts +++ b/src/electron.ts @@ -14,6 +14,8 @@ if (!isDev() && !runningUiTestOnCi()) { const electronTelemetry = electronTelemetryFactory('9b0c8ca04a361eb8160d98c5', buildOptions) } +app.commandLine.appendSwitch('--no-sandbox') + autoUpdater.logger = log log.info('App starting...') From 14f2f9ff1e728478977667dffc72f384dc0d6dc0 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Tue, 30 Apr 2019 21:22:54 +0200 Subject: [PATCH 6/8] Fix mac release artifact publish settings --- package.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.ts b/package.ts index aa07511..daa43a1 100644 --- a/package.ts +++ b/package.ts @@ -54,7 +54,7 @@ const mac: builder.CliOptions = { armv7l: false, arm64: false, projectDir: './build/clean', - publish: 'never', + publish: 'always', } async function executeBuild() { From 03e228e5a0e72d443f302fda79d30ae8d148f5e2 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Wed, 1 May 2019 00:58:04 +0200 Subject: [PATCH 7/8] Fix ci fullscreen flag --- src/electron.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/electron.ts b/src/electron.ts index cf74c95..eb82d02 100644 --- a/src/electron.ts +++ b/src/electron.ts @@ -51,7 +51,7 @@ async function createWindow() { mainWindow.once('ready-to-show', () => { if (mainWindow) { - runningUiTestOnCi && mainWindow.setFullScreen(true) + runningUiTestOnCi() && mainWindow.setFullScreen(true) mainWindow.show() } }) From ae7440f8ab89797fca2fb018471d129ead3ca8c6 Mon Sep 17 00:00:00 2001 From: Thomas Nordquist Date: Wed, 1 May 2019 01:26:00 +0200 Subject: [PATCH 8/8] Fix linux icon --- src/electron.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/electron.ts b/src/electron.ts index eb82d02..e8ee291 100644 --- a/src/electron.ts +++ b/src/electron.ts @@ -35,7 +35,7 @@ async function createWindow() { loadDevTools() } - const iconPath = path.join(__dirname, 'icon.png') + const iconPath = path.join(__dirname, '..', '..', 'icon.png') // Create the browser window. mainWindow = new BrowserWindow({ width: 1024,