blob: b60321af2d37a07b27e5897cf05592503aa46aad [file] [log] [blame] [edit]
// Copyright 2011 WebDriver committers
// Copyright 2011 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/**
* @fileoverview Atoms for accessing HTML5 web storage maps (localStorage,
* sessionStorage). These storage objects store each item as a key-value
* mapping pair.
*
*/
goog.provide('bot.storage');
goog.provide('bot.storage.Storage');
goog.require('bot');
goog.require('bot.Error');
goog.require('bot.ErrorCode');
goog.require('bot.html5');
/**
* A factory method to create a wrapper to access the HTML5 localStorage
* object.
* Note: We are not using Closure from goog.storage,
* Closure uses "window" object directly, which may not always be
* defined (for example in firefox extensions).
* We use bot.window() from bot.js instead to keep track of the window or frame
* is currently being used for command execution. The implementation is
* otherwise similar to the implementation in the Closure library
* (goog.storage.mechansim.HTML5LocalStorage).
*
* @param {Window=} opt_window The window whose storage to access;
* defaults to the main window.
* @return {!bot.storage.Storage} The wrapper Storage object.
*/
bot.storage.getLocalStorage = function(opt_window) {
var win = opt_window || bot.getWindow();
if (!bot.html5.isSupported(bot.html5.API.LOCAL_STORAGE, win)) {
throw new bot.Error(bot.ErrorCode.UNKNOWN_ERROR, 'Local storage undefined');
}
var storageMap = win.localStorage;
return new bot.storage.Storage(storageMap);
};
/**
* A factory method to create a wrapper to access the HTML5 sessionStorage
* object.
*
* @param {Window=} opt_window The window whose storage to access;
* defaults to the main window.
* @return {!bot.storage.Storage} The wrapper Storage object.
*/
bot.storage.getSessionStorage = function(opt_window) {
var win = opt_window || bot.getWindow();
if (bot.html5.isSupported(bot.html5.API.SESSION_STORAGE, win)) {
var storageMap = win.sessionStorage;
return new bot.storage.Storage(storageMap);
}
throw new bot.Error(bot.ErrorCode.UNKNOWN_ERROR,
'Session storage undefined');
};
/**
* Provides a wrapper object to the HTML5 web storage object.
* @constructor
*
* @param {Storage} storageMap HTML5 storage object e.g. localStorage,
* sessionStorage.
*/
bot.storage.Storage = function(storageMap) {
/**
* Member variable to access the assigned HTML5 storage object.
* @type {Storage}
* @private
*/
this.storageMap_ = storageMap;
};
/**
* Sets the value item of a key/value pair in the Storage object.
* If the value given is null, the string 'null' will be inserted
* instead.
*
* @param {string} key The key of the item.
* @param {*} value The value of the item.
*/
bot.storage.Storage.prototype.setItem = function(key, value) {
try {
// Note: Ideally, browsers should set a null value. But the browsers
// report arbitrarily. Firefox returns <null>, while Chrome reports
// the string "null". We are setting the value to the string "null".
this.storageMap_.setItem(key, value + '');
} catch (e) {
throw new bot.Error(bot.ErrorCode.UNKNOWN_ERROR, e.message);
}
};
/**
* Returns the value item of a key in the Storage object.
*
* @param {string} key The key of the returned value.
* @return {?string} The mapped value if present in the storage object,
* otherwise null. If a null value was inserted for a given
* key, then the string 'null' is returned.
*/
bot.storage.Storage.prototype.getItem = function(key) {
var value = this.storageMap_.getItem(key);
return /** @type {?string} */ value;
};
/**
* Returns an array of keys of all keys of the Storage object.
*
* @return {Array.<string>} The array of stored keys..
*/
bot.storage.Storage.prototype.keySet = function() {
var keys = [];
var length = this.size();
for (var i = 0; i < length; i++) {
keys[i] = this.storageMap_.key(i);
}
return keys;
};
/**
* Removes an item with a given key.
*
* @param {string} key The key item of the key/value pair.
* @return {?string} The removed value if present, otherwise null.
*/
bot.storage.Storage.prototype.removeItem = function(key) {
var value = this.getItem(key);
this.storageMap_.removeItem(key);
return value;
};
/**
* Removes all items.
*/
bot.storage.Storage.prototype.clear = function() {
this.storageMap_.clear();
};
/**
* Returns the number of items in the Storage object.
*
* @return {number} The number of the key/value pairs.
*/
bot.storage.Storage.prototype.size = function() {
return this.storageMap_.length;
};
/**
* Returns the key item of the key/value pairs in the Storage object
* of a given index.
*
* @param {number} index The index of the key/value pair list.
* @return {?string} The key item of a given index.
*/
bot.storage.Storage.prototype.key = function(index) {
return this.storageMap_.key(index);
};
/**
* Returns HTML5 storage object of the wrapper Storage object
*
* @return {Storage} The storageMap attribute.
*/
bot.storage.Storage.prototype.getStorageMap = function() {
return this.storageMap_;
};