main
js 2,399 lines 57.6 KB
Raw
1 function getProperty(propertyName) {
2 return el => el[propertyName];
3 }
4
5 function getAttribute(attributeName) {
6 return el => {
7 if (el.namespaceURI === '') {
8 throw new Error('Not an HTML element.');
9 }
10 return el.getAttribute(attributeName);
11 };
12 }
13
14 function getSVGProperty(propertyName) {
15 return el => el[propertyName];
16 }
17
18 function getSVGAttribute(attributeName) {
19 return el => {
20 if (el.namespaceURI !== 'http://www.w3.org/2000/svg') {
21 throw new Error('Not an SVG element.');
22 }
23 return el.getAttribute(attributeName);
24 };
25 }
26
27 const attributes = [
28 {name: 'about', read: getAttribute('about')},
29 {name: 'aBoUt', read: getAttribute('about')},
30 {
31 name: 'accent-Height',
32 containerTagName: 'svg',
33 tagName: 'font-face',
34 read: getSVGAttribute('accent-height'),
35 },
36 {
37 name: 'accent-height',
38 containerTagName: 'svg',
39 tagName: 'font-face',
40 read: getSVGAttribute('accent-height'),
41 },
42 {
43 name: 'accentHeight',
44 containerTagName: 'svg',
45 tagName: 'font-face',
46 read: getSVGAttribute('accent-height'),
47 },
48 {name: 'accept', tagName: 'input'},
49 {name: 'accept-charset', tagName: 'form', read: getProperty('acceptCharset')},
50 {name: 'accept-Charset', tagName: 'form', read: getProperty('acceptCharset')},
51 {name: 'acceptCharset', tagName: 'form'},
52 {name: 'accessKey'},
53 {
54 name: 'accumulate',
55 containerTagName: 'svg',
56 tagName: 'animate',
57 read: getSVGAttribute('accumulate'),
58 },
59 {name: 'action', tagName: 'form', overrideStringValue: 'https://reactjs.com'},
60 {
61 name: 'additive',
62 containerTagName: 'svg',
63 tagName: 'animate',
64 read: getSVGAttribute('additive'),
65 },
66 {
67 name: 'alignment-baseline',
68 containerTagName: 'svg',
69 tagName: 'textPath',
70 read: getSVGAttribute('alignment-baseline'),
71 },
72 {
73 name: 'alignmentBaseline',
74 containerTagName: 'svg',
75 tagName: 'textPath',
76 read: getSVGAttribute('alignment-baseline'),
77 },
78 {
79 name: 'allowFullScreen',
80 tagName: 'iframe',
81 read: getProperty('allowFullscreen'),
82 },
83 {
84 name: 'allowfullscreen',
85 tagName: 'iframe',
86 read: getProperty('allowFullscreen'),
87 },
88 {name: 'allowFullscreen', tagName: 'iframe'},
89 {
90 name: 'allowReorder',
91 containerTagName: 'svg',
92 tagName: 'switch',
93 read: getSVGAttribute('allowReorder'),
94 },
95 {
96 name: 'alphabetic',
97 containerTagName: 'svg',
98 tagName: 'font-face',
99 read: getSVGAttribute('alphabetic'),
100 },
101 {name: 'alt', tagName: 'img'},
102 {
103 name: 'amplitude',
104 containerTagName: 'svg',
105 tagName: 'feFuncA',
106 read: getSVGProperty('amplitude'),
107 },
108 {
109 name: 'arabic-form',
110 containerTagName: 'svg',
111 tagName: 'glyph',
112 read: getSVGAttribute('arabic-form'),
113 },
114 {
115 name: 'arabicForm',
116 containerTagName: 'svg',
117 tagName: 'glyph',
118 read: getSVGAttribute('arabic-form'),
119 },
120 {name: 'aria', read: getAttribute('aria')},
121 {name: 'aria-', read: getAttribute('aria-')},
122 {name: 'aria-hidden', read: getProperty('ariaHidden')},
123 {name: 'aria-invalidattribute', read: getAttribute('aria-invalidattribute')},
124 {name: 'as', tagName: 'link'},
125 {
126 name: 'ascent',
127 containerTagName: 'svg',
128 tagName: 'font-face',
129 read: getSVGAttribute('ascent'),
130 },
131 {name: 'async', tagName: 'script'},
132 {
133 name: 'attributeName',
134 containerTagName: 'svg',
135 tagName: 'animate',
136 read: getSVGAttribute('attributeName'),
137 },
138 {
139 name: 'attributeType',
140 containerTagName: 'svg',
141 tagName: 'animate',
142 read: getSVGAttribute('attributeType'),
143 },
144 {
145 name: 'autoCapitalize',
146 tagName: 'input',
147 read: getProperty('autocapitalize'),
148 overrideStringValue: 'words',
149 },
150 {
151 name: 'autoComplete',
152 tagName: 'input',
153 overrideStringValue: 'email',
154 read: getProperty('autocomplete'),
155 },
156 {
157 name: 'autoCorrect',
158 tagName: 'input',
159 overrideStringValue: 'off',
160 read: getAttribute('autocorrect'),
161 },
162 {name: 'autoPlay', tagName: 'video', read: getProperty('autoplay')},
163 {
164 name: 'autoReverse',
165 containerTagName: 'svg',
166 tagName: 'animate',
167 read: getSVGAttribute('autoreverse'),
168 },
169 {name: 'autoSave', tagName: 'input', read: getAttribute('autosave')},
170 {
171 name: 'azimuth',
172 containerTagName: 'svg',
173 tagName: 'feDistantLight',
174 read: getSVGProperty('azimuth'),
175 },
176 {
177 name: 'baseFrequency',
178 containerTagName: 'svg',
179 tagName: 'feTurbulence',
180 read: getSVGAttribute('baseFrequency'),
181 },
182 {
183 name: 'baseline-shift',
184 containerTagName: 'svg',
185 tagName: 'textPath',
186 read: getSVGAttribute('baseline-shift'),
187 },
188 {
189 name: 'baselineShift',
190 containerTagName: 'svg',
191 tagName: 'textPath',
192 read: getSVGAttribute('baseline-shift'),
193 },
194 {name: 'baseProfile', tagName: 'svg', read: getSVGAttribute('baseProfile')},
195 {
196 name: 'bbox',
197 containerTagName: 'svg',
198 tagName: 'font-face',
199 read: getSVGAttribute('bbox'),
200 },
201 {
202 name: 'begin',
203 containerTagName: 'svg',
204 tagName: 'animate',
205 read: getSVGAttribute('begin'),
206 },
207 {
208 name: 'bias',
209 containerTagName: 'svg',
210 tagName: 'feConvolveMatrix',
211 read: getSVGProperty('bias'),
212 },
213 {
214 name: 'by',
215 containerTagName: 'svg',
216 tagName: 'animate',
217 read: getSVGAttribute('by'),
218 },
219 {
220 name: 'calcMode',
221 containerTagName: 'svg',
222 tagName: 'animate',
223 overrideStringValue: 'discrete',
224 read: getSVGAttribute('calcMode'),
225 },
226 {
227 name: 'cap-height',
228 containerTagName: 'svg',
229 tagName: 'font-face',
230 read: getSVGAttribute('cap-height'),
231 },
232 {
233 name: 'capHeight',
234 containerTagName: 'svg',
235 tagName: 'font-face',
236 read: getSVGAttribute('cap-height'),
237 },
238 {
239 name: 'capture',
240 tagName: 'input',
241 overrideStringValue: 'environment',
242 read: getAttribute('capture'),
243 },
244 {name: 'cellPadding', tagName: 'table'},
245 {name: 'cellSpacing', tagName: 'table'},
246 {
247 name: 'challenge',
248 tagName: 'keygen',
249 read: getAttribute('challenge'), // The property is not supported in Chrome.
250 },
251 {name: 'charSet', tagName: 'script', read: getProperty('charset')},
252 {name: 'checked', tagName: 'input', extraProps: {onChange() {}}},
253 {name: 'Checked', tagName: 'input', read: getAttribute('Checked')},
254 {name: 'Children', read: getAttribute('children')},
255 {name: 'children'},
256 {
257 name: 'cite',
258 tagName: 'blockquote',
259 overrideStringValue: 'https://reactjs.com/',
260 },
261 {name: 'class', read: getAttribute('class')},
262 {name: 'classID', tagName: 'object', read: getAttribute('classid')},
263 {name: 'className'},
264 {name: 'clip', tagName: 'svg', read: getAttribute('clip')},
265 {
266 name: 'clip-path',
267 containerTagName: 'svg',
268 tagName: 'path',
269 read: getSVGAttribute('clip-path'),
270 },
271 {
272 name: 'clipPath',
273 containerTagName: 'svg',
274 tagName: 'path',
275 read: getSVGAttribute('clip-path'),
276 },
277 {
278 name: 'clipPathUnits',
279 containerTagName: 'svg',
280 tagName: 'clipPath',
281 overrideStringValue: 'objectBoundingBox',
282 read: getSVGProperty('clipPathUnits'),
283 },
284 {
285 name: 'clip-rule',
286 containerTagName: 'svg',
287 tagName: 'path',
288 read: getSVGAttribute('clip-rule'),
289 },
290 {
291 name: 'clipRule',
292 containerTagName: 'svg',
293 tagName: 'path',
294 read: getSVGAttribute('clip-rule'),
295 },
296 {
297 name: 'color',
298 containerTagName: 'svg',
299 tagName: 'text',
300 read: getSVGAttribute('color'),
301 },
302 {
303 name: 'color-interpolation',
304 containerTagName: 'svg',
305 tagName: 'animate',
306 overrideStringValue: 'sRGB',
307 read: getSVGAttribute('color-interpolation'),
308 },
309 {
310 name: 'colorInterpolation',
311 containerTagName: 'svg',
312 tagName: 'animate',
313 overrideStringValue: 'sRGB',
314 read: getSVGAttribute('color-interpolation'),
315 },
316 {
317 name: 'color-interpolation-filters',
318 containerTagName: 'svg',
319 tagName: 'feComposite',
320 overrideStringValue: 'sRGB',
321 read: getSVGAttribute('color-interpolation-filters'),
322 },
323 {
324 name: 'colorInterpolationFilters',
325 containerTagName: 'svg',
326 tagName: 'feComposite',
327 overrideStringValue: 'sRGB',
328 read: getSVGAttribute('color-interpolation-filters'),
329 },
330 {
331 name: 'color-profile',
332 containerTagName: 'svg',
333 tagName: 'image',
334 overrideStringValue: 'sRGB',
335 read: getSVGAttribute('color-profile'),
336 },
337 {
338 name: 'colorProfile',
339 containerTagName: 'svg',
340 tagName: 'image',
341 overrideStringValue: 'sRGB',
342 read: getSVGAttribute('color-profile'),
343 },
344 {
345 name: 'color-rendering',
346 containerTagName: 'svg',
347 tagName: 'animate',
348 overrideStringValue: 'optimizeSpeed',
349 read: getSVGAttribute('color-rendering'),
350 },
351 {
352 name: 'colorRendering',
353 containerTagName: 'svg',
354 tagName: 'animate',
355 overrideStringValue: 'optimizeSpeed',
356 read: getSVGAttribute('color-rendering'),
357 },
358 {name: 'cols', tagName: 'textarea'},
359 {name: 'colSpan', containerTagName: 'tr', tagName: 'td'},
360 {name: 'content', containerTagName: 'head', tagName: 'meta'},
361 {name: 'contentEditable'},
362 {
363 name: 'contentScriptType',
364 tagName: 'svg',
365 read: getSVGAttribute('contentScriptType'),
366 },
367 {
368 name: 'contentStyleType',
369 tagName: 'svg',
370 read: getSVGAttribute('contentStyleType'),
371 },
372 {name: 'contextMenu', read: getAttribute('contextmenu')}, // TODO: Read the property by rendering a menu with the ID.
373 {name: 'controls', tagName: 'video'},
374 {name: 'coords', tagName: 'a'},
375 {name: 'crossOrigin', tagName: 'script'},
376 {name: 'cursor', tag: 'svg', read: getAttribute('cursor')},
377 {
378 name: 'cx',
379 containerTagName: 'svg',
380 tagName: 'circle',
381 overrideStringValue: '10px',
382 read: getSVGProperty('cx'),
383 },
384 {
385 name: 'cy',
386 containerTagName: 'svg',
387 tagName: 'circle',
388 overrideStringValue: '10%',
389 read: getSVGProperty('cy'),
390 },
391 {
392 name: 'd',
393 containerTagName: 'svg',
394 tagName: 'path',
395 read: getSVGAttribute('d'),
396 },
397 {
398 name: 'dangerouslySetInnerHTML',
399 read: getAttribute('dangerouslySetInnerHTML'),
400 },
401 {
402 name: 'DangerouslySetInnerHTML',
403 read: getAttribute('DangerouslySetInnerHTML'),
404 },
405 {name: 'data', read: getAttribute('data')},
406 {name: 'data-', read: getAttribute('data-')},
407 {name: 'data-unknownattribute', read: getAttribute('data-unknownattribute')},
408 {name: 'datatype', read: getAttribute('datatype')},
409 {
410 name: 'dateTime',
411 tagName: 'time',
412 overrideStringValue: '2001-05-15T19:00',
413 read: getAttribute('datetime'),
414 },
415 {
416 name: 'decelerate',
417 containerTagName: 'svg',
418 tagName: 'animate',
419 read: getSVGAttribute('decelerate'),
420 },
421 {name: 'default', tagName: 'track'},
422 {
423 name: 'defaultchecked',
424 tagName: 'input',
425 read: getAttribute('defaultchecked'),
426 },
427 {name: 'defaultChecked', tagName: 'input'},
428 {name: 'defaultValue', tagName: 'input'},
429 {name: 'defaultValuE', tagName: 'input', read: getAttribute('defaultValuE')},
430 {name: 'defer', tagName: 'script'},
431 {
432 name: 'descent',
433 containerTagName: 'svg',
434 tagName: 'font-face',
435 read: getSVGAttribute('descent'),
436 },
437 {
438 name: 'diffuseConstant',
439 containerTagName: 'svg',
440 tagName: 'feDiffuseLighting',
441 read: getSVGProperty('diffuseConstant'),
442 },
443 {name: 'dir', overrideStringValue: 'rtl'},
444 {
445 name: 'direction',
446 containerTagName: 'svg',
447 tagName: 'text',
448 overrideStringValue: 'rtl',
449 read: getSVGAttribute('direction'),
450 },
451 {name: 'disabled', tagName: 'input'},
452 {
453 name: 'disablePictureInPicture',
454 tagName: 'video',
455 read: getProperty('disablepictureinpicture'),
456 },
457 {
458 name: 'disableRemotePlayback',
459 tagName: 'video',
460 read: getProperty('disableremoteplayback'),
461 },
462 {
463 name: 'display',
464 tagName: 'svg',
465 overrideStringValue: 'list-item',
466 read: getAttribute('display'),
467 },
468 {
469 name: 'divisor',
470 containerTagName: 'svg',
471 tagName: 'feConvolveMatrix',
472 read: getSVGProperty('divisor'),
473 },
474 {
475 name: 'dominant-baseline',
476 containerTagName: 'svg',
477 tagName: 'text',
478 read: getSVGAttribute('dominant-baseline'),
479 },
480 {
481 name: 'dominantBaseline',
482 containerTagName: 'svg',
483 tagName: 'text',
484 read: getSVGAttribute('dominant-baseline'),
485 },
486 {name: 'download', tagName: 'a'},
487 {name: 'dOwNlOaD', tagName: 'a', read: getAttribute('dOwNlOaD')},
488 {name: 'draggable'},
489 {
490 name: 'dur',
491 containerTagName: 'svg',
492 tagName: 'animate',
493 read: getSVGAttribute('dur'),
494 },
495 {
496 name: 'dx',
497 containerTagName: 'svg',
498 tagName: 'text',
499 overrideStringValue: '1pt 2px 3em',
500 read: getSVGProperty('dx'),
501 },
502 {
503 name: 'dX',
504 containerTagName: 'svg',
505 tagName: 'text',
506 overrideStringValue: '1pt 2px 3em',
507 read: getSVGProperty('dx'),
508 },
509 {
510 name: 'dy',
511 containerTagName: 'svg',
512 tagName: 'text',
513 overrideStringValue: '1 2 3',
514 read: getSVGProperty('dy'),
515 },
516 {
517 name: 'dY',
518 containerTagName: 'svg',
519 tagName: 'text',
520 overrideStringValue: '1 2 3',
521 read: getSVGProperty('dy'),
522 },
523 {
524 name: 'edgeMode',
525 containerTagName: 'svg',
526 tagName: 'feConvolveMatrix',
527 overrideStringValue: 'wrap',
528 read: getSVGProperty('edgeMode'),
529 },
530 {
531 name: 'elevation',
532 containerTagName: 'svg',
533 tagName: 'feDistantLight',
534 read: getSVGProperty('elevation'),
535 },
536 {
537 name: 'enable-background',
538 containerTagName: 'svg',
539 tagName: 'path',
540 read: getSVGAttribute('enable-background'),
541 },
542 {
543 name: 'enableBackground',
544 containerTagName: 'svg',
545 tagName: 'path',
546 read: getSVGAttribute('enable-background'),
547 },
548 {
549 name: 'encType',
550 tagName: 'form',
551 overrideStringValue: 'text/plain',
552 read: getProperty('enctype'),
553 },
554 {
555 name: 'end',
556 containerTagName: 'svg',
557 tagName: 'animate',
558 read: getSVGAttribute('end'),
559 },
560 {
561 name: 'enterKeyHint',
562 tagName: 'input',
563 read: getProperty('enterKeyHint'),
564 },
565 {
566 name: 'exponent',
567 read: getSVGProperty('exponent'),
568 containerTagName: 'svg',
569 tagName: 'feFuncA',
570 },
571 {
572 name: 'externalResourcesRequired',
573 containerTagName: 'svg',
574 tagName: 'path',
575 read: getSVGAttribute('externalResourcesRequired'),
576 },
577 {
578 name: 'fetchPriority',
579 overrideStringValue: 'high',
580 tagName: 'img',
581 read: getProperty('fetchPriority'),
582 },
583 {
584 name: 'fetchpriority',
585 overrideStringValue: 'high',
586 tagName: 'img',
587 read: getProperty('fetchPriority'),
588 },
589 {
590 name: 'fetchPriority',
591 overrideStringValue: 'high',
592 tagName: 'link',
593 read: getProperty('fetchPriority'),
594 },
595 {
596 name: 'fill',
597 containerTagName: 'svg',
598 tagName: 'path',
599 read: getSVGAttribute('fill'),
600 },
601 {
602 name: 'fillOpacity',
603 containerTagName: 'svg',
604 tagName: 'circle',
605 read: getSVGAttribute('fill-opacity'),
606 },
607 {
608 name: 'fill-opacity',
609 containerTagName: 'svg',
610 tagName: 'circle',
611 read: getSVGAttribute('fill-opacity'),
612 },
613 {
614 name: 'fillRule',
615 containerTagName: 'svg',
616 tagName: 'circle',
617 read: getSVGAttribute('fill-rule'),
618 },
619 {
620 name: 'fill-rule',
621 containerTagName: 'svg',
622 tagName: 'circle',
623 read: getSVGAttribute('fill-rule'),
624 },
625 {
626 name: 'filter',
627 containerTagName: 'svg',
628 tagName: 'g',
629 read: getSVGAttribute('filter'),
630 },
631 {
632 name: 'filterRes',
633 containerTagName: 'svg',
634 tagName: 'filter',
635 read: getSVGAttribute('filterRes'),
636 },
637 {
638 name: 'filterUnits',
639 containerTagName: 'svg',
640 tagName: 'filter',
641 overrideStringValue: 'userSpaceOnUse',
642 read: getSVGProperty('filterUnits'),
643 },
644 {
645 name: 'flood-color',
646 containerTagName: 'svg',
647 tagName: 'feflood',
648 overrideStringValue: 'currentColor',
649 read: getSVGAttribute('flood-color'),
650 },
651 {
652 name: 'floodColor',
653 containerTagName: 'svg',
654 tagName: 'feflood',
655 overrideStringValue: 'currentColor',
656 read: getSVGAttribute('flood-color'),
657 },
658 {
659 name: 'flood-opacity',
660 containerTagName: 'svg',
661 tagName: 'feflood',
662 overrideStringValue: 'inherit',
663 read: getSVGAttribute('flood-opacity'),
664 },
665 {
666 name: 'floodOpacity',
667 containerTagName: 'svg',
668 tagName: 'feflood',
669 overrideStringValue: 'inherit',
670 read: getSVGAttribute('flood-opacity'),
671 },
672 {name: 'focusable', tagName: 'p', read: getAttribute('focusable')},
673 {
674 name: 'font-family',
675 read: getSVGAttribute('font-family'),
676 containerTagName: 'svg',
677 tagName: 'font-face',
678 },
679 {
680 name: 'font-size',
681 read: getSVGAttribute('font-size'),
682 containerTagName: 'svg',
683 tagName: 'font-face',
684 },
685 {
686 name: 'font-size-adjust',
687 containerTagName: 'svg',
688 tagName: 'text',
689 read: getSVGAttribute('font-size-adjust'),
690 },
691 {
692 name: 'font-stretch',
693 read: getSVGAttribute('font-stretch'),
694 containerTagName: 'svg',
695 tagName: 'font-face',
696 },
697 {
698 name: 'font-style',
699 read: getSVGAttribute('font-style'),
700 containerTagName: 'svg',
701 tagName: 'font-face',
702 },
703 {
704 name: 'font-variant',
705 read: getSVGAttribute('font-variant'),
706 containerTagName: 'svg',
707 tagName: 'font-face',
708 },
709 {
710 name: 'font-weight',
711 read: getSVGAttribute('font-weight'),
712 containerTagName: 'svg',
713 tagName: 'font-face',
714 },
715 {
716 name: 'fontFamily',
717 read: getSVGAttribute('font-family'),
718 containerTagName: 'svg',
719 tagName: 'font-face',
720 },
721 {
722 name: 'fontSize',
723 read: getSVGAttribute('font-size'),
724 containerTagName: 'svg',
725 tagName: 'font-face',
726 },
727 {
728 name: 'fontSizeAdjust',
729 containerTagName: 'svg',
730 tagName: 'text',
731 read: getSVGAttribute('font-size-adjust'),
732 },
733 {
734 name: 'fontStretch',
735 read: getSVGAttribute('font-stretch'),
736 containerTagName: 'svg',
737 tagName: 'font-face',
738 },
739 {
740 name: 'fontStyle',
741 read: getSVGAttribute('font-style'),
742 containerTagName: 'svg',
743 tagName: 'font-face',
744 },
745 {
746 name: 'fontVariant',
747 read: getSVGAttribute('font-variant'),
748 containerTagName: 'svg',
749 tagName: 'font-face',
750 },
751 {
752 name: 'fontWeight',
753 read: getSVGAttribute('font-weight'),
754 containerTagName: 'svg',
755 tagName: 'font-face',
756 },
757 {name: 'for', tagName: 'label', read: getProperty('htmlFor')},
758 {name: 'fOr', tagName: 'label', read: getProperty('htmlFor')},
759 {name: 'form', read: getAttribute('form')}, // TODO: Read the property by rendering into a form with i
760 {
761 name: 'formAction',
762 tagName: 'input',
763 overrideStringValue: 'https://reactjs.com',
764 },
765 {
766 name: 'format',
767 read: getSVGAttribute('format'),
768 containerTagName: 'svg',
769 tagName: 'altGlyph',
770 },
771 {name: 'formEncType', tagName: 'input', read: getProperty('formEnctype')},
772 {name: 'formMethod', tagName: 'input', overrideStringValue: 'POST'},
773 {name: 'formNoValidate', tagName: 'input'},
774 {name: 'formTarget', tagName: 'input'},
775 {name: 'frameBorder', tagName: 'iframe'},
776 {
777 name: 'from',
778 read: getSVGAttribute('from'),
779 containerTagName: 'svg',
780 tagName: 'animate',
781 },
782 {
783 name: 'fx',
784 read: getSVGProperty('fx'),
785 containerTagName: 'svg',
786 overrideStringValue: '10px',
787 tagName: 'radialGradient',
788 },
789 {
790 name: 'fX',
791 containerTagName: 'svg',
792 tagName: 'radialGradient',
793 overrideStringValue: '10px',
794 read: getSVGProperty('fx'),
795 },
796 {
797 name: 'fY',
798 containerTagName: 'svg',
799 tagName: 'radialGradient',
800 overrideStringValue: '20em',
801 read: getSVGProperty('fy'),
802 },
803 {
804 name: 'fy',
805 read: getSVGProperty('fy'),
806 containerTagName: 'svg',
807 overrideStringValue: '20em',
808 tagName: 'radialGradient',
809 },
810 {
811 name: 'G1',
812 containerTagName: 'svg',
813 tagName: 'hkern',
814 read: getSVGAttribute('g1'),
815 },
816 {
817 name: 'g1',
818 read: getSVGAttribute('g1'),
819 containerTagName: 'svg',
820 tagName: 'hkern',
821 },
822 {
823 name: 'G2',
824 containerTagName: 'svg',
825 tagName: 'hkern',
826 read: getSVGAttribute('g2'),
827 },
828 {
829 name: 'g2',
830 read: getSVGAttribute('g2'),
831 containerTagName: 'svg',
832 tagName: 'hkern',
833 },
834 {
835 name: 'glyph-name',
836 read: getSVGAttribute('glyph-name'),
837 containerTagName: 'svg',
838 tagName: 'glyph',
839 },
840 {
841 name: 'glyph-orientation-horizontal',
842 containerTagName: 'svg',
843 tagName: 'text',
844 read: getSVGAttribute('glyph-orientation-horizontal'),
845 },
846 {
847 name: 'glyph-orientation-vertical',
848 containerTagName: 'svg',
849 tagName: 'text',
850 read: getSVGAttribute('glyph-orientation-vertical'),
851 },
852 {
853 name: 'glyphName',
854 read: getSVGAttribute('glyph-name'),
855 containerTagName: 'svg',
856 tagName: 'glyph',
857 },
858 {
859 name: 'glyphOrientationHorizontal',
860 containerTagName: 'svg',
861 tagName: 'text',
862 read: getSVGAttribute('glyph-orientation-horizontal'),
863 },
864 {
865 name: 'glyphOrientationVertical',
866 containerTagName: 'svg',
867 tagName: 'text',
868 read: getSVGAttribute('glyph-orientation-vertical'),
869 },
870 {
871 name: 'glyphRef',
872 read: getSVGAttribute('glyph-ref'),
873 containerTagName: 'svg',
874 tagName: 'altGlyph',
875 },
876 {
877 name: 'gradientTransform',
878 read: getSVGProperty('gradientTransform'),
879 containerTagName: 'svg',
880 overrideStringValue:
881 'translate(-10,-20) scale(2) rotate(45) translate(5,10)',
882 tagName: 'linearGradient',
883 },
884 {
885 name: 'gradientUnits',
886 read: getSVGProperty('gradientUnits'),
887 containerTagName: 'svg',
888 overrideStringValue: 'userSpaceOnUse',
889 tagName: 'linearGradient',
890 },
891 {
892 name: 'hanging',
893 read: getSVGAttribute('hanging'),
894 containerTagName: 'svg',
895 tagName: 'font-face',
896 },
897 // Disabled because it crashes other tests with React 15.
898 // TODO: re-enable when we no longer compare to 15.
899 // {name: 'hasOwnProperty', read: getAttribute('hasOwnProperty')},
900 {name: 'headers', containerTagName: 'tr', tagName: 'td'},
901 {name: 'height', tagName: 'img'},
902 {
903 name: 'height',
904 containerTagName: 'svg',
905 tagName: 'rect',
906 read: getSVGProperty('height'),
907 overrideStringValue: '100%',
908 },
909 {name: 'hidden', overrideStringValue: 'until-found'},
910 {name: 'high', tagName: 'meter'},
911 {
912 name: 'horiz-adv-x',
913 read: getSVGAttribute('horiz-adv-x'),
914 containerTagName: 'svg',
915 tagName: 'font',
916 },
917 {
918 name: 'horiz-origin-x',
919 read: getSVGAttribute('horiz-origin-x'),
920 containerTagName: 'svg',
921 tagName: 'font',
922 },
923 {
924 name: 'horizAdvX',
925 read: getSVGAttribute('horiz-adv-x'),
926 containerTagName: 'svg',
927 tagName: 'font',
928 },
929 {
930 name: 'horizOriginX',
931 read: getSVGAttribute('horiz-origin-x'),
932 containerTagName: 'svg',
933 tagName: 'font',
934 },
935 {name: 'href', tagName: 'a', overrideStringValue: 'https://reactjs.com'},
936 {name: 'hrefLang', read: getAttribute('hreflang')},
937 {name: 'htmlFor', tagName: 'label'},
938 {
939 name: 'http-equiv',
940 containerTagName: 'head',
941 tagName: 'meta',
942 read: getProperty('httpEquiv'),
943 },
944 {name: 'httpEquiv', containerTagName: 'head', tagName: 'meta'},
945 {name: 'icon', tagName: 'command', read: getAttribute('icon')},
946 {name: 'id'},
947 {name: 'ID', read: getProperty('id')},
948 {
949 name: 'ideographic',
950 read: getSVGAttribute('ideographic'),
951 containerTagName: 'svg',
952 tagName: 'font-face',
953 },
954 {
955 name: 'image-rendering',
956 tagName: 'svg',
957 read: getSVGAttribute('image-rendering'),
958 },
959 {
960 name: 'imageRendering',
961 tagName: 'svg',
962 read: getSVGAttribute('image-rendering'),
963 },
964 {name: 'imageSizes', tagName: 'link', read: getProperty('imageSizes')},
965 {name: 'imageSrcSet', tagName: 'link', read: getProperty('imageSrcset')},
966 {
967 name: 'in',
968 read: getSVGAttribute('in'),
969 containerTagName: 'svg',
970 tagName: 'feBlend',
971 },
972 {name: 'inert'},
973 {
974 name: 'in2',
975 read: getSVGProperty('in2'),
976 containerTagName: 'svg',
977 tagName: 'feBlend',
978 },
979 {name: 'initialChecked', read: getAttribute('initialchecked')},
980 {name: 'initialValue', read: getAttribute('initialvalue')},
981 {name: 'inlist', read: getAttribute('inlist')},
982 {name: 'inputMode', tagName: 'input'},
983 {name: 'integrity', tagName: 'script'},
984 {
985 name: 'intercept',
986 read: getSVGProperty('intercept'),
987 containerTagName: 'svg',
988 tagName: 'feFuncA',
989 },
990 {
991 name: 'is',
992 tagName: 'button',
993 overrideStringValue: 'x-test-element',
994 read: getAttribute('is'), // TODO: This could check if this is an extended custom element but this is a controversial spec.
995 },
996 {name: 'itemID', read: getAttribute('itemid')},
997 {name: 'itemProp', read: getAttribute('itemprop')},
998 {name: 'itemRef', read: getAttribute('itemref')},
999 {name: 'itemScope', read: getAttribute('itemscope')},
1000 {name: 'itemType', read: getAttribute('itemtype')},
1001 {
1002 name: 'k',
1003 read: getSVGAttribute('k'),
1004 containerTagName: 'svg',
1005 tagName: 'hkern',
1006 },
1007 {
1008 name: 'K',
1009 containerTagName: 'svg',
1010 tagName: 'hkern',
1011 read: getSVGAttribute('k'),
1012 },
1013 {
1014 name: 'K1',
1015 containerTagName: 'svg',
1016 tagName: 'feComposite',
1017 read: getSVGProperty('k1'),
1018 },
1019 {
1020 name: 'k1',
1021 read: getSVGProperty('k1'),
1022 containerTagName: 'svg',
1023 tagName: 'feComposite',
1024 },
1025 {
1026 name: 'k2',
1027 read: getSVGProperty('k2'),
1028 containerTagName: 'svg',
1029 tagName: 'feComposite',
1030 },
1031 {
1032 name: 'k3',
1033 read: getSVGProperty('k3'),
1034 containerTagName: 'svg',
1035 tagName: 'feComposite',
1036 },
1037 {
1038 name: 'k4',
1039 read: getSVGProperty('k4'),
1040 containerTagName: 'svg',
1041 tagName: 'feComposite',
1042 },
1043 {
1044 name: 'kernelMatrix',
1045 read: getSVGProperty('kernelMatrix'),
1046 containerTagName: 'svg',
1047 tagName: 'feConvolveMatrix',
1048 overrideStringValue: '1 2 3,4',
1049 },
1050 {
1051 name: 'kernelUnitLength',
1052 read: getSVGAttribute('kernelUnitLength'),
1053 containerTagName: 'svg',
1054 tagName: 'feConvolveMatrix',
1055 },
1056 {
1057 name: 'kerning',
1058 containerTagName: 'svg',
1059 tagName: 'text',
1060 read: getSVGAttribute('kerning'),
1061 },
1062 {name: 'keyParams', read: getAttribute('keyParams')},
1063 {
1064 name: 'keyPoints',
1065 read: getSVGAttribute('keyPoints'),
1066 containerTagName: 'svg',
1067 tagName: 'animateMotion',
1068 },
1069 {
1070 name: 'keySplines',
1071 read: getSVGAttribute('keySplines'),
1072 containerTagName: 'svg',
1073 tagName: 'animate',
1074 },
1075 {
1076 name: 'keyTimes',
1077 read: getSVGAttribute('keyTimes'),
1078 containerTagName: 'svg',
1079 tagName: 'animate',
1080 },
1081 {name: 'keyType', read: getAttribute('keyType')},
1082 {name: 'kind', tagName: 'track', overrideStringValue: 'captions'},
1083 {name: 'label', tagName: 'track'},
1084 {name: 'LANG', read: getProperty('lang')},
1085 {name: 'lang'},
1086 {name: 'lang', containerTagName: 'document', tagName: 'html'},
1087 {name: 'length', read: getAttribute('length')},
1088 {
1089 name: 'lengthAdjust',
1090 read: getSVGProperty('lengthAdjust'),
1091 containerTagName: 'svg',
1092 tagName: 'text',
1093 overrideStringValue: 'spacingAndGlyphs',
1094 },
1095 {
1096 name: 'letter-spacing',
1097 containerTagName: 'svg',
1098 tagName: 'text',
1099 read: getSVGAttribute('letter-spacing'),
1100 },
1101 {
1102 name: 'letterSpacing',
1103 containerTagName: 'svg',
1104 tagName: 'text',
1105 read: getSVGAttribute('letter-spacing'),
1106 },
1107 {
1108 name: 'lighting-color',
1109 containerTagName: 'svg',
1110 tagName: 'feDiffuseLighting',
1111 read: getSVGAttribute('lighting-color'),
1112 },
1113 {
1114 name: 'lightingColor',
1115 containerTagName: 'svg',
1116 tagName: 'feDiffuseLighting',
1117 read: getSVGAttribute('lighting-color'),
1118 },
1119 {
1120 name: 'limitingConeAngle',
1121 read: getSVGProperty('limitingConeAngle'),
1122 containerTagName: 'svg',
1123 tagName: 'feSpotLight',
1124 },
1125 {name: 'list', read: getAttribute('list')}, // TODO: This should match the ID of a datalist element and then read property.
1126 {
1127 name: 'local',
1128 read: getSVGAttribute('local'),
1129 containerTagName: 'svg',
1130 tagName: 'color-profile',
1131 },
1132 {name: 'loop', tagName: 'audio'},
1133 {name: 'low', tagName: 'meter'},
1134 {name: 'manifest', read: getAttribute('manifest')},
1135 {name: 'marginHeight', containerTagName: 'frameset', tagName: 'frame'},
1136 {name: 'marginWidth', containerTagName: 'frameset', tagName: 'frame'},
1137 {
1138 name: 'marker-end',
1139 containerTagName: 'svg',
1140 tagName: 'line',
1141 read: getSVGAttribute('marker-end'),
1142 },
1143 {
1144 name: 'marker-mid',
1145 containerTagName: 'svg',
1146 tagName: 'line',
1147 read: getSVGAttribute('marker-mid'),
1148 },
1149 {
1150 name: 'marker-start',
1151 containerTagName: 'svg',
1152 tagName: 'line',
1153 read: getSVGAttribute('marker-start'),
1154 },
1155 {
1156 name: 'markerEnd',
1157 containerTagName: 'svg',
1158 tagName: 'line',
1159 read: getSVGAttribute('marker-end'),
1160 },
1161 {
1162 name: 'markerHeight',
1163 read: getSVGProperty('markerHeight'),
1164 containerTagName: 'svg',
1165 tagName: 'marker',
1166 },
1167 {
1168 name: 'markerMid',
1169 containerTagName: 'svg',
1170 tagName: 'line',
1171 read: getSVGAttribute('marker-mid'),
1172 },
1173 {
1174 name: 'markerStart',
1175 containerTagName: 'svg',
1176 tagName: 'line',
1177 read: getSVGAttribute('marker-start'),
1178 },
1179 {
1180 name: 'markerUnits',
1181 read: getSVGProperty('markerUnits'),
1182 containerTagName: 'svg',
1183 tagName: 'marker',
1184 },
1185 {
1186 name: 'markerWidth',
1187 read: getSVGProperty('markerWidth'),
1188 containerTagName: 'svg',
1189 tagName: 'marker',
1190 },
1191 {
1192 name: 'mask',
1193 containerTagName: 'svg',
1194 tagName: 'path',
1195 read: getSVGAttribute('mask'),
1196 },
1197 {
1198 name: 'maskContentUnits',
1199 read: getSVGProperty('maskContentUnits'),
1200 containerTagName: 'svg',
1201 tagName: 'mask',
1202 overrideStringValue: 'objectBoundingBox',
1203 },
1204 {
1205 name: 'maskUnits',
1206 read: getSVGProperty('maskUnits'),
1207 containerTagName: 'svg',
1208 tagName: 'mask',
1209 overrideStringValue: 'userSpaceOnUse',
1210 },
1211 {
1212 name: 'mathematical',
1213 read: getSVGAttribute('mathematical'),
1214 containerTagName: 'svg',
1215 tagName: 'font-face',
1216 },
1217 {name: 'max', tagName: 'input'},
1218 {name: 'max', tagName: 'meter'},
1219 {name: 'max', tagName: 'progress'},
1220 {
1221 name: 'max',
1222 containerTagName: 'svg',
1223 tagName: 'animate',
1224 read: getSVGAttribute('max'),
1225 },
1226 {name: 'maxLength', tagName: 'textarea'},
1227 {name: 'media', tagName: 'link'},
1228 {
1229 name: 'media',
1230 containerTagName: 'svg',
1231 tagName: 'style',
1232 read: getSVGProperty('media'),
1233 },
1234 {name: 'mediaGroup', tagName: 'video', read: getAttribute('mediagroup')}, // TODO: Not yet implemented in Chrome.
1235 {name: 'method', tagName: 'form', overrideStringValue: 'POST'},
1236 {
1237 name: 'method',
1238 containerTagName: 'svg',
1239 tagName: 'textPath',
1240 read: getSVGProperty('method'),
1241 overrideStringValue: 'stretch',
1242 },
1243 {name: 'min', tagName: 'input'},
1244 {name: 'min', tagName: 'meter'},
1245 {
1246 name: 'min',
1247 containerTagName: 'svg',
1248 tagName: 'animate',
1249 read: getSVGAttribute('min'),
1250 },
1251 {name: 'minLength', tagName: 'input'},
1252 {
1253 name: 'mode',
1254 read: getSVGProperty('mode'),
1255 containerTagName: 'svg',
1256 tagName: 'feBlend',
1257 overrideStringValue: 'multiply',
1258 },
1259 {name: 'multiple', tagName: 'select'},
1260 {name: 'muted', tagName: 'video'},
1261 {name: 'name', tagName: 'input'},
1262 {
1263 name: 'name',
1264 containerTagName: 'svg',
1265 tagName: 'color-profile',
1266 read: getSVGAttribute('color-profile'),
1267 },
1268 {name: 'noModule', tagName: 'script'},
1269 {name: 'nonce', read: getAttribute('nonce')},
1270 {name: 'noValidate', tagName: 'form'},
1271 {
1272 name: 'numOctaves',
1273 read: getSVGProperty('numOctaves'),
1274 containerTagName: 'svg',
1275 tagName: 'feTurbulence',
1276 },
1277 {
1278 name: 'offset',
1279 read: getSVGProperty('offset'),
1280 containerTagName: 'svg',
1281 tagName: 'stop',
1282 },
1283 {name: 'on-click'}, // TODO: Check for event subscriptions
1284 {name: 'on-unknownevent'}, // TODO: Check for event subscriptions
1285 {name: 'onclick'}, // TODO: Check for event subscriptions
1286 {name: 'onClick'}, // TODO: Check for event subscriptions
1287 {name: 'onunknownevent'}, // TODO: Check for event subscriptions
1288 {name: 'onUnknownEvent'}, // TODO: Check for event subscriptions
1289 {
1290 name: 'opacity',
1291 containerTagName: 'svg',
1292 tagName: 'path',
1293 read: getSVGAttribute('opacity'),
1294 },
1295 {name: 'open', tagName: 'details'},
1296 {
1297 name: 'operator',
1298 read: getSVGProperty('operator'),
1299 containerTagName: 'svg',
1300 tagName: 'feComposite',
1301 overrideStringValue: 'xor',
1302 },
1303 {name: 'optimum', tagName: 'meter'},
1304 {
1305 name: 'order',
1306 read: getSVGAttribute('order'),
1307 containerTagName: 'svg',
1308 tagName: 'feConvolveMatrix',
1309 },
1310 {
1311 name: 'orient',
1312 read: getSVGAttribute('orient'),
1313 containerTagName: 'svg',
1314 tagName: 'marker',
1315 },
1316 {
1317 name: 'orientation',
1318 read: getSVGAttribute('orientation'),
1319 containerTagName: 'svg',
1320 tagName: 'glyph',
1321 },
1322 {
1323 name: 'origin',
1324 read: getSVGAttribute('origin'),
1325 containerTagName: 'svg',
1326 tagName: 'animateMotion',
1327 },
1328 {
1329 name: 'overflow',
1330 containerTagName: 'svg',
1331 tagName: 'path',
1332 read: getSVGAttribute('overflow'),
1333 },
1334 {
1335 name: 'overline-position',
1336 read: getSVGAttribute('overline-position'),
1337 containerTagName: 'svg',
1338 tagName: 'font-face',
1339 },
1340 {
1341 name: 'overline-thickness',
1342 read: getSVGAttribute('overline-thickness'),
1343 containerTagName: 'svg',
1344 tagName: 'font-face',
1345 },
1346 {
1347 name: 'overlinePosition',
1348 read: getSVGAttribute('overline-position'),
1349 containerTagName: 'svg',
1350 tagName: 'font-face',
1351 },
1352 {
1353 name: 'overlineThickness',
1354 read: getSVGAttribute('overline-thickness'),
1355 containerTagName: 'svg',
1356 tagName: 'font-face',
1357 },
1358 {
1359 name: 'paint-order',
1360 containerTagName: 'svg',
1361 tagName: 'path',
1362 read: getSVGAttribute('paint-order'),
1363 },
1364 {
1365 name: 'paintOrder',
1366 containerTagName: 'svg',
1367 tagName: 'path',
1368 read: getSVGAttribute('paint-order'),
1369 },
1370 {
1371 name: 'panose-1',
1372 read: getSVGAttribute('panose-1'),
1373 containerTagName: 'svg',
1374 tagName: 'font-face',
1375 },
1376 {
1377 name: 'panose1',
1378 containerTagName: 'svg',
1379 tagName: 'font-face',
1380 read: getSVGAttribute('panose-1'),
1381 },
1382 {
1383 name: 'pathLength',
1384 read: getSVGProperty('pathLength'),
1385 containerTagName: 'svg',
1386 tagName: 'path',
1387 },
1388 {name: 'pattern', tagName: 'input'},
1389 {
1390 name: 'patternContentUnits',
1391 read: getSVGProperty('patternContentUnits'),
1392 containerTagName: 'svg',
1393 tagName: 'pattern',
1394 overrideStringValue: 'objectBoundingBox',
1395 },
1396 {
1397 name: 'patternTransform',
1398 read: getSVGProperty('patternTransform'),
1399 containerTagName: 'svg',
1400 tagName: 'pattern',
1401 overrideStringValue:
1402 'translate(-10,-20) scale(2) rotate(45) translate(5,10)',
1403 },
1404 {
1405 name: 'patternUnits',
1406 read: getSVGProperty('patternUnits'),
1407 containerTagName: 'svg',
1408 tagName: 'pattern',
1409 overrideStringValue: 'userSpaceOnUse',
1410 },
1411 {name: 'placeholder', tagName: 'input'},
1412 {name: 'playsInline', read: getAttribute('playsinline')},
1413 {
1414 name: 'pointer-events',
1415 containerTagName: 'svg',
1416 tagName: 'path',
1417 read: getSVGAttribute('pointer-events'),
1418 },
1419 {
1420 name: 'pointerEvents',
1421 containerTagName: 'svg',
1422 tagName: 'path',
1423 read: getSVGAttribute('pointer-events'),
1424 },
1425 {
1426 name: 'points',
1427 read: getSVGProperty('points'),
1428 containerTagName: 'svg',
1429 tagName: 'polygon',
1430 overrideStringValue: '350,75 379,161 469,161',
1431 },
1432 {
1433 name: 'pointsAtX',
1434 read: getSVGProperty('pointsAtX'),
1435 containerTagName: 'svg',
1436 tagName: 'feSpotLight',
1437 },
1438 {
1439 name: 'pointsAtY',
1440 read: getSVGProperty('pointsAtY'),
1441 containerTagName: 'svg',
1442 tagName: 'feSpotLight',
1443 },
1444 {
1445 name: 'pointsAtZ',
1446 read: getSVGProperty('pointsAtZ'),
1447 containerTagName: 'svg',
1448 tagName: 'feSpotLight',
1449 },
1450 {name: 'popover', overrideStringValue: 'manual'},
1451 {
1452 name: 'popoverTarget',
1453 read: element => {
1454 document.body.appendChild(element);
1455 try {
1456 // trigger and target need to be connected for `popoverTargetElement` to read the actual value.
1457 return element.popoverTargetElement;
1458 } finally {
1459 document.body.removeChild(element);
1460 }
1461 },
1462 overrideStringValue: 'popover-target',
1463 tagName: 'button',
1464 },
1465 {name: 'popoverTargetAction', overrideStringValue: 'show', tagName: 'button'},
1466 {
1467 name: 'poster',
1468 tagName: 'video',
1469 overrideStringValue: 'https://reactjs.com',
1470 },
1471 {name: 'prefix', read: getAttribute('prefix')},
1472 {name: 'preload', tagName: 'video', overrideStringValue: 'none'},
1473 {
1474 name: 'preserveAlpha',
1475 read: getSVGProperty('preserveAlpha'),
1476 containerTagName: 'svg',
1477 tagName: 'feConvolveMatrix',
1478 },
1479 {
1480 name: 'preserveAspectRatio',
1481 read: getSVGProperty('preserveAspectRatio'),
1482 containerTagName: 'svg',
1483 tagName: 'feImage',
1484 overrideStringValue: 'xMinYMin slice',
1485 },
1486 {
1487 name: 'primitiveUnits',
1488 read: getSVGProperty('primitiveUnits'),
1489 containerTagName: 'svg',
1490 tagName: 'filter',
1491 overrideStringValue: 'objectBoundingBox',
1492 },
1493 {name: 'profile', read: getAttribute('profile')},
1494 {name: 'property', read: getAttribute('property')},
1495 {name: 'props', read: getAttribute('props')},
1496 {
1497 name: 'r',
1498 read: getSVGProperty('r'),
1499 containerTagName: 'svg',
1500 tagName: 'circle',
1501 overrideStringValue: '10pt',
1502 },
1503 {name: 'radioGroup', tagName: 'command', read: getAttribute('radiogroup')},
1504 {
1505 name: 'radius',
1506 read: getSVGAttribute('radius'),
1507 containerTagName: 'svg',
1508 tagName: 'feMorphology',
1509 },
1510 {name: 'readOnly', tagName: 'input'},
1511 {name: 'referrerPolicy', tagName: 'iframe'},
1512 {
1513 name: 'refX',
1514 read: getSVGProperty('refX'),
1515 containerTagName: 'svg',
1516 tagName: 'marker',
1517 overrideStringValue: '5em',
1518 },
1519 {
1520 name: 'refY',
1521 read: getSVGProperty('refY'),
1522 containerTagName: 'svg',
1523 tagName: 'marker',
1524 overrideStringValue: '6em',
1525 },
1526 {name: 'rel', tagName: 'a'},
1527 {
1528 name: 'rendering-intent',
1529 read: getSVGAttribute('rendering-intent'),
1530 containerTagName: 'svg',
1531 tagName: 'color-profile',
1532 },
1533 {
1534 name: 'renderingIntent',
1535 read: getSVGAttribute('rendering-intent'),
1536 containerTagName: 'svg',
1537 tagName: 'color-profile',
1538 },
1539 {
1540 name: 'repeatCount',
1541 read: getSVGAttribute('repeatcount'),
1542 containerTagName: 'svg',
1543 tagName: 'animate',
1544 },
1545 {
1546 name: 'repeatDur',
1547 read: getSVGAttribute('repeatdur'),
1548 containerTagName: 'svg',
1549 tagName: 'animate',
1550 },
1551 {name: 'required', tagName: 'input'},
1552 {
1553 name: 'requiredExtensions',
1554 read: getSVGProperty('requiredExtensions'),
1555 containerTagName: 'svg',
1556 tagName: 'a',
1557 },
1558 {
1559 name: 'requiredFeatures',
1560 read: getSVGAttribute('requiredFeatures'),
1561 containerTagName: 'svg',
1562 tagName: 'a',
1563 },
1564 {name: 'resource', read: getAttribute('resource')},
1565 {
1566 name: 'restart',
1567 read: getSVGAttribute('resource'),
1568 containerTagName: 'svg',
1569 tagName: 'animate',
1570 },
1571 {
1572 name: 'result',
1573 read: getSVGProperty('result'),
1574 containerTagName: 'svg',
1575 tagName: 'feBlend',
1576 },
1577 {name: 'results', tagName: 'input', read: getAttribute('results')}, // TODO: Should use property but it's not supported in Chrome.
1578 {name: 'reversed', tagName: 'ol'},
1579 {name: 'role', read: getAttribute('role')},
1580 {
1581 name: 'rotate',
1582 read: getSVGAttribute('role'),
1583 containerTagName: 'svg',
1584 tagName: 'altGlyph',
1585 },
1586 {name: 'rows', tagName: 'textarea'},
1587 {name: 'rowSpan', containerTagName: 'tr', tagName: 'td'},
1588 {
1589 name: 'rx',
1590 read: getSVGProperty('rx'),
1591 containerTagName: 'svg',
1592 tagName: 'ellipse',
1593 overrideStringValue: '1px',
1594 },
1595 {
1596 name: 'ry',
1597 read: getSVGProperty('ry'),
1598 containerTagName: 'svg',
1599 tagName: 'ellipse',
1600 overrideStringValue: '2px',
1601 },
1602 {
1603 name: 'sandbox',
1604 tagName: 'iframe',
1605 overrideStringValue: 'allow-forms allow-scripts',
1606 },
1607 {
1608 name: 'scale',
1609 read: getSVGProperty('scale'),
1610 containerTagName: 'svg',
1611 tagName: 'feDisplacementMap',
1612 },
1613 {
1614 name: 'scope',
1615 containerTagName: 'tr',
1616 tagName: 'th',
1617 overrideStringValue: 'row',
1618 },
1619 {name: 'scoped', tagName: 'style', read: getAttribute('scoped')},
1620 {name: 'scrolling', tagName: 'iframe', overrideStringValue: 'no'},
1621 {name: 'seamless', tagName: 'iframe', read: getAttribute('seamless')},
1622 {name: 'security', tagName: 'iframe', read: getAttribute('security')},
1623 {
1624 name: 'seed',
1625 read: getSVGProperty('seed'),
1626 containerTagName: 'svg',
1627 tagName: 'feTurbulence',
1628 },
1629 {name: 'selected', tagName: 'option', containerTagName: 'select'},
1630 {name: 'selectedIndex', tagName: 'select'},
1631 {name: 'shape', tagName: 'a'},
1632 {
1633 name: 'shape-rendering',
1634 tagName: 'svg',
1635 read: getSVGAttribute('shape-rendering'),
1636 },
1637 {
1638 name: 'shapeRendering',
1639 tagName: 'svg',
1640 read: getSVGAttribute('shape-rendering'),
1641 },
1642 {name: 'size', tagName: 'input'},
1643 {name: 'sizes', tagName: 'link'},
1644 {
1645 name: 'slope',
1646 read: getSVGAttribute('slope'),
1647 containerTagName: 'svg',
1648 tagName: 'font-face',
1649 },
1650 {
1651 name: 'spacing',
1652 read: getSVGProperty('spacing'),
1653 containerTagName: 'svg',
1654 tagName: 'textPath',
1655 overrideStringValue: 'auto',
1656 },
1657 {name: 'span', containerTagName: 'colgroup', tagName: 'col'},
1658 {
1659 name: 'specularConstant',
1660 read: getSVGProperty('specularConstant'),
1661 containerTagName: 'svg',
1662 tagName: 'feSpecularLighting',
1663 },
1664 {
1665 name: 'specularExponent',
1666 read: getSVGProperty('specularConstant'),
1667 containerTagName: 'svg',
1668 tagName: 'feSpecularLighting',
1669 },
1670 {name: 'speed', read: getAttribute('speed')},
1671 {
1672 name: 'spellCheck',
1673 overrideStringValue: 'false',
1674 tagName: 'input',
1675 read: getProperty('spellcheck'),
1676 },
1677 {
1678 name: 'spellcheck',
1679 overrideStringValue: 'false',
1680 tagName: 'input',
1681 read: getProperty('spellcheck'),
1682 },
1683 {
1684 name: 'spreadMethod',
1685 read: getSVGProperty('spreadMethod'),
1686 containerTagName: 'svg',
1687 tagName: 'linearGradient',
1688 overrideStringValue: 'reflect',
1689 },
1690 {name: 'src', tagName: 'img', overrideStringValue: 'https://reactjs.com'},
1691 {
1692 name: 'srcDoc',
1693 tagName: 'iframe',
1694 overrideStringValue: '<p>Hi</p>',
1695 read: getProperty('srcdoc'),
1696 },
1697 {
1698 name: 'srcdoc',
1699 tagName: 'iframe',
1700 overrideStringValue: '<p>Hi</p>',
1701 read: getProperty('srcdoc'),
1702 },
1703 {
1704 name: 'srcLang',
1705 containerTagName: 'audio',
1706 tagName: 'track',
1707 overrideStringValue: 'en',
1708 read: getProperty('srclang'),
1709 },
1710 {
1711 name: 'srclang',
1712 containerTagName: 'audio',
1713 tagName: 'track',
1714 overrideStringValue: 'en',
1715 read: getProperty('srclang'),
1716 },
1717 {name: 'srcSet', tagName: 'img'},
1718 {name: 'srcset', tagName: 'img'},
1719 {name: 'start', tagName: 'ol'},
1720 {
1721 name: 'startOffset',
1722 read: getSVGProperty('startOffset'),
1723 containerTagName: 'svg',
1724 tagName: 'textPath',
1725 },
1726 {name: 'state', read: getAttribute('state')},
1727 {
1728 name: 'stdDeviation',
1729 read: getSVGAttribute('stdDeviation'),
1730 containerTagName: 'svg',
1731 tagName: 'feGaussianBlur',
1732 },
1733 {
1734 name: 'stemh',
1735 read: getSVGAttribute('stemh'),
1736 containerTagName: 'svg',
1737 tagName: 'font-face',
1738 },
1739 {
1740 name: 'stemv',
1741 read: getSVGAttribute('stemv'),
1742 containerTagName: 'svg',
1743 tagName: 'font-face',
1744 },
1745 {name: 'step', read: getAttribute('step')},
1746 {
1747 name: 'stitchTiles',
1748 read: getSVGProperty('stitchTiles'),
1749 containerTagName: 'svg',
1750 tagName: 'feTurbulence',
1751 overrideStringValue: 'stitch',
1752 },
1753 {
1754 name: 'stop-color',
1755 containerTagName: 'svg',
1756 tagName: 'stop',
1757 read: getSVGAttribute('stop-color'),
1758 },
1759 {
1760 name: 'stop-opacity',
1761 containerTagName: 'svg',
1762 tagName: 'stop',
1763 read: getSVGAttribute('stop-opacity'),
1764 },
1765 {
1766 name: 'stopColor',
1767 containerTagName: 'svg',
1768 tagName: 'stop',
1769 read: getSVGAttribute('stop-color'),
1770 },
1771 {
1772 name: 'stopOpacity',
1773 containerTagName: 'svg',
1774 tagName: 'stop',
1775 read: getSVGAttribute('stop-opacity'),
1776 },
1777 {
1778 name: 'strikethrough-position',
1779 read: getSVGAttribute('strikethrough-position'),
1780 containerTagName: 'svg',
1781 tagName: 'font-face',
1782 },
1783 {
1784 name: 'strikethrough-thickness',
1785 read: getSVGAttribute('strikethrough-thickness'),
1786 containerTagName: 'svg',
1787 tagName: 'font-face',
1788 },
1789 {
1790 name: 'strikethroughPosition',
1791 read: getSVGAttribute('strikethrough-position'),
1792 containerTagName: 'svg',
1793 tagName: 'font-face',
1794 },
1795 {
1796 name: 'strikethroughThickness',
1797 read: getSVGAttribute('strikethrough-thickness'),
1798 containerTagName: 'svg',
1799 tagName: 'font-face',
1800 },
1801 {
1802 name: 'string',
1803 read: getSVGAttribute('string'),
1804 containerTagName: 'svg',
1805 tagName: 'font-face-format',
1806 },
1807 {
1808 name: 'stroke',
1809 containerTagName: 'svg',
1810 tagName: 'path',
1811 read: getSVGAttribute('stroke'),
1812 },
1813 {
1814 name: 'stroke-dasharray',
1815 containerTagName: 'svg',
1816 tagName: 'path',
1817 read: getSVGAttribute('stroke-dasharray'),
1818 },
1819 {
1820 name: 'stroke-Dasharray',
1821 containerTagName: 'svg',
1822 tagName: 'path',
1823 read: getSVGAttribute('stroke-dasharray'),
1824 },
1825 {
1826 name: 'stroke-dashoffset',
1827 containerTagName: 'svg',
1828 tagName: 'path',
1829 read: getSVGAttribute('stroke-dashoffset'),
1830 },
1831 {
1832 name: 'stroke-linecap',
1833 containerTagName: 'svg',
1834 tagName: 'path',
1835 read: getSVGAttribute('stroke-linecap'),
1836 },
1837 {
1838 name: 'stroke-linejoin',
1839 containerTagName: 'svg',
1840 tagName: 'path',
1841 read: getSVGAttribute('stroke-linejoin'),
1842 },
1843 {
1844 name: 'stroke-miterlimit',
1845 containerTagName: 'svg',
1846 tagName: 'path',
1847 read: getSVGAttribute('stroke-miterlimit'),
1848 },
1849 {
1850 name: 'stroke-opacity',
1851 containerTagName: 'svg',
1852 tagName: 'path',
1853 read: getSVGAttribute('stroke-opacity'),
1854 },
1855 {
1856 name: 'stroke-width',
1857 containerTagName: 'svg',
1858 tagName: 'path',
1859 read: getSVGAttribute('stroke-width'),
1860 },
1861 {
1862 name: 'strokeDasharray',
1863 containerTagName: 'svg',
1864 tagName: 'path',
1865 read: getSVGAttribute('stroke-dasharray'),
1866 },
1867 {
1868 name: 'strokeDashoffset',
1869 containerTagName: 'svg',
1870 tagName: 'path',
1871 read: getSVGAttribute('stroke-dashoffset'),
1872 },
1873 {
1874 name: 'strokeLinecap',
1875 containerTagName: 'svg',
1876 tagName: 'path',
1877 read: getSVGAttribute('stroke-linecap'),
1878 },
1879 {
1880 name: 'strokeLinejoin',
1881 containerTagName: 'svg',
1882 tagName: 'path',
1883 read: getSVGAttribute('stroke-linejoin'),
1884 },
1885 {
1886 name: 'strokeMiterlimit',
1887 containerTagName: 'svg',
1888 tagName: 'path',
1889 read: getSVGAttribute('stroke-miterlimit'),
1890 },
1891 {
1892 name: 'strokeOpacity',
1893 containerTagName: 'svg',
1894 tagName: 'path',
1895 read: getSVGAttribute('stroke-opacity'),
1896 },
1897 {
1898 name: 'strokeWidth',
1899 containerTagName: 'svg',
1900 tagName: 'path',
1901 read: getSVGAttribute('stroke-width'),
1902 },
1903 {name: 'style'},
1904 {name: 'summary', tagName: 'table'},
1905 {
1906 name: 'suppressContentEditableWarning',
1907 read: getAttribute('suppresscontenteditablewarning'),
1908 },
1909 {
1910 name: 'surfaceScale',
1911 read: getSVGProperty('surfaceScale'),
1912 containerTagName: 'svg',
1913 tagName: 'feDiffuseLighting',
1914 },
1915 {
1916 name: 'systemLanguage',
1917 overrideStringValue: 'en',
1918 read: getSVGProperty('systemLanguage'),
1919 containerTagName: 'svg',
1920 tagName: 'a',
1921 },
1922 {name: 'tabIndex'},
1923 {
1924 name: 'tabIndex',
1925 read: getSVGProperty('tabIndex'),
1926 tagName: 'svg',
1927 },
1928 {
1929 name: 'tableValues',
1930 read: getSVGProperty('tableValues'),
1931 containerTagName: 'svg',
1932 tagName: 'feFuncA',
1933 overrideStringValue: '0 1 2 3',
1934 },
1935 {
1936 name: 'target',
1937 read: getSVGProperty('target'),
1938 containerTagName: 'svg',
1939 tagName: 'a',
1940 },
1941 {
1942 name: 'targetX',
1943 read: getSVGProperty('targetX'),
1944 containerTagName: 'svg',
1945 tagName: 'feConvolveMatrix',
1946 },
1947 {
1948 name: 'targetY',
1949 read: getSVGProperty('targetY'),
1950 containerTagName: 'svg',
1951 tagName: 'feConvolveMatrix',
1952 },
1953 {
1954 name: 'text-anchor',
1955 containerTagName: 'svg',
1956 tagName: 'text',
1957 read: getSVGAttribute('text-anchor'),
1958 },
1959 {
1960 name: 'text-decoration',
1961 containerTagName: 'svg',
1962 tagName: 'text',
1963 read: getSVGAttribute('text-decoration'),
1964 },
1965 {
1966 name: 'text-rendering',
1967 tagName: 'svg',
1968 read: getSVGAttribute('text-rendering'),
1969 },
1970 {
1971 name: 'textAnchor',
1972 containerTagName: 'svg',
1973 tagName: 'text',
1974 read: getSVGAttribute('text-anchor'),
1975 },
1976 {
1977 name: 'textDecoration',
1978 containerTagName: 'svg',
1979 tagName: 'text',
1980 read: getSVGAttribute('text-decoration'),
1981 },
1982 {
1983 name: 'textLength',
1984 read: getSVGProperty('textLength'),
1985 containerTagName: 'svg',
1986 tagName: 'text',
1987 },
1988 {
1989 name: 'textRendering',
1990 tagName: 'svg',
1991 read: getSVGAttribute('text-rendering'),
1992 },
1993 {name: 'title'},
1994 {
1995 name: 'to',
1996 read: getSVGAttribute('to'),
1997 containerTagName: 'svg',
1998 tagName: 'set',
1999 },
2000 {
2001 name: 'transform',
2002 read: getSVGProperty('transform'),
2003 containerTagName: 'svg',
2004 tagName: 'a',
2005 overrideStringValue:
2006 'translate(-10,-20) scale(2) rotate(45) translate(5,10)',
2007 },
2008 {
2009 name: 'transform-origin',
2010 tagName: 'svg',
2011 read: getSVGAttribute('transform-origin'),
2012 },
2013 {
2014 name: 'transformOrigin',
2015 tagName: 'svg',
2016 read: getSVGAttribute('transform-origin'),
2017 },
2018 {name: 'type', tagName: 'button', overrideStringValue: 'reset'},
2019 {
2020 name: 'type',
2021 containerTagName: 'svg',
2022 tagName: 'feFuncA',
2023 read: getSVGProperty('type'),
2024 overrideStringValue: 'discrete',
2025 },
2026 {name: 'typeof', read: getAttribute('typeof')},
2027 {
2028 name: 'u1',
2029 read: getSVGAttribute('u1'),
2030 containerTagName: 'svg',
2031 tagName: 'hkern',
2032 },
2033 {
2034 name: 'u2',
2035 read: getSVGAttribute('u2'),
2036 containerTagName: 'svg',
2037 tagName: 'hkern',
2038 },
2039 {
2040 name: 'underline-position',
2041 read: getSVGAttribute('underline-position'),
2042 containerTagName: 'svg',
2043 tagName: 'font-face',
2044 },
2045 {
2046 name: 'underline-thickness',
2047 read: getSVGAttribute('underline-thickness'),
2048 containerTagName: 'svg',
2049 tagName: 'font-face',
2050 },
2051 {
2052 name: 'underlinePosition',
2053 read: getSVGAttribute('underline-position'),
2054 containerTagName: 'svg',
2055 tagName: 'font-face',
2056 },
2057 {
2058 name: 'underlineThickness',
2059 read: getSVGAttribute('underline-thickness'),
2060 containerTagName: 'svg',
2061 tagName: 'font-face',
2062 },
2063 {
2064 name: 'unicode',
2065 read: getSVGAttribute('unicode'),
2066 containerTagName: 'svg',
2067 tagName: 'glyph',
2068 },
2069 {
2070 name: 'unicode-bidi',
2071 containerTagName: 'svg',
2072 tagName: 'text',
2073 read: getSVGAttribute('unicode-bidi'),
2074 },
2075 {
2076 name: 'unicode-range',
2077 read: getSVGAttribute('unicode-range'),
2078 containerTagName: 'svg',
2079 tagName: 'font-face',
2080 },
2081 {
2082 name: 'unicodeBidi',
2083 containerTagName: 'svg',
2084 tagName: 'text',
2085 read: getSVGAttribute('unicode-bidi'),
2086 },
2087 {
2088 name: 'unicodeRange',
2089 read: getSVGAttribute('unicode-range'),
2090 containerTagName: 'svg',
2091 tagName: 'font-face',
2092 },
2093 {
2094 name: 'units-per-em',
2095 read: getSVGAttribute('units-per-em'),
2096 containerTagName: 'svg',
2097 tagName: 'font-face',
2098 },
2099 {
2100 name: 'unitsPerEm',
2101 read: getSVGAttribute('unites-per-em'),
2102 containerTagName: 'svg',
2103 tagName: 'font-face',
2104 },
2105 {name: 'unknown', read: getAttribute('unknown')},
2106 {
2107 name: 'unselectable',
2108 read: getAttribute('unselectable'),
2109 tagName: 'span',
2110 overrideStringValue: 'on',
2111 },
2112 {name: 'useMap', tagName: 'img'},
2113 {
2114 name: 'v-alphabetic',
2115 read: getSVGAttribute('v-alphabetic'),
2116 containerTagName: 'svg',
2117 tagName: 'font-face',
2118 },
2119 {
2120 name: 'v-hanging',
2121 read: getSVGAttribute('v-hanging'),
2122 containerTagName: 'svg',
2123 tagName: 'font-face',
2124 },
2125 {
2126 name: 'v-ideographic',
2127 read: getSVGAttribute('v-ideographic'),
2128 containerTagName: 'svg',
2129 tagName: 'font-face',
2130 },
2131 {
2132 name: 'v-mathematical',
2133 read: getSVGAttribute('v-mathematical'),
2134 containerTagName: 'svg',
2135 tagName: 'font-face',
2136 },
2137 {
2138 name: 'vAlphabetic',
2139 read: getSVGAttribute('v-alphabetic'),
2140 containerTagName: 'svg',
2141 tagName: 'font-face',
2142 },
2143 {name: 'value', tagName: 'input', extraProps: {onChange() {}}},
2144 {name: 'value', tagName: 'input', type: 'email', extraProps: {onChange() {}}},
2145 {
2146 name: 'value',
2147 tagName: 'input',
2148 type: 'number',
2149 extraProps: {onChange() {}},
2150 },
2151 {name: 'value', tagName: 'textarea', extraProps: {onChange() {}}},
2152 {
2153 name: 'value',
2154 containerTagName: 'select',
2155 tagName: 'option',
2156 extraProps: {onChange() {}},
2157 },
2158 {
2159 name: 'Value',
2160 containerTagName: 'select',
2161 tagName: 'option',
2162 read: getProperty('value'),
2163 },
2164 {
2165 name: 'values',
2166 read: getSVGProperty('values'),
2167 containerTagName: 'svg',
2168 tagName: 'feColorMatrix',
2169 overrideStringValue: '1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0',
2170 },
2171 {
2172 name: 'vector-effect',
2173 containerTagName: 'svg',
2174 tagName: 'line',
2175 read: getSVGAttribute('vector-effect'),
2176 },
2177 {
2178 name: 'vectorEffect',
2179 containerTagName: 'svg',
2180 tagName: 'line',
2181 read: getSVGAttribute('vector-effect'),
2182 },
2183 {name: 'version', containerTagName: 'document', tagName: 'html'},
2184 {name: 'version', tagName: 'svg', read: getSVGAttribute('version')},
2185 {
2186 name: 'vert-adv-y',
2187 read: getSVGAttribute('vert-origin-y'),
2188 containerTagName: 'svg',
2189 tagName: 'font',
2190 },
2191 {
2192 name: 'vert-origin-x',
2193 read: getSVGAttribute('vert-origin-y'),
2194 containerTagName: 'svg',
2195 tagName: 'font',
2196 },
2197 {
2198 name: 'vert-origin-y',
2199 read: getSVGAttribute('vert-origin-y'),
2200 containerTagName: 'svg',
2201 tagName: 'font',
2202 },
2203 {
2204 name: 'vertAdvY',
2205 read: getSVGAttribute('vert-adv-y'),
2206 containerTagName: 'svg',
2207 tagName: 'font',
2208 },
2209 {
2210 name: 'vertOriginX',
2211 read: getSVGAttribute('vert-origin-x'),
2212 containerTagName: 'svg',
2213 tagName: 'font',
2214 },
2215 {
2216 name: 'vertOriginY',
2217 read: getSVGAttribute('vert-origin-y'),
2218 containerTagName: 'svg',
2219 tagName: 'font',
2220 },
2221 {
2222 name: 'vHanging',
2223 read: getSVGAttribute('v-hanging'),
2224 containerTagName: 'svg',
2225 tagName: 'font-face',
2226 },
2227 {
2228 name: 'vIdeographic',
2229 read: getSVGAttribute('v-ideographic'),
2230 containerTagName: 'svg',
2231 tagName: 'font-face',
2232 },
2233 {
2234 name: 'viewBox',
2235 read: getSVGProperty('viewBox'),
2236 containerTagName: 'svg',
2237 tagName: 'marker',
2238 overrideStringValue: '0 0 1500 1000',
2239 },
2240 {
2241 name: 'viewTarget',
2242 read: getSVGAttribute('viewTarget'),
2243 containerTagName: 'svg',
2244 tagName: 'view',
2245 },
2246 {name: 'visibility', read: getAttribute('visibility')},
2247 {
2248 name: 'visibility',
2249 containerTagName: 'svg',
2250 tagName: 'path',
2251 read: getSVGAttribute('visibility'),
2252 },
2253 {
2254 name: 'vMathematical',
2255 read: getSVGAttribute('v-mathematical'),
2256 containerTagName: 'svg',
2257 tagName: 'font-face',
2258 },
2259 {name: 'vocab', read: getAttribute('vocab')},
2260 {name: 'width', tagName: 'img'},
2261 {
2262 name: 'width',
2263 containerTagName: 'svg',
2264 tagName: 'rect',
2265 read: getSVGProperty('width'),
2266 },
2267 {
2268 name: 'widths',
2269 read: getSVGAttribute('widths'),
2270 containerTagName: 'svg',
2271 tagName: 'font-face',
2272 },
2273 {name: 'wmode', read: getAttribute('wmode'), tagName: 'embed'},
2274 {
2275 name: 'word-spacing',
2276 containerTagName: 'svg',
2277 tagName: 'text',
2278 read: getSVGAttribute('word-spacing'),
2279 },
2280 {
2281 name: 'wordSpacing',
2282 containerTagName: 'svg',
2283 tagName: 'text',
2284 read: getSVGAttribute('word-spacing'),
2285 },
2286 {name: 'wrap', tagName: 'textarea'},
2287 {
2288 name: 'writing-mode',
2289 containerTagName: 'svg',
2290 tagName: 'text',
2291 read: getSVGAttribute('writing-mode'),
2292 },
2293 {
2294 name: 'writingMode',
2295 containerTagName: 'svg',
2296 tagName: 'text',
2297 read: getSVGAttribute('writing-mode'),
2298 },
2299 {
2300 name: 'x',
2301 read: getSVGAttribute('x'),
2302 containerTagName: 'svg',
2303 tagName: 'altGlyph',
2304 },
2305 {
2306 name: 'x-height',
2307 read: getSVGAttribute('x-height'),
2308 containerTagName: 'svg',
2309 tagName: 'font-face',
2310 },
2311 {
2312 name: 'x1',
2313 read: getSVGProperty('x1'),
2314 containerTagName: 'svg',
2315 tagName: 'line',
2316 },
2317 {
2318 name: 'x2',
2319 read: getSVGProperty('x2'),
2320 containerTagName: 'svg',
2321 tagName: 'line',
2322 },
2323 {
2324 name: 'xChannelSelector',
2325 read: getSVGProperty('xChannelSelector'),
2326 containerTagName: 'svg',
2327 tagName: 'feDisplacementMap',
2328 overrideStringValue: 'R',
2329 },
2330 {
2331 name: 'xHeight',
2332 read: getSVGAttribute('x-height'),
2333 containerTagName: 'svg',
2334 tagName: 'font-face',
2335 },
2336 {name: 'XLink:Actuate', read: getAttribute('XLink:Actuate')},
2337 {name: 'xlink:actuate', read: getAttribute('xlink:actuate')},
2338 {name: 'xlink:arcrole', read: getAttribute('xlink:arcrole')},
2339 {name: 'xlink:href', read: getAttribute('xlink:href')},
2340 {name: 'xlink:role', read: getAttribute('xlink:role')},
2341 {name: 'xlink:show', read: getAttribute('xlink:show')},
2342 {name: 'xlink:title', read: getAttribute('xlink:title')},
2343 {name: 'xlink:type', read: getAttribute('xlink:type')},
2344 {name: 'xlinkActuate', read: getAttribute('xlink:actuate')},
2345 {name: 'XlinkActuate', read: getAttribute('Xlink:actuate')},
2346 {name: 'xlinkArcrole', read: getAttribute('xlink:arcrole')},
2347 {name: 'xlinkHref', read: getAttribute('xlink:href')},
2348 {name: 'xlinkRole', read: getAttribute('xlink:role')},
2349 {name: 'xlinkShow', read: getAttribute('xlink:show')},
2350 {name: 'xlinkTitle', read: getAttribute('xlink:title')},
2351 {name: 'xlinkType', read: getAttribute('xlink:type')},
2352 {name: 'xml:base', read: getAttribute('xml:base')},
2353 {name: 'xml:lang', read: getAttribute('xml:lang')},
2354 {name: 'xml:space', read: getAttribute('xml:space')},
2355 {name: 'xmlBase', read: getAttribute('xml:base')},
2356 {name: 'xmlLang', read: getAttribute('xml:lang')},
2357 {name: 'xmlns', read: getProperty('namespaceURI'), tagName: 'svg'},
2358 {name: 'xmlns:xlink', read: getAttribute('xmlns:xlink')},
2359 {name: 'xmlnsXlink', read: getAttribute('xmlns:xlink')},
2360 {name: 'xmlSpace', read: getAttribute('xml:space')},
2361 {
2362 name: 'y',
2363 read: getSVGAttribute('y'),
2364 containerTagName: 'svg',
2365 tagName: 'altGlyph',
2366 },
2367 {
2368 name: 'y1',
2369 read: getSVGProperty('y1'),
2370 containerTagName: 'svg',
2371 tagName: 'line',
2372 },
2373 {
2374 name: 'y2',
2375 read: getSVGProperty('y2'),
2376 containerTagName: 'svg',
2377 tagName: 'line',
2378 },
2379 {
2380 name: 'yChannelSelector',
2381 read: getSVGProperty('yChannelSelector'),
2382 containerTagName: 'svg',
2383 tagName: 'feDisplacementMap',
2384 overrideStringValue: 'B',
2385 },
2386 {
2387 name: 'z',
2388 read: getSVGProperty('z'),
2389 containerTagName: 'svg',
2390 tagName: 'fePointLight',
2391 },
2392 {name: 'zoomAndPan', read: getSVGProperty('zoomAndPan'), tagName: 'svg'},
2393 ];
2394
2395 attributes.forEach(attr => {
2396 attr.read = attr.read || getProperty(attr.name);
2397 });
2398
2399 export default attributes;