all files / src/dom/ index.js

95.24% Statements 60/63
91.8% Branches 56/61
100% Functions 7/7
98% Lines 49/50
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98    12× 12× 12× 12× 12× 12×   12×   12×   12×   841×     62× 48×           1093× 1093×                       682×   682×   680× 10× 670× 10× 660× 657× 32× 32× 625× 547× 547× 547× 547×   78× 78× 24× 54× 49×               32× 32×                         22× 22×   22×    
'use strict';
 
exports.__esModule = true;
exports.ensureNodeData = ensureNodeData;
exports.getNodeType = getNodeType;
exports.removeNode = removeNode;
exports.setAccessor = setAccessor;
exports.getRawNodeAttributes = getRawNodeAttributes;
 
var _constants = require('../constants');
 
var _util = require('../util');
 
var _hooks = require('../hooks');
 
function ensureNodeData(node, data) {
	return node[_constants.ATTR_KEY] || (node[_constants.ATTR_KEY] = data || {});
}
 
function getNodeType(node) {
	if (node instanceof Text) return 3;
	Eif (node instanceof Element) return 1;
	return 0;
}
 
/** Removes a given DOM Node from its parent. */
 
function removeNode(node) {
	var p = node.parentNode;
	if (p) p.removeChild(node);
}
 
/** Set a named attribute on the given Node, with special behavior for some names and event handlers.
 *	If `value` is `null`, the attribute/handler will be removed.
 *	@param {Element} node	An element to mutate
 *	@param {string} name	The name/key to set, such as an event or attribute name
 *	@param {any} value		An attribute value, such as a function to be used as an event handler
 *	@param {any} previousValue	The last value that was set for this name/node pair
 *	@private
 */
 
function setAccessor(node, name, value, isSvg) {
	ensureNodeData(node)[name] = value;
 
	if (name === 'key' || name === 'children') return;
 
	if (name === 'class' && !isSvg) {
		node.className = value || '';
	} else if (name === 'style') {
		node.style.cssText = value || '';
	} else if (name === 'dangerouslySetInnerHTML') {
		if (value) node.innerHTML = value.__html;
	} else if (name !== 'type' && !isSvg && name in node) {
		setProperty(node, name, _util.empty(value) ? '' : value);
		if (_util.falsey(value)) node.removeAttribute(name);
	} else if (name[0] === 'o' && name[1] === 'n') {
		var l = node._listeners || (node._listeners = {});
		name = _util.toLowerCase(name.substring(2));
		if (!l[name]) node.addEventListener(name, eventProxy);else if (!value) node.removeEventListener(name, eventProxy);
		l[name] = value;
	} else {
		var ns = isSvg && name.match(/^xlink\:?(.+)/);
		if (_util.falsey(value)) {
			Iif (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', _util.toLowerCase(ns[1]));else node.removeAttribute(name);
		} else if (typeof value !== 'object' && !_util.isFunction(value)) {
			Iif (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', _util.toLowerCase(ns[1]), value);else node.setAttribute(name, value);
		}
	}
}
 
/** Attempt to set a DOM property to the given value.
 *	IE & FF throw for certain property-value combinations.
 */
function setProperty(node, name, value) {
	try {
		node[name] = value;
	} catch (e) {}
}
 
/** Proxy an event to hooked event handlers
 *	@private
 */
function eventProxy(e) {
	return this._listeners[e.type](_hooks.optionsHook('event', e) || e);
}
 
/** Get a node's attributes as a hashmap.
 *	@private
 */
 
function getRawNodeAttributes(node) {
	var attrs = {};
	for (var i = node.attributes.length; i--;) {
		attrs[node.attributes[i].name] = node.attributes[i].value;
	}
	return attrs;
}