--- 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) {}