import {CLASS_LIST, NEXT, PREV, VALUE} from './symbols.js'; import {knownAdjacent, knownSiblings} from './utils.js'; import {attributeChangedCallback as ceAttributes} from '../interface/custom-element-registry.js'; import {attributeChangedCallback as moAttributes} from '../interface/mutation-observer.js'; export 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' ]); export 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); }; export 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); }; export const booleanAttribute = { get(element, name) { return element.hasAttribute(name); }, set(element, name, value) { if (value) element.setAttribute(name, ''); else element.removeAttribute(name); } }; export const numericAttribute = { get(element, name) { return parseFloat(element.getAttribute(name) || 0); }, set(element, name, value) { element.setAttribute(name, value); } }; export const stringAttribute = { get(element, name) { return element.getAttribute(name) || ''; }, set(element, name, value) { element.setAttribute(name, value); } }; /* 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); } }; */