You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
2.6 KiB
JavaScript

'use strict';
const {CLASS_LIST, NEXT, PREV, VALUE} = require('./symbols.js');
const {knownAdjacent, knownSiblings} = require('./utils.js');
const {attributeChangedCallback: ceAttributes} = require('../interface/custom-element-registry.js');
const {attributeChangedCallback: moAttributes} = require('../interface/mutation-observer.js');
const emptyAttributes = new Set([
'allowfullscreen',
'allowpaymentrequest',
'async',
'autofocus',
'autoplay',
'checked',
'class',
'contenteditable',
'controls',
'default',
'defer',
'disabled',
'draggable',
'formnovalidate',
'hidden',
'id',
'ismap',
'itemscope',
'loop',
'multiple',
'muted',
'nomodule',
'novalidate',
'open',
'playsinline',
'readonly',
'required',
'reversed',
'selected',
'style',
'truespeed'
]);
exports.emptyAttributes = emptyAttributes;
const setAttribute = (element, attribute) => {
const {[VALUE]: value, name} = attribute;
attribute.ownerElement = element;
knownSiblings(element, attribute, element[NEXT]);
if (name === 'class')
element.className = value;
moAttributes(element, name, null);
ceAttributes(element, name, null, value);
};
exports.setAttribute = setAttribute;
const removeAttribute = (element, attribute) => {
const {[VALUE]: value, name} = attribute;
knownAdjacent(attribute[PREV], attribute[NEXT]);
attribute.ownerElement = attribute[PREV] = attribute[NEXT] = null;
if (name === 'class')
element[CLASS_LIST] = null;
moAttributes(element, name, value);
ceAttributes(element, name, value, null);
};
exports.removeAttribute = removeAttribute;
const booleanAttribute = {
get(element, name) {
return element.hasAttribute(name);
},
set(element, name, value) {
if (value)
element.setAttribute(name, '');
else
element.removeAttribute(name);
}
};
exports.booleanAttribute = booleanAttribute;
const numericAttribute = {
get(element, name) {
return parseFloat(element.getAttribute(name) || 0);
},
set(element, name, value) {
element.setAttribute(name, value);
}
};
exports.numericAttribute = numericAttribute;
const stringAttribute = {
get(element, name) {
return element.getAttribute(name) || '';
},
set(element, name, value) {
element.setAttribute(name, value);
}
};
exports.stringAttribute = stringAttribute;
/* oddly enough, this apparently is not a thing
export const nullableAttribute = {
get(element, name) {
return element.getAttribute(name);
},
set(element, name, value) {
if (value === null)
element.removeAttribute(name);
else
element.setAttribute(name, value);
}
};
*/