1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
// Try intercept traces links in Rails 4.2.
var traceFrames = document.getElementsByClassName('trace-frames');
var selectedFrame, currentSource = document.getElementById('frame-source-0');
// Add click listeners for all stack frames
for (var i = 0; i < traceFrames.length; i++) {
traceFrames[i].addEventListener('click', function(e) {
e.preventDefault();
var target = e.target;
var frameId = target.dataset.frameId;
var exceptionObjectId = target.dataset.exceptionObjectId;
// Change the binding of the console.
changeBinding(frameId, exceptionObjectId, function() {
// Rails already handles toggling the select class
selectedFrame = target;
return target.innerHTML;
});
// Change the extracted source code
changeSourceExtract(frameId);
});
}
// Change the binding of the current session and prompt the user.
function changeBinding(frameId, exceptionObjectId, callback) {
REPLConsole.currentSession.switchBindingTo(frameId, exceptionObjectId, callback);
}
function changeSourceExtract(frameId) {
var el = document.getElementById('frame-source-' + frameId);
if (currentSource && el) {
currentSource.className += " hidden";
el.className = el.className.replace(" hidden", "");
currentSource = el;
}
}
// Push the error page body upwards the size of the console.
//
// While, I wouldn't like to do that on every custom page (so I don't screw
// user's layouts), I think a lot of developers want to see all of the content
// on the default Rails error page.
//
// Since it's quite special as is now, being a bit more special in the name of
// better user experience, won't hurt.
document.addEventListener('DOMContentLoaded', function() {
var consoleElement = document.getElementById('console');
var resizerElement = consoleElement.getElementsByClassName('resizer')[0];
var containerElement = document.getElementById('container');
function setContainerElementBottomMargin(pixels) {
containerElement.style.marginBottom = pixels + 'px';
}
var currentConsoleElementHeight = consoleElement.offsetHeight;
setContainerElementBottomMargin(currentConsoleElementHeight);
resizerElement.addEventListener('mousedown', function(event) {
function recordConsoleElementHeight(event) {
resizerElement.removeEventListener('mouseup', recordConsoleElementHeight);
var currentConsoleElementHeight = consoleElement.offsetHeight;
setContainerElementBottomMargin(currentConsoleElementHeight);
}
resizerElement.addEventListener('mouseup', recordConsoleElementHeight);
});
});
|