--- chrome/content/PageInfoOverlay.js Fri Nov 19 00:44:00 2004 +++ chrome/content/PageInfoOverlay.js Sat Nov 5 04:44:00 2005 @@ -27,11 +27,14 @@ flag = 1; // Look to see if the minimum requirement is there - if (theDocument && 'defaultView' in theDocument) { + if (theDocument && theDocument.documentElement) { loc = theDocument.location.protocol; - if ('headers' in theDocument.defaultView) { - const headers = theDocument.defaultView.headers; - + if (theDocument.documentElement.hasAttribute('headers')) { + const parser = new DOMParser(); + const xmlHeaders = theDocument.documentElement.getAttribute('headers'); + + var headers = parser.parseFromString(xmlHeaders, "application/xml"); + headers = headers.documentElement; //dumpall("theWindow",theWindow,2); //dumpall("theDocument",theDocument,2); //dumpall("opener",window.opener,2); @@ -46,30 +49,33 @@ responseTree.treeBoxObject.view = responseheaders; // Show source of the requests - var source = (headers.isFromCache ? "fromcache" : "fromnetwork"); + var source = (headers.getAttribute("isFromCache" == true) ? "fromcache" : "fromnetwork"); source = document.getElementById("headerinfo-request-" + source); source.hidden = false; - // Populate the trees - var i; - requestheaders.addRow(["REQUEST",headers.request]); - for (i in headers.requestHeaders) { - requestheaders.addRow([i,headers.requestHeaders[i]]); + // Populate the trees -- needs xml tweaking + // old load into object + requestheaders.addRow(["REQUEST",headers.getAttribute("request")]); + responseheaders.addRow(["RESPONSE", headers.getAttribute("response")]); + + for(var i = 0; i < headers.childNodes.length; i++) { + var cur = headers.childNodes[i]; + if(cur.getAttribute("type") == "request") { + requestheaders.addRow([cur.getAttribute("name"), cur.getAttribute("value")]); + } else if(cur.getAttribute("type") == "response") { + // Server can send some headers multiple times.. + // Try to detect this and present them in the 'good' way. + var multi = cur.getAttribute("value").split('\n'); + for (var o in multi) { + responseheaders.addRow([cur.getAttribute("name"), multi[o]]); + } + } } requestheaders.rowCountChanged(0, length); requestheaders.enablehScroll("headerinfo-request-scroll","headerinfo-request-value"); - - responseheaders.addRow(["RESPONSE", headers.response]); - for (i in headers.responseHeaders) { - // Server can send some headers multiple times... - // Try to detect this and present them in the 'good' way. - var multi = headers.responseHeaders[i].split('\n'); - for (var o in multi) { - responseheaders.addRow([i, multi[o]]); - } - } responseheaders.rowCountChanged(0, length); responseheaders.enablehScroll("headerinfo-response-scroll","headerinfo-response-value"); + // FIXME: display starts jumping for some reason! } else if(loc=='http:' || loc=='https:') { // If we are here, it must be because the nsHeaderInfo component wasn't registered document.getElementById("headerinfoCNR").hidden = false; @@ -81,26 +87,36 @@ function saveHeaderInfoTab(title) { // Look to see if the minimum requirement is there - if (theDocument && 'defaultView' in theDocument && 'headers' in theDocument.defaultView) { - const headers = theDocument.defaultView.headers; + if (theDocument && theDocument.documentElement && theDocument.documentElement.hasAttribute('headers')) { + const parser = new DOMParser(); + const xmlHeaders = theDocument.documentElement.getAttribute('headers'); + + var headers = parser.parseFromString(xmlHeaders, "application/xml"); + headers = headers.documentElement; // First, the URL var txt = theDocument.location + "\n"; // Now, the request and the request headers - txt += "\n" + headers.request + "\n"; - for (i in headers.requestHeaders) { - txt += i + ": " + headers.requestHeaders[i] + "\n"; + txt += "\n" + headers.getAttribute("request") + "\n"; + for(var i = 0; i < headers.childNodes.length; i++) { + var cur = headers.childNodes[i]; + if(cur.getAttribute("type") == "request") { + txt += cur.getAttribute("name") + ": " + cur.getAttribute("value") + "\n"; + } } // Finaly, the response and its headers - txt += "\n" + headers.response + "\n"; - for (i in headers.responseHeaders) { - // Server can send some headers multiple times... - // Try to detect this and present them in the 'good' way. - var multi = headers.responseHeaders[i].split('\n'); - for (var o in multi) { - txt += i + ": " + multi[o] + "\n"; + txt += "\n" + headers.getAttribute("response") + "\n"; + for(var i = 0; i < headers.childNodes.length; i++) { + var cur = headers.childNodes[i]; + if(cur.getAttribute("type") == "response") { + // Server can send some headers multiple times.. + // Try to detect this and present them in the 'good' way. + var multi = cur.getAttribute("value").split('\n'); + for (var o in multi) { + txt += cur.getAttribute("name") + ": " + multi[o] + "\n"; + } } } --- components/nsHeaderInfo.js Fri Nov 4 22:45:00 2005 +++ components/nsHeaderInfo.js Sat Nov 5 04:11:00 2005 @@ -30,7 +30,7 @@ const JS_SCRIPTABLEINPUTSTREAM = "nsIScriptableInputStream"; const JS_ScriptableInputStream = new Components.Constructor ( JS_SCRIPTABLEINPUTSTREAM_CID, JS_SCRIPTABLEINPUTSTREAM ); - + /* * Utility functions @@ -49,6 +49,18 @@ */ var nsHeaderInfo = { + escapeForXML: function(str) { + const regex = new RegExp("[<>'\"&]", "g"); + function rep(s) { + if(s == "<") return "<"; + else if(s == ">") return ">"; + else if(s == "'") return "'"; + else if(s == "\"") return """; + else if(s == "&") return "&"; + else throw "Unexpected character! " + s; + } + return str.toString().replace(regex, rep); + }, onStateChange: function(aProg, aRequest, aFlags, aStatus) { // As we want all headers, we must wait for the 'STOP' state @@ -66,7 +78,38 @@ aRequest.QueryInterface(Components.interfaces.nsIMultiPartChannel); aRequest = aRequest.baseChannel.QueryInterface(Components.interfaces.nsIHttpChannel); } - aProg.DOMWindow.headers = new HeaderInfoVisitor(aRequest).getHeaders(); + var objHeaders = new HeaderInfoVisitor(aRequest).getHeaders(); + var headerElms = []; + var headerTypes = { + request: objHeaders.requestHeaders, + response: objHeaders.responseHeaders }; + for(i in headerTypes) { + var cur = headerTypes[i]; + for(j in cur) { + headerElms.push([ + "
", + ].join("")); + } + } + var xmlHeaders = [ + "", + headerElms.join(""), + "" ].join(""); + aProg.DOMWindow.document.documentElement.setAttribute("headers", xmlHeaders, ""); // We are done with the listener, release it aProg.removeProgressListener(this); } catch (ex) {}