diff --git a/phantomas_custom/modules/domComplexYLT/domComplexYLT.js b/phantomas_custom/modules/domComplexYLT/domComplexYLT.js index f35bf9d..a64f3c6 100644 --- a/phantomas_custom/modules/domComplexYLT/domComplexYLT.js +++ b/phantomas_custom/modules/domComplexYLT/domComplexYLT.js @@ -3,7 +3,7 @@ */ /* global document: true, Node: true, window: true */ -exports.version = '0.4.a'; +exports.version = '1.0.a'; exports.module = function(phantomas) { 'use strict'; @@ -18,11 +18,23 @@ exports.module = function(phantomas) { phantomas.setMetric('DOMelementsCount'); // @desc total number of HTML element nodes phantomas.setMetric('DOMelementMaxDepth'); // @desc maximum level on nesting of HTML element node - phantomas.setMetric('DOMidDuplicated'); // @desc duplicated id found in DOM - // 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) @@ -37,11 +49,6 @@ exports.module = function(phantomas) { DOMelementMaxDepthElts = [], size = 0; - // include all nodes - runner.isSkipped = function(node) { - return false; - }; - runner.walk(document.body, function(node, depth) { switch (node.nodeType) { case Node.COMMENT_NODE: @@ -64,8 +71,8 @@ exports.module = function(phantomas) { DOMelementMaxDepthElts.push(phantomas.getDOMPath(node)); } + // report duplicated ID (issue #392) if (node.id) { - // Send id to a collection so that duplicated ids can be counted phantomas.emit('domId', node.id); } @@ -74,6 +81,20 @@ exports.module = function(phantomas) { return false; } + // images + if (node.nodeName === 'IMG') { + if (!node.hasAttribute('width') || !node.hasAttribute('height')) { + phantomas.incrMetric('imagesWithoutDimensions'); + phantomas.addOffender('imagesWithoutDimensions', '%s <%s>', phantomas.getDOMPath(node), node.src); + } + if (node.naturalHeight && node.naturalWidth && node.height && node.width) { + if (node.naturalHeight > node.height || node.naturalWidth > node.width) { + phantomas.incrMetric('imagesScaledDown'); + phantomas.addOffender('imagesScaledDown', '%s (%dx%d -> %dx%d)', node.src, node.naturalWidth, node.naturalHeight, node.width, node.height); + } + } + } + // count nodes with inline CSS if (node.hasAttribute('style')) { phantomas.incrMetric('nodesWithInlineCSS'); @@ -100,44 +121,15 @@ exports.module = function(phantomas) { // count