Browse Source

fix: create `userData` on requestSingleInstanceLock() if needed (#33559) (#33593)

* test: use custom userData folder for requestSingleInstanceLock()

* update test

* prefix test folder path

* fix: create userDataDir on requestSingleInstanceLock() if needed

* Trigger Build

Co-authored-by: Micha Hanselmann <[email protected]>
trop[bot] 3 years ago
parent
commit
bdff8837a7

+ 2 - 0
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);

+ 7 - 0
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]);

+ 12 - 0
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);

+ 4 - 0
spec/fixtures/api/singleton-userdata/package.json

@@ -0,0 +1,4 @@
+{
+  "name": "electron-test-singleton-userdata",
+  "main": "main.js"
+}