tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit a7f825badc16c6b9d115bdc35e483d9b13de1e1c
parent 90424972214a70dbb9007e6f32a7573b337efb57
Author: Alexandre Lissy <lissyx+mozillians@lissyx.dyndns.org>
Date:   Wed, 19 Nov 2025 17:46:18 +0000

Bug 259356 - Add Glean labeled counters for profile creation place r=profiles-reviewers,mossop

Differential Revision: https://phabricator.services.mozilla.com/D252671

Diffstat:
Mtoolkit/profile/metrics.yaml | 25+++++++++++++++++++++++++
Mtoolkit/xre/nsXREDirProvider.cpp | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
Mtoolkit/xre/nsXREDirProvider.h | 10+++++++++-
3 files changed, 98 insertions(+), 5 deletions(-)

diff --git a/toolkit/profile/metrics.yaml b/toolkit/profile/metrics.yaml @@ -150,6 +150,31 @@ profiles: - heartbeat - update + creation_place: + type: labeled_counter + description: | + Tracking where profiles have been created. The `legacy_forced` refers to + usage of `MOZ_LEGACY_HOME=1` while `legacy_existing` is for the case an + existing legacy profile was detected. The `xdg_default` accounts for lack + of `XDG_CONFIG_HOME` value defaulting to `$HOME/.config` when + `xdg_config` refers to existing `XDG_CONFIG_HOME`. + bugs: + - https://bugzilla.mozilla.org/259356 + data_reviews: + - https://bugzilla.mozilla.org/show_bug.cgi?id=259356 + data_sensitivity: + - technical + notification_emails: + - me@mozilla.com + expires: never + labels: + - legacy_forced + - legacy_existing + - xdg_default + - xdg_config + send_in_pings: + - metrics + reset_date: type: quantity unit: days since Jan 1 1970 diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp @@ -51,6 +51,7 @@ #include "mozilla/Omnijar.h" #include "mozilla/Preferences.h" #include "mozilla/ProfilerLabels.h" +#include "mozilla/glean/ToolkitProfileMetrics.h" #include "mozilla/glean/ToolkitXreMetrics.h" #include "mozilla/Try.h" #include "mozilla/Utf8.h" @@ -101,6 +102,11 @@ nsIFile* gDataDirHome = nullptr; MOZ_CONSTINIT nsCOMPtr<nsIFile> gDataDirProfileLocal{}; MOZ_CONSTINIT nsCOMPtr<nsIFile> gDataDirProfile{}; +#if defined(MOZ_WIDGET_GTK) +nsXREDirProvider::legacyOrXDGHomeTelemetry gXdgTelemetry = + nsXREDirProvider::legacyOrXDGHomeTelemetry::empty; +#endif // defined(MOZ_WIDGET_GTK) + // These are required to allow nsXREDirProvider to be usable in xpcshell tests. // where gAppData is null. #if defined(XP_MACOSX) || defined(XP_UNIX) @@ -228,6 +234,33 @@ nsresult nsXREDirProvider::GetUserProfilesRootDir(nsIFile** aResult) { if (NS_FAILED(tmp)) { rv = tmp; } + +#if defined(MOZ_WIDGET_GTK) + switch (gXdgTelemetry) { + case legacyOrXDGHomeTelemetry::legacyExists: + mozilla::glean::profiles::creation_place.Get("legacy_exists"_ns).Add(1); + break; + case legacyOrXDGHomeTelemetry::legacyForced: + mozilla::glean::profiles::creation_place.Get("legacy_forced"_ns).Add(1); + break; + case legacyOrXDGHomeTelemetry::xdgDefault: + mozilla::glean::profiles::creation_place.Get("xdg_default"_ns).Add(1); + break; + case legacyOrXDGHomeTelemetry::xdgConfigHome: + mozilla::glean::profiles::creation_place.Get("xdg_config"_ns).Add(1); + break; + default: { + nsAutoCString nativePath; + nsresult rv_conv = file->GetNativePath(nativePath); + if (NS_SUCCEEDED(rv_conv)) { + NS_WARNING(nsPrintfCString( + "Recording no telemetry value with profile path %s", + nativePath.get()) + .get()); + } + } break; + } +#endif // defined(MOZ_WIDGET_GTK) } file.swap(*aResult); return rv; @@ -1356,11 +1389,19 @@ bool nsXREDirProvider::LegacyHomeExists(nsIFile** aFile) { return exists; } +void MaybeRecordXdgTelemetry( + nsXREDirProvider::legacyOrXDGHomeTelemetry aValue) { + if (gXdgTelemetry == nsXREDirProvider::legacyOrXDGHomeTelemetry::empty) { + gXdgTelemetry = aValue; + } +} + /* static */ nsresult nsXREDirProvider::GetLegacyOrXDGEnvValue(const char* aHomeDir, const char* aEnvName, nsCString aSubdir, - nsIFile** aFile) { + nsIFile** aFile, + bool* aWasFromEnv) { nsCOMPtr<nsIFile> localDir; nsresult rv = NS_OK; @@ -1368,6 +1409,9 @@ nsresult nsXREDirProvider::GetLegacyOrXDGEnvValue(const char* aHomeDir, if (envValue && *envValue) { rv = NS_NewNativeLocalFile(nsDependentCString(envValue), getter_AddRefs(localDir)); + if (aWasFromEnv) { + *aWasFromEnv = true; + } } // Explicitly check for rv failure because in case we get passed an env @@ -1380,6 +1424,9 @@ nsresult nsXREDirProvider::GetLegacyOrXDGEnvValue(const char* aHomeDir, MOZ_TRY(NS_NewNativeLocalFile(nsDependentCString(aHomeDir), getter_AddRefs(localDir))); MOZ_TRY(localDir->AppendNative(aSubdir)); + if (aWasFromEnv) { + *aWasFromEnv = false; + } } localDir.forget(aFile); @@ -1389,7 +1436,8 @@ nsresult nsXREDirProvider::GetLegacyOrXDGEnvValue(const char* aHomeDir, /* static */ nsresult nsXREDirProvider::GetLegacyOrXDGCachePath(const char* aHomeDir, nsIFile** aFile) { - return GetLegacyOrXDGEnvValue(aHomeDir, "XDG_CACHE_HOME", ".cache"_ns, aFile); + return GetLegacyOrXDGEnvValue(aHomeDir, "XDG_CACHE_HOME", ".cache"_ns, aFile, + nullptr); } /* @@ -1398,8 +1446,15 @@ nsresult nsXREDirProvider::GetLegacyOrXDGCachePath(const char* aHomeDir, /* static */ nsresult nsXREDirProvider::GetLegacyOrXDGConfigHome(const char* aHomeDir, nsIFile** aFile) { - return GetLegacyOrXDGEnvValue(aHomeDir, "XDG_CONFIG_HOME", ".config"_ns, - aFile); + bool wasFromEnv = false; + nsresult rv = GetLegacyOrXDGEnvValue(aHomeDir, "XDG_CONFIG_HOME", + ".config"_ns, aFile, &wasFromEnv); + if (NS_SUCCEEDED(rv) && wasFromEnv) { + MaybeRecordXdgTelemetry(legacyOrXDGHomeTelemetry::xdgConfigHome); + } else { + MaybeRecordXdgTelemetry(legacyOrXDGHomeTelemetry::xdgDefault); + } + return rv; } // Attempt to construct the HOME path depending on XDG or legacy status. @@ -1411,6 +1466,11 @@ nsresult nsXREDirProvider::GetLegacyOrXDGHomePath(const char* aHomeDir, bool exists = LegacyHomeExists(getter_AddRefs(parentDir)); if (exists || IsForceLegacyHome() || aForceLegacy) { + if (exists) { + MaybeRecordXdgTelemetry(legacyOrXDGHomeTelemetry::legacyExists); + } else { + MaybeRecordXdgTelemetry(legacyOrXDGHomeTelemetry::legacyForced); + } parentDir.forget(aFile); return NS_OK; } diff --git a/toolkit/xre/nsXREDirProvider.h b/toolkit/xre/nsXREDirProvider.h @@ -72,7 +72,8 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2, #if defined(MOZ_WIDGET_GTK) static nsresult GetLegacyOrXDGEnvValue(const char* aHomeDir, const char* aEnvName, - nsCString aSubdir, nsIFile** aFile); + nsCString aSubdir, nsIFile** aFile, + bool* aWasFromEnv); static nsresult GetLegacyOrXDGCachePath(const char* aHomeDir, nsIFile** aFile); static nsresult GetLegacyOrXDGHomePath(const char* aHomeDir, nsIFile** aFile, @@ -86,6 +87,13 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2, static nsresult GetLegacyOrXDGConfigHome(const char* aHomeDir, nsIFile** aFile); + enum legacyOrXDGHomeTelemetry { + empty, + legacyExists, + legacyForced, + xdgDefault, + xdgConfigHome + }; #endif // defined(MOZ_WIDGET_GTK) /* make sure you clone it, if you need to do stuff to it */