diff --git a/package.json b/package.json index 203c1fb812..daa31e306c 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@blueprintjs/core": "^3.36.0", "@blueprintjs/popover2": "^0.12.2", "@blueprintjs/select": "^3.15.0", - "@electron/fiddle-core": "^1.3.3", + "@electron/fiddle-core": "^1.4.0", "@octokit/rest": "^17.0.0", "@sentry/electron": "^5.11.0", "algoliasearch": "^4.12.0", diff --git a/src/interfaces.ts b/src/interfaces.ts index 51f73fde5a..1a50b29b35 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -280,6 +280,7 @@ export interface StartFiddleParams { dir: string; options: string[]; env: { [x: string]: string | undefined }; + runFromAsar?: boolean; } export interface DownloadVersionParams { diff --git a/src/main/fiddle-core.ts b/src/main/fiddle-core.ts index bc516c2699..cd90e3db53 100644 --- a/src/main/fiddle-core.ts +++ b/src/main/fiddle-core.ts @@ -35,6 +35,7 @@ export async function startFiddle( localPath, options, version, + runFromAsar, } = params; const env = { ...process.env }; @@ -53,7 +54,7 @@ export async function startFiddle( const child = await runner.spawn( isValidBuild && localPath ? Installer.getExecPath(localPath) : version, dir, - { args: options, cwd: dir, env }, + { args: options, cwd: dir, env, runFromAsar }, ); fiddleProcesses.set(webContents, child); diff --git a/src/renderer/components/commands-runner.tsx b/src/renderer/components/commands-runner.tsx index e2fdd124ae..2c1bd6228a 100644 --- a/src/renderer/components/commands-runner.tsx +++ b/src/renderer/components/commands-runner.tsx @@ -1,6 +1,14 @@ import * as React from 'react'; -import { Button, ButtonProps, Spinner } from '@blueprintjs/core'; +import { + Button, + ButtonGroup, + ButtonProps, + Menu, + MenuItem, + Spinner, +} from '@blueprintjs/core'; +import { Popover2 } from '@blueprintjs/popover2'; import { observer } from 'mobx-react'; import { InstallState, VersionSource } from '../../interfaces'; @@ -59,7 +67,9 @@ export const Runner = observer( props.icon = <Spinner size={16} />; } else { props.text = 'Run'; - props.onClick = window.app.runner.run; + props.onClick = () => { + window.app.runner.run({ runFromAsar: false }); + }; props.icon = 'play'; } break; @@ -76,8 +86,36 @@ export const Runner = observer( props.icon = <Spinner size={16} />; } } + const isAsarDisabled: boolean = + props.disabled || isRunning || isInstallingModules; - return <Button id="button-run" {...props} type={undefined} />; + return ( + <ButtonGroup> + <Button id="button-run" {...props} type={undefined} /> + <AsarButton disabled={isAsarDisabled} /> + </ButtonGroup> + ); } }, ); + +const AsarButton = ({ disabled }: { disabled: boolean }): JSX.Element => { + const asarButton = ( + <Menu> + <MenuItem + text="Run from ASAR" + icon="play" + active={!disabled} + onClick={() => { + window.app.runner.run({ runFromAsar: true }); + }} + /> + </Menu> + ); + + return ( + <Popover2 fill={true} content={asarButton} placement="bottom"> + <Button icon="caret-down" style={{ minWidth: 20 }} disabled={disabled} /> + </Popover2> + ); +}; diff --git a/src/renderer/components/commands.tsx b/src/renderer/components/commands.tsx index 86292d2b38..933b774660 100644 --- a/src/renderer/components/commands.tsx +++ b/src/renderer/components/commands.tsx @@ -55,6 +55,8 @@ export const Commands = observer( </ControlGroup> <ControlGroup fill={true} vertical={false}> <VersionChooser appState={appState} /> + </ControlGroup> + <ControlGroup fill={true} vertical={false}> <Runner appState={appState} /> </ControlGroup> {isBisectCommandShowing && ( diff --git a/src/renderer/runner.ts b/src/renderer/runner.ts index fa38415a9c..cb1f338272 100644 --- a/src/renderer/runner.ts +++ b/src/renderer/runner.ts @@ -20,11 +20,16 @@ export enum ForgeCommands { MAKE = 'make', } +export interface RunOptions { + runFromAsar?: boolean; +} + interface RunFiddleParams { localPath: string | undefined; isValidBuild: boolean; // If the localPath is a valid Electron build version: string; // The user selected version dir: string; + runFromAsar?: boolean; } const resultString: Record<RunResult, string> = Object.freeze({ @@ -139,8 +144,9 @@ export class Runner { /** * Actually run the fiddle. */ - public async run(): Promise<RunResult> { + public async run(runOptions?: RunOptions): Promise<RunResult> { const options = { includeDependencies: false, includeElectron: false }; + const runFromAsar = runOptions?.runFromAsar ?? false; const { appState } = this; const currentRunnable = appState.currentElectronVersion; @@ -220,6 +226,7 @@ export class Runner { isValidBuild, dir, version, + runFromAsar, }); } diff --git a/tests/renderer/components/__snapshots__/commands-runner-spec.tsx.snap b/tests/renderer/components/__snapshots__/commands-runner-spec.tsx.snap index 11b5693e11..ce8a4aa652 100644 --- a/tests/renderer/components/__snapshots__/commands-runner-spec.tsx.snap +++ b/tests/renderer/components/__snapshots__/commands-runner-spec.tsx.snap @@ -1,85 +1,120 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Runner component renders InstallState.downloading 1`] = ` -<Blueprint3.Button - disabled={true} - icon={ - <Blueprint3.Spinner - size={16} - value={50} - /> - } - id="button-run" - text="Downloading" -/> +<Blueprint3.ButtonGroup> + <Blueprint3.Button + disabled={true} + icon={ + <Blueprint3.Spinner + size={16} + value={50} + /> + } + id="button-run" + text="Downloading" + /> + <AsarButton + disabled={true} + /> +</Blueprint3.ButtonGroup> `; exports[`Runner component renders InstallState.installed 1`] = ` -<Blueprint3.Button - disabled={false} - icon="play" - id="button-run" - onClick={[MockFunction]} - text="Run" -/> +<Blueprint3.ButtonGroup> + <Blueprint3.Button + disabled={false} + icon="play" + id="button-run" + onClick={[Function]} + text="Run" + /> + <AsarButton + disabled={false} + /> +</Blueprint3.ButtonGroup> `; exports[`Runner component renders InstallState.installing 1`] = ` -<Blueprint3.Button - disabled={true} - icon={ - <Blueprint3.Spinner - size={16} - /> - } - id="button-run" - text="Unzipping" -/> +<Blueprint3.ButtonGroup> + <Blueprint3.Button + disabled={true} + icon={ + <Blueprint3.Spinner + size={16} + /> + } + id="button-run" + text="Unzipping" + /> + <AsarButton + disabled={true} + /> +</Blueprint3.ButtonGroup> `; exports[`Runner component renders InstallState.missing 1`] = ` -<Blueprint3.Button - disabled={true} - icon={ - <Blueprint3.Spinner - size={16} - /> - } - id="button-run" - text="Checking status" -/> +<Blueprint3.ButtonGroup> + <Blueprint3.Button + disabled={true} + icon={ + <Blueprint3.Spinner + size={16} + /> + } + id="button-run" + text="Checking status" + /> + <AsarButton + disabled={true} + /> +</Blueprint3.ButtonGroup> `; exports[`Runner component renders idle 1`] = ` -<Blueprint3.Button - disabled={false} - icon="play" - id="button-run" - onClick={[MockFunction]} - text="Run" -/> +<Blueprint3.ButtonGroup> + <Blueprint3.Button + disabled={false} + icon="play" + id="button-run" + onClick={[Function]} + text="Run" + /> + <AsarButton + disabled={false} + /> +</Blueprint3.ButtonGroup> `; exports[`Runner component renders installing modules 1`] = ` -<Blueprint3.Button - disabled={false} - icon={ - <Blueprint3.Spinner - size={16} - /> - } - id="button-run" - text="Installing modules" -/> +<Blueprint3.ButtonGroup> + <Blueprint3.Button + disabled={false} + icon={ + <Blueprint3.Spinner + size={16} + /> + } + id="button-run" + text="Installing modules" + /> + <AsarButton + disabled={true} + /> +</Blueprint3.ButtonGroup> `; exports[`Runner component renders running 1`] = ` -<Blueprint3.Button - active={true} - disabled={false} - icon="stop" - id="button-run" - onClick={[MockFunction]} - text="Stop" -/> +<Blueprint3.ButtonGroup> + <Blueprint3.Button + active={true} + disabled={false} + icon="stop" + id="button-run" + onClick={[MockFunction]} + text="Stop" + /> + <AsarButton + disabled={true} + /> +</Blueprint3.ButtonGroup> `; diff --git a/tests/renderer/components/__snapshots__/commands-spec.tsx.snap b/tests/renderer/components/__snapshots__/commands-spec.tsx.snap index 58a2265b00..cd642dd334 100644 --- a/tests/renderer/components/__snapshots__/commands-spec.tsx.snap +++ b/tests/renderer/components/__snapshots__/commands-spec.tsx.snap @@ -23,6 +23,11 @@ exports[`Commands component renders when system is darwin 1`] = ` <version-chooser appState={"default StateMock"} /> + </Blueprint3.ControlGroup> + <Blueprint3.ControlGroup + fill={true} + vertical={false} + > <runner appState={"default StateMock"} /> @@ -77,6 +82,11 @@ exports[`Commands component renders when system not is darwin 1`] = ` <version-chooser appState={"default StateMock"} /> + </Blueprint3.ControlGroup> + <Blueprint3.ControlGroup + fill={true} + vertical={false} + > <runner appState={"default StateMock"} /> diff --git a/yarn.lock b/yarn.lock index ddad25caf6..156b932a9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1089,11 +1089,21 @@ glob "^7.1.6" minimatch "^3.0.4" -"@electron/fiddle-core@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@electron/fiddle-core/-/fiddle-core-1.3.3.tgz#adb54cd4cb3c63726c945c028808e39baa562747" - integrity sha512-aBUN+jsNsLo+Ywfl0wQy2TRRGC8TvLF42Lt9zOdrzGgT7vzDNiFvr7+UiRVvC5inGR0XgeTmZpwaS6CnT6ZPWA== +"@electron/asar@^3.3.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.4.1.tgz#4e9196a4b54fba18c56cd8d5cac67c5bdc588065" + integrity sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA== + dependencies: + commander "^5.0.0" + glob "^7.1.6" + minimatch "^3.0.4" + +"@electron/fiddle-core@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@electron/fiddle-core/-/fiddle-core-1.4.0.tgz#b19840053a1a8e2e6cba45db3bd80b296b90fb88" + integrity sha512-dPoLYJJ5HtvnWG8p29JorKn6mlX4JOsQb6eGKT41Q48SqAm96WXkarHCGDA4PQWj5qJq1R75aBHtH78pLjX46A== dependencies: + "@electron/asar" "^3.3.1" "@electron/get" "^2.0.0" debug "^4.3.3" env-paths "^2.2.1"