From 2f9b1f4b0e26c9d06d837bfdbbd7ec1bf2ab8962 Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Thu, 14 Sep 2006 06:02:10 +0000 Subject: [PATCH] Landing Daniel Brooks' page info rewrite. Tracking bug is bug 52730, fixes bugs 53503, 53641, 55713, 60428, 68823, 74530, 74760, 76926, 77408, 81328, 85905, 88537, 91173, 94146, 96994, 97479, 110973, 110981, 112297, 117027. r=fabian,hwaara,bzbarsky,gerv,ksosez. sr=jag,hewitt. --- suite/browser/pageInfo.js | 923 +++++++++++++++--- suite/browser/pageInfo.xul | 341 +++++-- .../locales/en-US/chrome/browser/pageInfo.dtd | 124 ++- .../en-US/chrome/browser/pageInfo.properties | 79 +- 4 files changed, 1202 insertions(+), 265 deletions(-) diff --git a/suite/browser/pageInfo.js b/suite/browser/pageInfo.js index 236d2b9946ff..fa9f7b33bb96 100644 --- a/suite/browser/pageInfo.js +++ b/suite/browser/pageInfo.js @@ -2,26 +2,26 @@ /* ***** BEGIN LICENSE BLOCK ***** * Version: NPL 1.1/GPL 2.0/LGPL 2.1 * - * The contents of this file are subject to the Netscape Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/NPL/ + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ * - * Software distributed under the License is distributed on an "AS IS" basis, - * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License - * for the specific language governing rights and limitations under the - * License. + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. * * The Original Code is mozilla.org code. * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. * - * Contributor(s): * Contributor(s): smorrison@gte.com * Terry Hayes + * Daniel Brooks * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or @@ -35,10 +35,38 @@ * the provisions above, a recipient may use your version of this file under * the terms of any one of the NPL, the GPL or the LGPL. * - * ***** END LICENSE BLOCK ***** */ + * ***** END LICENSE BLOCK ***** +*/ -const nsScriptableDateFormat_CONTRACTID = "@mozilla.org/intl/scriptabledateformat;1"; +// mmm, yummy. global variables. +var theWindow = null; +var theDocument = null; + +var linkList = new Array(); +var formList = new Array(); +var imageList = new Array(); + +var linkIndex = 0; +var formIndex = 0; +var imageIndex = 0; +var frameCount = 0; + +// a number of services I'll need later +// the cache services +const nsICacheService = Components.interfaces.nsICacheService; +const cacheService = Components.classes["@mozilla.org/network/cache-service;1"].getService(nsICacheService); +var httpCacheSession = cacheService.createSession("HTTP", 0, true); +var ftpCacheSession = cacheService.createSession("FTP", 0, true); + +// scriptable date formater, for pretty printing dates const nsIScriptableDateFormat = Components.interfaces.nsIScriptableDateFormat; +var dateService = Components.classes["@mozilla.org/intl/scriptabledateformat;1"].getService(nsIScriptableDateFormat); + +// namespaces, don't need all of these yet... +const XLinkNS = "http://www.w3.org/1999/xlink"; +const XULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; +const XMLNS = "http://www.w3.org/XML/1998/namespace"; +const XHTMLNS = "http://www.w3.org/1999/xhtml"; /* Overlays register init functions here. * Add functions to call by invoking "onLoadRegistry.append(XXXLoadFunc);" @@ -46,53 +74,35 @@ const nsIScriptableDateFormat = Components.interfaces.nsIScriptableDateFormat; * invoked as "XXXLoadFunc();" */ var onLoadRegistry = [ ]; - + /* Called when PageInfo window is loaded. Arguments are: - * window.arguments[0] - window (or frame) to use for source (may be null) - * window.arguments[1] - tab name to display first (may be null) - */ + * window.arguments[0] - document to use for source (null=Page Info, otherwise Frame Info) + * window.arguments[1] - tab name to display first (may be null) +*/ function onLoadPageInfo() { - var strbundle = document.getElementById("pageinfobundle"); + //dump("===============================================================================\n"); + var theBundle = document.getElementById("pageinfobundle"); + var unknown = theBundle.getString("unknown"); - var page; - var docTitle; - if ((window.arguments.length >= 1) && window.arguments[0]) + var docTitle = ""; + if("arguments" in window && window.arguments.length >= 1 && window.arguments[0]) { - page = window.arguments[0]; - docTitle = strbundle.getString("frameInfo.title"); - } - else + theWindow = null; + theDocument = window.arguments[0]; + docTitle = theBundle.getString("frameInfo.title"); + } + else { - page = window.opener.frames[0].document; - docTitle = strbundle.getString("pageInfo.title"); + theWindow = window.opener.frames[0]; + theDocument = theWindow.document; + docTitle = theBundle.getString("pageInfo.title"); } - window.document.title = docTitle; - - var root = document.getElementById("cont"); + document.title = docTitle; - makeDocument(page, root); - - var formTreeHolder = document.getElementById("formTreeContainer"); - var hasForm = makeFormTree(page, formTreeHolder); - if (hasForm) - { - var formsTab = document.getElementById("formsTab"); - - formsTab.removeAttribute("hidden"); - formTreeHolder.removeAttribute("collapsed"); - } - - var imageTreeHolder = document.getElementById("imageTreeContainer"); - var hasImages = makeImageTree(page, imageTreeHolder); - if (hasImages) - { - var imagesTab = document.getElementById("imagesTab"); - - imagesTab.removeAttribute("hidden"); - imageTreeHolder.removeAttribute("collapsed"); - } + // do the easy stuff first + makeGeneralTab(); /* Call registered overlay init functions */ for (x in onLoadRegistry) @@ -100,147 +110,776 @@ function onLoadPageInfo() onLoadRegistry[x](); } - /* Selected the requested tab, if the name is specified */ - /* if (window.arguments != null) { */ - if ("arguments" in window && window.arguments.length > 1) { + /* Select the requested tab, if the name is specified */ + if ("arguments" in window && window.arguments.length > 1) + { var tabName = window.arguments[1]; if (tabName) { - var tabbox = document.getElementById("tabbox"); + var tabControl = document.getElementById("tabcontrol"); var tab = document.getElementById(tabName); - if (tabbox && tab) { - tabbox.selectedTab = tab; + if (tabControl && tab) + { + tabControl.selectedTab = tab; } } } } -function makeDocument(page, root) +function makeGeneralTab() { - var title = page.title; - var url = page.URL; - var lastModified; - var lastMod = page.lastModified // get string of last modified date - var lastModdate = Date.parse(lastMod) // convert modified string to date - if (lastModdate) { - var date = new Date(lastModdate); - try { - var dateService = Components.classes[nsScriptableDateFormat_CONTRACTID] - .getService(nsIScriptableDateFormat); - lastModified = dateService.FormatDateTime( - "", dateService.dateFormatLong, - dateService.timeFormatSeconds, - date.getFullYear(), date.getMonth()+1, - date.getDate(), date.getHours(), - date.getMinutes(), date.getSeconds()); - } catch(e) { - lastModified = lastMod; + var theBundle = document.getElementById("pageinfobundle"); + var unknown = theBundle.getString("unknown"); + var notSet = theBundle.getString("notset"); + + var title = (theDocument.title) ? theBundle.getFormattedString("pageTitle", [theDocument.title]) : theBundle.getString("noPageTitle"); + document.getElementById("titletext").value = title; + + var url = theDocument.location; + document.getElementById("urltext").value = url; + + var mode = ("compatMode" in theDocument && theDocument.compatMode == "BackCompat") ? theBundle.getString("generalQuirksMode") : theBundle.getString("generalStrictMode"); + document.getElementById("modetext").value = mode; + + // find out the mime type + var mimeType = theDocument.contentType || unknown; + document.getElementById("typetext").value = mimeType; + + // get the meta tags + var metaNodes = theDocument.getElementsByTagName("meta"); + var metaOutliner = document.getElementById("metaoutliner"); + var metaView = new pageInfoOutlinerView(["meta-name","meta-content"]); + + metaOutliner.outlinerBoxObject.view = metaView; + + var length = metaNodes.length; + for (var i = 0; i < length; i++) + { + metaView.addRow([metaNodes[i].name || metaNodes[i].httpEquiv, metaNodes[i].content]); + } + metaView.rowCountChanged(0, length); + + // get the document characterset + var encoding = theDocument.characterSet; + document.getElementById("encodingtext").value = encoding; + + // get the date of last modification + var modifiedText = formatDate(theDocument.lastModified, notSet); + document.getElementById("modifiedtext").value = modifiedText; + + // get cache info + var sourceText = theBundle.getString("generalNotCached"); + var expirationText = theBundle.getString("generalNoExpiration"); + var sizeText = unknown; + + var pageSize = 0; + var kbSize = 0; + var expirationTime = 0; + + try + { + var cacheEntryDescriptor = httpCacheSession.openCacheEntry(url, Components.interfaces.nsICache.ACCESS_READ, true); + if(cacheEntryDescriptor) + { + switch(cacheEntryDescriptor.deviceID) + { + case "disk": + sourceText = theBundle.getString("generalDiskCache"); + break; + case "memory": + sourceText = theBundle.getString("generalMemoryCache"); + break; + default: + sourceText = cacheEntryDescriptor.deviceID; + break; + } + + pageSize = cacheEntryDescriptor.dataSize; + kbSize = pageSize / 1024; + sizeText = pageSize; // + " (" + 0 + "Kb)"; + + expirationText = formatDate(cacheEntryDescriptor.expirationTime*1000, notSet); } - } else { - try { - var pageInfoBundle = document.getElementById("pageinfobundle"); - lastModified = pageInfoBundle.getString("unknown"); - } catch(e) { - lastModified = "Unknown"; + } + catch(ex) + { + try + { + cacheEntryDescriptor = ftpCacheSession.openCacheEntry(url, Components.interfaces.nsICache.ACCESS_READ, true); + if (cacheEntryDescriptor) + { + switch(cacheEntryDescriptor.deviceID) + { + case "disk": + sourceText = theBundle.getString("generalDiskCache"); + break; + case "memory": + sourceText = theBundle.getString("generalMemoryCache"); + break; + default: + sourceText = cacheEntryDescriptor.deviceID; + break; + } + + pageSize = cacheEntryDescriptor.dataSize; + kbSize = pageSize / 1024; + sizeText = pageSize; // + " (" + 0 + "Kb)"; + + expirationText = formatDate(cacheEntryDescriptor.expirationTime*1000, notSet); + } + } + catch(ex2) + { + sourceText = theBundle.getString("generalNotCached"); + } + } + document.getElementById("sourcetext").value = sourceText; + document.getElementById("expirestext").value = expirationText; + document.getElementById("sizetext").value = sizeText; +} + +//******** Form Stuff +function makeFormTab() +{ + var formOutliner = document.getElementById("formoutliner"); + var formPreview = document.getElementById("formpreview"); + + var formView = new pageInfoOutlinerView(["form-number","form-name","form-action","form-method"]); + var fieldView = new pageInfoOutlinerView(["field-number","field-label","field-field","field-type","field-value"]); + formOutliner.outlinerBoxObject.view = formView; + formPreview.outlinerBoxObject.view = fieldView; + + formList = grabAllForms(theWindow, theDocument); + formIndex = 0; + + var length = formList.length; + for (var i = 0; i < length; i++) + { + var elem = formList[i]; + formView.addRow([++formIndex, elem.name, elem.method, elem.action]); + } + formView.rowCountChanged(0, length); + + formView.selection.select(0); +} + +function grabAllForms(aWindow, aDocument) +{ + var theList = []; + + if (aWindow && aWindow.frames.length > 0) + { + var length = aWindow.frames.length; + for (var i = 0; i < length; i++) + { + var frame = aWindow.frames[i]; + theList = theList.concat(grabAllForms(frame, frame.document)); } } - document.getElementById("titletext").setAttribute("value", title); - document.getElementById("urltext").setAttribute("value", url); - document.getElementById("lastmodifiedtext").setAttribute("value", lastModified); + return theList.concat(aDocument.forms); } -function makeFormTree(page, root) +function onFormSelect() { - var formList = page.forms; - if (formList.length == 0) return false; + var theBundle = document.getElementById("pageinfobundle"); + var formOutliner = document.getElementById("formoutliner"); + var formView = formOutliner.outlinerBoxObject.view; + if (!formView.rowCount) return; - var treeChildren = document.getElementById("formChildren"); - - for (var i = 0; i < formList.length; i++) + if (formView.selection.count == 1) { - var treeItem = document.createElement("treeitem"); - var treeRowElem = treeItem.appendChild(document.createElement("treerow")); + var formPreview = document.getElementById("formpreview"); + var fieldView = new pageInfoOutlinerView(["field-number","field-label","field-field","field-type","field-value"]); + formPreview.outlinerBoxObject.view = fieldView; - var treeCellElem = treeRowElem.appendChild(document.createElement("treecell")); - treeCellElem.setAttribute("label", formList[i].action); + var clickedRow = formView.selection.currentIndex; + var formnum = formView.getCellText(clickedRow, "form-number"); + var form = formList[formnum-1]; + var ft = null; + if (form.name) + ft = theBundle.getFormattedString("formTitle", [form.name]); + else + ft = theBundle.getString("formUntitled"); - treeCellElem = treeRowElem.appendChild(document.createElement("treecell")); - treeCellElem.setAttribute("label", formList[i].method); + document.getElementById("formname").value = ft || theBundle.getString("formUntitled"); + document.getElementById("formenctype").value = form.encoding || theBundle.getString("default"); + document.getElementById("formtarget").value = form.target || theBundle.getString("formDefaultTarget"); - treeCellElem = treeRowElem.appendChild(document.createElement("treecell")); - treeCellElem.setAttribute("label", formList[i].name); + var formfields = form.elements; - treeChildren.appendChild(treeItem); + var length = formfields.length; + var i = 0; + + var checked = theBundle.getString("formChecked"); + var unchecked = theBundle.getString("formUnchecked"); + + for (i = 0; i < length; i++) + { + var elem = formfields[i]; + + if(elem.nodeName.toLowerCase() == "button") + fieldView.addRow([i+1, "", elem.name, elem.type, getValueText(elem)]); + else + fieldView.addRow([i+1, "", elem.name, elem.type, elem.value]); + } + + var labels = form.getElementsByTagName("label"); + var llength = labels.length + + for (i = 0; i < llength; i++) + { + var whatfor = labels[i].getAttribute("for") || findFirstControl(labels[i]); + var labeltext = getValueText(labels[i]); + + for(var j = 0; j < length; j++) + if (formfields[j] == whatfor || formfields[j].name == whatfor) + fieldView.setCellText(j, "field-label", labeltext); + } + + fieldView.rowCountChanged(0, length); + } +} + +function findFirstControl(node) +{ + function FormControlFilter() + { + this.acceptNode = function(node) + { + switch (node.nodeName.toLowerCase()) + { + case "input": + case "select": + case "button": + case "textarea": + case "object": + return NodeFilter.FILTER_ACCEPT; + break; + default: + return NodeFilter.FILTER_SKIP; + break; + } + return NodeFilter.FILTER_SKIP; // placate the js compiler + } } - return true; + var nodeFilter = new FormControlFilter; + var iterator = theDocument.createTreeWalker(node, NodeFilter.SHOW_ELEMENT, nodeFilter, true); + + return iterator.nextNode(); } -function makeImageTree(page, root) +//******** Link Stuff +function makeLinkTab() { - var imgList = page.images; - if (imgList.length == 0) return false; + //var start = new Date(); + var theBundle = document.getElementById("pageinfobundle"); + var linkOutliner = document.getElementById("linkoutliner"); - var treeChildren = document.getElementById("imagesChildren"); + var linkView = new pageInfoOutlinerView(["link-number","link-name","link-address","link-type"]); + linkOutliner.outlinerBoxObject.view = linkView; - for (var i = 0; i < imgList.length; i++) + linkList = grabAllLinks(theWindow, theDocument); + + var linkAnchor = theBundle.getString("linkAnchor"); + var linkArea = theBundle.getString("linkArea"); + var linkSubmit = theBundle.getString("linkSubmit"); + var linkSubmission = theBundle.getString("linkSubmission"); + var linkRel = theBundle.getString("linkRel"); + var linkStylesheet = theBundle.getString("linkStylesheet"); + var linkRev = theBundle.getString("linkRev"); + + var linktext = null; + linkIndex = 0; + + var length = linkList.length; + for (var i = 0; i < length; i++) { - var treeItem = document.createElement("treeitem"); - treeItem.setAttribute("container", "true"); - treeItem.setAttribute("parent", "true"); + var elem = linkList[i]; + switch (elem.nodeName.toLowerCase()) + { + case "a": + linktext = getValueText(elem); + linkView.addRow([++linkIndex, linktext, elem.href, linkAnchor]); + break; + case "area": + linkView.addRow([++linkIndex, elem.alt, elem.href, linkArea]); + break; + case "input": + linkView.addRow([++linkIndex, elem.value || linkSubmit, elem.form.action, linkSubmission]); + break; + case "link": + if (elem.rel) + { + // should this test use regexes to be a little more lenient wrt whitespace? + if (elem.rel.toLowerCase() == "stylesheet" || elem.rel.toLowerCase() == "alternate stylesheet") + linktext = linkStylesheet; + else + linktext = linkRel; + } + else + linktext = linkRev; + linkView.addRow([++linkIndex, elem.rel || elem.rev, elem.href, linktext]); + break; + default: + dump("Page Info - makeLinkTab(): Hey, that's an odd one! ("+elem+")"); + break; + } + } + linkView.rowCountChanged(0, length); - var treeRowElem = treeItem.appendChild(document.createElement("treerow")); + //var end = new Date(); + //dump("links tab took "+(end-start)+"ms to build.\n"); +} - var treeCellElem = treeRowElem.appendChild(document.createElement("treecell")); - treeCellElem.setAttribute("label", imgList[i].src); +function grabAllLinks(aWindow,aDocument) +{ + var theList = []; - treeCellElem = treeRowElem.appendChild(document.createElement("treecell")); - treeCellElem.setAttribute("label", imgList[i].width); - - treeCellElem = treeRowElem.appendChild(document.createElement("treecell")); - treeCellElem.setAttribute("label", imgList[i].height); - - treeCellElem = treeRowElem.appendChild(document.createElement("treecell")); - treeCellElem.setAttribute("label", imgList[i].alt); - - treeChildren.appendChild(treeItem); + if (aWindow && aWindow.frames.length > 0) + { + var num = aWindow.frames.length; + for (var i = 0; i < num; i++) + { + var frame = aWindow.frames[i]; + theList = theList.concat(grabAllLinks(frame, frame.document)); + } } - return true; + theList = theList.concat(aDocument.getElementsByTagName("link")); + + var inputList = aDocument.getElementsByTagName("input"); + var length = inputList.length; + for (i = 0; i < length; i++) + if (inputList[i].type.toLowerCase() == "submit") + theList = theList.concat(inputList[i]); + + return theList.concat(aDocument.links); } +function openURL(target) +{ + var url = target.parentNode.childNodes[2].value; + window.open(url, "_blank", "chrome"); +} + +//******** Image Stuff +function makeMediaTab() +{ + var theBundle = document.getElementById("pageinfobundle"); + var imageOutliner = document.getElementById("imageoutliner"); + + var imageView = new pageInfoOutlinerView(["image-number","image-address","image-type"]); + imageOutliner.outlinerBoxObject.view = imageView; + + imageList = grabAllMedia(theWindow, theDocument); + + var mediaImg = theBundle.getString("mediaImg"); + var mediaApplet = theBundle.getString("mediaApplet"); + var mediaObject = theBundle.getString("mediaObject"); + var mediaEmbed = theBundle.getString("mediaEmbed"); + var mediaLink = theBundle.getString("mediaLink"); + + var row = null; + var length = imageList.length; + imageIndex = 0; + + for (var i = 0; i < length; i++) + { + var elem = imageList[i]; + switch (elem.nodeName.toLowerCase()) + { + case "img": + imageView.addRow([++imageIndex, elem.src, mediaImg]); + break; + case "applet": + imageView.addRow([++imageIndex, elem.code || elem.object, mediaApplet]); + break; + case "object": + imageView.addRow([++imageIndex, elem.data, mediaObject]); + break; + case "embed": + imageView.addRow([++imageIndex, elem.src, mediaEmbed]); + break; + case "link": + imageView.addRow([++imageIndex, elem.href, mediaLink]); + break; + default: + dump("Page Info - makeMediaTab(): hey, that's an odd one! ("+elem+")");; + break; + } + } + imageView.rowCountChanged(0, length); + + imageView.selection.select(0); +} + +function grabAllMedia(aWindow, aDocument) +{ + var theList = []; + + if (aWindow && aWindow.frames.length > 0) + { + var num = aWindow.frames.length; + for (var i = 0; i < num; i++) + { + var frame = aWindow.frames[i]; + theList = theList.concat(grabAllMedia(frame, frame.document)); + } + } + + theList = theList.concat(aDocument.getElementsByTagName("embed"), aDocument.applets, aDocument.getElementsByTagName("object")); + + var inputList = aDocument.getElementsByTagName("input"); + var length = inputList.length + for (i = 0; i < length; i++) + if(inputList[i].type.toLowerCase() == "image") + theList = theList.concat(inputList[i]); + + var linkList = aDocument.getElementsByTagName("link"); + length = linkList.length; + for (i = 0; i < length; i++) + if(linkList[i].rel.toLowerCase() == "icon") + theList = theList.concat(linkList[i]); + + return theList.concat(aDocument.images); +} + function onImageSelect() { - var imageFrame = document.getElementById("imageFrame"); - imageFrame.setAttribute("src", "about:blank"); + var outliner = document.getElementById("imageoutliner"); + var preview = document.getElementById("imagepreview"); - var tree = document.getElementById("imageTree"); - - if (tree.selectedItems.length == 1) + if (outliner.outlinerBoxObject.selection.count == 1) { - var clickedRow = tree.selectedItems[0].firstChild; - var firstCell = clickedRow.firstChild; - var imageUrl = firstCell.getAttribute("label"); + var view = outliner.outlinerBoxObject.view; + if (!view.rowCount) return; + var clickedRow = outliner.outlinerBoxObject.selection.currentIndex; + var lineNum = view.getCellText(clickedRow, "image-number"); - /* The image has to be placed after a setTimeout because of bug 62517. */ - setTimeout(placeImage, 0, imageFrame, imageUrl); + makePreview(imageList[lineNum-1]); } } -function placeImage(imageFrame, imageUrl) +function makePreview(item) { - var imageDoc = imageFrame.contentDocument; - var imageNode = imageDoc.createElement("img"); - imageNode.setAttribute("src", imageUrl); + var theBundle = document.getElementById("pageinfobundle"); + var unknown = theBundle.getString("unknown"); + var notSet = theBundle.getString("notset"); - imageDoc.documentElement.appendChild(imageNode); + var url = ("src" in item && item.src) || ("code" in item && item.code) || ("data" in item && item.data) || ("href" in item && item.href) || unknown; // it better have at least one of those... + document.getElementById("imageurltext").value = url; + document.getElementById("imagetitletext").value = item.title || notSet; + document.getElementById("imagelongdesctext").value = ("longDesc" in item && item.longDesc) || notSet; + + // find out the mime type + var mimeType = unknown; + if (item.nodeName.toLowerCase() != "input") + mimeType = ("type" in item && item.type) || ("codeType" in item && item.codeType) || ("contentType" in item && item.contentType) || unknown; + document.getElementById("imagetypetext").value = mimeType; + + // get cache info + var sourceText = theBundle.getString("generalNotCached"); + var expirationText = theBundle.getString("unknown"); + var sizeText = theBundle.getString("unknown"); + + var expirationTime = 0; + var expirationDate = null; + + try + { + var cacheEntryDescriptor = httpCacheSession.openCacheEntry(url, Components.interfaces.nsICache.ACCESS_READ, true); // open for READ, in blocking mode + if (cacheEntryDescriptor) + { + switch(cacheEntryDescriptor.deviceID) + { + case "disk": + sourceText = theBundle.getString("generalDiskCache"); + break; + case "memory": + sourceText = theBundle.getString("generalMemoryCache"); + break; + default: + sourceText = cacheEntryDescriptor.deviceID; + break; + } + + sizeText = cacheEntryDescriptor.dataSize; + + expirationText = formatDate(cacheEntryDescriptor.expirationTime*1000, notSet); + } + } + catch(ex) + { + try + { + cacheEntryDescriptor = ftpCacheSession.openCacheEntry(url, Components.interfaces.nsICache.ACCESS_READ, true); // open for READ, in blocking mode + if (cacheEntryDescriptor) + { + switch(cacheEntryDescriptor.deviceID) + { + case "disk": + sourceText = theBundle.getString("generalDiskCache"); + break; + case "memory": + sourceText = theBundle.getString("generalMemoryCache"); + break; + default: + sourceText = cacheEntryDescriptor.deviceID; + break; + } + + sizeText = cacheEntryDescriptor.dataSize; + + expirationText = formatDate(cacheEntryDescriptor.expirationTime*1000, notSet); + } + } + catch(ex2) + { + sourceText = theBundle.getString("generalNotCached"); + } + } + document.getElementById("imagesourcetext").value = sourceText; + document.getElementById("imageexpirestext").value = expirationText; + document.getElementById("imagesizetext").value = sizeText; + + // perhaps these can be done in the future + //document.getElementById("imageplugintext").value = "--"; + //document.getElementById("imagecharsettext").value = "--"; + + document.getElementById("imagewidth").value = ("width" in item && item.width) || unknown; + document.getElementById("imageheight").value = ("height" in item && item.height) || unknown; + + // also can't be done at the moment + //document.getElementById("imageencryptiontext").value = "--"; + + var imageContainer = document.getElementById("theimagecontainer"); + var oldImage = document.getElementById("thepreviewimage"); + + var newImage = null; + if (item.nodeName.toLowerCase() == "link") + { + newImage = document.createElementNS("http://www.w3.org/1999/xhtml", "IMG"); + newImage.src = getAbsoluteURL(item.href, item); + } + else + { + newImage = item.cloneNode(true); + newImage.src = ("src" in item && item.src) || ("href" in item && item.href); // weird funky hack, I know :P + } + + newImage.setAttribute("id", "thepreviewimage"); + newImage.width = ("width" in item && item.width) || unknown; + newImage.height = ("height" in item && item.height) || unknown; + newImage.removeAttribute("align"); // just in case. + + imageContainer.removeChild(oldImage); + imageContainer.appendChild(newImage); } -function BrowserClose() + +//******** Other Misc Stuff +// Modified from the Links Panel v2.3, http://segment7.net/mozilla/links/links.html +// parse a node to extract the contents of the node +// linkNode doesn't really _have_ to be link +function getValueText(linkNode) { - window.close(); + var valueText = ""; + + var length = linkNode.childNodes.length; + for (var i = 0; i < length; i++) + { + var childNode = linkNode.childNodes[i]; + var nodeType = childNode.nodeType; + if (nodeType == Node.TEXT_NODE) + valueText += " " + childNode.nodeValue; + else if (nodeType == Node.ELEMENT_NODE) + { + if (childNode.nodeName.toLowerCase() == "img") + valueText += " " + getAltText(childNode); + else + valueText += " " + getValueText(childNode); + } + } + + return stripWS(valueText); } +// Copied from the Links Panel v2.3, http://segment7.net/mozilla/links/links.html +// traverse the tree in search of an img or area element and grab its alt tag +function getAltText(node) +{ + var altText = ""; + + if (node.alt) + return node.alt; + var length = node.childNodes.length; + for (var i = 0; i < length; i++) + if ((altText = getAltText(node.childNodes[i]) != undefined)) // stupid js warning... + return altText; + return ""; +} + +// Copied from the Links Panel v2.3, http://segment7.net/mozilla/links/links.html +// strip leading and trailing whitespace, and replace multiple consecutive whitespace characters with a single space +function stripWS(text) +{ + var middleRE = /\s+/g; + var endRE = /(^\s+)|(\s+$)/g; + + text = text.replace(middleRE, " "); + return text.replace(endRE, ""); +} + +function formatDate(datestr, unknown) +{ + var date = new Date(datestr); + return (date.valueOf()) ? dateService.FormatDateTime("", dateService.dateFormatLong, dateService.timeFormatSeconds, date.getFullYear(), date.getMonth()+1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()) : unknown; +} + +/* + * Takes care of XMLBase and + * url is the possibly relative url. + * node is the node where the url was given (needed for XMLBase) + * + * This function is called in many places as a workaround for bug 72524 + * Once bug 72522 is fixed this code should use the Node.baseURI attribute + * + * for node==null or url=="", empty string is returned + * + * This is basically just copied from http://lxr.mozilla.org/seamonkey/source/xpfe/browser/resources/content/metadata.js + */ + +function getAbsoluteURL(url, node) +{ + if (!url || !node) + return ""; + var urlArr = new Array(url); + + var doc = node.ownerDocument; + if (node.nodeType == Node.ATTRIBUTE_NODE) + node = node.ownerElement; + + while (node && node.nodeType == Node.ELEMENT_NODE) + { + var att = node.getAttributeNS(XMLNS, "base"); + if (att != "") + urlArr.unshift(att); + + node = node.parentNode; + } + + // Look for a . + var baseTags = doc.getElementsByTagNameNS(XHTMLNS, "base"); + + if (baseTags && baseTags.length) + { + urlArr.unshift(baseTags[baseTags.length - 1].getAttribute("href")); + } + + // resolve everything from bottom up, starting with document location + var ioService = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); + var URL = ioService.newURI(doc.location.href, null); + + for (var i=0; i Chris McAfee + Daniel Brooks + Gervase Markham --> - - + -%brandDTD; - -%pageInfoDTD; + + %brandDTD; + + %navigatorDTD; + + %pageInfoDTD; ]> -