all files / src/dom/ index.js

95.95% Statements 71/74
92.77% Branches 77/83
100% Functions 8/8
98.36% Lines 60/61
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115    12× 12× 12× 12× 12× 12×   12×   12×   12×   12×   12×   11136×     13114× 9941×           12198× 12198×                       1079×   1079×   1077× 26× 1051× 461×   461× 453× 1367× 453× 1359×     590× 587× 36× 36× 551× 471× 471× 471× 457× 14×   471×   80× 80× 24× 56× 49×               36× 36×                         4968× 4968× 3155×   4968×    
'use strict';
 
exports.__esModule = true;
exports.ensureNodeData = ensureNodeData;
exports.getNodeType = getNodeType;
exports.removeNode = removeNode;
exports.setAccessor = setAccessor;
exports.getRawNodeAttributes = getRawNodeAttributes;
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 
var _constants = require('../constants');
 
var _options = require('../options');
 
var _options2 = _interopRequireDefault(_options);
 
var _util = require('../util');
 
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, old, isSvg) {
	ensureNodeData(node)[name] = value;
 
	if (name === 'key' || name === 'children') return;
 
	if (name === 'class' && !isSvg) {
		node.className = value || '';
	} else if (name === 'style') {
		if (!value || _util.isString(value) || _util.isString(old)) {
			node.style.cssText = value || '';
		}
		if (value && typeof value === 'object') {
			for (var i in old) {
				if (!(i in value)) node.style[i] = '';
			}for (var i in value) {
				node.style[i] = typeof value[i] === 'number' && !_constants.NON_DIMENSION_PROPS[i] ? value[i] + 'px' : value[i];
			}
		}
	} 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 (value) {
			if (!l[name]) node.addEventListener(name, eventProxy);
		} else if (l[name]) {
			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](_options2['default'].event && _options2['default'].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;
}