• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2012 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.
4
5'use strict';
6
7/**
8 * @fileoverview Provides the Settings object.
9 */
10base.exportTo('base', function() {
11  var storage_ = localStorage;
12
13  /**
14   * Settings is a simple wrapper around local storage, to make it easier
15   * to test classes that have settings.
16   *
17   * May be called as new base.Settings() or simply base.Settings()
18   * @constructor
19   */
20  function Settings() {
21    return Settings;
22  };
23
24  /**
25   * Get the setting with the given name.
26   *
27   * @param {string} key The name of the setting.
28   * @param {string=} opt_default The default value to return if not set.
29   * @param {string=} opt_namespace If set, the setting name will be prefixed
30   * with this namespace, e.g. "categories.settingName". This is useful for
31   * a set of related settings.
32   */
33  Settings.get = function(key, opt_default, opt_namespace) {
34    key = Settings.namespace_(key, opt_namespace);
35    var rawVal = storage_.getItem(key);
36    if (rawVal === null || rawVal === undefined)
37      return opt_default;
38
39    // Old settings versions used to stringify objects instead of putting them
40    // into JSON. If those are encountered, parse will fail. In that case,
41    // "upgrade" the setting to the default value.
42    try {
43      return JSON.parse(rawVal).value;
44    } catch (e) {
45      storage_.removeItem(Settings.namespace_(key, opt_namespace));
46      return opt_default;
47    }
48  },
49
50  /**
51   * Set the setting with the given name to the given value.
52   *
53   * @param {string} key The name of the setting.
54   * @param {string} value The value of the setting.
55   * @param {string=} opt_namespace If set, the setting name will be prefixed
56   * with this namespace, e.g. "categories.settingName". This is useful for
57   * a set of related settings.
58   */
59  Settings.set = function(key, value, opt_namespace) {
60    if (value === undefined)
61      throw new Error('Settings.set: value must not be undefined');
62    var v = JSON.stringify({value: value});
63    storage_.setItem(Settings.namespace_(key, opt_namespace), v);
64  },
65
66  /**
67   * Return a list of all the keys, or all the keys in the given namespace
68   * if one is provided.
69   *
70   * @param {string=} opt_namespace If set, only return settings which
71   * begin with this prefix.
72   */
73  Settings.keys = function(opt_namespace) {
74    var result = [];
75    opt_namespace = opt_namespace || '';
76    for (var i = 0; i < storage_.length; i++) {
77      var key = storage_.key(i);
78      if (Settings.isnamespaced_(key, opt_namespace))
79        result.push(Settings.unnamespace_(key, opt_namespace));
80    }
81    return result;
82  },
83
84  Settings.isnamespaced_ = function(key, opt_namespace) {
85    return key.indexOf(Settings.normalize_(opt_namespace)) == 0;
86  },
87
88  Settings.namespace_ = function(key, opt_namespace) {
89    return Settings.normalize_(opt_namespace) + key;
90  },
91
92  Settings.unnamespace_ = function(key, opt_namespace) {
93    return key.replace(Settings.normalize_(opt_namespace), '');
94  },
95
96  /**
97   * All settings are prefixed with a global namespace to avoid collisions.
98   * Settings may also be namespaced with an additional prefix passed into
99   * the get, set, and keys methods in order to group related settings.
100   * This method makes sure the two namespaces are always set properly.
101   */
102  Settings.normalize_ = function(opt_namespace) {
103    return Settings.NAMESPACE + (opt_namespace ? opt_namespace + '.' : '');
104  }
105
106  Settings.setAlternativeStorageInstance = function(instance) {
107    storage_ = instance;
108  }
109  Settings.getAlternativeStorageInstance = function() {
110    if (storage_ === localStorage)
111      return undefined;
112    return storage_;
113  }
114
115  Settings.NAMESPACE = 'trace-viewer';
116
117  return {
118    Settings: Settings
119  };
120});
121