|
147 | 147 | this.clear(); |
148 | 148 |
|
149 | 149 | if(DEBUG) |
| 150 | + { |
150 | 151 | window.RemoteTrace = this; |
| 152 | + this.testStack = function() |
| 153 | + { |
| 154 | + this._onMessage(JSON.stringify({ |
| 155 | + time: 7, |
| 156 | + level: "GENERAL", |
| 157 | + message: ["I am a message with an %o object", {foo:"bar", blah:true}], |
| 158 | + stack: [ |
| 159 | + { |
| 160 | + function: "pretendObject.doesNotExist", |
| 161 | + file: "http://www.google.com/nonExistantFile.js", |
| 162 | + lineLocation: "3:40" |
| 163 | + }, |
| 164 | + { |
| 165 | + function: "<anonymous>", |
| 166 | + file: "http://www.google.com/nonExistantFile.js", |
| 167 | + lineLocation: "7" |
| 168 | + }, |
| 169 | + { |
| 170 | + function: "this.testStack", |
| 171 | + file: "http://localhost:8080/assets/js/../../../src/springroll/remote/RemoteTrace.js", |
| 172 | + lineLocation: "154:10" |
| 173 | + } |
| 174 | + ] |
| 175 | + })); |
| 176 | + }; |
| 177 | + this.testGroups = function() |
| 178 | + { |
| 179 | + this._onMessage(JSON.stringify({ |
| 180 | + time: 3, |
| 181 | + level: "group", |
| 182 | + message: ["Group start!"], |
| 183 | + stack: [ |
| 184 | + { |
| 185 | + function: "pretendObject.doesNotExist", |
| 186 | + file: "http://www.google.com/nonExistantFile.js", |
| 187 | + lineLocation: "3:40" |
| 188 | + } |
| 189 | + ] |
| 190 | + })); |
| 191 | + this._onMessage(JSON.stringify({ |
| 192 | + time: 3, |
| 193 | + level: "GENERAL", |
| 194 | + message: ["item in a group #1!"], |
| 195 | + stack: [ |
| 196 | + { |
| 197 | + function: "pretendObject.doesNotExist", |
| 198 | + file: "http://www.google.com/nonExistantFile.js", |
| 199 | + lineLocation: "3:40" |
| 200 | + } |
| 201 | + ] |
| 202 | + })); |
| 203 | + this._onMessage(JSON.stringify({ |
| 204 | + time: 3, |
| 205 | + level: "GENERAL", |
| 206 | + message: ["item in a group #2!"], |
| 207 | + stack: [ |
| 208 | + { |
| 209 | + function: "pretendObject.doesNotExist", |
| 210 | + file: "http://www.google.com/nonExistantFile.js", |
| 211 | + lineLocation: "3:40" |
| 212 | + } |
| 213 | + ] |
| 214 | + })); |
| 215 | + this._onMessage(JSON.stringify({ |
| 216 | + level: "groupEnd" |
| 217 | + })); |
| 218 | + }; |
| 219 | + } |
| 220 | + |
| 221 | + output.on("click", ".message", function(e) |
| 222 | + { |
| 223 | + var target = $(e.target); |
| 224 | + //block object toggles from affecting stack visibility toggles |
| 225 | + if(target.hasClass("objectToggle") || target.parent().hasClass("objectToggle")) |
| 226 | + { |
| 227 | + //stop the event |
| 228 | + e.stopPropagation(); |
| 229 | + var targetId = target.hasClass("objectToggle") ? |
| 230 | + target.data("target") : target.parent().data("target"); |
| 231 | + //we have to handle the event ourselves |
| 232 | + $(targetId).collapse("toggle"); |
| 233 | + } |
| 234 | + }); |
151 | 235 | }; |
152 | 236 |
|
153 | 237 | // Reference to the prototype |
|
314 | 398 | console.log(output); |
315 | 399 | } |
316 | 400 | }; |
| 401 | + |
| 402 | + function extendNumber(input, length) |
| 403 | + { |
| 404 | + var output = input.toString(); |
| 405 | + while(output.length < length) |
| 406 | + output = "0" + output; |
| 407 | + return output; |
| 408 | + } |
317 | 409 |
|
318 | 410 | /** |
319 | 411 | * Callback when a message is received by the server |
|
332 | 424 | result = JSON.parse(result); |
333 | 425 |
|
334 | 426 | var level = (result.level || "GENERAL").toLowerCase(), |
335 | | - stack = result.stack; |
336 | | - |
337 | | - var now = new Date(); |
| 427 | + stack = result.stack, |
| 428 | + now = new Date(); |
338 | 429 | if(result.time) |
339 | 430 | now.setTime(result.time); |
340 | | - now = now.toLocaleString(); |
| 431 | + now = now.toDateString() + " " + extendNumber(now.getHours(), 2) + ":" + |
| 432 | + extendNumber(now.getMinutes(), 2) + ":" + extendNumber(now.getSeconds(), 2) + |
| 433 | + "." + extendNumber(now.getMilliseconds(), 3); |
341 | 434 |
|
342 | 435 | this.saveButton.removeClass('disabled'); |
343 | 436 | this.clearButton.removeClass('disabled'); |
|
448 | 541 | */ |
449 | 542 | p.logMessage = function(now, messages, level, stack) |
450 | 543 | { |
451 | | - var message = ""; |
452 | | - for(var i = 0; i < messages.length; ++i) |
| 544 | + var message = "", i, length, messageDom; |
| 545 | + for(i = 0, length = messages.length; i < length; ++i) |
453 | 546 | { |
454 | 547 | if(i > 0) |
455 | 548 | message += " "; |
|
464 | 557 | .addClass(level) |
465 | 558 | .append( |
466 | 559 | $("<span class='type'></span>").text(level.toUpperCase()), |
467 | | - $("<span class='timestamp'></span>").text(now), |
468 | | - $("<span class='message'></span>").html(message) |
| 560 | + $("<span class='timestamp'></span>").text(now) |
469 | 561 | ); |
| 562 | + messageDom = $("<span class='message'></span>").html(message); |
| 563 | + if(stack) |
| 564 | + { |
| 565 | + var stackLinkText = stack[0].file; |
| 566 | + if(stackLinkText.indexOf("/") >= 0) |
| 567 | + stackLinkText = stackLinkText.substring(stackLinkText.lastIndexOf("/") + 1); |
| 568 | + stackLinkText += ":" + stack[0].lineLocation; |
| 569 | + log.append($("<span class='stackLink'></span>").text(stackLinkText)) |
| 570 | + .append(messageDom); |
| 571 | + var groupId = "group_" + this.nextGroupId++; |
| 572 | + var group = $("<div class='group stack collapse in' id='" + groupId + "'></div>"); |
| 573 | + for(i = 0, length = stack.length; i < length; ++i) |
| 574 | + { |
| 575 | + stackLinkText = stack[i].file; |
| 576 | + if(stackLinkText.indexOf("/") >= 0) |
| 577 | + stackLinkText = stackLinkText.substring(stackLinkText.lastIndexOf("/") + 1); |
| 578 | + stackLinkText += ":" + stack[i].lineLocation; |
| 579 | + var line = $("<div class='line'></div>"); |
| 580 | + line.text(stack[i].function) |
| 581 | + .append($("<span class='stackLink'></span>").text(stackLinkText)); |
| 582 | + group.append(line); |
| 583 | + } |
| 584 | + log.append(group); |
| 585 | + |
| 586 | + messageDom.attr("data-toggle", "collapse").attr("data-target", "#" + groupId); |
| 587 | + if(level != "error") |
| 588 | + { |
| 589 | + messageDom.addClass("collapsed"); |
| 590 | + group.collapse("hide"); |
| 591 | + } |
| 592 | + } |
| 593 | + else |
| 594 | + log.append(messageDom); |
470 | 595 | this.getLogParent().append(log); |
471 | 596 | return log; |
472 | 597 | }; |
|
479 | 604 | */ |
480 | 605 | p.prepareObject = function(input) |
481 | 606 | { |
482 | | - var output = $("<div class='object'>" + (Array.isArray(input) ? "Array [" : "Object {") + "</div>"); |
| 607 | + var output = $("<div class='object'></div>"); |
483 | 608 |
|
484 | 609 | var group = $("<div class='group log collapse in'></div>"); |
485 | 610 | for(var key in input) |
|
499 | 624 | { |
500 | 625 | var groupId = "group_" + this.nextGroupId++; |
501 | 626 | group.attr("id", groupId); |
502 | | - var chevron = $("<span class='groupToggle' data-toggle='collapse' data-target='#" + groupId + "'></span>"); |
503 | | - chevron.append( |
| 627 | + var chevron = $("<span class='objectToggle' data-toggle='collapse' data-target='#" + groupId + "'> " + (Array.isArray(input) ? "Array [" : "Object {") + "</span>"); |
| 628 | + chevron.prepend( |
504 | 629 | $("<span class='glyphicon glyphicon-chevron-right right'></span>"), |
505 | 630 | $("<span class='glyphicon glyphicon-chevron-down down'></span>") |
506 | 631 | ); |
507 | 632 | output.prepend(chevron); |
508 | 633 | output.append(group); |
| 634 | + group.append(Array.isArray(input) ? "]" : "}"); |
509 | 635 | } |
510 | | - output.append(Array.isArray(input) ? "]" : "}"); |
| 636 | + else |
| 637 | + group.append(Array.isArray(input) ? "Array []" : "Object {}"); |
511 | 638 | return output; |
512 | 639 | }; |
513 | 640 |
|
|
0 commit comments