Modify default field trial implementation to allow
WebRTC client to turn on feature code.

R=andresp@webrtc.org, henrika@webrtc.org, mflodman@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/39729004

git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@8301 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/system_wrappers/BUILD.gn b/system_wrappers/BUILD.gn
index c4f1da5..23063f3 100644
--- a/system_wrappers/BUILD.gn
+++ b/system_wrappers/BUILD.gn
@@ -188,6 +188,7 @@
 
 source_set("field_trial_default") {
   sources = [
+    "interface/field_trial_default.h",
     "source/field_trial_default.cc",
   ]
 
diff --git a/system_wrappers/interface/field_trial_default.h b/system_wrappers/interface/field_trial_default.h
new file mode 100644
index 0000000..fafe550
--- /dev/null
+++ b/system_wrappers/interface/field_trial_default.h
@@ -0,0 +1,26 @@
+//
+// Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the LICENSE file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS.  All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+//
+
+#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FIELD_TRIAL_DEFAULT_H_
+#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FIELD_TRIAL_DEFAULT_H_
+
+namespace webrtc {
+namespace field_trial {
+
+// Optionally initialize field trial from a string.
+// This method can be called at most once before any other call into webrtc.
+// E.g. before the peer connection factory is constructed.
+// Note: trials_string must never be destroyed.
+void InitFieldTrialsFromString(const char* trials_string);
+
+}  // namespace field_trial
+}  // namespace webrtc
+
+#endif  // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_FIELD_TRIAL_DEFAULT_H_
diff --git a/system_wrappers/source/field_trial_default.cc b/system_wrappers/source/field_trial_default.cc
index 892623c..97b703f 100644
--- a/system_wrappers/source/field_trial_default.cc
+++ b/system_wrappers/source/field_trial_default.cc
@@ -8,15 +8,55 @@
 //
 
 #include "webrtc/system_wrappers/interface/field_trial.h"
+#include "webrtc/system_wrappers/interface/field_trial_default.h"
 
-// Clients of webrtc that do not want to configure field trials can link with
-// this instead of providing their own implementation.
+#include <string>
+
+// Simple field trial implementation, which allows client to
+// specify desired flags in InitFieldTrialsFromString.
 namespace webrtc {
 namespace field_trial {
 
+static const char *trials_init_string = NULL;
+
 std::string FindFullName(const std::string& name) {
+  if (trials_init_string == NULL)
+    return std::string();
+
+  std::string trials_string(trials_init_string);
+  if (trials_string.empty())
+    return std::string();
+
+  static const char kPersistentStringSeparator = '/';
+  size_t next_item = 0;
+  while (next_item < trials_string.length()) {
+
+    // Find next name/value pair in field trial configuration string.
+    size_t field_name_end = trials_string.find(
+        kPersistentStringSeparator, next_item);
+    if (field_name_end == trials_string.npos || field_name_end == next_item)
+      break;
+    size_t field_value_end = trials_string.find(
+        kPersistentStringSeparator, field_name_end + 1);
+    if (field_value_end == trials_string.npos ||
+        field_value_end == field_name_end + 1)
+      break;
+    std::string field_name(trials_string, next_item,
+        field_name_end - next_item);
+    std::string field_value(trials_string, field_name_end + 1,
+        field_value_end - field_name_end - 1);
+    next_item = field_value_end + 1;
+
+    if (name == field_name)
+      return field_value;
+  }
   return std::string();
 }
 
+// Optionally initialize field trial from a string.
+void InitFieldTrialsFromString(const char* trials_string) {
+  trials_init_string = trials_string;
+}
+
 }  // namespace field_trial
 }  // namespace webrtc
diff --git a/system_wrappers/system_wrappers.gyp b/system_wrappers/system_wrappers.gyp
index 50801de..683840f 100644
--- a/system_wrappers/system_wrappers.gyp
+++ b/system_wrappers/system_wrappers.gyp
@@ -205,6 +205,7 @@
       'target_name': 'field_trial_default',
       'type': 'static_library',
       'sources': [
+        'interface/field_trial_default.h',
         'source/field_trial_default.cc',
       ],
       'dependencies': [