[9, "x"].forEach(function(key) { test(function() { var element = document.createElement("div"); var dataset = element.dataset; var value = "value for " + this.name; assert_equals(dataset[key], undefined); element.setAttribute("data-" + key, value); assert_equals(element.getAttribute("data-" + key), value); assert_equals(dataset[key], value); var propdesc = Object.getOwnPropertyDescriptor(dataset, key); assert_not_equals(propdesc, undefined); assert_equals(propdesc.value, value); assert_true(propdesc.writable); assert_true(propdesc.enumerable); assert_true(propdesc.configurable); }, "Getting property descriptor for key " + key); test(function() { var element = document.createElement("div"); var dataset = element.dataset; var proto = "proto getter for " + this.name; var calledSetter = []; Object.defineProperty(DOMStringMap.prototype, key, { "get": function() { return proto; }, "set": this.unreached_func("Should not call [[Set]] on prototype"), "configurable": true, }); this.add_cleanup(function() { delete DOMStringMap.prototype[key]; }); var value = "value for " + this.name; assert_equals(dataset[key], proto); assert_equals(element.getAttribute("data-" + key), null); assert_equals(dataset[key] = value, value); assert_equals(dataset[key], value); assert_equals(element.getAttribute("data-" + key), value); }, "Setting property for key " + key + " with accessor property on prototype"); });