browser/components/sessionstore/TabStateCache.jsm
author Birunthan Mohanathas <birunthan@mohanathas.com>
Sat, 26 Jul 2014 09:32:08 -0700
changeset 219147 e102b0c9d37e263ce220d22cabfd81199d82c375
parent 182127 browser/components/sessionstore/src/TabStateCache.jsm@0bc8711e7dd2b40002ffa82c97328536a81b4fe1
child 282463 732640286a2082c6ed685879ca9c1cda35c3d9ed
permissions -rw-r--r--
Bug 1038458 - Part 6: Flatten browser/components/sessionstore/src/ directory. r=mak

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

"use strict";

this.EXPORTED_SYMBOLS = ["TabStateCache"];

/**
 * A cache for tabs data.
 *
 * This cache implements a weak map from tabs (as XUL elements)
 * to tab data (as objects).
 *
 * Note that we should never cache private data, as:
 * - that data is used very seldom by SessionStore;
 * - caching private data in addition to public data is memory consuming.
 */
this.TabStateCache = Object.freeze({
  /**
   * Retrieves cached data for a given |browser|.
   *
   * @param browser (xul:browser)
   *        The browser to retrieve cached data for.
   * @return (object)
   *         The cached data stored for the given |browser|.
   */
  get: function (browser) {
    return TabStateCacheInternal.get(browser);
  },

  /**
   * Updates cached data for a given |browser|.
   *
   * @param browser (xul:browser)
   *        The browser belonging to the given tab data.
   * @param newData (object)
   *        The new data to be stored for the given |browser|.
   */
  update: function (browser, newData) {
    TabStateCacheInternal.update(browser, newData);
  }
});

let TabStateCacheInternal = {
  _data: new WeakMap(),

  /**
   * Retrieves cached data for a given |browser|.
   *
   * @param browser (xul:browser)
   *        The browser to retrieve cached data for.
   * @return (object)
   *         The cached data stored for the given |browser|.
   */
  get: function (browser) {
    return this._data.get(browser.permanentKey);
  },

  /**
   * Updates cached data for a given |browser|.
   *
   * @param browser (xul:browser)
   *        The browser belonging to the given tab data.
   * @param newData (object)
   *        The new data to be stored for the given |browser|.
   */
  update: function (browser, newData) {
    let data = this._data.get(browser.permanentKey) || {};

    for (let key of Object.keys(newData)) {
      let value = newData[key];
      if (value === null) {
        delete data[key];
      } else {
        data[key] = value;
      }
    }

    this._data.set(browser.permanentKey, data);
  }
};