From 2f0bbdd0d0b5b83df72244b093e76caa84564d24 Mon Sep 17 00:00:00 2001 From: Micha Hanselmann Date: Mon, 4 Apr 2022 03:39:55 +0200 Subject: [PATCH] fix: create `userData` on requestSingleInstanceLock() if needed (#33559) * test: use custom userData folder for requestSingleInstanceLock() * update test * prefix test folder path * fix: create userDataDir on requestSingleInstanceLock() if needed * Trigger Build --- shell/browser/api/electron_api_app.cc | 2 ++ spec-main/api-app-spec.ts | 7 +++++++ spec/fixtures/api/singleton-userdata/main.js | 12 ++++++++++++ spec/fixtures/api/singleton-userdata/package.json | 4 ++++ 4 files changed, 25 insertions(+) create mode 100644 spec/fixtures/api/singleton-userdata/main.js create mode 100644 spec/fixtures/api/singleton-userdata/package.json diff --git a/shell/browser/api/electron_api_app.cc b/shell/browser/api/electron_api_app.cc index d2de05d363ff2..d6d75c6a0230f 100644 --- a/shell/browser/api/electron_api_app.cc +++ b/shell/browser/api/electron_api_app.cc @@ -1148,6 +1148,8 @@ bool App::RequestSingleInstanceLock(gin::Arguments* args) { base::FilePath user_dir; base::PathService::Get(chrome::DIR_USER_DATA, &user_dir); + // The user_dir may not have been created yet. + base::CreateDirectoryAndGetError(user_dir, nullptr); auto cb = base::BindRepeating(&App::OnSecondInstance, base::Unretained(this)); auto wrapped_cb = base::BindRepeating(NotificationCallbackWrapper, cb); diff --git a/spec-main/api-app-spec.ts b/spec-main/api-app-spec.ts index f4337d224bdb1..62608d0ec14e8 100644 --- a/spec-main/api-app-spec.ts +++ b/spec-main/api-app-spec.ts @@ -228,6 +228,13 @@ describe('app module', () => { expect(code1).to.equal(0); }); + it('returns true when setting non-existent user data folder', async function () { + const appPath = path.join(fixturesPath, 'api', 'singleton-userdata'); + const instance = cp.spawn(process.execPath, [appPath]); + const [code] = await emittedOnce(instance, 'exit'); + expect(code).to.equal(0); + }); + async function testArgumentPassing (testArgs: SingleInstanceLockTestArgs) { const appPath = path.join(fixturesPath, 'api', 'singleton-data'); const first = cp.spawn(process.execPath, [appPath, ...testArgs.args]); diff --git a/spec/fixtures/api/singleton-userdata/main.js b/spec/fixtures/api/singleton-userdata/main.js new file mode 100644 index 0000000000000..98f6841b4282a --- /dev/null +++ b/spec/fixtures/api/singleton-userdata/main.js @@ -0,0 +1,12 @@ +const { app } = require('electron'); +const fs = require('fs'); +const path = require('path'); + +// non-existent user data folder should not break requestSingleInstanceLock() +// ref: https://github.com/electron/electron/issues/33547 +const userDataFolder = path.join(app.getPath('home'), 'electron-test-singleton-userdata'); +fs.rmSync(userDataFolder, { force: true, recursive: true }); +app.setPath('userData', userDataFolder); + +const gotTheLock = app.requestSingleInstanceLock(); +app.exit(gotTheLock ? 0 : 1); diff --git a/spec/fixtures/api/singleton-userdata/package.json b/spec/fixtures/api/singleton-userdata/package.json new file mode 100644 index 0000000000000..1269c0a67d5dd --- /dev/null +++ b/spec/fixtures/api/singleton-userdata/package.json @@ -0,0 +1,4 @@ +{ + "name": "electron-test-singleton-userdata", + "main": "main.js" +}