| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- import {
- includeBooleanAttr,
- isSpecialBooleanAttr,
- makeMap,
- NOOP
- } from '@vue/shared'
- import {
- compatUtils,
- ComponentInternalInstance,
- DeprecationTypes
- } from '@vue/runtime-core'
- export const xlinkNS = 'http://www.w3.org/1999/xlink'
- export function patchAttr(
- el: Element,
- key: string,
- value: any,
- isSVG: boolean,
- instance?: ComponentInternalInstance | null
- ) {
- if (isSVG && key.startsWith('xlink:')) {
- if (value == null) {
- el.removeAttributeNS(xlinkNS, key.slice(6, key.length))
- } else {
- el.setAttributeNS(xlinkNS, key, value)
- }
- } else {
- if (__COMPAT__ && compatCoerceAttr(el, key, value, instance)) {
- return
- }
- // note we are only checking boolean attributes that don't have a
- // corresponding dom prop of the same name here.
- const isBoolean = isSpecialBooleanAttr(key)
- if (value == null || (isBoolean && !includeBooleanAttr(value))) {
- el.removeAttribute(key)
- } else {
- el.setAttribute(key, isBoolean ? '' : value)
- }
- }
- }
- // 2.x compat
- const isEnumeratedAttr = __COMPAT__
- ? /*#__PURE__*/ makeMap('contenteditable,draggable,spellcheck')
- : NOOP
- export function compatCoerceAttr(
- el: Element,
- key: string,
- value: unknown,
- instance: ComponentInternalInstance | null = null
- ): boolean {
- if (isEnumeratedAttr(key)) {
- const v2CocercedValue =
- value === null
- ? 'false'
- : typeof value !== 'boolean' && value !== undefined
- ? 'true'
- : null
- if (
- v2CocercedValue &&
- compatUtils.softAssertCompatEnabled(
- DeprecationTypes.ATTR_ENUMERATED_COERCION,
- instance,
- key,
- value,
- v2CocercedValue
- )
- ) {
- el.setAttribute(key, v2CocercedValue)
- return true
- }
- } else if (
- value === false &&
- !isSpecialBooleanAttr(key) &&
- compatUtils.softAssertCompatEnabled(
- DeprecationTypes.ATTR_FALSE_VALUE,
- instance,
- key
- )
- ) {
- el.removeAttribute(key)
- return true
- }
- return false
- }
|