3 <style type="text/css">
4 .pass { color: green; }
10 var console = document.getElementById("console");
11 var span = document.createElement('span');
12 span.innerHTML = msg + '<br>';
13 console.appendChild(span);
16 function resultStringifier(result)
19 return "<b>the empty string</b>";
20 else if (result === null)
22 else if (result === undefined)
23 return "<b>undefined</b>";
24 return "the string '" + result + "'";
29 var a = document.createElement('a');
34 function nullTestElementAttribute(elementType, element, attr, expected, isUrl)
43 if (exceptionThrown) {
44 if (expected === 'exception')
45 result = "<span class='pass'>TEST SUCCEEDED:</span> Exception (" + exceptionThrown + ") was thrown as expected.";
47 result = "<span class='fail'>TEST FAILED:</span> An exception was thrown unexpectedly.";
49 if (expected === 'exception')
50 result = "<span class='fail'>TEST FAILED:</span> An exception should have been thrown.";
51 else if (isUrl && element[attr] === resolve(expected))
52 result = "<span class='pass'>TEST SUCCEEDED:</span> The value was " + resultStringifier(expected) + " resolved as a URL.";
53 else if (!isUrl && element[attr] === expected)
54 result = "<span class='pass'>TEST SUCCEEDED:</span> The value was " + resultStringifier(expected) + ".";
56 result = "<span class='fail'>TEST FAILED:</span> The value should have been " + resultStringifier(expected) + " but was " + resultStringifier(element[attr]) + ".";
58 result += " [tested " + elementType + "." + attr + "]";
64 if (window.testRunner)
65 testRunner.dumpAsText();
69 // Attr.value (expected: null)
71 // ProcessingInstruction.data
77 elementToUse: document.createElement('div'),
79 {name: 'nodeValue', expectedNull: null},
80 // 'prefix' only works because this is an HTMLElement type node, if it were an
81 // XML node (created using createElementNS()) this would throw an exception. We
82 // should test this further as Firefox has a different behavior.
83 {name: 'prefix', expectedNull: null},
84 {name: 'textContent', expectedNull: ''}
89 elementToUse: document.createElementNS('http://example.com/', 'example'),
91 {name: 'id', expectedNull: 'null'},
92 {name: 'className', expectedNull: 'null'},
93 {name: 'innerHTML', expectedNull: ''},
94 {name: 'outerHTML', expectedNull: 'exception'}
99 elementToUse: document.createElement('abbr'),
101 {name: 'accessKey', expectedNull: 'null'},
102 {name: 'title', expectedNull: 'null'},
103 {name: 'lang', expectedNull: 'null'},
104 {name: 'dir', expectedNull: ''},
105 {name: 'innerText', expectedNull: ''},
106 {name: 'outerText', expectedNull: 'exception'},
107 {name: 'contentEditable', expectedNull: 'exception'}
111 type: 'HTMLAnchorElement',
112 elementToUse: document.createElement('a'),
114 {name: 'charset', expectedNull: 'null'},
115 {name: 'coords', expectedNull: 'null'},
116 {name: 'download', expectedNull: 'null'},
117 {name: 'href', expectedNull: 'null', isUrl: true},
118 {name: 'hreflang', expectedNull: 'null'},
119 {name: 'name', expectedNull: 'null'},
120 {name: 'ping', expectedNull: 'null'},
121 {name: 'rel', expectedNull: 'null'},
122 {name: 'rev', expectedNull: 'null'},
123 {name: 'shape', expectedNull: 'null'},
124 {name: 'target', expectedNull: 'null'},
125 {name: 'type', expectedNull: 'null'}
129 type: 'HTMLAppletElement',
130 elementToUse: document.createElement('applet'),
132 {name: 'align', expectedNull: 'null'},
133 {name: 'alt', expectedNull: 'null'},
134 {name: 'archive', expectedNull: 'null'},
135 {name: 'code', expectedNull: 'null'},
136 {name: 'codeBase', expectedNull: 'null', isUrl: true},
137 {name: 'height', expectedNull: 'null'},
138 {name: 'name', expectedNull: 'null'},
139 {name: 'object', expectedNull: 'null', isUrl: true},
140 {name: 'width', expectedNull: 'null'}
144 type: 'HTMLAreaElement',
145 elementToUse: document.createElement('area'),
147 {name: 'alt', expectedNull: 'null'},
148 {name: 'coords', expectedNull: 'null'},
149 {name: 'href', expectedNull: 'null', isUrl: true},
150 {name: 'ping', expectedNull: 'null'},
151 {name: 'shape', expectedNull: 'null'},
152 {name: 'target', expectedNull: 'null'}
156 type: 'HTMLAudioElement',
157 elementToUse: document.createElement('audio'),
159 {name: 'mediaGroup', expectedNull: 'null'},
160 {name: 'preload', expectedNull: 'auto'},
161 {name: 'src', expectedNull: 'null', isUrl: true}
165 type: 'HTMLBaseElement',
166 elementToUse: document.createElement('base'),
168 {name: 'href', expectedNull: 'null', isUrl: true},
169 {name: 'target', expectedNull: 'null'}
173 type: 'HTMLBlockquoteElement',
174 elementToUse: document.createElement('blockquote'),
176 {name: 'cite', expectedNull: 'null', isUrl: true}
180 type: 'HTMLBodyElement',
181 elementToUse: document.createElement('body'),
183 {name: 'aLink', expectedNull: ''},
184 {name: 'background', expectedNull: 'null'},
185 {name: 'bgColor', expectedNull: ''},
186 {name: 'link', expectedNull: ''},
187 {name: 'text', expectedNull: ''},
188 {name: 'vLink', expectedNull: ''}
192 type: 'HTMLBRElement',
193 elementToUse: document.createElement('br'),
195 {name: 'clear', expectedNull: 'null'}
199 type: 'HTMLButtonElement',
200 elementToUse: document.createElement('button'),
202 {name: 'formAction', expectedNull: 'null', isUrl: true},
203 {name: 'formEnctype', expectedNull: 'application/x-www-form-urlencoded'},
204 {name: 'formMethod', expectedNull: 'get'},
205 {name: 'formTarget', expectedNull: 'null'},
206 {name: 'name', expectedNull: 'null'},
207 {name: 'type', expectedNull: 'submit'},
208 {name: 'value', expectedNull: 'null'}
212 type: 'HTMLDivElement',
213 elementToUse: document.createElement('div'),
215 {name: 'align', expectedNull: 'null'}
223 type: 'HTMLEmbedElement',
224 elementToUse: document.createElement('embed'),
226 {name: 'align', expectedNull: 'null'},
227 {name: 'height', expectedNull: 'null'},
228 {name: 'name', expectedNull: 'null'},
229 {name: 'src', expectedNull: 'null', isUrl: true},
230 {name: 'type', expectedNull: 'null'},
231 {name: 'width', expectedNull: 'null'}
235 type: 'HTMLFieldSetElement',
236 elementToUse: document.createElement('fieldset'),
238 {name: 'name', expectedNull: 'null'}
242 type: 'HTMLFontElement',
243 elementToUse: document.createElement('font'),
245 {name: 'color', expectedNull: ''},
246 {name: 'face', expectedNull: 'null'},
247 {name: 'size', expectedNull: 'null'}
251 type: 'HTMLFormElement',
252 elementToUse: document.createElement('form'),
254 {name: 'acceptCharset', expectedNull: 'null'},
255 {name: 'action', expectedNull: 'null', isUrl: true},
256 {name: 'autocomplete', expectedNull: 'on'},
257 {name: 'enctype', expectedNull: 'application/x-www-form-urlencoded'},
258 {name: 'encoding', expectedNull: 'application/x-www-form-urlencoded'},
259 {name: 'method', expectedNull: 'get'},
260 {name: 'name', expectedNull: 'null'},
261 {name: 'target', expectedNull: 'null'}
265 type: 'HTMLFrameElement',
266 elementToUse: document.createElement('frame'),
268 {name: 'frameBorder', expectedNull: 'null'},
269 {name: 'longDesc', expectedNull: 'null', isUrl: true},
270 {name: 'marginHeight', expectedNull: ''},
271 {name: 'marginWidth', expectedNull: ''},
272 {name: 'name', expectedNull: 'null'},
273 {name: 'scrolling', expectedNull: 'null'},
274 {name: 'src', expectedNull: 'null', isUrl: true}
278 type: 'HTMLFrameSetElement',
279 elementToUse: document.createElement('frameset'),
281 {name: 'cols', expectedNull: 'null'},
282 {name: 'rows', expectedNull: 'null'}
286 type: 'HTMLHeadElement',
287 elementToUse: document.createElement('head'),
289 {name: 'profile', expectedNull: ''}
293 type: 'HTMLHeadingElement',
294 // no need to test h2-h6
295 elementToUse: document.createElement('h1'),
297 {name: 'align', expectedNull: 'null'}
301 type: 'HTMLHRElement',
302 elementToUse: document.createElement('hr'),
304 {name: 'align', expectedNull: 'null'},
305 {name: 'color', expectedNull: 'null'},
306 {name: 'size', expectedNull: 'null'},
307 {name: 'width', expectedNull: 'null'}
311 type: 'HTMLHtmlElement',
312 elementToUse: document.createElement('html'),
314 {name: 'version', expectedNull: 'null'}
318 type: 'HTMLIFrameElement',
319 elementToUse: document.createElement('iframe'),
321 {name: 'align', expectedNull: 'null'},
322 {name: 'frameBorder', expectedNull: 'null'},
323 {name: 'height', expectedNull: 'null'},
324 {name: 'longDesc', expectedNull: 'null', isUrl: true},
325 {name: 'marginHeight', expectedNull: ''},
326 {name: 'marginWidth', expectedNull: ''},
327 {name: 'name', expectedNull: 'null'},
328 {name: 'scrolling', expectedNull: 'null'},
329 {name: 'src', expectedNull: 'null', isUrl: true},
330 {name: 'srcdoc', expectedNull: 'null'},
331 {name: 'width', expectedNull: 'null'}
335 type: 'HTMLImageElement',
336 elementToUse: document.createElement('img'),
338 {name: 'align', expectedNull: 'null'},
339 {name: 'alt', expectedNull: 'null'},
340 {name: 'border', expectedNull: ''},
341 {name: 'crossOrigin', expectedNull: null},
342 {name: 'longDesc', expectedNull: 'null', isUrl: true},
343 {name: 'lowsrc', expectedNull: 'null', isUrl: true},
344 {name: 'name', expectedNull: 'null'},
345 {name: 'src', expectedNull: 'null', isUrl: true},
346 {name: 'srcset', expectedNull: 'null'},
347 {name: 'useMap', expectedNull: 'null'}
351 type: 'HTMLInputElement',
352 elementToUse: document.createElement('input'),
354 {name: 'accept', expectedNull: 'null'},
355 {name: 'align', expectedNull: 'null'},
356 {name: 'alt', expectedNull: 'null'},
357 {name: 'autocomplete', expectedNull: 'null'},
358 {name: 'defaultValue', expectedNull: 'null'},
359 {name: 'dirName', expectedNull: 'null'},
360 {name: 'formAction', expectedNull: 'null', isUrl: true},
361 {name: 'formEnctype', expectedNull: 'application/x-www-form-urlencoded'},
362 {name: 'formMethod', expectedNull: 'get'},
363 {name: 'formTarget', expectedNull: 'null'},
364 {name: 'max', expectedNull: 'null'},
365 {name: 'min', expectedNull: 'null'},
366 {name: 'name', expectedNull: 'null'},
367 {name: 'pattern', expectedNull: 'null'},
368 {name: 'placeholder', expectedNull: 'null'},
369 {name: 'src', expectedNull: 'null', isUrl: true},
370 {name: 'step', expectedNull: 'null'},
371 {name: 'type', expectedNull: 'text'},
372 {name: 'useMap', expectedNull: 'null'}
375 // [TreatNullAs=NullString] is not identical to [TreatNullAs=EmptyString] because
376 // null and empty string can be distinguished. A side-effect is that setting
377 // HTMLInputElement.value to null does clear the old value. This would be fixed by
378 // using [TreatNullAs=EmptyString], but until then test value separately to avoid
379 // interference from the defaultValue test.
381 type: 'HTMLInputElement',
382 elementToUse: document.createElement('input'),
384 {name: 'value', expectedNull: ''}
388 type: 'HTMLKeygenElement',
389 elementToUse: document.createElement('keygen'),
391 {name: 'challenge', expectedNull: 'null'},
392 {name: 'keytype', expectedNull: ''},
393 {name: 'name', expectedNull: 'null'}
397 type: 'HTMLLabelElement',
398 elementToUse: document.createElement('label'),
400 {name: 'htmlFor', expectedNull: 'null'}
404 type: 'HTMLLegendElement',
405 elementToUse: document.createElement('legend'),
407 {name: 'align', expectedNull: 'null'}
411 type: 'HTMLLIElement',
412 elementToUse: document.createElement('li'),
414 {name: 'type', expectedNull: 'null'}
418 type: 'HTMLLinkElement',
419 elementToUse: document.createElement('link'),
421 {name: 'charset', expectedNull: 'null'},
422 {name: 'href', expectedNull: 'null', isUrl: true},
423 {name: 'hreflang', expectedNull: 'null'},
424 {name: 'media', expectedNull: 'null'},
425 {name: 'rel', expectedNull: 'null'},
426 {name: 'rev', expectedNull: 'null'},
427 {name: 'target', expectedNull: 'null'},
428 {name: 'type', expectedNull: 'null'}
432 type: 'HTMLMapElement',
433 elementToUse: document.createElement('map'),
435 {name: 'name', expectedNull: 'null'}
439 type: 'HTMLMarqueeElement',
440 elementToUse: document.createElement('marquee'),
442 {name: 'behavior', expectedNull: 'null'},
443 {name: 'bgColor', expectedNull: 'null'},
444 {name: 'direction', expectedNull: 'null'},
445 {name: 'height', expectedNull: 'null'},
446 {name: 'width', expectedNull: 'null'}
454 type: 'HTMLMetaElement',
455 elementToUse: document.createElement('meta'),
457 {name: 'content', expectedNull: 'null'},
458 {name: 'httpEquiv', expectedNull: 'null'},
459 {name: 'name', expectedNull: 'null'},
460 {name: 'scheme', expectedNull: 'null'}
464 type: 'HTMLModElement',
465 elementToUse: document.createElement('ins'), // same as 'del'
467 {name: 'cite', expectedNull: 'null', isUrl: true},
468 {name: 'dateTime', expectedNull: 'null'}
472 type: 'HTMLObjectElement',
473 elementToUse: document.createElement('object'),
475 {name: 'code', expectedNull: 'null'},
476 {name: 'align', expectedNull: 'null'},
477 {name: 'archive', expectedNull: 'null'},
478 {name: 'border', expectedNull: ''},
479 {name: 'codeBase', expectedNull: 'null', isUrl: true},
480 {name: 'codeType', expectedNull: 'null'},
481 {name: 'data', expectedNull: 'null', isUrl: true},
482 {name: 'height', expectedNull: 'null'},
483 {name: 'name', expectedNull: 'null'},
484 {name: 'standby', expectedNull: 'null'},
485 {name: 'type', expectedNull: 'null'},
486 {name: 'useMap', expectedNull: 'null'},
487 {name: 'width', expectedNull: 'null'}
491 type: 'HTMLOListElement',
492 elementToUse: document.createElement('ol'),
494 {name: 'type', expectedNull: 'null'}
498 type: 'HTMLOptGroupElement',
499 elementToUse: document.createElement('optgroup'),
501 {name: 'label', expectedNull: 'null'}
505 type: 'HTMLOptionElement',
506 elementToUse: document.createElement('option'),
508 {name: 'text', expectedNull: 'null'},
509 {name: 'label', expectedNull: 'null'},
510 {name: 'value', expectedNull: 'null'}
514 type: 'HTMLOutputElement',
515 elementToUse: document.createElement('output'),
517 {name: 'name', expectedNull: 'null'},
518 {name: 'defaultValue', expectedNull: 'null'},
519 {name: 'value', expectedNull: 'null'}
523 type: 'HTMLParagraphElement',
524 elementToUse: document.createElement('p'),
526 {name: 'align', expectedNull: 'null'}
530 type: 'HTMLParamElement',
531 elementToUse: document.createElement('param'),
533 {name: 'name', expectedNull: 'null'},
534 {name: 'type', expectedNull: 'null'},
535 {name: 'value', expectedNull: 'null'},
536 {name: 'valueType', expectedNull: 'null'}
544 type: 'HTMLQuoteElement',
545 elementToUse: document.createElement('q'),
547 {name: 'cite', expectedNull: 'null', isUrl:true}
551 type: 'HTMLScriptElement',
552 elementToUse: document.createElement('script'),
554 {name: 'text', expectedNull: 'null'},
555 {name: 'htmlFor', expectedNull: 'null'},
556 {name: 'event', expectedNull: 'null'},
557 {name: 'charset', expectedNull: 'null'},
558 {name: 'src', expectedNull: 'null', isUrl: true},
559 {name: 'type', expectedNull: 'null'},
560 {name: 'crossOrigin', expectedNull: null},
561 {name: 'nonce', expectedNull: 'null'}
565 type: 'HTMLSelectElement',
566 elementToUse: document.createElement('select'),
568 {name: 'value', expectedNull: ''},
569 {name: 'name', expectedNull: 'null'}
573 type: 'HTMLSourceElement',
574 elementToUse: document.createElement('source'),
576 {name: 'src', expectedNull: 'null', isUrl: true},
577 {name: 'type', expectedNull: 'null'}
581 type: 'HTMLStyleElement',
582 elementToUse: document.createElement('style'),
584 {name: 'media', expectedNull: 'null'},
585 {name: 'type', expectedNull: 'null'}
589 type: 'HTMLTableCaptionElement',
590 elementToUse: document.createElement('caption'),
592 {name: 'align', expectedNull: 'null'}
596 type: 'HTMLTableCellElement',
597 elementToUse: document.createElement('td'),
599 {name: 'abbr', expectedNull: 'null'},
600 {name: 'align', expectedNull: 'null'},
601 {name: 'axis', expectedNull: 'null'},
602 {name: 'bgColor', expectedNull: ''},
603 {name: 'ch', expectedNull: 'null'},
604 {name: 'chOff', expectedNull: 'null'},
605 {name: 'headers', expectedNull: ''},
606 {name: 'height', expectedNull: 'null'},
607 {name: 'scope', expectedNull: 'null'},
608 {name: 'vAlign', expectedNull: 'null'},
609 {name: 'width', expectedNull: 'null'}
613 type: 'HTMLTableColElement',
614 elementToUse: document.createElement('col'),
616 {name: 'align', expectedNull: 'null'},
617 {name: 'ch', expectedNull: 'null'},
618 {name: 'chOff', expectedNull: 'null'},
619 {name: 'vAlign', expectedNull: 'null'},
620 {name: 'width', expectedNull: 'null'}
624 type: 'HTMLTableElement',
625 elementToUse: document.createElement('table'),
627 {name: 'align', expectedNull: 'null'},
628 {name: 'bgColor', expectedNull: ''},
629 {name: 'border', expectedNull: 'null'},
630 {name: 'cellPadding', expectedNull: ''},
631 {name: 'cellSpacing', expectedNull: ''},
632 {name: 'frame', expectedNull: 'null'},
633 {name: 'rules', expectedNull: 'null'},
634 {name: 'summary', expectedNull: 'null'},
635 {name: 'width', expectedNull: 'null'}
639 type: 'HTMLTableRowElement',
640 elementToUse: document.createElement('tr'),
642 {name: 'align', expectedNull: 'null'},
643 {name: 'bgColor', expectedNull: ''},
644 {name: 'ch', expectedNull: 'null'},
645 {name: 'chOff', expectedNull: 'null'},
646 {name: 'vAlign', expectedNull: 'null'}
650 type: 'HTMLTableSectionElement',
651 elementToUse: document.createElement('tbody'),
653 {name: 'align', expectedNull: 'null'},
654 {name: 'ch', expectedNull: 'null'},
655 {name: 'chOff', expectedNull: 'null'},
656 {name: 'vAlign', expectedNull: 'null'}
660 type: 'HTMLTextAreaElement',
661 elementToUse: document.createElement('textarea'),
663 {name: 'defaultValue', expectedNull: 'null'},
664 {name: 'dirName', expectedNull: 'null'},
665 {name: 'inputMode', expectedNull: 'null'},
666 {name: 'name', expectedNull: 'null'},
667 {name: 'placeholder', expectedNull: 'null'},
668 {name: 'value', expectedNull: ''},
669 {name: 'wrap', expectedNull: 'null'}
673 type: 'HTMLTitleElement',
674 elementToUse: document.createElement('title'),
676 {name: 'text', expectedNull: 'null'}
680 type: 'HTMLTrackElement',
681 elementToUse: document.createElement('track'),
683 {name: 'kind', expectedNull: 'subtitles'},
684 {name: 'label', expectedNull: 'null'},
685 {name: 'src', expectedNull: 'null', isUrl: true},
686 {name: 'srclang', expectedNull: 'null'}
690 type: 'HTMLUListElement',
691 elementToUse: document.createElement('ul'),
693 {name: 'type', expectedNull: 'null'}
697 type: 'HTMLVideoElement',
698 elementToUse: document.createElement('video'),
700 {name: 'mediaGroup', expectedNull: 'null'},
701 {name: 'poster', expectedNull: 'null', isUrl: true},
702 {name: 'preload', expectedNull: 'auto'},
703 {name: 'src', expectedNull: 'null', isUrl: true}
708 for (element in listing) {
709 var type = listing[element].type;
710 var elementToUse = listing[element].elementToUse;
711 var attrs = listing[element].attributes;
712 for (attr in attrs) {
713 nullTestElementAttribute(type, elementToUse, attrs[attr].name, attrs[attr].expectedNull, attrs[attr].isUrl);
720 <body onload="runTests()">
721 <p>This test setting various attributes of a elements to JavaScript null.</p>
722 <div id="console"></div>