Deep Debugger
var tableRows = {};
var tableCels = {};
var tableObjs = {};
var tablesBuilt = {};
var tableShows = {};
var tableHides = {};
// IE: nodes w/id need to be redeclared or getElementById is b0rked
var frame = null;
window.onload = function(){
// if IE loads this page too quickly (instantly) then
// window.debugVar might not have been set
window.setTimeout(startMeUp, 100);
}
function startMeUp(){
frame = document.getElementById('frame');
// GET string
var index = location.search.split("=").pop();
var debugObj = window.opener.dojo.debugDeep;
var debugVar = debugObj.debugVars[index] || window.debugVar;
buildTable('root', frame, debugVar);
}
function buildTable(path, parent, obj){
var keys = [];
var vals = [];
for(var prop in obj){
keys.push(prop);
try {
vals[prop] = obj[prop];
} catch(E) {
vals[prop] = 'ERROR: ' + E.message;
}
}
keys.sort(keySorter);
if (!keys.length){
var div = document.createElement('div');
div.appendChild(document.createTextNode('Object has no properties.'));
parent.appendChild(div);
return;
}
var t = document.createElement('table');
t.border = "1";
var tb = document.createElement('tbody');
t.appendChild(tb);
for(var i = 0; i < keys.length; i++) {
buildTableRow(path+'-'+keys[i], tb, keys[i], vals[keys[i]]);
}
if (path == 'root'){
//t.style.width = '90%';
}
t.style.width = '100%';
parent.appendChild(t);
tablesBuilt[path] = true;
}
function buildTableRow(path, tb, name, value) {
var simpleType = typeof(value);
var createSubrow = (simpleType == 'object');
var complexType = simpleType;
if (simpleType == 'object'){
var cls = getConstructorClass(value);
if (cls){
if (cls == 'Object'){
}else if (cls == 'Array'){
complexType = 'array';
}else{
complexType += ' ('+cls+')';
}
}
}
/*var tr1 = document.createElement('tr');
var td1 = document.createElement('td');
var td2 = document.createElement('td');
var td3 = document.createElement('td');
var td4 = document.createElement('td');*/
var row = tb.rows.length;
var tr1 = tb.insertRow(row++);
var td1 = tr1.insertCell(0);
var td2 = tr1.insertCell(1);
var td3 = tr1.insertCell(2);
var td4 = tr1.insertCell(3);
tr1.style.verticalAlign = 'top';
td1.style.verticalAlign = 'middle';
td1.className = 'propPlus';
td2.className = 'propName';
td3.className = 'propType';
td4.className = 'propVal';
//tr1.appendChild(td1);
//tr1.appendChild(td2);
//tr1.appendChild(td3);
//tr1.appendChild(td4);
if (createSubrow){
var img1 = document.createElement('img');
img1.width = 9;
img1.height = 9;
img1.src = 'arrow_show.gif';
var a1 = document.createElement('a');
a1.appendChild(img1);
a1.href = '#';
a1.onclick = function(){ showTableRow(path); return false; };
var img2 = document.createElement('img');
img2.width = 9;
img2.height = 9;
img2.src = 'arrow_hide.gif';
var a2 = document.createElement('a');
a2.appendChild(img2);
a2.href = '#';
a2.onclick = function(){ hideTableRow(path); return false; };
a2.style.display = 'none';
tableShows[path] = a1;
tableHides[path] = a2;
td1.appendChild(a1);
td1.appendChild(a2);
}else{
var img = document.createElement('img');
img.width = 9;
img.height = 9;
img.src = 'spacer.gif';
td1.appendChild(img);
}
td2.appendChild(document.createTextNode(name));
td3.appendChild(document.createTextNode(complexType));
td4.appendChild(buildPreBlock(value));
//tb.appendChild(tr1);
if (createSubrow){
var tr2 = tb.insertRow(row++);
var td5 = tr2.insertCell(0);
var td6 = tr2.insertCell(1);
//var tr2 = document.createElement('tr');
//var td5 = document.createElement('td');
//var td6 = document.createElement('td');
td5.innerHTML = ' ';
//td6.innerHTML = ' ';
td6.colSpan = '3';
tr2.appendChild(td5);
tr2.appendChild(td6);
tr2.style.display = 'none';
tb.appendChild(tr2);
tableRows[path] = tr2;
tableCels[path] = td6;
tableObjs[path] = value;
}
}
function showTableRow(path){
var tr = tableRows[path];
var td = tableCels[path];
var a1 = tableShows[path];
var a2 = tableHides[path];
if (!tablesBuilt[path]){
//alert('building table for '+path);
buildTable(path, td, tableObjs[path]);
}
tr.style.display = 'table-row';
a1.style.display = 'none';
a2.style.display = 'inline';
}
function hideTableRow(path){
var tr = tableRows[path];
var a1 = tableShows[path];
var a2 = tableHides[path];
tr.style.display = 'none';
a1.style.display = 'inline';
a2.style.display = 'none';
}
function buildPreBlock(value){
//
// how many lines ?
//
var s = ''+value;
s = s.replace("\r\n", "\n");
s = s.replace("\r", "");
var lines = s.split("\n");
if (lines.length < 2){
if (lines[0].length < 60){
var pre = document.createElement('pre');
pre.appendChild(document.createTextNode(s));
return pre;
}
}
//
// multiple lines :(
//
var preview = lines[0].substr(0, 60) + ' ...';
var pre1 = document.createElement('pre');
pre1.appendChild(document.createTextNode(preview));
pre1.className = 'clicky';
var pre2 = document.createElement('pre');
pre2.appendChild(document.createTextNode(s));
pre2.style.display = 'none';
pre2.className = 'clicky';
pre1.onclick = function(){
pre1.style.display = 'none';
pre2.style.display = 'block';
}
pre2.onclick = function(){
pre1.style.display = 'block';
pre2.style.display = 'none';
}
var pre = document.createElement('div');
pre.appendChild(pre1);
pre.appendChild(pre2);
return pre;
}
function getConstructorClass(obj){
if (!obj.constructor || !obj.constructor.toString) return;
var m = obj.constructor.toString().match(/function\s*(\w+)/);
if (m && m.length == 2) return m[1];
return null;
}
function keySorter(a, b){
if (a == parseInt(a) && b == parseInt(b)){
return (parseInt(a) > parseInt(b)) ? 1 : ((parseInt(a) < parseInt(b)) ? -1 : 0);
}
// sort by lowercase string
var a2 = String(a).toLowerCase();
var b2 = String(b).toLowerCase();
return (a2 > b2) ? 1 : ((a2 < b2) ? -1 : 0);
}
body {
font-family: arial, helvetica, sans-serif;
}
table {
border-width: 0px;
border-spacing: 1px;
border-collapse: separate;
}
td {
border-width: 0px;
padding: 2px;
}
img {
border: 0;
}
pre {
margin: 0;
padding: 0;
white-space: -moz-pre-wrap; /* Mozilla, supported since 1999 */
white-space: -pre-wrap; /* Opera 4 - 6 */
white-space: -o-pre-wrap; /* Opera 7 */
white-space: pre-wrap; /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
word-wrap: break-word; /* IE 5.5+ */
}
pre.clicky {
cursor: hand;
cursor: pointer;
}
td.propPlus {
width: 9px;
background-color: #ddd;
}
td.propName {
background-color: #ddd;
}
td.propType {
background-color: #ddd;
}
td.propVal {
background-color: #ddd;
}
Javascript Object Browser
Wyszukiwarka
Podobne podstrony:
long deep breathingDeep JourneysGłębia The Deep [1977]PROJEKT DEEP SHIELDUNO S DEEP PAN PIZZAMillennium s End In Too DeepG83 Deep Hole Peck DrillingJack Handley Further Deep ThoughtsInstructions Deep SleepDr Dre7 (Deep Cover Remix)Deep WizardryDeep MeditationDeep DisclosureThe Morrow Project Operation Deep Freeze2009 08 Dig Deep Debugging with Stracewięcej podobnych podstron