// 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. 'use strict'; /** * @fileoverview Provides the Settings object. */ base.exportTo('base', function() { var storage_ = localStorage; /** * Settings is a simple wrapper around local storage, to make it easier * to test classes that have settings. * * May be called as new base.Settings() or simply base.Settings() * @constructor */ function Settings() { return Settings; }; /** * Get the setting with the given name. * * @param {string} key The name of the setting. * @param {string=} opt_default The default value to return if not set. * @param {string=} opt_namespace If set, the setting name will be prefixed * with this namespace, e.g. "categories.settingName". This is useful for * a set of related settings. */ Settings.get = function(key, opt_default, opt_namespace) { key = Settings.namespace_(key, opt_namespace); var rawVal = storage_.getItem(key); if (rawVal === null || rawVal === undefined) return opt_default; // Old settings versions used to stringify objects instead of putting them // into JSON. If those are encountered, parse will fail. In that case, // "upgrade" the setting to the default value. try { return JSON.parse(rawVal).value; } catch (e) { storage_.removeItem(Settings.namespace_(key, opt_namespace)); return opt_default; } }, /** * Set the setting with the given name to the given value. * * @param {string} key The name of the setting. * @param {string} value The value of the setting. * @param {string=} opt_namespace If set, the setting name will be prefixed * with this namespace, e.g. "categories.settingName". This is useful for * a set of related settings. */ Settings.set = function(key, value, opt_namespace) { if (value === undefined) throw new Error('Settings.set: value must not be undefined'); var v = JSON.stringify({value: value}); storage_.setItem(Settings.namespace_(key, opt_namespace), v); }, /** * Return a list of all the keys, or all the keys in the given namespace * if one is provided. * * @param {string=} opt_namespace If set, only return settings which * begin with this prefix. */ Settings.keys = function(opt_namespace) { var result = []; opt_namespace = opt_namespace || ''; for (var i = 0; i < storage_.length; i++) { var key = storage_.key(i); if (Settings.isnamespaced_(key, opt_namespace)) result.push(Settings.unnamespace_(key, opt_namespace)); } return result; }, Settings.isnamespaced_ = function(key, opt_namespace) { return key.indexOf(Settings.normalize_(opt_namespace)) == 0; }, Settings.namespace_ = function(key, opt_namespace) { return Settings.normalize_(opt_namespace) + key; }, Settings.unnamespace_ = function(key, opt_namespace) { return key.replace(Settings.normalize_(opt_namespace), ''); }, /** * All settings are prefixed with a global namespace to avoid collisions. * Settings may also be namespaced with an additional prefix passed into * the get, set, and keys methods in order to group related settings. * This method makes sure the two namespaces are always set properly. */ Settings.normalize_ = function(opt_namespace) { return Settings.NAMESPACE + (opt_namespace ? opt_namespace + '.' : ''); } Settings.setAlternativeStorageInstance = function(instance) { storage_ = instance; } Settings.getAlternativeStorageInstance = function() { if (storage_ === localStorage) return undefined; return storage_; } Settings.NAMESPACE = 'trace-viewer'; return { Settings: Settings }; });