["localStorage", "sessionStorage"].forEach(function(name) { [9, "x"].forEach(function(key) { test(function() { var desc = { value: "value", }; var storage = window[name]; storage.clear(); assert_equals(storage[key], undefined); assert_equals(storage.getItem(key), null); assert_equals(Object.defineProperty(storage, key, desc), storage); assert_equals(storage[key], "value"); assert_equals(storage.getItem(key), "value"); }, "Defining data property for key " + key + " on " + name); test(function() { var desc1 = { value: "value", }; var desc2 = { value: "new value", }; var storage = window[name]; storage.clear(); assert_equals(storage[key], undefined); assert_equals(storage.getItem(key), null); assert_equals(Object.defineProperty(storage, key, desc1), storage); assert_equals(storage[key], "value"); assert_equals(storage.getItem(key), "value"); assert_equals(Object.defineProperty(storage, key, desc2), storage); assert_equals(storage[key], "new value"); assert_equals(storage.getItem(key), "new value"); }, "Defining data property for key " + key + " on " + name + " twice"); test(function() { var desc = { value: { toString: function() { return "value"; } }, }; var storage = window[name]; storage.clear(); assert_equals(storage[key], undefined); assert_equals(storage.getItem(key), null); assert_equals(Object.defineProperty(storage, key, desc), storage); assert_equals(storage[key], "value"); assert_equals(storage.getItem(key), "value"); }, "Defining data property with toString for key " + key + " on " + name); }); });