decorate.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. window.Tracker = window.Tracker || {};
  2. Tracker.Decorate = function (window, pageWin) {
  3. var Element, appendChild, insertBefore, getAttribute, check, checklist, scriptElements, i, l;
  4. Element = pageWin.Element.prototype;
  5. appendChild = Element.appendChild;
  6. insertBefore = Element.insertBefore;
  7. scriptElements = pageWin.document.scripts;
  8. var overideInsertingNodeFunction = function (fn) {
  9. return function (node) {
  10. var me, args, url, code, content;
  11. me = this;
  12. args = [].slice.apply(arguments);
  13. if (!node || node.nodeName != "SCRIPT")
  14. return fn.apply(me, args);
  15. url = node.getAttribute("src");
  16. if (!url)
  17. return fn.apply(me, args);
  18. Tracker.Util.intelligentGet(url).then(function (data) {
  19. content = data.response;
  20. code = new Tracker.Code(url, content, Tracker.Util.handle(node));
  21. code.setType("append");
  22. code.loadConsum = data.consum;
  23. Tracker.CodeList.add(code);
  24. node.removeAttribute("src");
  25. Tracker.View.ControlPanel.addCode(code);
  26. code.onReady(function () {
  27. node.appendChild(pageWin.document.createTextNode(code.executiveCode));
  28. fn.apply(me, args);
  29. node.src = url;
  30. });
  31. }, function () {
  32. code = new Tracker.Code(url);
  33. code.setType("append");
  34. code.setState("timeout");
  35. Tracker.CodeList.add(code);
  36. fn.apply(me, args);
  37. Tracker.View.ControlPanel.addCode(code);
  38. });
  39. return node;
  40. };
  41. };
  42. check = function (item, name) {
  43. if (item && item.prototype && item.prototype[name])
  44. if (item.prototype[name] != Element[name])
  45. item.prototype[name] = Element[name];
  46. };
  47. checklist = [window.HTMLElement, window.HTMLHeadElement, window.HTMLBodyElement];
  48. Element.appendChild = overideInsertingNodeFunction(appendChild);
  49. Element.insertBefore = overideInsertingNodeFunction(insertBefore);
  50. Tracker.Util.forEach(checklist, function (object) {
  51. check(object, "appendChild");
  52. check(object, "insertBefore");
  53. });
  54. window.__tracker__ = function (groupId) {
  55. [].concat((groupId || '').split(',')).forEach(function (item) {
  56. Tracker.StatusPool.arrivedSnippetGroupPut(item);
  57. });
  58. };
  59. window.__trackerError__ = function (codeId, msg) {
  60. Tracker.CodeList.get(codeId).addError(msg);
  61. };
  62. window.__trackerMockTop__ = function () {
  63. return {
  64. location: {},
  65. document: {write: Tracker.Util.blank}
  66. };
  67. };
  68. window.__trackerScriptStart__ = function (codeId, scriptTagIndex) {
  69. var script, code;
  70. script = scriptTagIndex === "undefined" ?
  71. scriptElements[scriptElements.length - 1] : Tracker.Util.handle(scriptTagIndex);
  72. if (script && script.hasAttribute("tracker-src"))
  73. script.src = script.getAttribute("tracker-src");
  74. setTimeout(function () {
  75. if (script.onreadystatechange)
  76. script.onreadystatechange();
  77. }, 0);
  78. code = Tracker.CodeList.get(codeId);
  79. code._startTime = new Date();
  80. };
  81. window.__trackerScriptEnd__ = function (codeId) {
  82. var code, endTime;
  83. endTime = new Date();
  84. code = Tracker.CodeList.get(codeId);
  85. code.runConsum = endTime.getTime() - code._startTime.getTime();
  86. // TODO: 此值虚高,因为钩子运行本身也产生耗时,需要扣除钩子时间才准确
  87. delete code._startTime;
  88. code.lastModified = Tracker.Util.time();
  89. };
  90. window.onbeforeunload = function () {
  91. var startTime = Tracker.Util.time();
  92. return function () {
  93. var now = Tracker.Util.time();
  94. if (now - startTime < 3e3)
  95. setTimeout(function () {
  96. var h = window.location.hash;
  97. window.location.href = ~h.indexOf("#") ? h : "#" + h;
  98. }, 0);
  99. while (Tracker.Util.time() - now < 500);
  100. }
  101. }();
  102. };