113f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org// Copyright 2014 The Chromium Authors. All rights reserved. 213f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org// Use of this source code is governed by a BSD-style license that can be 313f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org// found in the LICENSE file. 413f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org 513f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.orgcr.define('options', function() { 613f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org /** 713f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * SupervisedUserListData class. 813f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * Handles requests for retrieving a list of existing supervised users which 913f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * are supervised by the current profile. For each request a promise is 1013f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * returned, which is cached in order to reuse the retrieved supervised users 1113f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * for future requests. The first request will be handled asynchronously. 1213f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * @constructor 1313f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * @class 1413f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org */ 1513f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org function SupervisedUserListData() { 1613f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org this.observers_ = []; 1713f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org }; 1813f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org 1913f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org cr.addSingletonGetter(SupervisedUserListData); 2013f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org 2113f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org /** 2213f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * Receives a list of supervised users and resolves the promise. 2313f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * @param {Array.<Object>} supervisedUsers Array of supervised user objects. 2413f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * Each object is of the form: 2513f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * supervisedUser = { 2613f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * id: "Supervised User ID", 2713f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * name: "Supervised User Name", 2813f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * iconURL: "chrome://path/to/icon/image", 2913f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * onCurrentDevice: true or false, 3013f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * needAvatar: true or false 3113f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * } 3213f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * @private 3313f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org */ 3413f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org SupervisedUserListData.prototype.receiveExistingSupervisedUsers_ = 3513f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org function(supervisedUsers) { 3613f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org if (!this.promise_) { 3713f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org this.onDataChanged_(supervisedUsers); 3813f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org return; 3913f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org } 4013f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org this.resolve_(supervisedUsers); 4113f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org }; 4213f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org 4313f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org /** 4413f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * Called when there is a signin error when retrieving the list of supervised 4513f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * users. Rejects the promise and resets the cached promise to null. 4613f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org * @private 4713f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org */ 48 SupervisedUserListData.prototype.onSigninError_ = function() { 49 if (!this.promise_) { 50 return; 51 } 52 this.reject_(); 53 this.resetPromise_(); 54 }; 55 56 /** 57 * Handles the request for the list of existing supervised users by returning 58 * a promise for the requested data. If there is no cached promise yet, a new 59 * one will be created. 60 * @return {Promise} The promise containing the list of supervised users. 61 * @private 62 */ 63 SupervisedUserListData.prototype.requestExistingSupervisedUsers_ = 64 function() { 65 if (this.promise_) 66 return this.promise_; 67 this.promise_ = this.createPromise_(); 68 chrome.send('requestSupervisedUserImportUpdate'); 69 return this.promise_; 70 }; 71 72 /** 73 * Creates the promise containing the list of supervised users. The promise is 74 * resolved in receiveExistingSupervisedUsers_() or rejected in 75 * onSigninError_(). The promise is cached, so that for future requests it can 76 * be resolved immediately. 77 * @return {Promise} The promise containing the list of supervised users. 78 * @private 79 */ 80 SupervisedUserListData.prototype.createPromise_ = function() { 81 var self = this; 82 return new Promise(function(resolve, reject) { 83 self.resolve_ = resolve; 84 self.reject_ = reject; 85 }); 86 }; 87 88 /** 89 * Resets the promise to null in order to avoid stale data. For the next 90 * request, a new promise will be created. 91 * @private 92 */ 93 SupervisedUserListData.prototype.resetPromise_ = function() { 94 this.promise_ = null; 95 }; 96 97 /** 98 * Initializes |promise| with the new data and also passes the new data to 99 * observers. 100 * @param {Array.<Object>} supervisedUsers Array of supervised user objects. 101 * For the format of the objects, see receiveExistingSupervisedUsers_(). 102 * @private 103 */ 104 SupervisedUserListData.prototype.onDataChanged_ = function(supervisedUsers) { 105 this.promise_ = this.createPromise_(); 106 this.resolve_(supervisedUsers); 107 for (var i = 0; i < this.observers_.length; ++i) 108 this.observers_[i].receiveExistingSupervisedUsers_(supervisedUsers); 109 }; 110 111 /** 112 * Adds an observer to the list of observers. 113 * @param {Object} observer The observer to be added. 114 * @private 115 */ 116 SupervisedUserListData.prototype.addObserver_ = function(observer) { 117 for (var i = 0; i < this.observers_.length; ++i) 118 assert(this.observers_[i] != observer); 119 this.observers_.push(observer); 120 }; 121 122 /** 123 * Removes an observer from the list of observers. 124 * @param {Object} observer The observer to be removed. 125 * @private 126 */ 127 SupervisedUserListData.prototype.removeObserver_ = function(observer) { 128 for (var i = 0; i < this.observers_.length; ++i) { 129 if (this.observers_[i] == observer) { 130 this.observers_.splice(i, 1); 131 return; 132 } 133 } 134 }; 135 136 // Forward public APIs to private implementations. 137 cr.makePublic(SupervisedUserListData, [ 138 'addObserver', 139 'onSigninError', 140 'receiveExistingSupervisedUsers', 141 'removeObserver', 142 'requestExistingSupervisedUsers', 143 'resetPromise', 144 ]); 145 146 // Export 147 return { 148 SupervisedUserListData: SupervisedUserListData, 149 }; 150}); 151