offendersHelpers.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. var OffendersHelpers = function() {
  2. this.domPathToArray = function(str) {
  3. return str.split(/\s?>\s?/);
  4. };
  5. this.listOfDomArraysToTree = function(listOfDomArrays) {
  6. var result = {};
  7. function recursiveTreeBuilder(tree, domArray) {
  8. if (domArray.length > 0) {
  9. var currentDomElement = domArray.shift();
  10. if (tree === null) {
  11. tree = {};
  12. }
  13. tree[currentDomElement] = recursiveTreeBuilder(tree[currentDomElement] || null, domArray);
  14. return tree;
  15. } else if (tree === null) {
  16. return 1;
  17. } else {
  18. return tree + 1;
  19. }
  20. }
  21. listOfDomArrays.forEach(function(domArray) {
  22. result = recursiveTreeBuilder(result, domArray);
  23. });
  24. return result;
  25. };
  26. this.domPathToDomElementObj = function(domPath) {
  27. var domArray = this.domPathToArray(domPath);
  28. var domTree = this.listOfDomArraysToTree([this.domPathToArray(domPath)]);
  29. if (domArray[0] === 'html') {
  30. return {
  31. type: 'html'
  32. };
  33. }
  34. if (domArray[0] === 'body') {
  35. if (domArray.length === 1) {
  36. return {
  37. type: 'body'
  38. };
  39. } else {
  40. return {
  41. type: 'domElement',
  42. element: domArray[domArray.length - 1],
  43. tree: domTree
  44. };
  45. }
  46. }
  47. if (domArray[0] === 'head') {
  48. return {
  49. type: 'head'
  50. };
  51. }
  52. if (domArray[0] === '#document') {
  53. return {
  54. type: 'document'
  55. };
  56. }
  57. if (domArray[0] === 'window') {
  58. return {
  59. type: 'window'
  60. };
  61. }
  62. if (domArray[0] === 'DocumentFragment') {
  63. if (domArray.length === 1) {
  64. return {
  65. type: 'fragment'
  66. };
  67. } else {
  68. return {
  69. type: 'fragmentElement',
  70. element: domArray[domArray.length - 1],
  71. tree: domTree
  72. };
  73. }
  74. }
  75. // Not attached element, such as just created with document.createElement()
  76. if (domArray.length === 1) {
  77. return {
  78. type: 'createdElement',
  79. element: domPath
  80. };
  81. } else {
  82. return {
  83. type: 'createdElement',
  84. element: domArray[domArray.length - 1],
  85. tree: domTree
  86. };
  87. }
  88. };
  89. this.backtraceToArray = function(str) {
  90. var traceArray = str.split(/ \/ /);
  91. if (traceArray) {
  92. var results = [];
  93. var parts = null;
  94. for (var i=0 ; i<traceArray.length ; i++) {
  95. parts = /^(([\w$]+) )?([^ ]+):(\d+)$/.exec(traceArray[i]);
  96. if (parts) {
  97. var obj = {
  98. file: parts[3],
  99. line: parseInt(parts[4], 10)
  100. };
  101. if (parts[2]) {
  102. obj.functionName = parts[2];
  103. }
  104. results.push(obj);
  105. } else {
  106. return null;
  107. }
  108. }
  109. return results;
  110. } else {
  111. return null;
  112. }
  113. };
  114. this.sortVarsLikeChromeDevTools = function(vars) {
  115. return vars.sort(function(a, b) {
  116. return (a < b) ? -1 : 1;
  117. });
  118. };
  119. this.urlToLink = function(url) {
  120. var shortUrl = (url.length > 110) ? url.substr(0, 47) + ' ... ' + url.substr(-48) : url;
  121. return '<a href="' + url + '" target="_blank" title="' + url + '">' + shortUrl + '</a>';
  122. };
  123. this.cssOffenderPattern = function(offender) {
  124. var parts = /^(.*) (?:<([^ \(]*)>|\[inline CSS\]) @ (\d+):(\d+)$/.exec(offender);
  125. if (!parts) {
  126. return {
  127. offender: offender
  128. };
  129. } else {
  130. return {
  131. css: parts[1],
  132. file: parts[2] || null,
  133. line: parseInt(parts[3], 10),
  134. column: parseInt(parts[4], 10)
  135. };
  136. }
  137. };
  138. this.fileWithSizePattern = function(fileWithSize) {
  139. var parts = /^([^ ]*) \((\d+\.\d{2}) kB\)$/.exec(fileWithSize);
  140. if (!parts) {
  141. return {
  142. file: fileWithSize
  143. };
  144. } else {
  145. return {
  146. file: parts[1],
  147. size: parseFloat(parts[2])
  148. };
  149. }
  150. };
  151. };
  152. module.exports = new OffendersHelpers();