blob: f3659fc6df95526426333a594ed6edf69fed6486 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview
* Class for enabling experimental features.
*/
'use strict';
/** @suppress {duplicate} */
var remoting = remoting || {};
(function() {
var kExperimentsStorageName = 'remoting-experiments';
var ACTIVE_FIELD_TRIALS = {'ChromotingVP9': 'vp9'};
/**
* @param {Array.<string>} list
*/
function save(list) {
var storageMap = {};
storageMap[kExperimentsStorageName] = list;
chrome.storage.local.set(storageMap);
};
/** @type {Object} */
remoting.experiments = {};
/**
* Enables an experiment.
*
* @param {string} experiment to enable.
*/
remoting.experiments.enable = function(experiment) {
remoting.experiments.get().then(function(/** Array.<string> */list) {
if (list.indexOf(experiment) == -1) {
list.push(experiment);
save(list);
}
});
};
/**
* Disables an experiment.
*
* @param {string} experiment to disable.
*/
remoting.experiments.disable = function(experiment) {
remoting.experiments.get().then(function(/** Array.<string> */list) {
list = list.filter(function(e) { return e !== experiment; });
save(list);
});
};
/**
* Determines if the field-trial is enabled for this session.
*
* @param {string} trialName The FieldTrial to check for enabling.
* @return {Promise}
*/
function getTrialState(trialName) {
var deferred = new base.Deferred();
chrome.metricsPrivate.getFieldTrial(trialName,
function(/** string */ group) {
if (group == 'Enabled') {
deferred.resolve(true);
} else {
deferred.resolve(false);
}
});
return deferred.promise();
};
/**
* Returns list of all enabled experiments.
* @return {Promise}
*/
remoting.experiments.get = function() {
var localStorageList = new Promise(function(resolve, reject) {
chrome.storage.local.get(kExperimentsStorageName, function(items) {
/** @type {Array<string>} */
var experiments = new Array();
if (items.hasOwnProperty(kExperimentsStorageName)) {
experiments = /** @type {Array<string>} */
(items[kExperimentsStorageName]);
}
resolve(experiments);
});
});
var trialNames = Object.keys(ACTIVE_FIELD_TRIALS);
return Promise.all([localStorageList].concat(
trialNames.map(function(/** string */ trialName) {
return getTrialState(trialName);
})))
.then(function(results) {
/** @type {Array<string>} */
var list = results[0];
for (var i = 0; i < trialNames.length; ++i) {
if (results[i + 1]) {
list.push(ACTIVE_FIELD_TRIALS[trialNames[i]]);
}
}
return list;
});
};
})();