Skip to content

Commit 0e9bf00

Browse files
committed
Bug 1543807 - Part 1: Modify launcher process telemetry to be gated on datareporting.healthreport.uploadEnabled; r=mhowell
Differential Revision: https://phabricator.services.mozilla.com/D29543 --HG-- extra : moz-landing-system : lando
1 parent 482490a commit 0e9bf00

File tree

4 files changed

+99
-37
lines changed

4 files changed

+99
-37
lines changed

browser/app/winlauncher/ErrorHandler.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -683,13 +683,9 @@ static bool SendPing(const mozilla::LauncherError& aError) {
683683
#if defined(MOZ_TELEMETRY_REPORTING)
684684
# if defined(MOZ_LAUNCHER_PROCESS)
685685
mozilla::LauncherRegistryInfo regInfo;
686-
mozilla::LauncherResult<mozilla::LauncherRegistryInfo::EnabledState>
687-
launcherEnabled = regInfo.IsEnabled();
688-
if (launcherEnabled.isErr() ||
689-
launcherEnabled.unwrap() ==
690-
mozilla::LauncherRegistryInfo::EnabledState::ForceDisabled) {
691-
// If the launcher is force disabled, we do not send any pings
692-
// (since studies and thus telemetry have been opted out)
686+
mozilla::LauncherResult<bool> telemetryEnabled = regInfo.IsTelemetryEnabled();
687+
if (telemetryEnabled.isErr() || !telemetryEnabled.unwrap()) {
688+
// Do not send anything if telemetry has been opted out
693689
return false;
694690
}
695691
# endif // defined(MOZ_LAUNCHER_PROCESS)

toolkit/xre/LauncherRegistryInfo.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const wchar_t LauncherRegistryInfo::kLauncherSubKeyPath[] =
2424
const wchar_t LauncherRegistryInfo::kLauncherSuffix[] = L"|Launcher";
2525
const wchar_t LauncherRegistryInfo::kBrowserSuffix[] = L"|Browser";
2626
const wchar_t LauncherRegistryInfo::kImageTimestampSuffix[] = L"|Image";
27+
const wchar_t LauncherRegistryInfo::kTelemetrySuffix[] = L"|Telemetry";
2728

2829
LauncherResult<LauncherRegistryInfo::Disposition> LauncherRegistryInfo::Open() {
2930
if (!!mRegKey) {
@@ -93,6 +94,27 @@ LauncherVoidResult LauncherRegistryInfo::ReflectPrefToRegistry(
9394
return Ok();
9495
}
9596

97+
LauncherVoidResult LauncherRegistryInfo::ReflectTelemetryPrefToRegistry(
98+
const bool aEnable) {
99+
LauncherResult<Disposition> disposition = Open();
100+
if (disposition.isErr()) {
101+
return LAUNCHER_ERROR_FROM_RESULT(disposition);
102+
}
103+
104+
std::wstring valueName(ResolveTelemetryValueName());
105+
106+
DWORD value = aEnable ? 1UL : 0UL;
107+
DWORD len = sizeof(value);
108+
LSTATUS result = ::RegSetValueExW(mRegKey.get(), valueName.c_str(), 0,
109+
REG_DWORD, reinterpret_cast<PBYTE>(&value),
110+
len);
111+
if (result != ERROR_SUCCESS) {
112+
return LAUNCHER_ERROR_FROM_WIN32(result);
113+
}
114+
115+
return Ok();
116+
}
117+
96118
LauncherResult<LauncherRegistryInfo::ProcessType> LauncherRegistryInfo::Check(
97119
const ProcessType aDesiredType) {
98120
LauncherResult<Disposition> disposition = Open();
@@ -235,6 +257,15 @@ LauncherRegistryInfo::IsEnabled() {
235257
return EnabledState::FailDisabled;
236258
}
237259

260+
LauncherResult<bool> LauncherRegistryInfo::IsTelemetryEnabled() {
261+
LauncherResult<Disposition> disposition = Open();
262+
if (disposition.isErr()) {
263+
return LAUNCHER_ERROR_FROM_RESULT(disposition);
264+
}
265+
266+
return GetTelemetrySetting();
267+
}
268+
238269
LauncherResult<std::wstring> LauncherRegistryInfo::ResolveValueName(
239270
LauncherRegistryInfo::ProcessType aProcessType) {
240271
if (aProcessType == ProcessType::Launcher) {
@@ -267,6 +298,16 @@ std::wstring LauncherRegistryInfo::ResolveImageTimestampValueName() {
267298
return mImageValueName;
268299
}
269300

301+
std::wstring LauncherRegistryInfo::ResolveTelemetryValueName() {
302+
if (mTelemetryValueName.empty()) {
303+
mTelemetryValueName.assign(mBinPath);
304+
mTelemetryValueName.append(kTelemetrySuffix,
305+
ArrayLength(kTelemetrySuffix) - 1);
306+
}
307+
308+
return mTelemetryValueName;
309+
}
310+
270311
LauncherVoidResult LauncherRegistryInfo::WriteStartTimestamp(
271312
LauncherRegistryInfo::ProcessType aProcessType,
272313
const Maybe<uint64_t>& aValue) {
@@ -390,6 +431,31 @@ LauncherResult<DWORD> LauncherRegistryInfo::GetSavedImageTimestamp() {
390431
return value;
391432
}
392433

434+
LauncherResult<bool> LauncherRegistryInfo::GetTelemetrySetting() {
435+
std::wstring telemetryValueName = ResolveTelemetryValueName();
436+
437+
DWORD value;
438+
DWORD valueLen = sizeof(value);
439+
DWORD type;
440+
LSTATUS result = ::RegQueryValueExW(
441+
mRegKey.get(), telemetryValueName.c_str(), nullptr, &type,
442+
reinterpret_cast<PBYTE>(&value), &valueLen);
443+
if (result == ERROR_FILE_NOT_FOUND) {
444+
// Value does not exist, treat as false
445+
return false;
446+
}
447+
448+
if (result != ERROR_SUCCESS) {
449+
return LAUNCHER_ERROR_FROM_WIN32(result);
450+
}
451+
452+
if (type != REG_DWORD) {
453+
return LAUNCHER_ERROR_FROM_WIN32(ERROR_DATATYPE_MISMATCH);
454+
}
455+
456+
return value != 0;
457+
}
458+
393459
LauncherResult<uint64_t> LauncherRegistryInfo::GetStartTimestamp(
394460
LauncherRegistryInfo::ProcessType aProcessType) {
395461
LauncherResult<std::wstring> name = ResolveValueName(aProcessType);

toolkit/xre/LauncherRegistryInfo.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class LauncherRegistryInfo final {
3636

3737
LauncherVoidResult ReflectPrefToRegistry(const bool aEnable);
3838
LauncherResult<EnabledState> IsEnabled();
39+
LauncherResult<bool> IsTelemetryEnabled();
40+
LauncherVoidResult ReflectTelemetryPrefToRegistry(const bool aEnable);
3941
LauncherResult<ProcessType> Check(const ProcessType aDesiredType);
4042
LauncherVoidResult DisableDueToFailure();
4143

@@ -52,21 +54,25 @@ class LauncherRegistryInfo final {
5254
LauncherVoidResult ClearStartTimestamps();
5355
LauncherResult<DWORD> GetSavedImageTimestamp();
5456
LauncherResult<uint64_t> GetStartTimestamp(ProcessType aProcessType);
57+
LauncherResult<bool> GetTelemetrySetting();
5558

5659
LauncherResult<std::wstring> ResolveValueName(ProcessType aProcessType);
5760
std::wstring ResolveImageTimestampValueName();
61+
std::wstring ResolveTelemetryValueName();
5862

5963
private:
6064
nsAutoRegKey mRegKey;
6165
std::wstring mBinPath;
6266
std::wstring mImageValueName;
6367
std::wstring mBrowserValueName;
6468
std::wstring mLauncherValueName;
69+
std::wstring mTelemetryValueName;
6570

6671
static const wchar_t kLauncherSubKeyPath[];
6772
static const wchar_t kLauncherSuffix[];
6873
static const wchar_t kBrowserSuffix[];
6974
static const wchar_t kImageTimestampSuffix[];
75+
static const wchar_t kTelemetrySuffix[];
7076
};
7177

7278
} // namespace mozilla

toolkit/xre/nsAppRunner.cpp

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ extern void InstallSignalHandlers(const char* ProgramName);
246246
#define FILE_INVALIDATE_CACHES NS_LITERAL_CSTRING(".purgecaches")
247247
#define FILE_STARTUP_INCOMPLETE NS_LITERAL_STRING(".startup-incomplete")
248248

249+
#if defined(MOZ_BLOCK_PROFILE_DOWNGRADE) || defined(MOZ_LAUNCHER_PROCESS)
250+
static const char kPrefHealthReportUploadEnabled[] =
251+
"datareporting.healthreport.uploadEnabled";
252+
#endif // defined(MOZ_BLOCK_PROFILE_DOWNGRADE) || defined(MOZ_LAUNCHER_PROCESS)
253+
249254
int gArgc;
250255
char** gArgv;
251256

@@ -1509,30 +1514,25 @@ static void RegisterApplicationRestartChanged(const char* aPref, void* aData) {
15091514

15101515
# if defined(MOZ_LAUNCHER_PROCESS)
15111516

1512-
static const char kShieldPrefName[] = "app.shield.optoutstudies.enabled";
1513-
15141517
static void OnLauncherPrefChanged(const char* aPref, void* aData) {
1515-
const bool kLauncherPrefDefaultValue =
1516-
# if defined(NIGHTLY_BUILD) || (MOZ_UPDATE_CHANNEL == beta)
1517-
true
1518-
# else
1519-
false
1520-
# endif // defined(NIGHTLY_BUILD) || (MOZ_UPDATE_CHANNEL == beta)
1521-
;
1522-
bool prefVal = Preferences::GetBool(kShieldPrefName, false) &&
1523-
Preferences::GetBool(PREF_WIN_LAUNCHER_PROCESS_ENABLED,
1524-
kLauncherPrefDefaultValue);
1518+
bool prefVal = Preferences::GetBool(PREF_WIN_LAUNCHER_PROCESS_ENABLED, true);
15251519

15261520
mozilla::LauncherRegistryInfo launcherRegInfo;
15271521
mozilla::LauncherVoidResult reflectResult =
15281522
launcherRegInfo.ReflectPrefToRegistry(prefVal);
15291523
MOZ_ASSERT(reflectResult.isOk());
15301524
}
15311525

1532-
static void SetupLauncherProcessPref() {
1533-
// In addition to the launcher pref itself, we also tie the launcher process
1534-
// state to the SHIELD opt-out pref.
1526+
static void OnLauncherTelemetryPrefChanged(const char* aPref, void* aData) {
1527+
bool prefVal = Preferences::GetBool(kPrefHealthReportUploadEnabled, true);
1528+
1529+
mozilla::LauncherRegistryInfo launcherRegInfo;
1530+
mozilla::LauncherVoidResult reflectResult =
1531+
launcherRegInfo.ReflectTelemetryPrefToRegistry(prefVal);
1532+
MOZ_ASSERT(reflectResult.isOk());
1533+
}
15351534

1535+
static void SetupLauncherProcessPref() {
15361536
if (gLauncherProcessState) {
15371537
// We've already successfully run
15381538
return;
@@ -1550,28 +1550,22 @@ static void SetupLauncherProcessPref() {
15501550
CrashReporter::Annotation::LauncherProcessState,
15511551
static_cast<uint32_t>(enabledState.unwrap()));
15521552

1553-
# if defined(NIGHTLY_BUILD) || (MOZ_UPDATE_CHANNEL == beta)
1554-
// Reflect the pref states into the registry by calling
1555-
// OnLauncherPrefChanged.
1556-
OnLauncherPrefChanged(PREF_WIN_LAUNCHER_PROCESS_ENABLED, nullptr);
1557-
1558-
// Now obtain the revised state of the launcher process for reflection
1559-
// into prefs
1560-
enabledState = launcherRegInfo.IsEnabled();
1561-
# endif // defined(NIGHTLY_BUILD) || (MOZ_UPDATE_CHANNEL == beta)
1562-
}
1563-
1564-
if (enabledState.isOk()) {
15651553
// Reflect the launcher process registry state into user prefs
15661554
Preferences::SetBool(
15671555
PREF_WIN_LAUNCHER_PROCESS_ENABLED,
15681556
enabledState.unwrap() !=
15691557
mozilla::LauncherRegistryInfo::EnabledState::ForceDisabled);
15701558
}
15711559

1572-
Preferences::RegisterCallback(&OnLauncherPrefChanged, kShieldPrefName);
1560+
mozilla::LauncherVoidResult reflectResult =
1561+
launcherRegInfo.ReflectTelemetryPrefToRegistry(
1562+
Preferences::GetBool(kPrefHealthReportUploadEnabled, true));
1563+
MOZ_ASSERT(reflectResult.isOk());
1564+
15731565
Preferences::RegisterCallback(&OnLauncherPrefChanged,
15741566
PREF_WIN_LAUNCHER_PROCESS_ENABLED);
1567+
Preferences::RegisterCallback(&OnLauncherTelemetryPrefChanged,
1568+
kPrefHealthReportUploadEnabled);
15751569
}
15761570

15771571
# endif // defined(MOZ_LAUNCHER_PROCESS)
@@ -2070,8 +2064,8 @@ static void SubmitDowngradeTelemetry(const nsCString& aLastVersion,
20702064
NS_ENSURE_TRUE_VOID(prefBranch);
20712065

20722066
bool enabled;
2073-
nsresult rv = prefBranch->GetBoolPref(
2074-
"datareporting.healthreport.uploadEnabled", &enabled);
2067+
nsresult rv = prefBranch->GetBoolPref(kPrefHealthReportUploadEnabled,
2068+
&enabled);
20752069
NS_ENSURE_SUCCESS_VOID(rv);
20762070
if (!enabled) {
20772071
return;

0 commit comments

Comments
 (0)