diff --git a/front/src/views/rule.html b/front/src/views/rule.html index a31efa4..9385be9 100644 --- a/front/src/views/rule.html +++ b/front/src/views/rule.html @@ -48,6 +48,9 @@
+ Scroll event bound on window + Scroll event bound on document + window.onscroll function declared
no backtrace
backtrace diff --git a/lib/metadata/policies.js b/lib/metadata/policies.js index 4bc9347..fc18c4d 100644 --- a/lib/metadata/policies.js +++ b/lib/metadata/policies.js @@ -216,7 +216,7 @@ var policies = { return { count: offenders.length, list: offenders.map(function(offender) { - var parts = /^bound by (.*)$/.exec(offender); + var parts = /^bound by (.*) on ([^ ]+)$/.exec(offender); if (!parts) { debug('eventsScrollBound offenders transform function error with "%s"', offender); @@ -228,7 +228,8 @@ var policies = { var backtraceArray = offendersHelpers.backtraceToArray(parts[1]); return { - backtrace: backtraceArray || [] + backtrace: backtraceArray || [], + target: parts[2] }; }) }; @@ -239,8 +240,8 @@ var policies = { "label": "DOM access on scroll", "message": "

This rule counts the number of DOM-accessing functions calls, such as queries, readings, writings, bindings and jQuery functions.

Two scroll events are triggered quickly, one after the other, and only the second one is analyzed so throttled functions are ignored.

One of the main reasons of a poor scrolling experience is when too much JS is executed on each scroll event. Note that some devices such as smartphones and MacBooks send more scroll events than others.

Reduce the number of DOM accesses inside scroll listeners. Put DOM queries outside them when possible. Use throttling or deboucing.

", "isOkThreshold": 1, - "isBadThreshold": 10, - "isAbnormalThreshold": 20, + "isBadThreshold": 12, + "isAbnormalThreshold": 25, "hasOffenders": true, "offendersTransformFn": function(offenders) { return offenders; diff --git a/lib/tools/phantomas/custom_modules/modules/eventYLT/eventYLT.js b/lib/tools/phantomas/custom_modules/modules/eventYLT/eventYLT.js index 8409fbd..82b678e 100644 --- a/lib/tools/phantomas/custom_modules/modules/eventYLT/eventYLT.js +++ b/lib/tools/phantomas/custom_modules/modules/eventYLT/eventYLT.js @@ -41,7 +41,7 @@ exports.module = function(phantomas) { // count window.addEventListener('scroll', ...) - issue #508 if (eventType === 'scroll' && (path === 'window' || path === '#document')) { phantomas.incrMetric('eventsScrollBound'); - phantomas.addOffender('eventsScrollBound', 'bound by %s', phantomas.getBacktrace()); + phantomas.addOffender('eventsScrollBound', 'bound by %s on %s', phantomas.getBacktrace(), path); } } @@ -67,4 +67,16 @@ exports.module = function(phantomas) { })(window.__phantomas); }); }); + + phantomas.on('report', function() { + phantomas.evaluate(function() { + (function(phantomas) { + // Check if a window.onscroll function is defined + if (typeof(window.onscroll) === "function") { + phantomas.incrMetric('eventsScrollBound'); + phantomas.addOffender('eventsScrollBound', 'bound by %s on %s', '', 'window.onscroll'); + } + }(window.__phantomas)); + }); + }); }; diff --git a/lib/tools/phantomas/custom_modules/modules/scrollListener/scrollListener.js b/lib/tools/phantomas/custom_modules/modules/scrollListener/scrollListener.js index cd6e1df..bc250b0 100644 --- a/lib/tools/phantomas/custom_modules/modules/scrollListener/scrollListener.js +++ b/lib/tools/phantomas/custom_modules/modules/scrollListener/scrollListener.js @@ -32,13 +32,7 @@ exports.module = function(phantomas) { }); window.dispatchEvent(evt); - // 3. onscroll() - if (window.onscroll) { - phantomas.pushContext({ - type: 'window.onscroll' - }); - window.onscroll(); - } + // No need to call window.onscroll(), it's called by the scroll event on window } catch(e) { phantomas.log('ScrollListener error: %s', e); diff --git a/test/www/scroll-page.html b/test/www/scroll-page.html new file mode 100644 index 0000000..2ff52a5 --- /dev/null +++ b/test/www/scroll-page.html @@ -0,0 +1,18 @@ + + + Scroll page + + +

Simple page

+ + + + \ No newline at end of file