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:
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 */