/** * Analyzes DOM complexity */ /* global document: true, Node: true, window: true */ exports.version = '1.0.a'; exports.module = function(phantomas) { 'use strict'; // total length of HTML comments (including brackets) phantomas.setMetric('commentsSize'); // @desc the size of HTML comments on the page @offenders // total length of text nodes with whitespaces only (i.e. pretty formatting of HTML) phantomas.setMetric('whiteSpacesSize'); // @desc the size of text nodes with whitespaces only // count all tags phantomas.setMetric('DOMelementsCount'); // @desc total number of HTML element nodes phantomas.setMetric('DOMelementMaxDepth'); // @desc maximum level on nesting of HTML element node // nodes with inlines CSS (style attribute) phantomas.setMetric('nodesWithInlineCSS'); // @desc number of nodes with inline CSS styling (with style attribute) @offenders // images phantomas.setMetric('imagesScaledDown'); // @desc number of nodes that have images scaled down in HTML @offenders phantomas.setMetric('imagesWithoutDimensions'); // @desc number of nodes without both width and height attribute @offenders // duplicated ID (issue #392) phantomas.setMetric('DOMidDuplicated'); // @desc number of duplicated IDs found in DOM var Collection = require('../../../../../../node_modules/phantomas/lib/collection'), DOMids = new Collection(); phantomas.on('domId', function(id) { DOMids.push(id); }); // HTML size phantomas.on('report', function() { phantomas.setMetricEvaluate('bodyHTMLSize', function() { // @desc the size of body tag content (document.body.innerHTML.length) return document.body && document.body.innerHTML.length || 0; }); phantomas.evaluate(function() { (function(phantomas) { var runner = new phantomas.nodeRunner(), whitespacesRegExp = /^\s+$/, DOMelementMaxDepth = 0, DOMelementMaxDepthElts = [], size = 0; runner.walk(document.body, function(node, depth) { switch (node.nodeType) { case Node.COMMENT_NODE: size = node.textContent.length + 7; // ''.length phantomas.incrMetric('commentsSize', size); // log HTML comments bigger than 64 characters if (size > 64) { phantomas.addOffender('commentsSize', phantomas.getDOMPath(node) + ' (' + size + ' characters)'); } break; case Node.ELEMENT_NODE: phantomas.incrMetric('DOMelementsCount'); if (depth > DOMelementMaxDepth) { DOMelementMaxDepth = depth; DOMelementMaxDepthElts = [phantomas.getDOMPath(node)]; } else if (depth === DOMelementMaxDepth) { DOMelementMaxDepthElts.push(phantomas.getDOMPath(node)); } // report duplicated ID (issue #392) if (node.id) { phantomas.emit('domId', node.id); } // ignore inline