Use testRunner instead of layoutTestController in fast/doctypes, dom, dynamic, encodi...
[WebKit-https.git] / LayoutTests / fast / dom / element-attribute-js-null.html
1 <html>
2 <head>
3     <style type="text/css">
4         .pass { color: green; }
5         .fail { color: red; }
6     </style>
7     <script>
8         function printOut(msg)
9         {
10             var console = document.getElementById("console");
11             var span = document.createElement('span');
12             span.innerHTML = msg + '<br>';
13             console.appendChild(span);
14         }
15
16         function resultStringifier(result)
17         {
18             if (result === "")
19                 return "<b>the empty string</b>";
20             else if (result === null)
21                 return "<b>null</b>";
22             else if (result === undefined)
23                 return "<b>undefined</b>";
24             return "the string '" + result + "'";
25         }
26
27         function nullTestElementAttribute(elementType, element, attr, expected)
28         {
29             var exceptionThrown;
30             try {
31                 element[attr] = null;
32             } catch (ec) {
33                 exceptionThrown = ec;
34             }
35             var result;
36             if (exceptionThrown) {
37                 if (expected === 'exception')
38                     result = "<span class='pass'>TEST SUCCEEDED:</span> Exception (" + exceptionThrown + ") was thrown as expected.";
39                 else
40                     result = "<span class='fail'>TEST FAILED:</span> An exception was thrown unexpectedly.";
41             } else {
42                 if (expected === 'exception')
43                     result = "<span class='fail'>TEST FAILED:</span> An exception should have been thrown.";
44                 else if (element[attr] === expected)
45                     result = "<span class='pass'>TEST SUCCEEDED:</span> The value was " + resultStringifier(expected) + ".";
46                 else
47                     result = "<span class='fail'>TEST FAILED:</span> The value should have been " + resultStringifier(expected) + " but was " + resultStringifier(element[attr]) + ".";
48             }
49             result += " [tested " + elementType + "." + attr + "]";
50             printOut(result);
51         }
52
53         function runTests()
54         {
55             if (window.testRunner)
56                 testRunner.dumpAsText();
57
58             // Others to test:
59             //  Core DOM
60             //    Attr.value (expected: null)
61             //    CharacterData.data
62             //    ProcessingInstruction.data
63             //  Functions
64
65             var listing = [
66                 {
67                     type: 'Node',
68                     elementToUse: document.createElement('div'),
69                     attributes: [
70                         {name: 'nodeValue', expectedNull: null},
71                          // 'prefix' only works because this is an HTMLElement type node, if it were an
72                          // XML node (created using createElementNS()) this would throw an exception. We
73                          // should test this further as Firefox has a different behavior.
74                         {name: 'prefix', expectedNull: null},
75                         {name: 'textContent', expectedNull: ''}
76                     ]
77                 },
78                 {
79                     type: 'HTMLElement',
80                     elementToUse: document.createElement('div'),
81                     attributes: [
82                         {name: 'title', expectedNull: ''},
83                         {name: 'id', expectedNull: ''},
84                         {name: 'lang', expectedNull: ''},
85                         {name: 'dir', expectedNull: ''},
86                         {name: 'className', expectedNull: ''},
87                         {name: 'innerHTML', expectedNull: ''},
88                         {name: 'innerText', expectedNull: ''},
89                         // FIXME: TEST THESE
90                         // {name: 'outerHTML', expectedNull: ''},
91                         // {name: 'outerText', expectedNull: ''},
92                         {name: 'contentEditable', expectedNull: 'exception'}
93                     ]
94                 },
95                 {
96                     type: 'HTMLAnchorElement',
97                     elementToUse: document.createElement('a'),
98                     attributes: [
99                         {name: 'accessKey', expectedNull: ''},
100                         {name: 'charset', expectedNull: ''},
101                         {name: 'coords', expectedNull: ''},
102                         {name: 'href', expectedNull: ''},
103                         {name: 'hreflang', expectedNull: ''},
104                         {name: 'name', expectedNull: ''},
105                         {name: 'rel', expectedNull: ''},
106                         {name: 'rev', expectedNull: ''},
107                         {name: 'shape', expectedNull: ''},
108                         {name: 'target', expectedNull: ''},
109                         {name: 'type', expectedNull: ''}
110                     ]
111                 },
112                 {
113                     type: 'HTMLAppletElement',
114                     elementToUse: document.createElement('applet'),
115                     attributes: [
116                         {name: 'align', expectedNull: ''},
117                         {name: 'alt', expectedNull: ''},
118                         {name: 'archive', expectedNull: ''},
119                         {name: 'code', expectedNull: ''},
120                         {name: 'codeBase', expectedNull: ''},
121                         {name: 'height', expectedNull: ''},
122                         {name: 'hspace', expectedNull: ''},
123                         {name: 'name', expectedNull: ''},
124                         {name: 'object', expectedNull: ''},
125                         {name: 'vspace', expectedNull: ''},
126                         {name: 'width', expectedNull: ''}
127                     ]
128                 },
129                 {
130                     type: 'HTMLAreaElement',
131                     elementToUse: document.createElement('area'),
132                     attributes: [
133                         {name: 'accessKey', expectedNull: ''},
134                         {name: 'alt', expectedNull: ''},
135                         {name: 'coords', expectedNull: ''},
136                         {name: 'href', expectedNull: ''},
137                         {name: 'shape', expectedNull: ''},
138                         {name: 'target', expectedNull: ''}
139                     ]
140                 },
141                 {
142                     type: 'HTMLBaseElement',
143                     elementToUse: document.createElement('base'),
144                     attributes: [
145                         {name: 'href', expectedNull: ''},
146                         {name: 'target', expectedNull: ''}
147                     ]
148                 },
149                 {
150                     type: 'HTMLBaseFontElement',
151                     elementToUse: document.createElement('basefont'),
152                     attributes: [
153                         {name: 'color', expectedNull: ''},
154                         {name: 'face', expectedNull: ''}
155                     ]
156                 },
157                 {
158                     type: 'HTMLBlockquoteElement',
159                     elementToUse: document.createElement('blockquote'),
160                     attributes: [
161                         {name: 'cite', expectedNull: ''}
162                     ]
163                 },
164                 {
165                     type: 'HTMLBodyElement',
166                     elementToUse: document.createElement('body'),
167                     attributes: [
168                         {name: 'aLink', expectedNull: ''},
169                         {name: 'background', expectedNull: ''},
170                         {name: 'bgColor', expectedNull: ''},
171                         {name: 'link', expectedNull: ''},
172                         {name: 'text', expectedNull: ''},
173                         {name: 'vLink', expectedNull: ''}
174                     ]
175                 },
176                 {
177                     type: 'HTMLBRElement',
178                     elementToUse: document.createElement('br'),
179                     attributes: [
180                         {name: 'clear', expectedNull: ''}
181                     ]
182                 },
183                 {
184                     type: 'HTMLButtonElement',
185                     elementToUse: document.createElement('button'),
186                     attributes: [
187                         {name: 'accessKey', expectedNull: ''},
188                         {name: 'name', expectedNull: ''},
189                         {name: 'value', expectedNull: ''}
190                     ]
191                 },
192                 {
193                     type: 'HTMLDivElement',
194                     elementToUse: document.createElement('div'),
195                     attributes: [
196                         {name: 'align', expectedNull: ''}
197                     ]
198                 },
199
200                 // HTMLDListElement
201                 // NONE
202
203                 {
204                     type: 'HTMLEmbedElement',
205                     elementToUse: document.createElement('embed'),
206                     attributes: [
207                         {name: 'align', expectedNull: ''},
208                         {name: 'name', expectedNull: ''},
209                         {name: 'src', expectedNull: ''},
210                         {name: 'type', expectedNull: ''}
211                     ]
212                 },
213
214                 // HTMLFieldSetElement
215                 // NONE
216
217                 {
218                     type: 'HTMLFontElement',
219                     elementToUse: document.createElement('font'),
220                     attributes: [
221                         {name: 'color', expectedNull: ''},
222                         {name: 'face', expectedNull: ''},
223                         {name: 'size', expectedNull: ''}
224                     ]
225                 },
226                 {
227                     type: 'HTMLFormElement',
228                     elementToUse: document.createElement('form'),
229                     attributes: [
230                         {name: 'name', expectedNull: ''},
231                         {name: 'acceptCharset', expectedNull: ''},
232                         {name: 'action', expectedNull: ''},
233                         {name: 'encoding', expectedNull: 'application/x-www-form-urlencoded'},
234                         {name: 'enctype', expectedNull: 'application/x-www-form-urlencoded'},
235                         {name: 'method', expectedNull: 'get'},
236                         {name: 'target', expectedNull: ''}
237                     ]
238                 },
239                 {
240                     type: 'HTMLFrameElement',
241                     elementToUse: document.createElement('frame'),
242                     attributes: [
243                         {name: 'frameBorder', expectedNull: ''},
244                         {name: 'longDesc', expectedNull: ''},
245                         {name: 'marginHeight', expectedNull: ''},
246                         {name: 'marginWidth', expectedNull: ''},
247                         {name: 'name', expectedNull: ''},
248                         {name: 'scrolling', expectedNull: ''},
249                         {name: 'src', expectedNull: ''},
250                         {name: 'location', expectedNull: ''} // not a documented attribute
251                     ]
252                 },
253                 {
254                     type: 'HTMLFrameSetElement',
255                     elementToUse: document.createElement('frameset'),
256                     attributes: [
257                         {name: 'cols', expectedNull: ''},
258                         {name: 'rows', expectedNull: ''}
259                     ]
260                 },
261                 {
262                     type: 'HTMLHeadElement',
263                     elementToUse: document.createElement('head'),
264                     attributes: [
265                         {name: 'profile', expectedNull: ''}
266                     ]
267                 },
268                 {
269                     type: 'HTMLHeadingElement',
270                     // no need to test h2-h6
271                     elementToUse: document.createElement('h1'),
272                     attributes: [
273                         {name: 'align', expectedNull: ''}
274                     ]
275                 },
276                 {
277                     type: 'HTMLHRElement',
278                     elementToUse: document.createElement('hr'), // no need to test h2-h6
279                     attributes: [
280                         {name: 'align', expectedNull: ''},
281                         {name: 'size', expectedNull: ''},
282                         {name: 'width', expectedNull: ''}
283                     ]
284                 },
285                 {
286                     type: 'HTMLHtmlElement',
287                     elementToUse: document.createElement('html'),
288                     attributes: [
289                         {name: 'version', expectedNull: ''}
290                     ]
291                 },
292                 {
293                     type: 'HTMLIFrameElement',
294                     elementToUse: document.createElement('iframe'),
295                     attributes: [
296                         {name: 'align', expectedNull: ''},
297                         {name: 'frameBorder', expectedNull: ''},
298                         {name: 'height', expectedNull: ''},
299                         {name: 'longDesc', expectedNull: ''},
300                         {name: 'marginHeight', expectedNull: ''},
301                         {name: 'marginWidth', expectedNull: ''},
302                         {name: 'name', expectedNull: ''},
303                         {name: 'scrolling', expectedNull: ''},
304                         {name: 'src', expectedNull: ''},
305                         {name: 'width', expectedNull: ''}
306                     ]
307                 },
308                 {
309                     type: 'HTMLImageElement',
310                     elementToUse: document.createElement('img'),
311                     attributes: [
312                         {name: 'name', expectedNull: ''},
313                         {name: 'align', expectedNull: ''},
314                         {name: 'alt', expectedNull: ''},
315                         {name: 'border', expectedNull: ''},
316                         {name: 'longDesc', expectedNull: ''},
317                         {name: 'src', expectedNull: ''},
318                         {name: 'useMap', expectedNull: ''},
319                         {name: 'lowsrc', expectedNull: ''}
320                     ]
321                 },
322                 {
323                     type: 'HTMLInputElement',
324                     elementToUse: document.createElement('input'),
325                     attributes: [
326                         {name: 'accept', expectedNull: ''},
327                         {name: 'accessKey', expectedNull: ''},
328                         {name: 'align', expectedNull: ''},
329                         {name: 'alt', expectedNull: ''},
330                         {name: 'defaultValue', expectedNull: ''},
331                         {name: 'name', expectedNull: ''},
332                         {name: 'src', expectedNull: ''},
333                         {name: 'type', expectedNull: 'text'},
334                         {name: 'useMap', expectedNull: ''},
335                         {name: 'value', expectedNull: ''},
336                     ]
337                 },
338                 {
339                     type: 'HTMLLabelElement',
340                     elementToUse: document.createElement('label'),
341                     attributes: [
342                         {name: 'accessKey', expectedNull: ''},
343                         {name: 'htmlFor', expectedNull: ''}
344                     ]
345                 },
346                 {
347                     type: 'HTMLLegendElement',
348                     elementToUse: document.createElement('legend'),
349                     attributes: [
350                         {name: 'accessKey', expectedNull: ''},
351                         {name: 'align', expectedNull: ''}
352                     ]
353                 },
354                 {
355                     type: 'HTMLLIElement',
356                     elementToUse: document.createElement('li'),
357                     attributes: [
358                         {name: 'type', expectedNull: ''}
359                     ]
360                 },
361                 {
362                     type: 'HTMLLinkElement',
363                     elementToUse: document.createElement('link'),
364                     attributes: [
365                         {name: 'charset', expectedNull: ''},
366                         {name: 'href', expectedNull: ''},
367                         {name: 'hreflang', expectedNull: ''},
368                         {name: 'media', expectedNull: ''},
369                         {name: 'rel', expectedNull: ''},
370                         {name: 'rev', expectedNull: ''},
371                         {name: 'target', expectedNull: ''},
372                         {name: 'type', expectedNull: ''}
373                     ]
374                 },
375                 {
376                     type: 'HTMLMapElement',
377                     elementToUse: document.createElement('map'),
378                     attributes: [
379                         {name: 'name', expectedNull: ''}
380                     ]
381                 },
382
383                 // HTMLMenuElement
384                 // NONE
385
386                 {
387                     type: 'HTMLMetaElement',
388                     elementToUse: document.createElement('meta'),
389                     attributes: [
390                         {name: 'content', expectedNull: ''},
391                         {name: 'httpEquiv', expectedNull: ''},
392                         {name: 'name', expectedNull: ''},
393                         {name: 'scheme', expectedNull: ''}
394                     ]
395                 },
396                 {
397                     type: 'HTMLModElement',
398                     elementToUse: document.createElement('ins'), // same as 'del'
399                     attributes: [
400                         {name: 'cite', expectedNull: ''},
401                         {name: 'dateTime', expectedNull: ''}
402                     ]
403                 },
404                 {
405                     type: 'HTMLObjectElement',
406                     elementToUse: document.createElement('object'),
407                     attributes: [
408                         {name: 'code', expectedNull: ''},
409                         {name: 'align', expectedNull: ''},
410                         {name: 'archive', expectedNull: ''},
411                         {name: 'border', expectedNull: ''},
412                         {name: 'codeBase', expectedNull: ''},
413                         {name: 'codeType', expectedNull: ''},
414                         {name: 'data', expectedNull: ''},
415                         {name: 'height', expectedNull: ''},
416                         {name: 'name', expectedNull: ''},
417                         {name: 'standby', expectedNull: ''},
418                         {name: 'type', expectedNull: ''},
419                         {name: 'useMap', expectedNull: ''},
420                         {name: 'width', expectedNull: ''}
421                     ]
422                 },
423                 {
424                     type: 'HTMLOListElement',
425                     elementToUse: document.createElement('ol'),
426                     attributes: [
427                         {name: 'type', expectedNull: ''}
428                     ]
429                 },
430                 {
431                     type: 'HTMLOptGroupElement',
432                     elementToUse: document.createElement('optgroup'),
433                     attributes: [
434                         {name: 'label', expectedNull: ''}
435                     ]
436                 },
437                 {
438                     type: 'HTMLOptionElement',
439                     elementToUse: document.createElement('option'),
440                     attributes: [
441                         {name: 'text', expectedNull: 'null'},
442                         {name: 'label', expectedNull: 'null'},
443                         {name: 'value', expectedNull: 'null'}
444                     ]
445                 },
446                 {
447                     type: 'HTMLParagraphElement',
448                     elementToUse: document.createElement('p'),
449                     attributes: [
450                         {name: 'align', expectedNull: ''}
451                     ]
452                 },
453                 {
454                     type: 'HTMLParamElement',
455                     elementToUse: document.createElement('param'),
456                     attributes: [
457                         {name: 'name', expectedNull: ''},
458                         {name: 'type', expectedNull: ''},
459                         {name: 'value', expectedNull: ''},
460                         {name: 'valueType', expectedNull: ''}
461                     ]
462                 },
463
464                 // HTMLPreElement
465                 // NONE
466
467                 {
468                     type: 'HTMLQuoteElement',
469                     elementToUse: document.createElement('q'),
470                     attributes: [
471                         {name: 'cite', expectedNull: ''}
472                     ]
473                 },
474                 {
475                     type: 'HTMLScriptElement',
476                     elementToUse: document.createElement('script'),
477                     attributes: [
478                         {name: 'text', expectedNull: ''},
479                         {name: 'htmlFor', expectedNull: ''},
480                         {name: 'event', expectedNull: ''},
481                         {name: 'charset', expectedNull: ''},
482                         {name: 'src', expectedNull: ''},
483                         {name: 'type', expectedNull: ''}
484                     ]
485                 },
486                 {
487                     type: 'HTMLSelectElement',
488                     elementToUse: document.createElement('select'),
489                     attributes: [
490                         {name: 'value', expectedNull: ''},
491                         {name: 'name', expectedNull: ''}
492                     ]
493                 },
494                 {
495                     type: 'HTMLStyleElement',
496                     elementToUse: document.createElement('style'),
497                     attributes: [
498                         {name: 'media', expectedNull: ''},
499                         {name: 'type', expectedNull: ''}
500                     ]
501                 },
502                 {
503                     type: 'HTMLTableCaptionElement',
504                     elementToUse: document.createElement('caption'),
505                     attributes: [
506                         {name: 'align', expectedNull: ''}
507                     ]
508                 },
509                 {
510                     type: 'HTMLTableCellElement',
511                     elementToUse: document.createElement('td'),
512                     attributes: [
513                         {name: 'abbr', expectedNull: ''},
514                         {name: 'align', expectedNull: ''},
515                         {name: 'axis', expectedNull: ''},
516                         {name: 'bgColor', expectedNull: ''},
517                         {name: 'ch', expectedNull: ''},
518                         {name: 'chOff', expectedNull: ''},
519                         {name: 'headers', expectedNull: ''},
520                         {name: 'height', expectedNull: ''},
521                         {name: 'scope', expectedNull: ''},
522                         {name: 'vAlign', expectedNull: ''},
523                         {name: 'width', expectedNull: ''}
524                     ]
525                 },
526                 {
527                     type: 'HTMLTableColElement',
528                     elementToUse: document.createElement('col'),
529                     attributes: [
530                         {name: 'align', expectedNull: ''},
531                         {name: 'ch', expectedNull: ''},
532                         {name: 'chOff', expectedNull: ''},
533                         {name: 'vAlign', expectedNull: ''},
534                         {name: 'width', expectedNull: ''}
535                     ]
536                 },
537                 {
538                     type: 'HTMLTableElement',
539                     elementToUse: document.createElement('table'),
540                     attributes: [
541                         {name: 'align', expectedNull: ''},
542                         {name: 'bgColor', expectedNull: ''},
543                         {name: 'border', expectedNull: ''},
544                         {name: 'cellPadding', expectedNull: ''},
545                         {name: 'cellSpacing', expectedNull: ''},
546                         {name: 'frame', expectedNull: ''},
547                         {name: 'rules', expectedNull: ''},
548                         {name: 'summary', expectedNull: ''},
549                         {name: 'width', expectedNull: ''}
550                     ]
551                 },
552                 {
553                     type: 'HTMLTableRowElement',
554                     elementToUse: document.createElement('tr'),
555                     attributes: [
556                         {name: 'align', expectedNull: ''},
557                         {name: 'bgColor', expectedNull: ''},
558                         {name: 'ch', expectedNull: ''},
559                         {name: 'chOff', expectedNull: ''},
560                         {name: 'vAlign', expectedNull: ''}
561                     ]
562                 },
563                 {
564                     type: 'HTMLTableSectionElement',
565                     elementToUse: document.createElement('tbody'),
566                     attributes: [
567                         {name: 'align', expectedNull: ''},
568                         {name: 'ch', expectedNull: ''},
569                         {name: 'chOff', expectedNull: ''},
570                         {name: 'vAlign', expectedNull: ''}
571                     ]
572                 },
573                 {
574                     type: 'HTMLTextAreaElement',
575                     elementToUse: document.createElement('textarea'),
576                     attributes: [
577                         {name: 'defaultValue', expectedNull: ''},
578                         {name: 'accessKey', expectedNull: ''},
579                         {name: 'name', expectedNull: ''},
580                         {name: 'value', expectedNull: ''}
581                     ]
582                 },
583                 {
584                     type: 'HTMLTitleElement',
585                     elementToUse: document.createElement('title'),
586                     attributes: [
587                         {name: 'text', expectedNull: ''}
588                     ]
589                 },
590                 {
591                     type: 'HTMLUListElement',
592                     elementToUse: document.createElement('ul'),
593                     attributes: [
594                         {name: 'type', expectedNull: ''}
595                     ]
596                 }
597             ];
598
599             for (element in listing) {
600                 var type = listing[element].type;
601                 var elementToUse = listing[element].elementToUse;
602                 var attrs = listing[element].attributes;
603                 for (attr in attrs) {
604                     nullTestElementAttribute(type, elementToUse, attrs[attr].name, attrs[attr].expectedNull);
605                 }
606                 printOut('');
607             }
608         }
609     </script>
610 </head>
611 <body onload="runTests()">
612     <p>This test setting various attributes of a elements to JavaScript null.</p>
613     <div id="console"></div>
614 </body>
615 </html>