debug.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. // use this to isolate the scope
  2. (function () {
  3. if(!$axure.document.configuration.showConsole) { return; }
  4. $(document).ready(function () {
  5. var pluginInfo = {
  6. id: 'debugHost',
  7. context: 'inspect',
  8. title: 'Interaction Console',
  9. gid: 3
  10. };
  11. var pluginStarted = false;
  12. var showEmptyState = true;
  13. $axure.player.createPluginHost(pluginInfo);
  14. var prevElId = 'p';
  15. var currentElId = 'c';
  16. generateDebug();
  17. $('#variablesClearLink').click(clearvars_click);
  18. $('#traceClear').click(cleartrace_click);
  19. $('#traceToggle').click(stoptrace_click);
  20. $('#closeConsole').click(close);
  21. var currentStack= [];
  22. var finishedStack = [];
  23. $axure.messageCenter.addMessageListener(function (message, data) {
  24. if(message == 'axCompositeEventMessage') {
  25. for(var i = 0; i < data.length; i++) {
  26. processMessages(data[i].message, data[i].data);
  27. }
  28. } else processMessages(message, data);
  29. });
  30. var processMessages = function (message, data) {
  31. if(message == 'openPlugin') {
  32. if(data == pluginInfo.id && !pluginStarted) {
  33. starttrace();
  34. }
  35. } else if(message == 'globalVariableValues') {
  36. $('#variablesDiv').empty();
  37. for(var key in data) {
  38. var value = data[key] == '' ? '<span>(blank)</span>' : data[key];
  39. $('#variablesDiv').append('<div class="variableList"><div class="variableName">' + key + '</div><div class="variableValue">' + value + '</div></div>');
  40. }
  41. } else if(message == 'axEvent') {
  42. hideEmptyState();
  43. prevElId = currentElId;
  44. currentElId = data.elementId;
  45. var addToStack = "<div class='axEventBlock'>";
  46. addToStack += "<div class='axEventContainer'>";
  47. addToStack += " <div class='axTime'>" + new Date().toLocaleTimeString() + "</div>";
  48. addToStack += " <div class='axLabel'>" + data.label + " (" + data.type + ")</div>";
  49. addToStack += " <div class='axEvent'>" + data.event.description + "</div>";
  50. addToStack += "</div></div>";
  51. currentStack.push($(addToStack));
  52. } else if (message == 'axEventComplete') {
  53. handleNoCondition()
  54. if (tryAddGroupCounter()) {
  55. currentStack.shift();
  56. return;
  57. }
  58. finishedStack.push(currentStack.shift());
  59. for (var i = finishedStack.length - 1; i >= 0; i--) {
  60. if ($('#traceDiv').children().length > 99) $('#traceDiv').children().last().remove();
  61. $('#traceDiv').prepend(finishedStack[i]);
  62. }
  63. finishedStack = [];
  64. } else if (message == 'axCase') {
  65. var addToStack = "<div class='axCaseContainer'>";
  66. addToStack += " <div class='axCaseItem'>" + data.item + "</div>";
  67. if (data.description) { addToStack += " <div class='axCaseDescription' title='" + data.description + "'>" + data.description + "</div>" };
  68. addToStack += "</div>";
  69. currentStack[currentStack.length - 1].append($(addToStack));
  70. } else if (message == 'axAction') {
  71. var addToStack = "<div class='axActionContainer'>";
  72. addToStack += " <div class='axActionItem'>" + data.name + "</div>";
  73. addToStack += "</div>";
  74. currentStack[currentStack.length - 1].append($(addToStack));
  75. } else if (message == 'axInfo') {
  76. var addToStack = "<div class='axInfoContainer'>";
  77. addToStack += " <div class='axInfoItem'>" + data.item + "</div>";
  78. if (data.description) { addToStack += " <div class='axInfoDescription' title='" + data.longDescription + "'>" + data.description + "</div>" };
  79. addToStack += "</div>";
  80. currentStack[currentStack.length - 1].append($(addToStack));
  81. }
  82. }
  83. // bind to the page load
  84. $axure.page.bind('load.debug', function () {
  85. var traceStr = $axure.player.getHashStringVar(TRACE_VAR_NAME);
  86. if (!traceStr) $axure.messageCenter.setState("isTracing", false);
  87. else if (traceStr == 1) starttrace();
  88. else if (traceStr == 0) stoptrace_click();
  89. $axure.messageCenter.postMessage('getGlobalVariables', '');
  90. return false;
  91. });
  92. function handleNoCondition() {
  93. var event = currentStack[currentStack.length - 1];
  94. var action = event.find('.axActionContainer');
  95. if (action.length == 0) {
  96. event.append($("<div class='axActionContainer'><span>No condition met</span></div></div>"));
  97. }
  98. }
  99. function compareEventBlocks(first, second) {
  100. if(currentElId !== prevElId) return false;
  101. var firstClone = first.clone();
  102. var secondClone = second.clone();
  103. firstClone.find('.axTime').remove();
  104. secondClone.find('.axTime').remove();
  105. firstClone.find('.axEventCounter').remove();
  106. secondClone.find('.axEventCounter').remove();
  107. return firstClone.html() === secondClone.html();
  108. }
  109. function tryAddGroupCounter() {
  110. var prevEvent;
  111. if(finishedStack.length == 0 && currentStack.length > 0) {
  112. prevEvent = $('#traceDiv').find('.axEventBlock').first();
  113. if(prevEvent.length == 0) return false;
  114. } else if(finishedStack.length > 0) {
  115. prevEvent = finishedStack[finishedStack.length - 1];
  116. } else {
  117. return false;
  118. }
  119. var currentEvent = currentStack[0];
  120. if(compareEventBlocks(prevEvent, currentEvent)) {
  121. var prevLabel = prevEvent.find('.axLabel');
  122. var counterBlock = prevLabel.find('.axEventCounter');
  123. prevEvent.find('.axTime').text(currentEvent.find('.axTime').text());
  124. if(counterBlock.length == 0) {
  125. var eventCounter = "<span class='axEventCounter'>2</span>";
  126. prevLabel.append($(eventCounter));
  127. return true;
  128. }
  129. var count = counterBlock.text();
  130. if(isNaN(count)) return true;
  131. if(count > 8) counterBlock.text('9+');
  132. else counterBlock.text(+count + 1);
  133. return true;
  134. }
  135. return false;
  136. }
  137. function clearvars_click(event) {
  138. $axure.messageCenter.postMessage('resetGlobalVariables', '');
  139. }
  140. function close() {
  141. $axure.player.pluginClose("debugHost");
  142. }
  143. function cleartrace_click(event) {
  144. $('#traceDiv').html('');
  145. clearLastEventState();
  146. }
  147. function clearLastEventState() {
  148. lastEventId = '';
  149. sameLastEvent = false;
  150. lastCaseName = '';
  151. }
  152. function starttrace() {
  153. $axure.messageCenter.setState("isTracing", true);
  154. console.log("starting trace");
  155. $axure.player.setVarInCurrentUrlHash(TRACE_VAR_NAME, 1);
  156. pluginStarted = true;
  157. if (!$axure.document.configuration.isAxshare) {
  158. $.get("consoleShown");
  159. }
  160. }
  161. function hideEmptyState() {
  162. if(showEmptyState) {
  163. $('#traceEmptyState').hide();
  164. showEmptyState = false;
  165. }
  166. }
  167. function restarttrace_click(event) {
  168. $('#traceToggle').text('Stop');
  169. $('#traceToggle').off("click");
  170. $('#traceToggle').click(stoptrace_click);
  171. starttrace();
  172. clearLastEventState();
  173. }
  174. function stoptrace_click(event) {
  175. $axure.messageCenter.setState("isTracing", false);
  176. $('#traceDiv').prepend('<div class="tracePausedNotification">Trace Paused<div>');
  177. $('#traceToggle').text('Restart');
  178. $('#traceToggle').off("click");
  179. $('#traceToggle').click(restarttrace_click);
  180. console.log("stopping trace");
  181. $axure.player.setVarInCurrentUrlHash(TRACE_VAR_NAME, 0);
  182. pluginStarted = true;
  183. }
  184. });
  185. function generateDebug() {
  186. var pageNotesUi = "<div id='debugHeader'>";
  187. pageNotesUi += "<div id='debugToolbar'>";
  188. pageNotesUi += "<div id='consoleTitle' class='pluginNameHeader'>Console</div>";
  189. pageNotesUi += "</div>";
  190. pageNotesUi += "</div>";
  191. pageNotesUi += "<div id='variablesContainer' style='max-height:300px; overflow-y:auto'>";
  192. pageNotesUi += "<div id='variablesTitle' class='sectionTitle'>Variables</div>";
  193. pageNotesUi += "<a id='variablesClearLink' class='traceOption'>Reset values</a>";
  194. pageNotesUi += "<div id='variablesDiv'></div></div>";
  195. pageNotesUi += "<div id='traceContainer'>";
  196. pageNotesUi += "<div id='traceHeader'>";
  197. pageNotesUi += "<span class='sectionTitle'>Trace</span><a id='traceClear' class='traceOption'>Clear</a><a id='traceToggle' class='traceOption'>Stop</a>";
  198. pageNotesUi += "</div>";
  199. pageNotesUi += "</div>";
  200. pageNotesUi += "<div id='debugScrollContainer'>";
  201. pageNotesUi += "<div id='debugContainer'>";
  202. pageNotesUi += "<div id='traceEmptyState'>Interactions will be recorded here as you click through the prototype</div>";
  203. pageNotesUi += "<div id='traceDiv'></div></div>";
  204. pageNotesUi += "</div></div>";
  205. $('#debugHost').append(pageNotesUi);
  206. }
  207. })();