OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/installer/util/experiment_storage.h" | 5 #include "chrome/installer/util/experiment_storage.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 | 8 |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
150 | 150 |
151 } // namespace | 151 } // namespace |
152 | 152 |
153 // ExperimentStorage::Lock ----------------------------------------------------- | 153 // ExperimentStorage::Lock ----------------------------------------------------- |
154 | 154 |
155 ExperimentStorage::Lock::~Lock() { | 155 ExperimentStorage::Lock::~Lock() { |
156 BOOL result = ::ReleaseMutex(storage_->mutex_.Get()); | 156 BOOL result = ::ReleaseMutex(storage_->mutex_.Get()); |
157 DCHECK(result); | 157 DCHECK(result); |
158 } | 158 } |
159 | 159 |
160 bool ExperimentStorage::Lock::ReadParticipation(Participation* participation) { | 160 bool ExperimentStorage::Lock::ReadParticipation(Study* participation) { |
161 base::win::RegKey key; | 161 base::win::RegKey key; |
162 // A failure to open the key likely indicates that this isn't running from a | 162 // A failure to open the key likely indicates that this isn't running from a |
163 // real install of Chrome. | 163 // real install of Chrome. |
164 if (!OpenParticipationKey(false /* !write_access */, &key)) | 164 if (!OpenParticipationKey(false /* !write_access */, &key)) |
165 return false; | 165 return false; |
166 | 166 |
167 DWORD value = 0; | 167 DWORD value = 0; |
168 LONG result = key.ReadValueDW(kRegValueRetentionStudy, &value); | 168 LONG result = key.ReadValueDW(kRegValueRetentionStudy, &value); |
169 if (result != ERROR_SUCCESS) { | 169 // An error most likely means that the value is not present. |
170 // This likely means that the value is not present. | 170 if (result != ERROR_SUCCESS || value == 0) |
171 *participation = Participation::kNotEvaluated; | 171 *participation = kNoStudySelected; |
172 } else if (value == 0) { | 172 else if (value == 1) |
173 *participation = Participation::kNotParticipating; | 173 *participation = kStudyOne; |
174 } else { | 174 else |
175 *participation = Participation::kIsParticipating; | 175 *participation = kStudyTwo; |
176 } | |
177 return true; | 176 return true; |
178 } | 177 } |
179 | 178 |
180 bool ExperimentStorage::Lock::WriteParticipation(Participation participation) { | 179 bool ExperimentStorage::Lock::WriteParticipation(Study participation) { |
| 180 DCHECK(participation == kNoStudySelected || participation == kStudyOne || |
| 181 participation == kStudyTwo); |
181 base::win::RegKey key; | 182 base::win::RegKey key; |
182 // A failure to open the key likely indicates that this isn't running from a | 183 // A failure to open the key likely indicates that this isn't running from a |
183 // real install of Chrome. | 184 // real install of Chrome. |
184 if (!OpenParticipationKey(true /* write_access */, &key)) | 185 if (!OpenParticipationKey(true /* write_access */, &key)) |
185 return false; | 186 return false; |
186 | 187 |
187 if (participation == Participation::kNotEvaluated) | 188 if (participation == kNoStudySelected) |
188 return key.DeleteValue(kRegValueRetentionStudy) == ERROR_SUCCESS; | 189 return key.DeleteValue(kRegValueRetentionStudy) == ERROR_SUCCESS; |
189 const DWORD value = participation == Participation::kIsParticipating ? 1 : 0; | 190 return key.WriteValue(kRegValueRetentionStudy, participation) == |
190 return key.WriteValue(kRegValueRetentionStudy, value) == ERROR_SUCCESS; | 191 ERROR_SUCCESS; |
191 } | 192 } |
192 | 193 |
193 bool ExperimentStorage::Lock::LoadExperiment(Experiment* experiment) { | 194 bool ExperimentStorage::Lock::LoadExperiment(Experiment* experiment) { |
194 // This function loads both the experiment metrics and state from the | 195 // This function loads both the experiment metrics and state from the |
195 // registry. | 196 // registry. |
196 // - If no metrics are found: |experiment| is cleared, and true is returned. | 197 // - If no metrics are found: |experiment| is cleared, and true is returned. |
197 // (Per-user experiment data in the registry is ignored for all users.) | 198 // (Per-user experiment data in the registry is ignored for all users.) |
198 // - If metrics indicate an initial state (prior to a user being elected into | 199 // - If metrics indicate an initial state (prior to a user being elected into |
199 // an experiment group): |experiment| is populated with the metrics and true | 200 // an experiment group): |experiment| is populated with the metrics and true |
200 // is returned. (Per-user experiment data in the registry is ignored for all | 201 // is returned. (Per-user experiment data in the registry is ignored for all |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 WriteTime(&key, kRegValueLatestDisplayTime, | 471 WriteTime(&key, kRegValueLatestDisplayTime, |
471 experiment.latest_display_time().ToInternalValue()); | 472 experiment.latest_display_time().ToInternalValue()); |
472 WriteTime(&key, kRegValueUserSessionUptime, | 473 WriteTime(&key, kRegValueUserSessionUptime, |
473 experiment.user_session_uptime().ToInternalValue()); | 474 experiment.user_session_uptime().ToInternalValue()); |
474 WriteTime(&key, kRegValueActionDelay, | 475 WriteTime(&key, kRegValueActionDelay, |
475 experiment.action_delay().ToInternalValue()); | 476 experiment.action_delay().ToInternalValue()); |
476 return true; | 477 return true; |
477 } | 478 } |
478 | 479 |
479 } // namespace installer | 480 } // namespace installer |
OLD | NEW |