How to use read method in Cucumber-gherkin

Best JavaScript code snippet using cucumber-gherkin

Run Cucumber-gherkin automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

player.js

Source: player.js Github

copy
1const CONSTS = require('../constants')
2
3function processPlayer (buf, actor, repObj, waitingHandle, dataOut, iteration) {
4  switch (waitingHandle) {
5    case 1:
6      if (buf.readBit()) {
7        // bHidden
8        dataOut.hidden = true
9        dataOut.disappear = true
10      }
11      break
12    case 2:
13      if (!buf.readBit()) {
14        // bReplicateMovement
15        dataOut.noMovement = true
16        dataOut.disappear = true
17      }
18      break
19    case 3:
20      if (buf.readBit()) {
21        // tearOff
22        dataOut.tearoff = true
23        dataOut.disappear = true
24      }
25      break
26    case 13:
27      buf.readInt(CONSTS.ROLE_MAX) // role
28      break
29    case 5:
30      [ownerGuid, owner] = buf.readObject()
31      dataOut.playerOwner = ownerGuid // seems never hit this
32      break
33    case 14:
34      const movement = buf.readMovement(true /* isMoving */, true /* isPlayer */)
35      if (movement[0] >= 0 && movement[1] >= 0) { // readVecotr sometime might get me negative value, might be a bug
36        dataOut.newLoc = movement
37      }
38      break
39    case 7:
40      // when player get into car, we will get
41      // [03-02T20:48:09.272 - Symbol(PlayerUpdate) - guid:xxx -- {"noMovement":true,"disappear":true,"playerAttachTo":5140,"pToPS":0} --- (22500)
42      // 5140 is the car guid
43      [attachGuid, attachName] = buf.readObject()
44      dataOut.attachedTo = attachGuid
45      // then when he get off the car
46      // [03-02T20:49:37.773 - Symbol(PlayerUpdate) - guid:xxx -- {"newLoc":[1165.6766,2849.3476,164.672,8.4759521484375],"playerAttachTo":0,"pToPS":yyy} --- (27454)
47      break
48    case 8:
49      buf.readVector(10000, 30) // locationOffset, not sure what it is
50      break
51    case 9:
52      buf.readVector(10000, 30) // locationOffset, not sure what it is
53      break
54    case 10:
55      buf.readRotationShort()
56      break
57    case 11:
58      buf.readName() // attachSocket
59      break
60    case 12:
61      [attachComponnent, attachName] = buf.readObject()
62      break
63    case 13:
64      buf.readInt(CONSTS.ROLE_MAX) // role
65      break
66    case 14:
67      buf.readBit()
68      break
69    case 15:
70      buf.readObject()
71      break
72    case 16:
73      [playerStateGuid, playerState] = buf.readObject()
74      dataOut.pToPS = playerStateGuid // this mapping is imporatnt
75      break
76    case 17:
77      buf.readUInt16() // pitch
78      break
79    case 18:
80      buf.readObject()
81      break
82    // ACharacter
83    case 19:
84      buf.readObject()
85      break
86    case 20:
87      buf.readName()
88      break
89    case 21:
90      buf.readVector(10000, 30)
91      break
92    case 22:
93      buf.readRotationShort()
94      break
95    case 23:
96      buf.readBit()
97      break
98    case 24:
99      buf.readBit()
100      break
101    case 25:
102      buf.readBit()
103      break
104    case 26:
105      buf.readFloat()
106      break
107    case 27:
108      buf.readFloat()
109      break
110    case 28:
111      buf.readByte()
112      break
113    case 29:
114      buf.readBit()
115      break
116    case 30:
117      buf.readFloat()
118      break
119    case 31:
120      buf.readUInt32()
121      break
122    case 32:
123      buf.readBit()
124      break
125    case 33:
126      buf.readObject()
127      break
128    case 34:
129      buf.readFloat()
130      break
131    case 35:
132      buf.readVector(10000, 30)
133      break
134    case 36:
135      buf.readRotationShort()
136      break
137    case 37:
138      buf.readObject()
139      break
140    case 38:
141      buf.readName()
142      break
143    case 39:
144      buf.readBit()
145      break
146    case 40:
147      buf.readBit()
148      break
149    case 41:
150      buf.readBit() // bHasAdditiveSources
151      buf.readBit() // bHasOverrideSources
152      buf.readVector(10, 24) // lastPreAdditiveVelocity
153      buf.readBit() // bIsAdditiveVelocityApplied
154      buf.readUInt8() // flags
155      break
156    case 42:
157      buf.readVector(10, 24)
158      break
159    case 43:
160      buf.readVector(10, 24)
161      break
162    // AMutableCharacter
163    case 44:
164      const arrayNum = buf.readUInt16()
165      let index = buf.readIntPacked()
166      while (index != 0) {
167        buf.readUInt8()
168        index = buf.readIntPacked()
169      }
170      break
171    // ATslCharacter
172    case 45:
173      buf.readInt(8) // Remote_CastAnim
174      break
175    case 46:
176      buf.readBit() // CurrentWeaponZoomLevel
177      break
178    case 47:
179      buf.readFloat() // BuffFinalSpreadFactor
180      break
181    case 48:
182      buf.readObject() // InventoryFacade
183      break
184    case 49:
185      buf.readObject() // WeaponProcessor
186      break
187    case 50:
188      buf.readByte() // CharacterState
189      break
190    case 51:
191      buf.readBit() // bIsScopingRemote
192      break
193    case 52:
194      buf.readBit() // bIsAimingRemote
195      break
196    case 53:
197      buf.readBit() // bIsFirstPersonRemote
198      break
199    case 54:
200      buf.readBit() // bIsInVehicleRemote
201      break
202    case 55:
203      buf.readUInt32() // SpectatedCount
204      break
205    case 56:
206      buf.readObject() // Team
207      break
208    case 57: // begin FTakeHitInfo
209      buf.readFloat() // ActualDamage
210      break
211    case 58:
212      buf.readObject() // DamageType
213      break
214    case 59:
215      buf.readObject() // PlayerInstigator
216      break
217    case 60:
218      buf.readVector(1, 20) // DamageOrigin
219      break
220    case 61:
221      buf.readVector(1, 20) // RelHitLocation
222      break
223    case 62:
224      buf.readName() // BoneName
225      break
226    case 63:
227      buf.readFloat() // DamageMaxRadius
228      break
229    case 64:
230      buf.readByte() // ShotDirPitch
231      break
232    case 65:
233      buf.readByte() // ShotDirYaw
234      break
235    case 66:
236      buf.readBit() // bPointDamage
237      break
238    case 67:
239      buf.readBit() // bRadialDamage
240      break
241    case 68:
242      buf.readBit() // bKilled
243      break
244    case 69:
245      buf.readByte() // EnsureReplicationByte
246      break
247    case 70:
248      buf.readName() // AttackerWeaponName
249      break
250    case 71:
251      buf.readFloatVector() // AttackerLocation
252      break // FTakeHitInfo end
253    case 72:
254      buf.readInt(3) // TargetingType
255      break
256    case 73:
257      buf.readFloat() // ReviveCastingTime
258      break
259    case 74:
260      buf.readBit() // bWantsToRun
261      break
262    case 75:
263      buf.readBit() // bWantsToSprint
264      break
265    case 76:
266      buf.readBit() // bWantsToSprintingAuto
267      break
268    case 77:
269      buf.readBit() // bWantsToRollingLeft
270      break
271    case 78:
272      buf.readBit() // bWantsToRollingRight
273      break
274    case 79:
275      buf.readBit() // bIsPeekLeft
276      break
277    case 80:
278      buf.readBit() // bIsPeekRight
279      break
280    case 81:
281      buf.readBit() // IgnoreRotation
282      break
283    case 82:
284      buf.readBit() // bIsGroggying
285      break
286    case 83:
287      buf.readBit() // bIsThirdPerson
288      break
289    case 84:
290      buf.readBit() // bIsReviving
291      break
292    case 85:
293      buf.readBit() // bIsWeaponObstructed
294      break
295    case 86:
296      buf.readBit() // bIsCoatEquipped
297      break
298    case 87:
299      buf.readBit() // bIsZombie
300      break
301    case 88:
302      buf.readBit() // bIsThrowHigh
303      break
304    case 89:
305      buf.readBit() // bUseRightShoulderAiming
306      break
307    case 90:
308      buf.readRotationShort() // GunDirectionSway
309      break
310    case 91:
311      buf.readFixedVector(1, 16) // AimOffsets
312      break
313    case 92:
314      buf.readObject() // NetOwnerController
315      break
316    case 93:
317      buf.readBit() // bAimStateActive
318      break
319    case 94:
320      buf.readBit() // bIsHoldingBreath
321      break
322    case 95:
323      const health = buf.readFloat() // Health
324      dataOut.health = health
325      break
326    case 96:
327      buf.readBit() // HealthMax
328      break
329    case 97:
330      buf.readFloat() // GroggyHealth
331      break
332    case 98:
333      buf.readFloat() // GroggyHealthMax
334      break
335    case 99:
336      buf.readFloat() // BoostGauge
337      break
338    case 100:
339      buf.readFloat() // BoostGaugeMax
340      break
341    case 101:
342      buf.readInt(8) // ShoesSoundType
343      break
344    case 102:
345      buf.readObject() // VehicleRiderComponent
346      break
347    case 103:
348      buf.readBit() // bIsActiveRagdollActive
349      break
350    case 104:
351      buf.readInt(4) // PreReplicatedStanceMode
352      break
353    case 105:
354      buf.readBit() // bServerFinishedVault
355      break
356    case 106:
357      buf.readBit() // bWantsToCancelVault
358      break
359    case 107:
360      buf.readBit() // bIsDemoVaulting_CP
361      break
362    default:
363      return false
364  }
365  return true
366}
367
368module.exports = processPlayer
369
Full Screen

attributes.js

Source: attributes.js Github

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