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: 'HTMLHeadingElement',
287 // no need to test h2-h6
288 elementToUse: document.createElement('h1'),
290 {name: 'align', expectedNull: 'null'}
294 type: 'HTMLHRElement',
295 elementToUse: document.createElement('hr'),
297 {name: 'align', expectedNull: 'null'},
298 {name: 'color', expectedNull: 'null'},
299 {name: 'size', expectedNull: 'null'},
300 {name: 'width', expectedNull: 'null'}
304 type: 'HTMLHtmlElement',
305 elementToUse: document.createElement('html'),
307 {name: 'version', expectedNull: 'null'}
311 type: 'HTMLIFrameElement',
312 elementToUse: document.createElement('iframe'),
314 {name: 'align', expectedNull: 'null'},
315 {name: 'frameBorder', expectedNull: 'null'},
316 {name: 'height', expectedNull: 'null'},
317 {name: 'longDesc', expectedNull: 'null', isUrl: true},
318 {name: 'marginHeight', expectedNull: ''},
319 {name: 'marginWidth', expectedNull: ''},
320 {name: 'name', expectedNull: 'null'},
321 {name: 'scrolling', expectedNull: 'null'},
322 {name: 'src', expectedNull: 'null', isUrl: true},
323 {name: 'srcdoc', expectedNull: 'null'},
324 {name: 'width', expectedNull: 'null'}
328 type: 'HTMLImageElement',
329 elementToUse: document.createElement('img'),
331 {name: 'align', expectedNull: 'null'},
332 {name: 'alt', expectedNull: 'null'},
333 {name: 'border', expectedNull: ''},
334 {name: 'crossOrigin', expectedNull: null},
335 {name: 'longDesc', expectedNull: 'null', isUrl: true},
336 {name: 'lowsrc', expectedNull: 'null', isUrl: true},
337 {name: 'name', expectedNull: 'null'},
338 {name: 'src', expectedNull: 'null', isUrl: true},
339 {name: 'srcset', expectedNull: 'null'},
340 {name: 'useMap', expectedNull: 'null'}
344 type: 'HTMLInputElement',
345 elementToUse: document.createElement('input'),
347 {name: 'accept', expectedNull: 'null'},
348 {name: 'align', expectedNull: 'null'},
349 {name: 'alt', expectedNull: 'null'},
350 {name: 'autocomplete', expectedNull: 'null'},
351 {name: 'defaultValue', expectedNull: 'null'},
352 {name: 'dirName', expectedNull: 'null'},
353 {name: 'formAction', expectedNull: 'null', isUrl: true},
354 {name: 'formEnctype', expectedNull: 'application/x-www-form-urlencoded'},
355 {name: 'formMethod', expectedNull: 'get'},
356 {name: 'formTarget', expectedNull: 'null'},
357 {name: 'max', expectedNull: 'null'},
358 {name: 'min', expectedNull: 'null'},
359 {name: 'name', expectedNull: 'null'},
360 {name: 'pattern', expectedNull: 'null'},
361 {name: 'placeholder', expectedNull: 'null'},
362 {name: 'src', expectedNull: 'null', isUrl: true},
363 {name: 'step', expectedNull: 'null'},
364 {name: 'type', expectedNull: 'text'},
365 {name: 'useMap', expectedNull: 'null'}
368 // [TreatNullAs=NullString] is not identical to [TreatNullAs=EmptyString] because
369 // null and empty string can be distinguished. A side-effect is that setting
370 // HTMLInputElement.value to null does clear the old value. This would be fixed by
371 // using [TreatNullAs=EmptyString], but until then test value separately to avoid
372 // interference from the defaultValue test.
374 type: 'HTMLInputElement',
375 elementToUse: document.createElement('input'),
377 {name: 'value', expectedNull: ''}
381 type: 'HTMLKeygenElement',
382 elementToUse: document.createElement('keygen'),
384 {name: 'challenge', expectedNull: 'null'},
385 {name: 'keytype', expectedNull: ''},
386 {name: 'name', expectedNull: 'null'}
390 type: 'HTMLLabelElement',
391 elementToUse: document.createElement('label'),
393 {name: 'htmlFor', expectedNull: 'null'}
397 type: 'HTMLLegendElement',
398 elementToUse: document.createElement('legend'),
400 {name: 'align', expectedNull: 'null'}
404 type: 'HTMLLIElement',
405 elementToUse: document.createElement('li'),
407 {name: 'type', expectedNull: 'null'}
411 type: 'HTMLLinkElement',
412 elementToUse: document.createElement('link'),
414 {name: 'charset', expectedNull: 'null'},
415 {name: 'href', expectedNull: 'null', isUrl: true},
416 {name: 'hreflang', expectedNull: 'null'},
417 {name: 'media', expectedNull: 'null'},
418 {name: 'rel', expectedNull: 'null'},
419 {name: 'rev', expectedNull: 'null'},
420 {name: 'target', expectedNull: 'null'},
421 {name: 'type', expectedNull: 'null'}
425 type: 'HTMLMapElement',
426 elementToUse: document.createElement('map'),
428 {name: 'name', expectedNull: 'null'}
432 type: 'HTMLMarqueeElement',
433 elementToUse: document.createElement('marquee'),
435 {name: 'behavior', expectedNull: 'null'},
436 {name: 'bgColor', expectedNull: 'null'},
437 {name: 'direction', expectedNull: 'null'},
438 {name: 'height', expectedNull: 'null'},
439 {name: 'width', expectedNull: 'null'}
447 type: 'HTMLMetaElement',
448 elementToUse: document.createElement('meta'),
450 {name: 'content', expectedNull: 'null'},
451 {name: 'httpEquiv', expectedNull: 'null'},
452 {name: 'name', expectedNull: 'null'},
453 {name: 'scheme', expectedNull: 'null'}
457 type: 'HTMLModElement',
458 elementToUse: document.createElement('ins'), // same as 'del'
460 {name: 'cite', expectedNull: 'null', isUrl: true},
461 {name: 'dateTime', expectedNull: 'null'}
465 type: 'HTMLObjectElement',
466 elementToUse: document.createElement('object'),
468 {name: 'code', expectedNull: 'null'},
469 {name: 'align', expectedNull: 'null'},
470 {name: 'archive', expectedNull: 'null'},
471 {name: 'border', expectedNull: ''},
472 {name: 'codeBase', expectedNull: 'null', isUrl: true},
473 {name: 'codeType', expectedNull: 'null'},
474 {name: 'data', expectedNull: 'null', isUrl: true},
475 {name: 'height', expectedNull: 'null'},
476 {name: 'name', expectedNull: 'null'},
477 {name: 'standby', expectedNull: 'null'},
478 {name: 'type', expectedNull: 'null'},
479 {name: 'useMap', expectedNull: 'null'},
480 {name: 'width', expectedNull: 'null'}
484 type: 'HTMLOListElement',
485 elementToUse: document.createElement('ol'),
487 {name: 'type', expectedNull: 'null'}
491 type: 'HTMLOptGroupElement',
492 elementToUse: document.createElement('optgroup'),
494 {name: 'label', expectedNull: 'null'}
498 type: 'HTMLOptionElement',
499 elementToUse: document.createElement('option'),
501 {name: 'text', expectedNull: 'null'},
502 {name: 'label', expectedNull: 'null'},
503 {name: 'value', expectedNull: 'null'}
507 type: 'HTMLOutputElement',
508 elementToUse: document.createElement('output'),
510 {name: 'name', expectedNull: 'null'},
511 {name: 'defaultValue', expectedNull: 'null'},
512 {name: 'value', expectedNull: 'null'}
516 type: 'HTMLParagraphElement',
517 elementToUse: document.createElement('p'),
519 {name: 'align', expectedNull: 'null'}
523 type: 'HTMLParamElement',
524 elementToUse: document.createElement('param'),
526 {name: 'name', expectedNull: 'null'},
527 {name: 'type', expectedNull: 'null'},
528 {name: 'value', expectedNull: 'null'},
529 {name: 'valueType', expectedNull: 'null'}
537 type: 'HTMLQuoteElement',
538 elementToUse: document.createElement('q'),
540 {name: 'cite', expectedNull: 'null', isUrl:true}
544 type: 'HTMLScriptElement',
545 elementToUse: document.createElement('script'),
547 {name: 'text', expectedNull: 'null'},
548 {name: 'htmlFor', expectedNull: 'null'},
549 {name: 'event', expectedNull: 'null'},
550 {name: 'charset', expectedNull: 'null'},
551 {name: 'src', expectedNull: 'null', isUrl: true},
552 {name: 'type', expectedNull: 'null'},
553 {name: 'crossOrigin', expectedNull: null},
554 {name: 'nonce', expectedNull: 'null'}
558 type: 'HTMLSelectElement',
559 elementToUse: document.createElement('select'),
561 {name: 'value', expectedNull: ''},
562 {name: 'name', expectedNull: 'null'}
566 type: 'HTMLSourceElement',
567 elementToUse: document.createElement('source'),
569 {name: 'src', expectedNull: 'null', isUrl: true},
570 {name: 'type', expectedNull: 'null'}
574 type: 'HTMLStyleElement',
575 elementToUse: document.createElement('style'),
577 {name: 'media', expectedNull: 'null'},
578 {name: 'type', expectedNull: 'null'}
582 type: 'HTMLTableCaptionElement',
583 elementToUse: document.createElement('caption'),
585 {name: 'align', expectedNull: 'null'}
589 type: 'HTMLTableCellElement',
590 elementToUse: document.createElement('td'),
592 {name: 'abbr', expectedNull: 'null'},
593 {name: 'align', expectedNull: 'null'},
594 {name: 'axis', expectedNull: 'null'},
595 {name: 'bgColor', expectedNull: ''},
596 {name: 'ch', expectedNull: 'null'},
597 {name: 'chOff', expectedNull: 'null'},
598 {name: 'headers', expectedNull: ''},
599 {name: 'height', expectedNull: 'null'},
600 {name: 'scope', expectedNull: 'null'},
601 {name: 'vAlign', expectedNull: 'null'},
602 {name: 'width', expectedNull: 'null'}
606 type: 'HTMLTableColElement',
607 elementToUse: document.createElement('col'),
609 {name: 'align', expectedNull: 'null'},
610 {name: 'ch', expectedNull: 'null'},
611 {name: 'chOff', expectedNull: 'null'},
612 {name: 'vAlign', expectedNull: 'null'},
613 {name: 'width', expectedNull: 'null'}
617 type: 'HTMLTableElement',
618 elementToUse: document.createElement('table'),
620 {name: 'align', expectedNull: 'null'},
621 {name: 'bgColor', expectedNull: ''},
622 {name: 'border', expectedNull: 'null'},
623 {name: 'cellPadding', expectedNull: ''},
624 {name: 'cellSpacing', expectedNull: ''},
625 {name: 'frame', expectedNull: 'null'},
626 {name: 'rules', expectedNull: 'null'},
627 {name: 'summary', expectedNull: 'null'},
628 {name: 'width', expectedNull: 'null'}
632 type: 'HTMLTableRowElement',
633 elementToUse: document.createElement('tr'),
635 {name: 'align', expectedNull: 'null'},
636 {name: 'bgColor', expectedNull: ''},
637 {name: 'ch', expectedNull: 'null'},
638 {name: 'chOff', expectedNull: 'null'},
639 {name: 'vAlign', expectedNull: 'null'}
643 type: 'HTMLTableSectionElement',
644 elementToUse: document.createElement('tbody'),
646 {name: 'align', expectedNull: 'null'},
647 {name: 'ch', expectedNull: 'null'},
648 {name: 'chOff', expectedNull: 'null'},
649 {name: 'vAlign', expectedNull: 'null'}
653 type: 'HTMLTextAreaElement',
654 elementToUse: document.createElement('textarea'),
656 {name: 'defaultValue', expectedNull: 'null'},
657 {name: 'dirName', expectedNull: 'null'},
658 {name: 'inputMode', expectedNull: 'null'},
659 {name: 'name', expectedNull: 'null'},
660 {name: 'placeholder', expectedNull: 'null'},
661 {name: 'value', expectedNull: ''},
662 {name: 'wrap', expectedNull: 'null'}
666 type: 'HTMLTitleElement',
667 elementToUse: document.createElement('title'),
669 {name: 'text', expectedNull: 'null'}
673 type: 'HTMLTrackElement',
674 elementToUse: document.createElement('track'),
676 {name: 'kind', expectedNull: 'subtitles'},
677 {name: 'label', expectedNull: 'null'},
678 {name: 'src', expectedNull: 'null', isUrl: true},
679 {name: 'srclang', expectedNull: 'null'}
683 type: 'HTMLUListElement',
684 elementToUse: document.createElement('ul'),
686 {name: 'type', expectedNull: 'null'}
690 type: 'HTMLVideoElement',
691 elementToUse: document.createElement('video'),
693 {name: 'mediaGroup', expectedNull: 'null'},
694 {name: 'poster', expectedNull: 'null', isUrl: true},
695 {name: 'preload', expectedNull: 'auto'},
696 {name: 'src', expectedNull: 'null', isUrl: true}
701 for (element in listing) {
702 var type = listing[element].type;
703 var elementToUse = listing[element].elementToUse;
704 var attrs = listing[element].attributes;
705 for (attr in attrs) {
706 nullTestElementAttribute(type, elementToUse, attrs[attr].name, attrs[attr].expectedNull, attrs[attr].isUrl);
713 <body onload="runTests()">
714 <p>This test setting various attributes of a elements to JavaScript null.</p>
715 <div id="console"></div>