Index: base/metrics/field_trial.cc |
diff --git a/base/metrics/field_trial.cc b/base/metrics/field_trial.cc |
index 4d4fdcebde56b38bec2acb8a44679c61d3bd65aa..b5dea9b3628c3f9a5fc347949651387e089684ac 100644 |
--- a/base/metrics/field_trial.cc |
+++ b/base/metrics/field_trial.cc |
@@ -10,6 +10,7 @@ |
#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/rand_util.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -123,8 +124,14 @@ void CheckTrialGroup(const std::string& trial_name, |
base::LazyInstance<std::map<std::string, std::string>>::Leaky g_seen_states = |
LAZY_INSTANCE_INITIALIZER; |
+// A debug token generated during FieldTrialList construction. Used to diagnose |
+// crbug.com/359406. |
+// TODO(asvitkine): Remove when crbug.com/359406 is resolved. |
+int32_t g_debug_token = -1; |
+ |
// Tracks whether |g_seen_states| is used. Defaults to false, because unit tests |
-// will create multiple FieldTrialList instances. |
+// will create multiple FieldTrialList instances. Also controls whether |
+// |g_debug_token| is included in the field trial state string. |
bool g_use_global_check_states = false; |
} // namespace |
@@ -262,6 +269,9 @@ FieldTrial::FieldTrial(const std::string& trial_name, |
DCHECK_GT(total_probability, 0); |
DCHECK(!trial_name_.empty()); |
DCHECK(!default_group_name_.empty()); |
+ |
+ if (g_debug_token == -1) |
+ g_debug_token = RandInt(1, INT32_MAX); |
} |
FieldTrial::~FieldTrial() {} |
@@ -356,6 +366,11 @@ void FieldTrialList::EnableGlobalStateChecks() { |
} |
// static |
+int32_t FieldTrialList::GetDebugToken() { |
+ return g_debug_token; |
+} |
+ |
+// static |
FieldTrial* FieldTrialList::FactoryGetFieldTrial( |
const std::string& trial_name, |
FieldTrial::Probability total_probability, |
@@ -484,6 +499,12 @@ void FieldTrialList::StatesToString(std::string* output) { |
output->append(it->group_name); |
output->append(1, kPersistentStringSeparator); |
} |
+ if (g_use_global_check_states) { |
+ output->append("DebugToken"); |
+ output->append(1, kPersistentStringSeparator); |
+ output->append(IntToString(g_debug_token)); |
+ output->append(1, kPersistentStringSeparator); |
+ } |
} |
// static |