1<!DOCTYPE html> 2<html> 3<title>HTMLBodyElement and HTMLFrameSetElement Event Handler Tests</title> 4<script src="/resources/testharness.js"></script> 5<script src="/resources/testharnessreport.js"></script> 6 7<script> 8function getObject(interface) { 9 switch(interface) { 10 case "Element": 11 var e = document.createElementNS("http://example.com/", "example"); 12 assert_true(e instanceof Element); 13 assert_false(e instanceof HTMLElement); 14 assert_false(e instanceof SVGElement); 15 return e; 16 case "HTMLElement": 17 var e = document.createElement("html"); 18 assert_true(e instanceof HTMLElement); 19 return e; 20 case "HTMLBodyElement": 21 var e = document.createElement("body"); 22 assert_true(e instanceof HTMLBodyElement); 23 return e; 24 case "HTMLFormElement": 25 var e = document.createElement("form"); 26 assert_true(e instanceof HTMLFormElement); 27 return e; 28 case "HTMLFrameSetElement": 29 var e = document.createElement("frameset"); 30 assert_true(e instanceof HTMLFrameSetElement); 31 return e; 32 case "SVGElement": 33 var e = document.createElementNS("http://www.w3.org/2000/svg", "rect"); 34 assert_true(e instanceof SVGElement); 35 return e; 36 case "Document": 37 assert_true(document instanceof Document); 38 return document; 39 case "Window": 40 assert_true(window instanceof Window); 41 return window; 42 } 43 assert_unreached(); 44} 45 46function testSet(interface, attribute) { 47 test(function() { 48 var object = getObject(interface); 49 function nop() {} 50 assert_equals(object[attribute], null, "Initially null"); 51 object[attribute] = nop; 52 assert_equals(object[attribute], nop, "Return same function"); 53 object[attribute] = ""; 54 assert_equals(object[attribute], null, "Return null after setting string"); 55 object[attribute] = null; 56 assert_equals(object[attribute], null, "Finally null"); 57 }, "Set " + interface + "." + attribute); 58} 59 60function testReflect(interface, attribute) { 61 test(function() { 62 var element = getObject(interface); 63 assert_false(element.hasAttribute(attribute), "Initially missing"); 64 element.setAttribute(attribute, "return"); 65 assert_equals(element.getAttribute(attribute), "return", "Return same string"); 66 assert_equals(typeof element[attribute], "function", "Convert to function"); 67 element.removeAttribute(attribute); 68 }, "Reflect " + interface + "." + attribute); 69} 70 71function testForwardToWindow(interface, attribute) { 72 test(function() { 73 var element = getObject(interface); 74 window[attribute] = null; 75 element.setAttribute(attribute, "return"); 76 assert_equals(typeof window[attribute], "function", "Convert to function"); 77 assert_equals(window[attribute], element[attribute], "Forward content attribute"); 78 function nop() {} 79 element[attribute] = nop; 80 assert_equals(window[attribute], nop, "Forward IDL attribute"); 81 window[attribute] = null; 82 }, "Forward " + interface + "." + attribute + " to Window"); 83} 84 85// Object.propertyIsEnumerable cannot be used because it doesn't 86// work with properties inherited through the prototype chain. 87function getEnumerable(interface) { 88 var enumerable = {}; 89 for (var attribute in getObject(interface)) { 90 enumerable[attribute] = true; 91 } 92 return enumerable; 93} 94 95var enumerableCache = {}; 96function testEnumerate(interface, attribute) { 97 if (!(interface in enumerableCache)) { 98 enumerableCache[interface] = getEnumerable(interface); 99 } 100 test(function() { 101 assert_true(enumerableCache[interface][attribute]); 102 }, "Enumerate " + interface + "." + attribute); 103} 104 105[ 106 "onblur", 107 "onerror", 108 "onfocus", 109 "onload", 110 "onscroll", 111 "onresize" 112].forEach(function(attribute) { 113 testSet("HTMLBodyElement", attribute); 114 testEnumerate("HTMLBodyElement", attribute); 115 testReflect("HTMLBodyElement", attribute); 116 testForwardToWindow("HTMLBodyElement", attribute); 117 testSet("HTMLFrameSetElement", attribute); 118 testEnumerate("HTMLFrameSetElement", attribute); 119 testReflect("HTMLFrameSetElement", attribute); 120 testForwardToWindow("HTMLFrameSetElement", attribute); 121}); 122</script> 123</html> 124