From 701a76d3dd26ed5382abb1060ff11e79266528cf Mon Sep 17 00:00:00 2001 From: Micha Hanselmann Date: Thu, 31 Mar 2022 15:05:03 +0200 Subject: [PATCH 1/5] test: use custom userData folder for requestSingleInstanceLock() --- spec/fixtures/api/singleton/main.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/fixtures/api/singleton/main.js b/spec/fixtures/api/singleton/main.js index 4bd6433eea215..921e91a8b5776 100644 --- a/spec/fixtures/api/singleton/main.js +++ b/spec/fixtures/api/singleton/main.js @@ -1,9 +1,17 @@ const { app } = require('electron'); +const fs = require('fs'); +const path = require('path'); app.whenReady().then(() => { console.log('started'); // ping parent }); +// non-existing user data folder should not break requestSingleInstanceLock() +// ref: https://github.com/electron/electron/issues/33547 +const userDataFolder = path.join(app.getPath('home'), 'electron-userData'); +fs.rmSync(userDataFolder, { force: true, recursive: true }); +app.setPath('userData', userDataFolder); + const gotTheLock = app.requestSingleInstanceLock(); app.on('second-instance', (event, args, workingDirectory) => { From 5c80f29da677e1d439592d1cdebd4b20da642720 Mon Sep 17 00:00:00 2001 From: Micha Hanselmann Date: Thu, 31 Mar 2022 16:30:30 +0200 Subject: [PATCH 2/5] update test --- spec-main/api-app-spec.ts | 7 +++++++ spec/fixtures/api/singleton-userdata/main.js | 12 ++++++++++++ spec/fixtures/api/singleton-userdata/package.json | 4 ++++ spec/fixtures/api/singleton/main.js | 8 -------- 4 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 spec/fixtures/api/singleton-userdata/main.js create mode 100644 spec/fixtures/api/singleton-userdata/package.json diff --git a/spec-main/api-app-spec.ts b/spec-main/api-app-spec.ts index 718223229572b..98b7b8ac2778f 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.only('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..1e8d6637d0f1a --- /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-existing user data folder should not break requestSingleInstanceLock() +// ref: https://github.com/electron/electron/issues/33547 +const userDataFolder = path.join(app.getPath('home'), '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" +} diff --git a/spec/fixtures/api/singleton/main.js b/spec/fixtures/api/singleton/main.js index 921e91a8b5776..4bd6433eea215 100644 --- a/spec/fixtures/api/singleton/main.js +++ b/spec/fixtures/api/singleton/main.js @@ -1,17 +1,9 @@ const { app } = require('electron'); -const fs = require('fs'); -const path = require('path'); app.whenReady().then(() => { console.log('started'); // ping parent }); -// non-existing user data folder should not break requestSingleInstanceLock() -// ref: https://github.com/electron/electron/issues/33547 -const userDataFolder = path.join(app.getPath('home'), 'electron-userData'); -fs.rmSync(userDataFolder, { force: true, recursive: true }); -app.setPath('userData', userDataFolder); - const gotTheLock = app.requestSingleInstanceLock(); app.on('second-instance', (event, args, workingDirectory) => { From b2e7aeaa38408f175abeadefdad3eca8088e598b Mon Sep 17 00:00:00 2001 From: Micha Hanselmann Date: Fri, 1 Apr 2022 10:13:56 +0200 Subject: [PATCH 3/5] prefix test folder path --- spec/fixtures/api/singleton-userdata/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/fixtures/api/singleton-userdata/main.js b/spec/fixtures/api/singleton-userdata/main.js index 1e8d6637d0f1a..6b9a33cc1ac08 100644 --- a/spec/fixtures/api/singleton-userdata/main.js +++ b/spec/fixtures/api/singleton-userdata/main.js @@ -4,7 +4,7 @@ const path = require('path'); // non-existing user data folder should not break requestSingleInstanceLock() // ref: https://github.com/electron/electron/issues/33547 -const userDataFolder = path.join(app.getPath('home'), 'singleton-userdata'); +const userDataFolder = path.join(app.getPath('home'), 'electron-test-singleton-userdata'); fs.rmSync(userDataFolder, { force: true, recursive: true }); app.setPath('userData', userDataFolder); From aa00bfda5f432a22638574b21011e130cbd8ef02 Mon Sep 17 00:00:00 2001 From: Micha Hanselmann Date: Fri, 1 Apr 2022 10:19:30 +0200 Subject: [PATCH 4/5] fix: create userDataDir on requestSingleInstanceLock() if needed --- shell/browser/api/electron_api_app.cc | 2 ++ spec-main/api-app-spec.ts | 2 +- spec/fixtures/api/singleton-userdata/main.js | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/shell/browser/api/electron_api_app.cc b/shell/browser/api/electron_api_app.cc index 73db1e756f885..e3a88a28b0872 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 98b7b8ac2778f..0389b70931a07 100644 --- a/spec-main/api-app-spec.ts +++ b/spec-main/api-app-spec.ts @@ -228,7 +228,7 @@ describe('app module', () => { expect(code1).to.equal(0); }); - it.only('returns true when setting non-existent user data folder', async function () { + 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'); diff --git a/spec/fixtures/api/singleton-userdata/main.js b/spec/fixtures/api/singleton-userdata/main.js index 6b9a33cc1ac08..98f6841b4282a 100644 --- a/spec/fixtures/api/singleton-userdata/main.js +++ b/spec/fixtures/api/singleton-userdata/main.js @@ -2,7 +2,7 @@ const { app } = require('electron'); const fs = require('fs'); const path = require('path'); -// non-existing user data folder should not break requestSingleInstanceLock() +// 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 }); From 5c27ba4ed9e985e9fcc6968a0f301b8deaadd445 Mon Sep 17 00:00:00 2001 From: Micha Hanselmann Date: Fri, 1 Apr 2022 14:34:55 +0200 Subject: [PATCH 5/5] Trigger Build