Roll src/third_party/WebKit d9c6159:8139f33 (svn 201974:201975)
[chromium-blink-merge.git] / remoting / webapp / base / js / experiments.js
blobab6edc111b579e0e77c05c2946621b3c56d01303
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 /**
6 * @fileoverview
7 * Class for enabling experimental features.
8 */
10 'use strict';
12 /** @suppress {duplicate} */
13 var remoting = remoting || {};
15 (function() {
17 var kExperimentsStorageName = 'remoting-experiments';
18 var ACTIVE_FIELD_TRIALS = {'ChromotingQUIC': 'quic', 'ChromotingVP9': 'vp9'};
20 /**
21 * @param {Array.<string>} list
23 function save(list) {
24 var storageMap = {};
25 storageMap[kExperimentsStorageName] = list;
26 chrome.storage.local.set(storageMap);
29 /** @type {Object} */
30 remoting.experiments = {};
32 /**
33 * Enables an experiment.
35 * @param {string} experiment to enable.
37 remoting.experiments.enable = function(experiment) {
38 remoting.experiments.get().then(function(/** Array.<string> */list) {
39 if (list.indexOf(experiment) == -1) {
40 list.push(experiment);
41 save(list);
43 });
46 /**
47 * Disables an experiment.
49 * @param {string} experiment to disable.
51 remoting.experiments.disable = function(experiment) {
52 remoting.experiments.get().then(function(/** Array.<string> */list) {
53 list = list.filter(function(e) { return e !== experiment; });
54 save(list);
55 });
58 /**
59 * Determines if the field-trial is enabled for this session.
61 * @param {string} trialName The FieldTrial to check for enabling.
62 * @return {Promise}
64 function getTrialState(trialName) {
65 var deferred = new base.Deferred();
66 chrome.metricsPrivate.getFieldTrial(trialName,
67 function(/** string */ group) {
68 if (group == 'Enabled') {
69 deferred.resolve(true);
70 } else {
71 deferred.resolve(false);
73 });
74 return deferred.promise();
77 /**
78 * Returns list of all enabled experiments.
79 * @return {Promise}
81 remoting.experiments.get = function() {
83 var localStorageList = new Promise(function(resolve, reject) {
84 chrome.storage.local.get(kExperimentsStorageName, function(items) {
85 /** @type {Array<string>} */
86 var experiments = new Array();
87 if (items.hasOwnProperty(kExperimentsStorageName)) {
88 experiments = /** @type {Array<string>} */
89 (items[kExperimentsStorageName]);
91 resolve(experiments);
92 });
93 });
95 var trialNames = Object.keys(ACTIVE_FIELD_TRIALS);
97 return Promise.all([localStorageList].concat(
98 trialNames.map(function(/** string */ trialName) {
99 return getTrialState(trialName);
100 })))
101 .then(function(results) {
102 /** @type {Array<string>} */
103 var list = results[0];
104 for (var i = 0; i < trialNames.length; ++i) {
105 if (results[i + 1]) {
106 list.push(ACTIVE_FIELD_TRIALS[trialNames[i]]);
109 return list;
113 })();