diff --git a/docs/api/app.md b/docs/api/app.md index 0ad160d8863f..9dcb4835aade 100644 --- a/docs/api/app.md +++ b/docs/api/app.md @@ -602,6 +602,7 @@ Returns `string` - The current application directory. * `%APPDATA%` on Windows * `$XDG_CONFIG_HOME` or `~/.config` on Linux * `~/Library/Application Support` on macOS + * `assets` The directory where app assets such as `resources.pak` are stored. By default this is the same as the folder containing the `exe` path. Available on Windows and Linux only. * `userData` The directory for storing your app's configuration files, which by default is the `appData` directory appended with your app's name. By convention files storing user data should be written to this directory, and @@ -616,7 +617,7 @@ Returns `string` - The current application directory. directory. * `temp` Temporary directory. * `exe` The current executable file. - * `module` The `libchromiumcontent` library. + * `module` The location of the Chromium module. By default this is synonymous with `exe`. * `desktop` The current user's Desktop directory. * `documents` Directory for a user's "My Documents". * `downloads` Directory for a user's downloads. diff --git a/shell/app/electron_main_delegate.cc b/shell/app/electron_main_delegate.cc index 819843179406..a5116fc8969f 100644 --- a/shell/app/electron_main_delegate.cc +++ b/shell/app/electron_main_delegate.cc @@ -219,7 +219,7 @@ std::string LoadResourceBundle(const std::string& locale) { pak_dir = base::apple::FrameworkBundlePath().Append(FILE_PATH_LITERAL("Resources")); #else - base::PathService::Get(base::DIR_MODULE, &pak_dir); + base::PathService::Get(base::DIR_ASSETS, &pak_dir); #endif std::string loaded_locale = ui::ResourceBundle::InitSharedInstanceWithLocale( diff --git a/shell/browser/api/electron_api_app.cc b/shell/browser/api/electron_api_app.cc index 19ce763d34b7..fdaaac369f29 100644 --- a/shell/browser/api/electron_api_app.cc +++ b/shell/browser/api/electron_api_app.cc @@ -383,6 +383,9 @@ int GetPathConstant(std::string_view name) { // clang-format off constexpr auto Lookup = base::MakeFixedFlatMap({ {"appData", DIR_APP_DATA}, +#if !BUILDFLAG(IS_MAC) + {"assets", base::DIR_ASSETS}, +#endif #if BUILDFLAG(IS_POSIX) {"cache", base::DIR_CACHE}, #else diff --git a/shell/common/asar/archive_win.cc b/shell/common/asar/archive_win.cc index 861c2fec086e..ae3e73797bf4 100644 --- a/shell/common/asar/archive_win.cc +++ b/shell/common/asar/archive_win.cc @@ -26,13 +26,13 @@ const wchar_t kIntegrityCheckResourceType[] = L"Integrity"; const wchar_t kIntegrityCheckResourceItem[] = L"ElectronAsar"; std::optional Archive::RelativePath() const { - base::FilePath exe_path; - if (!base::PathService::Get(base::FILE_EXE, &exe_path)) { - LOG(FATAL) << "Couldn't get exe file path"; + base::FilePath assets_dir; + if (!base::PathService::Get(base::DIR_ASSETS, &assets_dir)) { + LOG(FATAL) << "Couldn't get assets directory path"; } base::FilePath relative_path; - if (!exe_path.DirName().AppendRelativePath(path_, &relative_path)) { + if (!assets_dir.AppendRelativePath(path_, &relative_path)) { return std::nullopt; } diff --git a/shell/common/node_bindings.cc b/shell/common/node_bindings.cc index c90809e99fb1..04648369ce8d 100644 --- a/shell/common/node_bindings.cc +++ b/shell/common/node_bindings.cc @@ -456,11 +456,10 @@ base::FilePath GetResourcesPath() { #if BUILDFLAG(IS_MAC) return MainApplicationBundlePath().Append("Contents").Append("Resources"); #else - auto* command_line = base::CommandLine::ForCurrentProcess(); - base::FilePath exec_path(command_line->GetProgram()); - base::PathService::Get(base::FILE_EXE, &exec_path); + base::FilePath assets_path; + base::PathService::Get(base::DIR_ASSETS, &assets_path); - return exec_path.DirName().Append(FILE_PATH_LITERAL("resources")); + return assets_path.Append(FILE_PATH_LITERAL("resources")); #endif } } // namespace diff --git a/spec/api-app-spec.ts b/spec/api-app-spec.ts index e6f21f34850a..34983c484e9e 100644 --- a/spec/api-app-spec.ts +++ b/spec/api-app-spec.ts @@ -1109,6 +1109,20 @@ describe('app module', () => { expect(paths).to.deep.equal([true, true, true]); }); + if (process.platform === 'darwin') { + it('throws an error when trying to get the assets path on macOS', () => { + expect(() => { + app.getPath('assets' as any); + }).to.throw(/Failed to get 'assets' path/); + }); + } else { + it('returns an assets path that is identical to the module path', () => { + const assetsPath = app.getPath('assets'); + expect(fs.existsSync(assetsPath)).to.be.true(); + expect(assetsPath).to.equal(path.dirname(app.getPath('module'))); + }); + } + it('throws an error when the name is invalid', () => { expect(() => { app.getPath('does-not-exist' as any);