// Copyright (c) 2012 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 handling saving and restoring of per-host options. */ 'use strict'; /** @suppress {duplicate} */ var remoting = remoting || {}; /** @type {Object} */ remoting.HostSettings = {}; /** * Load the settings for the specified host. Settings are returned as a * dictionary of (name, value) pairs. * * @param {string} hostId The host identifer for which to load options. * @param {function(Object):void} callback Callback to which the * current settings for the host are passed. If there are no settings, * then an empty dictionary is passed. * @return {void} Nothing. */ remoting.HostSettings.load = function(hostId, callback) { /** * @param {Object} requestedHost * @param {Object} allHosts * @return {void} Nothing. */ var onDone = function(requestedHost, allHosts) { callback(requestedHost); }; remoting.HostSettings.loadInternal_(hostId, onDone); }; /** * Save the settings for the specified hosts. Existing settings with the same * names will be overwritten; settings not currently saved will be created. * * @param {string} hostId The host identifer for which to save options. * @param {Object} options The options to save, expressed as a dictionary of * (name, value) pairs. * @param {function():void=} opt_callback Optional completion callback. * @return {void} Nothing. */ remoting.HostSettings.save = function(hostId, options, opt_callback) { /** * @param {Object} requestedHost * @param {Object} allHosts * @return {void} Nothing. */ var onDone = function(requestedHost, allHosts) { for (var option in options) { requestedHost[option] = options[option]; } allHosts[hostId] = requestedHost; var newSettings = {}; newSettings[remoting.HostSettings.KEY_] = JSON.stringify(allHosts); chrome.storage.local.set(newSettings, opt_callback); }; remoting.HostSettings.loadInternal_(hostId, onDone); }; /** * Helper function for both load and save. * * @param {string} hostId The host identifer for which to load options. * @param {function(Object, Object):void} callback Callback to which the * current settings for the specified host and for all hosts are passed. * @return {void} Nothing. */ remoting.HostSettings.loadInternal_ = function(hostId, callback) { /** * @param {Object.<string>} allHosts The current options for all hosts. * @return {void} Nothing. */ var onDone = function(allHosts) { var result = {}; try { result = jsonParseSafe(allHosts[remoting.HostSettings.KEY_]); if (typeof(result) != 'object') { console.error("Error loading host settings: Not an object"); result = {}; } else if (/** @type {Object} */ (result).hasOwnProperty(hostId) && typeof(result[hostId]) == 'object') { callback(result[hostId], result); return; } } catch (err) { var typedErr = /** @type {*} */ (err); console.error('Error loading host settings:', typedErr); } callback({}, /** @type {Object} */ (result)); }; chrome.storage.local.get(remoting.HostSettings.KEY_, onDone); }; /** @type {string} @private */ remoting.HostSettings.KEY_ = 'remoting-host-options';