index.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /**
  2. * Ajax接口调试功能
  3. *
  4. * 原理:
  5. *
  6. * devtools → background-page → content-page → console.*
  7. *
  8. * @author [email protected]
  9. */
  10. let AjaxDebugger = (function () {
  11. let MSG_TYPE = Tarp.require('../static/js/core/msg_type');
  12. /**
  13. * 自定义Console
  14. */
  15. let FeHelperConsole = (function () {
  16. let Types = 'log,debug,info,warn,error,group,groupCollapsed,groupEnd'.split(',');
  17. let sendMessage = function (type, format, args) {
  18. chrome.extension.sendMessage({
  19. type: MSG_TYPE.AJAX_DEBUGGER_CONSOLE,
  20. content: escape(JSON.stringify(Array.prototype.slice.call(arguments, 0)))
  21. });
  22. };
  23. let that = new Function();
  24. Types.forEach(function (tp) {
  25. that[tp] = sendMessage.bind(that, tp);
  26. });
  27. return that;
  28. })();
  29. /**
  30. * 分析Request
  31. * @param request
  32. */
  33. let analyticRequest = function (request) {
  34. let url = request.request.url || "",
  35. urlSeparator = (url.indexOf("?") > -1) ? "&" : "?",
  36. requestParams = (request.request.postData && request.request.postData.params) || [],
  37. responseStatus = request.response.status + " " + request.response.statusText,
  38. responseSize = request.response.bodySize + request.response.headersSize;
  39. let queryString = '';
  40. requestParams.forEach(function (param, index) {
  41. queryString += (index === 0 ? urlSeparator : '&') + param.name + '=' + param.value;
  42. });
  43. let requestPath = '/' + (url.split('?') || [''])[0].replace('://', '').split('/').splice(1).join('/');
  44. let responseTime = request.time > 1000 ? Math.ceil(request.time / 1000) + 's' : Math.ceil(request.time) + 'ms';
  45. responseSize = responseSize > 1024 ? Math.ceil(responseSize / 1024) + 'KB' : Math.ceil(responseSize) + 'B';
  46. // 获取Response的数据
  47. request.getContent(function (content, encoding) {
  48. if (content) {
  49. try {
  50. request.response.responseData = JSON.parse(content);
  51. }
  52. catch (e) {
  53. request.response.responseData = content;
  54. }
  55. }
  56. let header = "Ajax请求加载完毕 (" + [requestPath, responseStatus, responseTime, responseSize].join(" - ") + ") " + ' -- By FeHelper';
  57. FeHelperConsole.group(header);
  58. FeHelperConsole.log('AjaxURL :', {url: url + queryString});
  59. FeHelperConsole.log("Request :", {request: request.request});
  60. FeHelperConsole.log("Response :", {response: request.response});
  61. FeHelperConsole.log("OtherInfo:", {
  62. timeConsuming: responseTime,
  63. timings: request.timings,
  64. time: request.startedDateTime,
  65. server: request.serverIPAddress
  66. });
  67. FeHelperConsole.groupEnd();
  68. });
  69. };
  70. /**
  71. * 监控Network中的请求
  72. */
  73. chrome.devtools.network.onRequestFinished.addListener(function (request) {
  74. let reqUrl = request.request.url.split('?')[0];
  75. if (/\.js$/.test(reqUrl)) {
  76. return false;
  77. }
  78. let isXHR = /\.json$/.test(reqUrl) || (request.request.headers.concat(request.response.headers)).some(function (header) {
  79. return (
  80. (header.name === "X-Requested-With" && header.value === "XMLHttpRequest") ||
  81. (header.name === "Content-Type" && (
  82. header.value === "application/x-www-form-urlencoded" ||
  83. /application\/json/.test(header.value) ||
  84. /application\/javascript/.test(header.value) ||
  85. /text\/javascript/.test(header.value)
  86. ))
  87. );
  88. });
  89. if (isXHR) {
  90. chrome.extension.sendMessage({
  91. type: MSG_TYPE.AJAX_DEBUGGER_SWITCH
  92. }, function (debuggerSwitchOn) {
  93. debuggerSwitchOn && analyticRequest(request);
  94. });
  95. }
  96. });
  97. })();