浏览代码

Add addEventListeners to the JS execution tree

Gaël Métais 11 年之前
父节点
当前提交
3170deef28
共有 2 个文件被更改,包括 45 次插入0 次删除
  1. 1 0
      app/lib/phantomasWrapper.js
  2. 44 0
      phantomas_custom/modules/eventListYLT/eventListYLT.js

+ 1 - 0
app/lib/phantomasWrapper.js

@@ -37,6 +37,7 @@ var PhantomasWrapper = function() {
                 'domComplexity',
                 'domMutations',
                 'domQueries',
+                'eventListeners',
                 'filmStrip',
                 'jQuery',
                 'jserrors',

+ 44 - 0
phantomas_custom/modules/eventListYLT/eventListYLT.js

@@ -0,0 +1,44 @@
+/**
+ * Analyzes events bound to DOM elements
+ */
+/* global Document: true, Element: true, window: true */
+'use strict';
+
+exports.version = '0.2.a';
+
+exports.module = function(phantomas) {
+        phantomas.setMetric('eventsBound'); // @desc number of EventTarget.addEventListener calls
+
+    // spy calls to EventTarget.addEventListener
+    // @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener
+    phantomas.once('init', function() {
+        phantomas.evaluate(function() {
+            (function(phantomas) {
+                function eventSpyBefore(eventType) {
+                    /* jshint validthis: true */
+                    var path = phantomas.getDOMPath(this);
+                    //phantomas.log('DOM event: "' + eventType + '" bound to "' + path + '"');
+
+                    phantomas.incrMetric('eventsBound');
+                    phantomas.addOffender('eventsBound', '"%s" bound to "%s"', eventType, path);
+
+                    phantomas.enterContext({
+                        type: 'addEventListener',
+                        callDetails: {
+                            context: {
+                                domElement: path
+                            },
+                            arguments: [eventType]
+                        },
+                        caller: phantomas.getCaller(1),
+                        backtrace: phantomas.getBacktrace()
+                    });
+                }
+
+                phantomas.spy(Element.prototype, 'addEventListener', eventSpyBefore, phantomas.leaveContext);
+                phantomas.spy(Document.prototype, 'addEventListener', eventSpyBefore, phantomas.leaveContext);
+                phantomas.spy(window, 'addEventListener', eventSpyBefore, phantomas.leaveContext);
+            })(window.__phantomas);
+        });
+    });
+};