["localStorage", "sessionStorage"].forEach(function(name) { test(function() { var key = Symbol(); var storage = window[name]; storage.clear(); storage[key] = "test"; assert_equals(storage[key], "test"); }, name + ": plain set + get (loose)"); test(function() { "use strict"; var key = Symbol(); var storage = window[name]; storage.clear(); storage[key] = "test"; assert_equals(storage[key], "test"); }, name + ": plain set + get (strict)"); test(function() { var key = Symbol(); var storage = window[name]; storage.clear(); Object.defineProperty(storage, key, { "value": "test" }); assert_equals(storage[key], "test"); }, name + ": defineProperty + get"); test(function() { var key = Symbol(); var storage = window[name]; storage.clear(); Object.defineProperty(storage, key, { "value": "test", "configurable": false }); assert_equals(storage[key], "test"); var desc = Object.getOwnPropertyDescriptor(storage, key); assert_true(desc.configurable, "configurable"); assert_true(delete storage[key]); assert_equals(storage[key], undefined); }, name + ": defineProperty not configurable"); test(function() { var key = Symbol(); Storage.prototype[key] = "test"; this.add_cleanup(function() { delete Storage.prototype[key]; }); var storage = window[name]; storage.clear(); assert_equals(storage[key], "test"); var desc = Object.getOwnPropertyDescriptor(storage, key); assert_equals(desc, undefined); }, name + ": get with symbol on prototype"); test(function() { var key = Symbol(); var storage = window[name]; storage.clear(); storage[key] = "test"; assert_true(delete storage[key]); assert_equals(storage[key], undefined); }, name + ": delete existing property"); test(function() { var key = Symbol(); var storage = window[name]; storage.clear(); assert_true(delete storage[key]); assert_equals(storage[key], undefined); }, name + ": delete non-existent property"); });