put-forwards.html (4723B)
1 <!doctype html> 2 <meta charset="utf-8"> 3 <title>[PutForwards] behavior</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <link rel="author" title="Jens Widell" href="mailto:jl@opera.com"> 7 <link rel="help" href="https://webidl.spec.whatwg.org/#PutForwards"> 8 9 <script> 10 test(() => { 11 var getter_called = false; 12 var element = document.createElement("div"); 13 var element_style = element.style; 14 var descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "style"); 15 16 Object.defineProperty(element, "style", { 17 get: function () { 18 getter_called = true; 19 return element_style; 20 }, 21 set: descriptor.set 22 }); 23 24 element.style = "color: green"; 25 26 assert_true(getter_called, "Overridden getter should be called"); 27 assert_equals(element_style.color, "green", "Put forwarding still works"); 28 }, "Overriding getter of [PutForwards] attribute"); 29 30 test(() => { 31 var setter_called = false; 32 var element = document.createElement("div"); 33 var element_style = element.style; 34 var descriptor = Object.getOwnPropertyDescriptor(CSSStyleDeclaration.prototype, "cssText"); 35 36 Object.defineProperty(element_style, "cssText", { 37 get: descriptor.get, 38 set: function (v) { 39 setter_called = true; 40 descriptor.set.call(this, v); 41 } 42 }); 43 44 element.style = "color: green"; 45 46 assert_true(setter_called, "Overridden setter should be called"); 47 assert_equals(element_style.color, "green", "Put forwarding still works"); 48 }, "Overriding setter of [PutForwards] target attribute"); 49 50 test(() => { 51 var element = document.createElement("div"); 52 var element_style = element.style; 53 var fake_style = { cssText: "original" }; 54 var descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "style"); 55 56 Object.defineProperty(element, "style", { 57 get: function () { 58 return fake_style; 59 }, 60 set: descriptor.set 61 }); 62 63 element.style = "color: green"; 64 65 assert_equals(element_style.cssText, "", "Original value intact"); 66 assert_equals(fake_style.cssText, "color: green", "Fake style object updated"); 67 }, "Overriding target of [PutForwards] attribute"); 68 69 test(() => { 70 var element = document.createElement("div"); 71 var descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "style"); 72 73 Object.defineProperty(element, "style", { 74 get: function () { 75 throw new SyntaxError(); 76 }, 77 set: descriptor.set 78 }); 79 80 assert_throws_js(SyntaxError, () => { 81 element.style = "color: green"; 82 }); 83 }, "Exception propagation from getter of [PutForwards] attribute"); 84 85 test(() => { 86 var element = document.createElement("div"); 87 var element_style = element.style; 88 var descriptor = Object.getOwnPropertyDescriptor(CSSStyleDeclaration.prototype, "cssText"); 89 90 Object.defineProperty(element_style, "cssText", { 91 get: descriptor.get, 92 set: function (v) { 93 throw new SyntaxError(); 94 } 95 }); 96 97 assert_throws_js(SyntaxError, () => { 98 element.style = "color: green"; 99 }); 100 }, "Exception propagation from setter of [PutForwards] target attribute"); 101 102 test(() => { 103 var element = document.createElement("div"); 104 var descriptor = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "style"); 105 106 Object.defineProperty(element, "style", { 107 get: function () { 108 return null; 109 }, 110 set: descriptor.set 111 }); 112 113 assert_throws_js(TypeError, () => { 114 element.style = "color: green"; 115 }); 116 }, "TypeError when getter of [PutForwards] attribute returns non-object"); 117 118 119 test(() => { 120 var element = document.createElement("div"); 121 122 var element_style = element.style; 123 Object.defineProperty(element.style, "cssText", { 124 value: null, 125 writable: false, 126 }); 127 128 element.style = "color: green"; 129 assert_equals(element.style, element_style); 130 assert_equals(element.style.cssText, null); 131 }, "Does not throw when setter of [PutForwards] attribute returns false"); 132 133 function test_token_list(elementName, attribute, target, value) { 134 test(() => { 135 var element=document.createElement(elementName); 136 assert_true(element[attribute] instanceof DOMTokenList,"The attribute is a DOMTokenList"); 137 element[attribute]=value; 138 assert_equals(element.getAttribute(target),value,"Setting the attribute is reflected in the target"); 139 element[attribute]=""; 140 assert_equals(element.getAttribute(target),"","Clearing the attribute is reflected in the target"); 141 },"Setting "+elementName+"."+attribute+" to "+value+" is reflected in "+target) 142 } 143 144 test_token_list("a","relList","rel","noreferrer"); 145 test_token_list("area","relList","rel","noreferrer"); 146 test_token_list("form","relList","rel","noreferrer"); 147 test_token_list("link","relList","rel","stylesheet"); 148 </script>