browser/components/sessionstore/src/TabStateCache.jsm
author Tim Taubert <ttaubert@mozilla.com>
Mon, 20 Jan 2014 20:50:17 +0100
changeset 182127 0bc8711e7dd2b40002ffa82c97328536a81b4fe1
parent 182122 c99d792be115612fa33f955fb1ce6634fdf9c1b4
permissions -rw-r--r--
Bug 941540 - Use browser.permanentKey to handle docShell swaps more easily r=yoric

/* 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);
  }
};