summaryrefslogtreecommitdiffstats
path: root/application/palemoon/base/content
diff options
context:
space:
mode:
Diffstat (limited to 'application/palemoon/base/content')
-rw-r--r--application/palemoon/base/content/pageinfo/feeds.js59
-rw-r--r--application/palemoon/base/content/pageinfo/feeds.xml40
-rw-r--r--application/palemoon/base/content/pageinfo/pageInfo.css26
-rw-r--r--application/palemoon/base/content/pageinfo/pageInfo.js1286
-rw-r--r--application/palemoon/base/content/pageinfo/pageInfo.xml29
-rw-r--r--application/palemoon/base/content/pageinfo/pageInfo.xul507
-rw-r--r--application/palemoon/base/content/pageinfo/permissions.js341
-rw-r--r--application/palemoon/base/content/pageinfo/security.js378
8 files changed, 0 insertions, 2666 deletions
diff --git a/application/palemoon/base/content/pageinfo/feeds.js b/application/palemoon/base/content/pageinfo/feeds.js
deleted file mode 100644
index 468d8c19d..000000000
--- a/application/palemoon/base/content/pageinfo/feeds.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-function initFeedTab()
-{
- const feedTypes = {
- "application/rss+xml": gBundle.getString("feedRss"),
- "application/atom+xml": gBundle.getString("feedAtom"),
- "text/xml": gBundle.getString("feedXML"),
- "application/xml": gBundle.getString("feedXML"),
- "application/rdf+xml": gBundle.getString("feedXML")
- };
-
- // get the feeds
- var linkNodes = gDocument.getElementsByTagName("link");
- var length = linkNodes.length;
- for (var i = 0; i < length; i++) {
- var link = linkNodes[i];
- if (!link.href)
- continue;
-
- var rel = link.rel && link.rel.toLowerCase();
- var rels = {};
- if (rel) {
- for each (let relVal in rel.split(/\s+/))
- rels[relVal] = true;
- }
-
- if (rels.feed || (link.type && rels.alternate && !rels.stylesheet)) {
- var type = isValidFeed(link, gDocument.nodePrincipal, "feed" in rels);
- if (type) {
- type = feedTypes[type] || feedTypes["application/rss+xml"];
- addRow(link.title, type, link.href);
- }
- }
- }
-
- var feedListbox = document.getElementById("feedListbox");
- document.getElementById("feedTab").hidden = feedListbox.getRowCount() == 0;
-}
-
-function onSubscribeFeed()
-{
- var listbox = document.getElementById("feedListbox");
- openUILinkIn(listbox.selectedItem.getAttribute("feedURL"), "current",
- { ignoreAlt: true });
-}
-
-function addRow(name, type, url)
-{
- var item = document.createElement("richlistitem");
- item.setAttribute("feed", "true");
- item.setAttribute("name", name);
- item.setAttribute("type", type);
- item.setAttribute("feedURL", url);
- document.getElementById("feedListbox").appendChild(item);
-}
diff --git a/application/palemoon/base/content/pageinfo/feeds.xml b/application/palemoon/base/content/pageinfo/feeds.xml
deleted file mode 100644
index 782c05a73..000000000
--- a/application/palemoon/base/content/pageinfo/feeds.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE bindings [
- <!ENTITY % pageInfoDTD SYSTEM "chrome://browser/locale/pageInfo.dtd">
- %pageInfoDTD;
-]>
-
-<bindings id="feedBindings"
- xmlns="http://www.mozilla.org/xbl"
- xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:xbl="http://www.mozilla.org/xbl">
-
- <binding id="feed" extends="chrome://global/content/bindings/richlistbox.xml#richlistitem">
- <content>
- <xul:vbox flex="1">
- <xul:hbox flex="1">
- <xul:textbox flex="1" readonly="true" xbl:inherits="value=name"
- class="feedTitle"/>
- <xul:label xbl:inherits="value=type"/>
- </xul:hbox>
- <xul:vbox>
- <xul:vbox align="start">
- <xul:hbox>
- <xul:label xbl:inherits="value=feedURL,tooltiptext=feedURL" class="text-link" flex="1"
- onclick="openUILink(this.value, event);" crop="end"/>
- </xul:hbox>
- </xul:vbox>
- </xul:vbox>
- <xul:hbox flex="1" class="feed-subscribe">
- <xul:spacer flex="1"/>
- <xul:button label="&feedSubscribe;" accesskey="&feedSubscribe.accesskey;"
- oncommand="onSubscribeFeed()"/>
- </xul:hbox>
- </xul:vbox>
- </content>
- </binding>
-</bindings>
diff --git a/application/palemoon/base/content/pageinfo/pageInfo.css b/application/palemoon/base/content/pageinfo/pageInfo.css
deleted file mode 100644
index 622b56bb5..000000000
--- a/application/palemoon/base/content/pageinfo/pageInfo.css
+++ /dev/null
@@ -1,26 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-#viewGroup > radio {
- -moz-binding: url("chrome://browser/content/pageinfo/pageInfo.xml#viewbutton");
-}
-
-richlistitem[feed] {
- -moz-binding: url("chrome://browser/content/pageinfo/feeds.xml#feed");
-}
-
-richlistitem[feed]:not([selected="true"]) .feed-subscribe {
- display: none;
-}
-
-groupbox[closed="true"] > .groupbox-body {
- visibility: collapse;
-}
-
-#thepreviewimage {
- display: block;
-/* This following entry can be removed when Bug 522850 is fixed. */
- min-width: 1px;
-}
diff --git a/application/palemoon/base/content/pageinfo/pageInfo.js b/application/palemoon/base/content/pageinfo/pageInfo.js
deleted file mode 100644
index 600174ad9..000000000
--- a/application/palemoon/base/content/pageinfo/pageInfo.js
+++ /dev/null
@@ -1,1286 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-var Cu = Components.utils;
-Cu.import("resource://gre/modules/LoadContextInfo.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-//******** define a js object to implement nsITreeView
-function pageInfoTreeView(treeid, copycol)
-{
- // copycol is the index number for the column that we want to add to
- // the copy-n-paste buffer when the user hits accel-c
- this.treeid = treeid;
- this.copycol = copycol;
- this.rows = 0;
- this.tree = null;
- this.data = [ ];
- this.selection = null;
- this.sortcol = -1;
- this.sortdir = false;
-}
-
-pageInfoTreeView.prototype = {
- set rowCount(c) { throw "rowCount is a readonly property"; },
- get rowCount() { return this.rows; },
-
- setTree: function(tree)
- {
- this.tree = tree;
- },
-
- getCellText: function(row, column)
- {
- // row can be null, but js arrays are 0-indexed.
- // colidx cannot be null, but can be larger than the number
- // of columns in the array. In this case it's the fault of
- // whoever typoed while calling this function.
- return this.data[row][column.index] || "";
- },
-
- setCellValue: function(row, column, value)
- {
- },
-
- setCellText: function(row, column, value)
- {
- this.data[row][column.index] = value;
- },
-
- addRow: function(row)
- {
- this.rows = this.data.push(row);
- this.rowCountChanged(this.rows - 1, 1);
- if (this.selection.count == 0 && this.rowCount && !gImageElement)
- this.selection.select(0);
- },
-
- rowCountChanged: function(index, count)
- {
- this.tree.rowCountChanged(index, count);
- },
-
- invalidate: function()
- {
- this.tree.invalidate();
- },
-
- clear: function()
- {
- if (this.tree)
- this.tree.rowCountChanged(0, -this.rows);
- this.rows = 0;
- this.data = [ ];
- },
-
- handleCopy: function(row)
- {
- return (row < 0 || this.copycol < 0) ? "" : (this.data[row][this.copycol] || "");
- },
-
- performActionOnRow: function(action, row)
- {
- if (action == "copy") {
- var data = this.handleCopy(row)
- this.tree.treeBody.parentNode.setAttribute("copybuffer", data);
- }
- },
-
- onPageMediaSort : function(columnname)
- {
- var tree = document.getElementById(this.treeid);
- var treecol = tree.columns.getNamedColumn(columnname);
-
- this.sortdir =
- gTreeUtils.sort(
- tree,
- this,
- this.data,
- treecol.index,
- function textComparator(a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); },
- this.sortcol,
- this.sortdir
- );
-
- this.sortcol = treecol.index;
- },
-
- getRowProperties: function(row) { return ""; },
- getCellProperties: function(row, column) { return ""; },
- getColumnProperties: function(column) { return ""; },
- isContainer: function(index) { return false; },
- isContainerOpen: function(index) { return false; },
- isSeparator: function(index) { return false; },
- isSorted: function() { },
- canDrop: function(index, orientation) { return false; },
- drop: function(row, orientation) { return false; },
- getParentIndex: function(index) { return 0; },
- hasNextSibling: function(index, after) { return false; },
- getLevel: function(index) { return 0; },
- getImageSrc: function(row, column) { },
- getProgressMode: function(row, column) { },
- getCellValue: function(row, column) { },
- toggleOpenState: function(index) { },
- cycleHeader: function(col) { },
- selectionChanged: function() { },
- cycleCell: function(row, column) { },
- isEditable: function(row, column) { return false; },
- isSelectable: function(row, column) { return false; },
- performAction: function(action) { },
- performActionOnCell: function(action, row, column) { }
-};
-
-// mmm, yummy. global variables.
-var gWindow = null;
-var gDocument = null;
-var gImageElement = null;
-
-// column number to help using the data array
-const COL_IMAGE_ADDRESS = 0;
-const COL_IMAGE_TYPE = 1;
-const COL_IMAGE_SIZE = 2;
-const COL_IMAGE_ALT = 3;
-const COL_IMAGE_COUNT = 4;
-const COL_IMAGE_NODE = 5;
-const COL_IMAGE_BG = 6;
-
-// column number to copy from, second argument to pageInfoTreeView's constructor
-const COPYCOL_NONE = -1;
-const COPYCOL_META_CONTENT = 1;
-const COPYCOL_IMAGE = COL_IMAGE_ADDRESS;
-
-// one nsITreeView for each tree in the window
-var gMetaView = new pageInfoTreeView('metatree', COPYCOL_META_CONTENT);
-var gImageView = new pageInfoTreeView('imagetree', COPYCOL_IMAGE);
-
-gImageView.getCellProperties = function(row, col) {
- var data = gImageView.data[row];
- var item = gImageView.data[row][COL_IMAGE_NODE];
- var props = "";
- if (!checkProtocol(data) ||
- item instanceof HTMLEmbedElement ||
- (item instanceof HTMLObjectElement && !item.type.startsWith("image/")))
- props += "broken";
-
- if (col.element.id == "image-address")
- props += " ltr";
-
- return props;
-};
-
-gImageView.getCellText = function(row, column) {
- var value = this.data[row][column.index];
- if (column.index == COL_IMAGE_SIZE) {
- if (value == -1) {
- return gStrings.unknown;
- } else {
- var kbSize = Number(Math.round(value / 1024 * 100) / 100);
- return gBundle.getFormattedString("mediaFileSize", [kbSize]);
- }
- }
- return value || "";
-};
-
-gImageView.onPageMediaSort = function(columnname) {
- var tree = document.getElementById(this.treeid);
- var treecol = tree.columns.getNamedColumn(columnname);
-
- var comparator;
- if (treecol.index == COL_IMAGE_SIZE || treecol.index == COL_IMAGE_COUNT) {
- comparator = function numComparator(a, b) { return a - b; };
- } else {
- comparator = function textComparator(a, b) { return a.toLowerCase().localeCompare(b.toLowerCase()); };
- }
-
- this.sortdir =
- gTreeUtils.sort(
- tree,
- this,
- this.data,
- treecol.index,
- comparator,
- this.sortcol,
- this.sortdir
- );
-
- this.sortcol = treecol.index;
-};
-
-var gImageHash = { };
-
-// localized strings (will be filled in when the document is loaded)
-// this isn't all of them, these are just the ones that would otherwise have been loaded inside a loop
-var gStrings = { };
-var gBundle;
-
-const PERMISSION_CONTRACTID = "@mozilla.org/permissionmanager;1";
-const PREFERENCES_CONTRACTID = "@mozilla.org/preferences-service;1";
-const ATOM_CONTRACTID = "@mozilla.org/atom-service;1";
-
-// a number of services I'll need later
-// the cache services
-const nsICacheStorageService = Components.interfaces.nsICacheStorageService;
-const nsICacheStorage = Components.interfaces.nsICacheStorage;
-const cacheService = Components.classes["@mozilla.org/netwerk/cache-storage-service;1"].getService(nsICacheStorageService);
-
-var loadContextInfo = LoadContextInfo.fromLoadContext(
- window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsIWebNavigation)
- .QueryInterface(Components.interfaces.nsILoadContext), false);
-var diskStorage = cacheService.diskCacheStorage(loadContextInfo, false);
-
-const nsICookiePermission = Components.interfaces.nsICookiePermission;
-const nsIPermissionManager = Components.interfaces.nsIPermissionManager;
-
-const nsICertificateDialogs = Components.interfaces.nsICertificateDialogs;
-const CERTIFICATEDIALOGS_CONTRACTID = "@mozilla.org/nsCertificateDialogs;1"
-
-// clipboard helper
-function getClipboardHelper() {
- try {
- return Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper);
- } catch(e) {
- // do nothing, later code will handle the error
- }
-}
-const gClipboardHelper = getClipboardHelper();
-
-// Interface for image loading content
-const nsIImageLoadingContent = Components.interfaces.nsIImageLoadingContent;
-
-// 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";
-const XHTML2NS = "http://www.w3.org/2002/06/xhtml2"
-
-const XHTMLNSre = "^http\:\/\/www\.w3\.org\/1999\/xhtml$";
-const XHTML2NSre = "^http\:\/\/www\.w3\.org\/2002\/06\/xhtml2$";
-const XHTMLre = RegExp(XHTMLNSre + "|" + XHTML2NSre, "");
-
-/* Overlays register functions here.
- * These arrays are used to hold callbacks that Page Info will call at
- * various stages. Use them by simply appending a function to them.
- * For example, add a function to onLoadRegistry by invoking
- * "onLoadRegistry.push(XXXLoadFunc);"
- * The XXXLoadFunc should be unique to the overlay module, and will be
- * invoked as "XXXLoadFunc();"
- */
-
-// These functions are called to build the data displayed in the Page
-// Info window. The global variables gDocument and gWindow are set.
-var onLoadRegistry = [ ];
-
-// These functions are called to remove old data still displayed in
-// the window when the document whose information is displayed
-// changes. For example, at this time, the list of images of the Media
-// tab is cleared.
-var onResetRegistry = [ ];
-
-// These are called once for each subframe of the target document and
-// the target document itself. The frame is passed as an argument.
-var onProcessFrame = [ ];
-
-// These functions are called once for each element (in all subframes, if any)
-// in the target document. The element is passed as an argument.
-var onProcessElement = [ ];
-
-// These functions are called once when all the elements in all of the target
-// document (and all of its subframes, if any) have been processed
-var onFinished = [ ];
-
-// These functions are called once when the Page Info window is closed.
-var onUnloadRegistry = [ ];
-
-// These functions are called once when an image preview is shown.
-var onImagePreviewShown = [ ];
-
-/* Called when PageInfo window is loaded. Arguments are:
- * window.arguments[0] - (optional) an object consisting of
- * - doc: (optional) document to use for source. if not provided,
- * the calling window's document will be used
- * - initialTab: (optional) id of the inital tab to display
- */
-function onLoadPageInfo()
-{
- gBundle = document.getElementById("pageinfobundle");
- gStrings.unknown = gBundle.getString("unknown");
- gStrings.notSet = gBundle.getString("notset");
- gStrings.mediaImg = gBundle.getString("mediaImg");
- gStrings.mediaBGImg = gBundle.getString("mediaBGImg");
- gStrings.mediaBorderImg = gBundle.getString("mediaBorderImg");
- gStrings.mediaListImg = gBundle.getString("mediaListImg");
- gStrings.mediaCursor = gBundle.getString("mediaCursor");
- gStrings.mediaObject = gBundle.getString("mediaObject");
- gStrings.mediaEmbed = gBundle.getString("mediaEmbed");
- gStrings.mediaLink = gBundle.getString("mediaLink");
- gStrings.mediaInput = gBundle.getString("mediaInput");
- gStrings.mediaVideo = gBundle.getString("mediaVideo");
- gStrings.mediaAudio = gBundle.getString("mediaAudio");
-
- var args = "arguments" in window &&
- window.arguments.length >= 1 &&
- window.arguments[0];
-
- if (!args || !args.doc) {
- gWindow = window.opener.content;
- gDocument = gWindow.document;
- }
-
- // init media view
- var imageTree = document.getElementById("imagetree");
- imageTree.view = gImageView;
-
- /* Select the requested tab, if the name is specified */
- loadTab(args);
- Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService)
- .notifyObservers(window, "page-info-dialog-loaded", null);
-
- // Make sure the page info window gets focus even if a doorhanger might
- // otherwise (async) steal it.
- window.focus();
-}
-
-function loadPageInfo()
-{
- var titleFormat = gWindow != gWindow.top ? "pageInfo.frame.title"
- : "pageInfo.page.title";
- document.title = gBundle.getFormattedString(titleFormat, [gDocument.location]);
-
- document.getElementById("main-window").setAttribute("relatedUrl", gDocument.location);
-
- // do the easy stuff first
- makeGeneralTab();
-
- // and then the hard stuff
- makeTabs(gDocument, gWindow);
-
- initFeedTab();
- onLoadPermission(gDocument.nodePrincipal);
-
- /* Call registered overlay init functions */
- onLoadRegistry.forEach(function(func) { func(); });
-}
-
-function resetPageInfo(args)
-{
- /* Reset Meta tags part */
- gMetaView.clear();
-
- /* Reset Media tab */
- var mediaTab = document.getElementById("mediaTab");
- if (!mediaTab.hidden) {
- Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService)
- .removeObserver(imagePermissionObserver, "perm-changed");
- mediaTab.hidden = true;
- }
- gImageView.clear();
- gImageHash = {};
-
- /* Reset Feeds Tab */
- var feedListbox = document.getElementById("feedListbox");
- while (feedListbox.firstChild)
- feedListbox.removeChild(feedListbox.firstChild);
-
- /* Call registered overlay reset functions */
- onResetRegistry.forEach(function(func) { func(); });
-
- /* Rebuild the data */
- loadTab(args);
-}
-
-function onUnloadPageInfo()
-{
- // Remove the observer, only if there is at least 1 image.
- if (!document.getElementById("mediaTab").hidden) {
- Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService)
- .removeObserver(imagePermissionObserver, "perm-changed");
- }
-
- /* Call registered overlay unload functions */
- onUnloadRegistry.forEach(function(func) { func(); });
-}
-
-function doHelpButton()
-{
- const helpTopics = {
- "generalPanel": "pageinfo_general",
- "mediaPanel": "pageinfo_media",
- "feedPanel": "pageinfo_feed",
- "permPanel": "pageinfo_permissions",
- "securityPanel": "pageinfo_security"
- };
-
- var deck = document.getElementById("mainDeck");
- var helpdoc = helpTopics[deck.selectedPanel.id] || "pageinfo_general";
- openHelpLink(helpdoc);
-}
-
-function showTab(id)
-{
- var deck = document.getElementById("mainDeck");
- var pagel = document.getElementById(id + "Panel");
- deck.selectedPanel = pagel;
-}
-
-function loadTab(args)
-{
- if (args && args.doc) {
- gDocument = args.doc;
- gWindow = gDocument.defaultView;
- }
-
- gImageElement = args && args.imageElement;
-
- /* Load the page info */
- loadPageInfo();
-
- var initialTab = (args && args.initialTab) || "generalTab";
- var radioGroup = document.getElementById("viewGroup");
- initialTab = document.getElementById(initialTab) || document.getElementById("generalTab");
- radioGroup.selectedItem = initialTab;
- radioGroup.selectedItem.doCommand();
- radioGroup.focus();
-}
-
-function onClickMore()
-{
- var radioGrp = document.getElementById("viewGroup");
- var radioElt = document.getElementById("securityTab");
- radioGrp.selectedItem = radioElt;
- showTab('security');
-}
-
-function toggleGroupbox(id)
-{
- var elt = document.getElementById(id);
- if (elt.hasAttribute("closed")) {
- elt.removeAttribute("closed");
- if (elt.flexWhenOpened)
- elt.flex = elt.flexWhenOpened;
- }
- else {
- elt.setAttribute("closed", "true");
- if (elt.flex) {
- elt.flexWhenOpened = elt.flex;
- elt.flex = 0;
- }
- }
-}
-
-function openCacheEntry(key, cb)
-{
- var checkCacheListener = {
- onCacheEntryCheck: function(entry, appCache) {
- return Components.interfaces.nsICacheEntryOpenCallback.ENTRY_WANTED;
- },
- onCacheEntryAvailable: function(entry, isNew, appCache, status) {
- cb(entry);
- },
- get mainThreadOnly() { return true; }
- };
- diskStorage.asyncOpenURI(Services.io.newURI(key, null, null), "", nsICacheStorage.OPEN_READONLY, checkCacheListener);
-}
-
-function makeGeneralTab()
-{
- var title = (gDocument.title) ? gBundle.getFormattedString("pageTitle", [gDocument.title]) : gBundle.getString("noPageTitle");
- document.getElementById("titletext").value = title;
-
- var url = gDocument.location.toString();
- setItemValue("urltext", url);
-
- var referrer = ("referrer" in gDocument && gDocument.referrer);
- setItemValue("refertext", referrer);
-
- var mode = ("compatMode" in gDocument && gDocument.compatMode == "BackCompat") ? "generalQuirksMode" : "generalStrictMode";
- document.getElementById("modetext").value = gBundle.getString(mode);
-
- // find out the mime type
- var mimeType = gDocument.contentType;
- setItemValue("typetext", mimeType);
-
- // get the document characterset
- var encoding = gDocument.characterSet;
- document.getElementById("encodingtext").value = encoding;
-
- // get the meta tags
- var metaNodes = gDocument.getElementsByTagName("meta");
- var length = metaNodes.length;
-
- var metaGroup = document.getElementById("metaTags");
- if (!length)
- metaGroup.collapsed = true;
- else {
- var metaTagsCaption = document.getElementById("metaTagsCaption");
- if (length == 1)
- metaTagsCaption.label = gBundle.getString("generalMetaTag");
- else
- metaTagsCaption.label = gBundle.getFormattedString("generalMetaTags", [length]);
- var metaTree = document.getElementById("metatree");
- metaTree.view = gMetaView;
-
- for (var i = 0; i < length; i++)
- gMetaView.addRow([metaNodes[i].name || metaNodes[i].httpEquiv, metaNodes[i].content]);
-
- metaGroup.collapsed = false;
- }
-
- // get the date of last modification
- var modifiedText = formatDate(gDocument.lastModified, gStrings.notSet);
- document.getElementById("modifiedtext").value = modifiedText;
-
- // get cache info
- var cacheKey = url.replace(/#.*$/, "");
- openCacheEntry(cacheKey, function(cacheEntry) {
- var sizeText;
- if (cacheEntry) {
- var pageSize = cacheEntry.dataSize;
- var kbSize = formatNumber(Math.round(pageSize / 1024 * 100) / 100);
- sizeText = gBundle.getFormattedString("generalSize", [kbSize, formatNumber(pageSize)]);
- }
- setItemValue("sizetext", sizeText);
- });
-
- securityOnLoad();
-}
-
-//******** Generic Build-a-tab
-// Assumes the views are empty. Only called once to build the tabs, and
-// does so by farming the task off to another thread via setTimeout().
-// The actual work is done with a TreeWalker that calls doGrab() once for
-// each element node in the document.
-
-var gFrameList = [ ];
-
-function makeTabs(aDocument, aWindow)
-{
- goThroughFrames(aDocument, aWindow);
- processFrames();
-}
-
-function goThroughFrames(aDocument, aWindow)
-{
- gFrameList.push(aDocument);
- if (aWindow && aWindow.frames.length > 0) {
- var num = aWindow.frames.length;
- for (var i = 0; i < num; i++)
- goThroughFrames(aWindow.frames[i].document, aWindow.frames[i]); // recurse through the frames
- }
-}
-
-function processFrames()
-{
- if (gFrameList.length) {
- var doc = gFrameList[0];
- onProcessFrame.forEach(function(func) { func(doc); });
- var iterator = doc.createTreeWalker(doc, NodeFilter.SHOW_ELEMENT, grabAll);
- gFrameList.shift();
- setTimeout(doGrab, 10, iterator);
- onFinished.push(selectImage);
- }
- else
- onFinished.forEach(function(func) { func(); });
-}
-
-function doGrab(iterator)
-{
- for (var i = 0; i < 500; ++i)
- if (!iterator.nextNode()) {
- processFrames();
- return;
- }
-
- setTimeout(doGrab, 10, iterator);
-}
-
-function addImage(url, type, alt, elem, isBg)
-{
- if (!url)
- return;
-
- if (!gImageHash.hasOwnProperty(url))
- gImageHash[url] = { };
- if (!gImageHash[url].hasOwnProperty(type))
- gImageHash[url][type] = { };
- if (!gImageHash[url][type].hasOwnProperty(alt)) {
- gImageHash[url][type][alt] = gImageView.data.length;
- var row = [url, type, -1, alt, 1, elem, isBg];
- gImageView.addRow(row);
-
- // Fill in cache data asynchronously
- openCacheEntry(url, function(cacheEntry) {
- // The data at row[2] corresponds to the data size.
- if (cacheEntry) {
- row[2] = cacheEntry.dataSize;
- // Invalidate the row to trigger a repaint.
- gImageView.tree.invalidateRow(gImageView.data.indexOf(row));
- }
- });
-
- // Add the observer, only once.
- if (gImageView.data.length == 1) {
- document.getElementById("mediaTab").hidden = false;
- Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService)
- .addObserver(imagePermissionObserver, "perm-changed", false);
- }
- }
- else {
- var i = gImageHash[url][type][alt];
- gImageView.data[i][COL_IMAGE_COUNT]++;
- if (elem == gImageElement)
- gImageView.data[i][COL_IMAGE_NODE] = elem;
- }
-}
-
-function grabAll(elem)
-{
- // check for images defined in CSS (e.g. background, borders), any node may have multiple
- var computedStyle = elem.ownerDocument.defaultView.getComputedStyle(elem, "");
-
- if (computedStyle) {
- var addImgFunc = function (label, val) {
- if (val.primitiveType == CSSPrimitiveValue.CSS_URI) {
- addImage(val.getStringValue(), label, gStrings.notSet, elem, true);
- }
- else if (val.primitiveType == CSSPrimitiveValue.CSS_STRING) {
- // This is for -moz-image-rect.
- // TODO: Reimplement once bug 714757 is fixed
- var strVal = val.getStringValue();
- if (strVal.search(/^.*url\(\"?/) > -1) {
- url = strVal.replace(/^.*url\(\"?/,"").replace(/\"?\).*$/,"");
- addImage(url, label, gStrings.notSet, elem, true);
- }
- }
- else if (val.cssValueType == CSSValue.CSS_VALUE_LIST) {
- // recursively resolve multiple nested CSS value lists
- for (var i = 0; i < val.length; i++)
- addImgFunc(label, val.item(i));
- }
- };
-
- addImgFunc(gStrings.mediaBGImg, computedStyle.getPropertyCSSValue("background-image"));
- addImgFunc(gStrings.mediaBorderImg, computedStyle.getPropertyCSSValue("border-image-source"));
- addImgFunc(gStrings.mediaListImg, computedStyle.getPropertyCSSValue("list-style-image"));
- addImgFunc(gStrings.mediaCursor, computedStyle.getPropertyCSSValue("cursor"));
- }
-
- // one swi^H^H^Hif-else to rule them all
- if (elem instanceof HTMLImageElement)
- addImage(elem.src, gStrings.mediaImg,
- (elem.hasAttribute("alt")) ? elem.alt : gStrings.notSet, elem, false);
- else if (elem instanceof SVGImageElement) {
- try {
- // Note: makeURLAbsolute will throw if either the baseURI is not a valid URI
- // or the URI formed from the baseURI and the URL is not a valid URI
- var href = makeURLAbsolute(elem.baseURI, elem.href.baseVal);
- addImage(href, gStrings.mediaImg, "", elem, false);
- } catch (e) { }
- }
- else if (elem instanceof HTMLVideoElement) {
- addImage(elem.currentSrc, gStrings.mediaVideo, "", elem, false);
- }
- else if (elem instanceof HTMLAudioElement) {
- addImage(elem.currentSrc, gStrings.mediaAudio, "", elem, false);
- }
- else if (elem instanceof HTMLLinkElement) {
- if (elem.rel && /\bicon\b/i.test(elem.rel))
- addImage(elem.href, gStrings.mediaLink, "", elem, false);
- }
- else if (elem instanceof HTMLInputElement || elem instanceof HTMLButtonElement) {
- if (elem.type.toLowerCase() == "image")
- addImage(elem.src, gStrings.mediaInput,
- (elem.hasAttribute("alt")) ? elem.alt : gStrings.notSet, elem, false);
- }
- else if (elem instanceof HTMLObjectElement)
- addImage(elem.data, gStrings.mediaObject, getValueText(elem), elem, false);
- else if (elem instanceof HTMLEmbedElement)
- addImage(elem.src, gStrings.mediaEmbed, "", elem, false);
-
- onProcessElement.forEach(function(func) { func(elem); });
-
- return NodeFilter.FILTER_ACCEPT;
-}
-
-//******** Link Stuff
-function openURL(target)
-{
- var url = target.parentNode.childNodes[2].value;
- window.open(url, "_blank", "chrome");
-}
-
-function onBeginLinkDrag(event,urlField,descField)
-{
- if (event.originalTarget.localName != "treechildren")
- return;
-
- var tree = event.target;
- if (!("treeBoxObject" in tree))
- tree = tree.parentNode;
-
- var row = tree.treeBoxObject.getRowAt(event.clientX, event.clientY);
- if (row == -1)
- return;
-
- // Adding URL flavor
- var col = tree.columns[urlField];
- var url = tree.view.getCellText(row, col);
- col = tree.columns[descField];
- var desc = tree.view.getCellText(row, col);
-
- var dt = event.dataTransfer;
- dt.setData("text/x-moz-url", url + "\n" + desc);
- dt.setData("text/url-list", url);
- dt.setData("text/plain", url);
-}
-
-//******** Image Stuff
-function getSelectedRows(tree)
-{
- var start = { };
- var end = { };
- var numRanges = tree.view.selection.getRangeCount();
-
- var rowArray = [ ];
- for (var t = 0; t < numRanges; t++) {
- tree.view.selection.getRangeAt(t, start, end);
- for (var v = start.value; v <= end.value; v++)
- rowArray.push(v);
- }
-
- return rowArray;
-}
-
-function getSelectedRow(tree)
-{
- var rows = getSelectedRows(tree);
- return (rows.length == 1) ? rows[0] : -1;
-}
-
-function selectSaveFolder(aCallback)
-{
- const nsILocalFile = Components.interfaces.nsILocalFile;
- const nsIFilePicker = Components.interfaces.nsIFilePicker;
- let titleText = gBundle.getString("mediaSelectFolder");
- let fp = Components.classes["@mozilla.org/filepicker;1"].
- createInstance(nsIFilePicker);
- let fpCallback = function fpCallback_done(aResult) {
- if (aResult == nsIFilePicker.returnOK) {
- aCallback(fp.file.QueryInterface(nsILocalFile));
- } else {
- aCallback(null);
- }
- };
-
- fp.init(window, titleText, nsIFilePicker.modeGetFolder);
- fp.appendFilters(nsIFilePicker.filterAll);
- try {
- let prefs = Components.classes[PREFERENCES_CONTRACTID].
- getService(Components.interfaces.nsIPrefBranch);
- let initialDir = prefs.getComplexValue("browser.download.dir", nsILocalFile);
- if (initialDir) {
- fp.displayDirectory = initialDir;
- }
- } catch (ex) {
- }
- fp.open(fpCallback);
-}
-
-function saveMedia()
-{
- var tree = document.getElementById("imagetree");
- var rowArray = getSelectedRows(tree);
- if (rowArray.length == 1) {
- var row = rowArray[0];
- var item = gImageView.data[row][COL_IMAGE_NODE];
- var url = gImageView.data[row][COL_IMAGE_ADDRESS];
-
- if (url) {
- var titleKey = "SaveImageTitle";
-
- if (item instanceof HTMLVideoElement)
- titleKey = "SaveVideoTitle";
- else if (item instanceof HTMLAudioElement)
- titleKey = "SaveAudioTitle";
-
- saveURL(url, null, titleKey, false, false, makeURI(item.baseURI), gDocument);
- }
- } else {
- selectSaveFolder(function(aDirectory) {
- if (aDirectory) {
- var saveAnImage = function(aURIString, aChosenData, aBaseURI) {
- internalSave(aURIString, null, null, null, null, false, "SaveImageTitle",
- aChosenData, aBaseURI, gDocument);
- };
-
- for (var i = 0; i < rowArray.length; i++) {
- var v = rowArray[i];
- var dir = aDirectory.clone();
- var item = gImageView.data[v][COL_IMAGE_NODE];
- var uriString = gImageView.data[v][COL_IMAGE_ADDRESS];
- var uri = makeURI(uriString);
-
- try {
- uri.QueryInterface(Components.interfaces.nsIURL);
- dir.append(decodeURIComponent(uri.fileName));
- } catch(ex) {
- /* data: uris */
- }
-
- if (i == 0) {
- saveAnImage(uriString, new AutoChosen(dir, uri), makeURI(item.baseURI));
- } else {
- // This delay is a hack which prevents the download manager
- // from opening many times. See bug 377339.
- setTimeout(saveAnImage, 200, uriString, new AutoChosen(dir, uri),
- makeURI(item.baseURI));
- }
- }
- }
- });
- }
-}
-
-function onBlockImage()
-{
- var permissionManager = Components.classes[PERMISSION_CONTRACTID]
- .getService(nsIPermissionManager);
-
- var checkbox = document.getElementById("blockImage");
- var uri = makeURI(document.getElementById("imageurltext").value);
- if (checkbox.checked)
- permissionManager.add(uri, "image", nsIPermissionManager.DENY_ACTION);
- else
- permissionManager.remove(uri, "image");
-}
-
-function onImageSelect()
-{
- var previewBox = document.getElementById("mediaPreviewBox");
- var mediaSaveBox = document.getElementById("mediaSaveBox");
- var splitter = document.getElementById("mediaSplitter");
- var tree = document.getElementById("imagetree");
- var count = tree.view.selection.count;
- if (count == 0) {
- previewBox.collapsed = true;
- mediaSaveBox.collapsed = true;
- splitter.collapsed = true;
- tree.flex = 1;
- }
- else if (count > 1) {
- splitter.collapsed = true;
- previewBox.collapsed = true;
- mediaSaveBox.collapsed = false;
- tree.flex = 1;
- }
- else {
- mediaSaveBox.collapsed = true;
- splitter.collapsed = false;
- previewBox.collapsed = false;
- tree.flex = 0;
- makePreview(getSelectedRows(tree)[0]);
- }
-}
-
-function makePreview(row)
-{
- var imageTree = document.getElementById("imagetree");
- var item = gImageView.data[row][COL_IMAGE_NODE];
- var url = gImageView.data[row][COL_IMAGE_ADDRESS];
- var isBG = gImageView.data[row][COL_IMAGE_BG];
- var isAudio = false;
-
- setItemValue("imageurltext", url);
-
- var imageText;
- if (!isBG &&
- !(item instanceof SVGImageElement) &&
- !(gDocument instanceof ImageDocument)) {
- imageText = item.title || item.alt;
-
- if (!imageText && !(item instanceof HTMLImageElement))
- imageText = getValueText(item);
- }
- setItemValue("imagetext", imageText);
-
- setItemValue("imagelongdesctext", item.longDesc);
-
- // get cache info
- var cacheKey = url.replace(/#.*$/, "");
- openCacheEntry(cacheKey, function(cacheEntry) {
- // find out the file size
- var sizeText;
- if (cacheEntry) {
- var imageSize = cacheEntry.dataSize;
- var kbSize = Math.round(imageSize / 1024 * 100) / 100;
- sizeText = gBundle.getFormattedString("generalSize",
- [formatNumber(kbSize), formatNumber(imageSize)]);
- }
- else
- sizeText = gBundle.getString("mediaUnknownNotCached");
- setItemValue("imagesizetext", sizeText);
-
- var mimeType;
- var numFrames = 1;
- if (item instanceof HTMLObjectElement ||
- item instanceof HTMLEmbedElement ||
- item instanceof HTMLLinkElement)
- mimeType = item.type;
-
- if (!mimeType && !isBG && item instanceof nsIImageLoadingContent) {
- var imageRequest = item.getRequest(nsIImageLoadingContent.CURRENT_REQUEST);
- if (imageRequest) {
- mimeType = imageRequest.mimeType;
- var image = imageRequest.image;
- if (image)
- numFrames = image.numFrames;
- }
- }
-
- if (!mimeType)
- mimeType = getContentTypeFromHeaders(cacheEntry);
-
- // if we have a data url, get the MIME type from the url
- if (!mimeType && url.startsWith("data:")) {
- let dataMimeType = /^data:(image\/[^;,]+)/i.exec(url);
- if (dataMimeType)
- mimeType = dataMimeType[1].toLowerCase();
- }
-
- var imageType;
- if (mimeType) {
- // We found the type, try to display it nicely
- let imageMimeType = /^image\/(.*)/i.exec(mimeType);
- if (imageMimeType) {
- imageType = imageMimeType[1].toUpperCase();
- if (numFrames > 1)
- imageType = gBundle.getFormattedString("mediaAnimatedImageType",
- [imageType, numFrames]);
- else
- imageType = gBundle.getFormattedString("mediaImageType", [imageType]);
- }
- else {
- // the MIME type doesn't begin with image/, display the raw type
- imageType = mimeType;
- }
- }
- else {
- // We couldn't find the type, fall back to the value in the treeview
- imageType = gImageView.data[row][COL_IMAGE_TYPE];
- }
- setItemValue("imagetypetext", imageType);
-
- var imageContainer = document.getElementById("theimagecontainer");
- var oldImage = document.getElementById("thepreviewimage");
-
- var isProtocolAllowed = checkProtocol(gImageView.data[row]);
-
- var newImage = new Image;
- newImage.id = "thepreviewimage";
- var physWidth = 0, physHeight = 0;
- var width = 0, height = 0;
-
- if ((item instanceof HTMLLinkElement || item instanceof HTMLInputElement ||
- item instanceof HTMLImageElement ||
- item instanceof SVGImageElement ||
- (item instanceof HTMLObjectElement && mimeType && mimeType.startsWith("image/")) || isBG) && isProtocolAllowed) {
- newImage.setAttribute("src", url);
- physWidth = newImage.width || 0;
- physHeight = newImage.height || 0;
-
- // "width" and "height" attributes must be set to newImage,
- // even if there is no "width" or "height attribute in item;
- // otherwise, the preview image cannot be displayed correctly.
- if (!isBG) {
- newImage.width = ("width" in item && item.width) || newImage.naturalWidth;
- newImage.height = ("height" in item && item.height) || newImage.naturalHeight;
- }
- else {
- // the Width and Height of an HTML tag should not be used for its background image
- // (for example, "table" can have "width" or "height" attributes)
- newImage.width = newImage.naturalWidth;
- newImage.height = newImage.naturalHeight;
- }
-
- if (item instanceof SVGImageElement) {
- newImage.width = item.width.baseVal.value;
- newImage.height = item.height.baseVal.value;
- }
-
- width = newImage.width;
- height = newImage.height;
-
- document.getElementById("theimagecontainer").collapsed = false
- document.getElementById("brokenimagecontainer").collapsed = true;
- }
- else if (item instanceof HTMLVideoElement && isProtocolAllowed) {
- newImage = document.createElementNS("http://www.w3.org/1999/xhtml", "video");
- newImage.id = "thepreviewimage";
- newImage.src = url;
- newImage.controls = true;
- width = physWidth = item.videoWidth;
- height = physHeight = item.videoHeight;
-
- document.getElementById("theimagecontainer").collapsed = false;
- document.getElementById("brokenimagecontainer").collapsed = true;
- }
- else if (item instanceof HTMLAudioElement && isProtocolAllowed) {
- newImage = new Audio;
- newImage.id = "thepreviewimage";
- newImage.src = url;
- newImage.controls = true;
- isAudio = true;
-
- document.getElementById("theimagecontainer").collapsed = false;
- document.getElementById("brokenimagecontainer").collapsed = true;
- }
- else {
- // fallback image for protocols not allowed (e.g., javascript:)
- // or elements not [yet] handled (e.g., object, embed).
- document.getElementById("brokenimagecontainer").collapsed = false;
- document.getElementById("theimagecontainer").collapsed = true;
- }
-
- var imageSize = "";
- if (url && !isAudio) {
- if (width != physWidth || height != physHeight) {
- imageSize = gBundle.getFormattedString("mediaDimensionsScaled",
- [formatNumber(physWidth),
- formatNumber(physHeight),
- formatNumber(width),
- formatNumber(height)]);
- }
- else {
- imageSize = gBundle.getFormattedString("mediaDimensions",
- [formatNumber(width),
- formatNumber(height)]);
- }
- }
- setItemValue("imagedimensiontext", imageSize);
-
- makeBlockImage(url);
-
- imageContainer.removeChild(oldImage);
- imageContainer.appendChild(newImage);
-
- onImagePreviewShown.forEach(function(func) { func(); });
- });
-}
-
-function makeBlockImage(url)
-{
- var permissionManager = Components.classes[PERMISSION_CONTRACTID]
- .getService(nsIPermissionManager);
- var prefs = Components.classes[PREFERENCES_CONTRACTID]
- .getService(Components.interfaces.nsIPrefBranch);
-
- var checkbox = document.getElementById("blockImage");
- var imagePref = prefs.getIntPref("permissions.default.image");
- if (!(/^https?:/.test(url)) || imagePref == 2)
- // We can't block the images from this host because either is is not
- // for http(s) or we don't load images at all
- checkbox.hidden = true;
- else {
- var uri = makeURI(url);
- if (uri.host) {
- checkbox.hidden = false;
- checkbox.label = gBundle.getFormattedString("mediaBlockImage", [uri.host]);
- var perm = permissionManager.testPermission(uri, "image");
- checkbox.checked = perm == nsIPermissionManager.DENY_ACTION;
- }
- else
- checkbox.hidden = true;
- }
-}
-
-var imagePermissionObserver = {
- observe: function (aSubject, aTopic, aData)
- {
- if (document.getElementById("mediaPreviewBox").collapsed)
- return;
-
- if (aTopic == "perm-changed") {
- var permission = aSubject.QueryInterface(Components.interfaces.nsIPermission);
- if (permission.type == "image") {
- var imageTree = document.getElementById("imagetree");
- var row = getSelectedRow(imageTree);
- var item = gImageView.data[row][COL_IMAGE_NODE];
- var url = gImageView.data[row][COL_IMAGE_ADDRESS];
- if (permission.matchesURI(makeURI(url), true)) {
- makeBlockImage(url);
- }
- }
- }
- }
-}
-
-function getContentTypeFromHeaders(cacheEntryDescriptor)
-{
- if (!cacheEntryDescriptor)
- return null;
-
- return (/^Content-Type:\s*(.*?)\s*(?:\;|$)/mi
- .exec(cacheEntryDescriptor.getMetaDataElement("response-head")))[1];
-}
-
-//******** 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
-function getValueText(node)
-{
- var valueText = "";
-
- // form input elements don't generally contain information that is useful to our callers, so return nothing
- if (node instanceof HTMLInputElement ||
- node instanceof HTMLSelectElement ||
- node instanceof HTMLTextAreaElement)
- return valueText;
-
- // otherwise recurse for each child
- var length = node.childNodes.length;
- for (var i = 0; i < length; i++) {
- var childNode = node.childNodes[i];
- var nodeType = childNode.nodeType;
-
- // text nodes are where the goods are
- if (nodeType == Node.TEXT_NODE)
- valueText += " " + childNode.nodeValue;
- // and elements can have more text inside them
- else if (nodeType == Node.ELEMENT_NODE) {
- // images are special, we want to capture the alt text as if the image weren't there
- if (childNode instanceof HTMLImageElement)
- 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 setItemValue(id, value)
-{
- var item = document.getElementById(id);
- if (value) {
- item.parentNode.collapsed = false;
- item.value = value;
- }
- else
- item.parentNode.collapsed = true;
-}
-
-function formatNumber(number)
-{
- return (+number).toLocaleString(); // coerce number to a numeric value before calling toLocaleString()
-}
-
-function formatDate(datestr, unknown)
-{
- // scriptable date formatter, for pretty printing dates
- var dateService = Components.classes["@mozilla.org/intl/scriptabledateformat;1"]
- .getService(Components.interfaces.nsIScriptableDateFormat);
-
- var date = new Date(datestr);
- if (!date.valueOf())
- return unknown;
-
- return dateService.FormatDateTime("", dateService.dateFormatLong,
- dateService.timeFormatSeconds,
- date.getFullYear(), date.getMonth()+1, date.getDate(),
- date.getHours(), date.getMinutes(), date.getSeconds());
-}
-
-function doCopy()
-{
- if (!gClipboardHelper)
- return;
-
- var elem = document.commandDispatcher.focusedElement;
-
- if (elem && "treeBoxObject" in elem) {
- var view = elem.view;
- var selection = view.selection;
- var text = [], tmp = '';
- var min = {}, max = {};
-
- var count = selection.getRangeCount();
-
- for (var i = 0; i < count; i++) {
- selection.getRangeAt(i, min, max);
-
- for (var row = min.value; row <= max.value; row++) {
- view.performActionOnRow("copy", row);
-
- tmp = elem.getAttribute("copybuffer");
- if (tmp)
- text.push(tmp);
- elem.removeAttribute("copybuffer");
- }
- }
- gClipboardHelper.copyString(text.join("\n"), document);
- }
-}
-
-function doSelectAll()
-{
- var elem = document.commandDispatcher.focusedElement;
-
- if (elem && "treeBoxObject" in elem)
- elem.view.selection.selectAll();
-}
-
-function selectImage()
-{
- if (!gImageElement)
- return;
-
- var tree = document.getElementById("imagetree");
- for (var i = 0; i < tree.view.rowCount; i++) {
- if (gImageElement == gImageView.data[i][COL_IMAGE_NODE] &&
- !gImageView.data[i][COL_IMAGE_BG]) {
- tree.view.selection.select(i);
- tree.treeBoxObject.ensureRowIsVisible(i);
- tree.focus();
- return;
- }
- }
-}
-
-function checkProtocol(img)
-{
- var url = img[COL_IMAGE_ADDRESS];
- return /^data:image\//i.test(url) ||
- /^(https?|ftp|file|about|chrome|resource):/.test(url);
-}
diff --git a/application/palemoon/base/content/pageinfo/pageInfo.xml b/application/palemoon/base/content/pageinfo/pageInfo.xml
deleted file mode 100644
index 20d330046..000000000
--- a/application/palemoon/base/content/pageinfo/pageInfo.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<bindings id="pageInfoBindings"
- xmlns="http://www.mozilla.org/xbl"
- xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:xbl="http://www.mozilla.org/xbl">
-
- <!-- based on preferences.xml paneButton -->
- <binding id="viewbutton" extends="chrome://global/content/bindings/radio.xml#radio">
- <content>
- <xul:image class="viewButtonIcon" xbl:inherits="src"/>
- <xul:label class="viewButtonLabel" xbl:inherits="value=label"/>
- </content>
- <implementation implements="nsIAccessibleProvider">
- <property name="accessibleType" readonly="true">
- <getter>
- <![CDATA[
- return Components.interfaces.nsIAccessibleProvider.XULListitem;
- ]]>
- </getter>
- </property>
- </implementation>
- </binding>
-
-</bindings>
diff --git a/application/palemoon/base/content/pageinfo/pageInfo.xul b/application/palemoon/base/content/pageinfo/pageInfo.xul
deleted file mode 100644
index e3a61d31e..000000000
--- a/application/palemoon/base/content/pageinfo/pageInfo.xul
+++ /dev/null
@@ -1,507 +0,0 @@
-<?xml version="1.0"?>
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-<?xml-stylesheet href="chrome://browser/content/pageinfo/pageInfo.css" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/skin/pageInfo.css" type="text/css"?>
-
-<!DOCTYPE window [
- <!ENTITY % pageInfoDTD SYSTEM "chrome://browser/locale/pageInfo.dtd">
- %pageInfoDTD;
-]>
-
-#ifdef XP_MACOSX
-<?xul-overlay href="chrome://browser/content/macBrowserOverlay.xul"?>
-#endif
-
-<window id="main-window"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- windowtype="Browser:page-info"
- onload="onLoadPageInfo()"
- onunload="onUnloadPageInfo()"
- align="stretch"
- screenX="10" screenY="10"
- width="&pageInfoWindow.width;" height="&pageInfoWindow.height;"
- persist="screenX screenY width height sizemode">
-
- <script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
- <script type="application/javascript" src="chrome://global/content/contentAreaUtils.js"/>
- <script type="application/javascript" src="chrome://global/content/treeUtils.js"/>
- <script type="application/javascript" src="chrome://browser/content/pageinfo/pageInfo.js"/>
- <script type="application/javascript" src="chrome://browser/content/pageinfo/feeds.js"/>
- <script type="application/javascript" src="chrome://browser/content/pageinfo/permissions.js"/>
- <script type="application/javascript" src="chrome://browser/content/pageinfo/security.js"/>
- <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
-
- <stringbundleset id="pageinfobundleset">
- <stringbundle id="pageinfobundle" src="chrome://browser/locale/pageInfo.properties"/>
- <stringbundle id="pkiBundle" src="chrome://pippki/locale/pippki.properties"/>
- <stringbundle id="browserBundle" src="chrome://browser/locale/browser.properties"/>
- </stringbundleset>
-
- <commandset id="pageInfoCommandSet">
- <command id="cmd_close" oncommand="window.close();"/>
- <command id="cmd_help" oncommand="doHelpButton();"/>
- <command id="cmd_copy" oncommand="doCopy();"/>
- <command id="cmd_selectall" oncommand="doSelectAll();"/>
-
- <!-- permissions tab -->
- <command id="cmd_imageDef" oncommand="onCheckboxClick('image');"/>
- <command id="cmd_popupDef" oncommand="onCheckboxClick('popup');"/>
- <command id="cmd_cookieDef" oncommand="onCheckboxClick('cookie');"/>
- <command id="cmd_desktop-notificationDef" oncommand="onCheckboxClick('desktop-notification');"/>
- <command id="cmd_installDef" oncommand="onCheckboxClick('install');"/>
- <command id="cmd_geoDef" oncommand="onCheckboxClick('geo');"/>
- <command id="cmd_pluginsDef" oncommand="onCheckboxClick('plugins');"/>
- <command id="cmd_imageToggle" oncommand="onRadioClick('image');"/>
- <command id="cmd_popupToggle" oncommand="onRadioClick('popup');"/>
- <command id="cmd_cookieToggle" oncommand="onRadioClick('cookie');"/>
- <command id="cmd_desktop-notificationToggle" oncommand="onRadioClick('desktop-notification');"/>
- <command id="cmd_installToggle" oncommand="onRadioClick('install');"/>
- <command id="cmd_geoToggle" oncommand="onRadioClick('geo');"/>
- <command id="cmd_pluginsToggle" oncommand="onPluginRadioClick(event);"/>
- </commandset>
-
- <keyset id="pageInfoKeySet">
- <key key="&closeWindow.key;" modifiers="accel" command="cmd_close"/>
- <key keycode="VK_ESCAPE" command="cmd_close"/>
-#ifdef XP_MACOSX
- <key key="." modifiers="meta" command="cmd_close"/>
-#else
- <key keycode="VK_F1" command="cmd_help"/>
-#endif
- <key key="&copy.key;" modifiers="accel" command="cmd_copy"/>
- <key key="&selectall.key;" modifiers="accel" command="cmd_selectall"/>
- <key key="&selectall.key;" modifiers="alt" command="cmd_selectall"/>
- </keyset>
-
- <menupopup id="picontext">
- <menuitem id="menu_selectall" label="&selectall.label;" command="cmd_selectall" accesskey="&selectall.accesskey;"/>
- <menuitem id="menu_copy" label="&copy.label;" command="cmd_copy" accesskey="&copy.accesskey;"/>
- </menupopup>
-
- <windowdragbox id="topBar" class="viewGroupWrapper">
- <radiogroup id="viewGroup" class="chromeclass-toolbar" orient="horizontal">
- <radio id="generalTab" label="&generalTab;" accesskey="&generalTab.accesskey;"
- oncommand="showTab('general');"/>
- <radio id="mediaTab" label="&mediaTab;" accesskey="&mediaTab.accesskey;"
- oncommand="showTab('media');" hidden="true"/>
- <radio id="feedTab" label="&feedTab;" accesskey="&feedTab.accesskey;"
- oncommand="showTab('feed');" hidden="true"/>
- <radio id="permTab" label="&permTab;" accesskey="&permTab.accesskey;"
- oncommand="showTab('perm');"/>
- <radio id="securityTab" label="&securityTab;" accesskey="&securityTab.accesskey;"
- oncommand="showTab('security');"/>
- <!-- Others added by overlay -->
- </radiogroup>
- </windowdragbox>
-
- <deck id="mainDeck" flex="1">
- <!-- General page information -->
- <vbox id="generalPanel">
- <textbox class="header" readonly="true" id="titletext"/>
- <grid id="generalGrid">
- <columns>
- <column/>
- <column class="gridSeparator"/>
- <column flex="1"/>
- </columns>
- <rows id="generalRows">
- <row id="generalURLRow">
- <label control="urltext" value="&generalURL;"/>
- <separator/>
- <textbox readonly="true" id="urltext"/>
- </row>
- <row id="generalSeparatorRow1">
- <separator class="thin"/>
- </row>
- <row id="generalTypeRow">
- <label control="typetext" value="&generalType;"/>
- <separator/>
- <textbox readonly="true" id="typetext"/>
- </row>
- <row id="generalModeRow">
- <label control="modetext" value="&generalMode;"/>
- <separator/>
- <textbox readonly="true" crop="end" id="modetext"/>
- </row>
- <row id="generalEncodingRow">
- <label control="encodingtext" value="&generalEncoding;"/>
- <separator/>
- <textbox readonly="true" id="encodingtext"/>
- </row>
- <row id="generalSizeRow">
- <label control="sizetext" value="&generalSize;"/>
- <separator/>
- <textbox readonly="true" id="sizetext"/>
- </row>
- <row id="generalReferrerRow">
- <label control="refertext" value="&generalReferrer;"/>
- <separator/>
- <textbox readonly="true" id="refertext"/>
- </row>
- <row id="generalSeparatorRow2">
- <separator class="thin"/>
- </row>
- <row id="generalModifiedRow">
- <label control="modifiedtext" value="&generalModified;"/>
- <separator/>
- <textbox readonly="true" id="modifiedtext"/>
- </row>
- </rows>
- </grid>
- <separator class="thin"/>
- <groupbox id="metaTags" flex="1" class="collapsable treebox">
- <caption id="metaTagsCaption" onclick="toggleGroupbox('metaTags');"/>
- <tree id="metatree" flex="1" hidecolumnpicker="true" contextmenu="picontext">
- <treecols>
- <treecol id="meta-name" label="&generalMetaName;"
- persist="width" flex="1"
- onclick="gMetaView.onPageMediaSort('meta-name');"/>
- <splitter class="tree-splitter"/>
- <treecol id="meta-content" label="&generalMetaContent;"
- persist="width" flex="4"
- onclick="gMetaView.onPageMediaSort('meta-content');"/>
- </treecols>
- <treechildren id="metatreechildren" flex="1"/>
- </tree>
- </groupbox>
- <groupbox id="securityBox">
- <caption id="securityBoxCaption" label="&securityHeader;"/>
- <description id="general-security-identity" class="header"/>
- <description id="general-security-privacy" class="header"/>
- <hbox id="securityDetailsButtonBox" align="right">
- <button id="security-view-details" label="&generalSecurityDetails;"
- accesskey="&generalSecurityDetails.accesskey;"
- oncommand="onClickMore();"/>
- </hbox>
- </groupbox>
- </vbox>
-
- <!-- Media information -->
- <vbox id="mediaPanel">
- <tree id="imagetree" onselect="onImageSelect();" contextmenu="picontext"
- ondragstart="onBeginLinkDrag(event,'image-address','image-alt')">
- <treecols>
- <treecol sortSeparators="true" primary="true" persist="width" flex="10"
- width="10" id="image-address" label="&mediaAddress;"
- onclick="gImageView.onPageMediaSort('image-address');"/>
- <splitter class="tree-splitter"/>
- <treecol sortSeparators="true" persist="hidden width" flex="2"
- width="2" id="image-type" label="&mediaType;"
- onclick="gImageView.onPageMediaSort('image-type');"/>
- <splitter class="tree-splitter"/>
- <treecol sortSeparators="true" hidden="true" persist="hidden width" flex="2"
- width="2" id="image-size" label="&mediaSize;" value="size"
- onclick="gImageView.onPageMediaSort('image-size');"/>
- <splitter class="tree-splitter"/>
- <treecol sortSeparators="true" hidden="true" persist="hidden width" flex="4"
- width="4" id="image-alt" label="&mediaAltHeader;"
- onclick="gImageView.onPageMediaSort('image-alt');"/>
- <splitter class="tree-splitter"/>
- <treecol sortSeparators="true" hidden="true" persist="hidden width" flex="1"
- width="1" id="image-count" label="&mediaCount;"
- onclick="gImageView.onPageMediaSort('image-count');"/>
- </treecols>
- <treechildren id="imagetreechildren" flex="1"/>
- </tree>
- <splitter orient="vertical" id="mediaSplitter"/>
- <vbox flex="1" id="mediaPreviewBox" collapsed="true">
- <grid id="mediaGrid">
- <columns>
- <column id="mediaLabelColumn"/>
- <column class="gridSeparator"/>
- <column flex="1"/>
- </columns>
- <rows id="mediaRows">
- <row id="mediaLocationRow">
- <label control="imageurltext" value="&mediaLocation;"/>
- <separator/>
- <textbox readonly="true" id="imageurltext"/>
- </row>
- <row id="mediaTypeRow">
- <label control="imagetypetext" value="&generalType;"/>
- <separator/>
- <textbox readonly="true" id="imagetypetext"/>
- </row>
- <row id="mediaSizeRow">
- <label control="imagesizetext" value="&generalSize;"/>
- <separator/>
- <textbox readonly="true" id="imagesizetext"/>
- </row>
- <row id="mediaDimensionRow">
- <label control="imagedimensiontext" value="&mediaDimension;"/>
- <separator/>
- <textbox readonly="true" id="imagedimensiontext"/>
- </row>
- <row id="mediaTextRow">
- <label control="imagetext" value="&mediaText;"/>
- <separator/>
- <textbox readonly="true" id="imagetext"/>
- </row>
- <row id="mediaLongdescRow">
- <label control="imagelongdesctext" value="&mediaLongdesc;"/>
- <separator/>
- <textbox readonly="true" id="imagelongdesctext"/>
- </row>
- </rows>
- </grid>
- <hbox id="imageSaveBox" align="end">
- <vbox id="blockImageBox">
- <checkbox id="blockImage" hidden="true" oncommand="onBlockImage()"
- accesskey="&mediaBlockImage.accesskey;"/>
- <label control="thepreviewimage" value="&mediaPreview;" class="header"/>
- </vbox>
- <spacer id="imageSaveBoxSpacer" flex="1"/>
- <button label="&mediaSaveAs;" accesskey="&mediaSaveAs.accesskey;"
- icon="save" id="imagesaveasbutton"
- oncommand="saveMedia();"/>
- </hbox>
- <vbox id="imagecontainerbox" class="inset iframe" flex="1" pack="center">
- <hbox id="theimagecontainer" pack="center">
- <image id="thepreviewimage"/>
- </hbox>
- <hbox id="brokenimagecontainer" pack="center" collapsed="true">
- <image id="brokenimage" src="resource://gre-resources/broken-image.png"/>
- </hbox>
- </vbox>
- </vbox>
- <hbox id="mediaSaveBox" collapsed="true">
- <spacer id="mediaSaveBoxSpacer" flex="1"/>
- <button label="&mediaSaveAs;" accesskey="&mediaSaveAs2.accesskey;"
- icon="save" id="mediasaveasbutton"
- oncommand="saveMedia();"/>
- </hbox>
- </vbox>
-
- <!-- Feeds -->
- <vbox id="feedPanel">
- <richlistbox id="feedListbox" flex="1"/>
- </vbox>
-
- <!-- Permissions -->
- <vbox id="permPanel">
- <hbox id="permHostBox">
- <label value="&permissionsFor;" control="hostText" />
- <textbox id="hostText" class="header" readonly="true"
- crop="end" flex="1"/>
- </hbox>
-
- <vbox id="permList" flex="1">
- <vbox class="permission" id="permImageRow">
- <label class="permissionLabel" id="permImageLabel"
- value="&permImage;" control="imageRadioGroup"/>
- <hbox id="permImageBox" role="group" aria-labelledby="permImageLabel">
- <checkbox id="imageDef" command="cmd_imageDef" label="&permUseDefault;"/>
- <spacer flex="1"/>
- <radiogroup id="imageRadioGroup" orient="horizontal">
- <radio id="image#1" command="cmd_imageToggle" label="&permAllow;"/>
- <radio id="image#2" command="cmd_imageToggle" label="&permBlock;"/>
- </radiogroup>
- </hbox>
- </vbox>
- <vbox class="permission" id="permPopupRow">
- <label class="permissionLabel" id="permPopupLabel"
- value="&permPopup;" control="popupRadioGroup"/>
- <hbox id="permPopupBox" role="group" aria-labelledby="permPopupLabel">
- <checkbox id="popupDef" command="cmd_popupDef" label="&permUseDefault;"/>
- <spacer flex="1"/>
- <radiogroup id="popupRadioGroup" orient="horizontal">
- <radio id="popup#1" command="cmd_popupToggle" label="&permAllow;"/>
- <radio id="popup#2" command="cmd_popupToggle" label="&permBlock;"/>
- </radiogroup>
- </hbox>
- </vbox>
- <vbox class="permission" id="permCookieRow">
- <label class="permissionLabel" id="permCookieLabel"
- value="&permCookie;" control="cookieRadioGroup"/>
- <hbox id="permCookieBox" role="group" aria-labelledby="permCookieLabel">
- <checkbox id="cookieDef" command="cmd_cookieDef" label="&permUseDefault;"/>
- <spacer flex="1"/>
- <radiogroup id="cookieRadioGroup" orient="horizontal">
- <radio id="cookie#1" command="cmd_cookieToggle" label="&permAllow;"/>
- <radio id="cookie#8" command="cmd_cookieToggle" label="&permAllowSession;"/>
- <radio id="cookie#9" command="cmd_cookieToggle" label="&permAllowFirstPartyOnly;"/>
- <radio id="cookie#2" command="cmd_cookieToggle" label="&permBlock;"/>
- </radiogroup>
- </hbox>
- </vbox>
- <vbox class="permission" id="permNotificationRow">
- <label class="permissionLabel" id="permNotificationLabel"
- value="&permNotifications;" control="desktop-notificationRadioGroup"/>
- <hbox role="group" aria-labelledby="permNotificationLabel">
- <checkbox id="desktop-notificationDef" command="cmd_desktop-notificationDef" label="&permUseDefault;"/>
- <spacer flex="1"/>
- <radiogroup id="desktop-notificationRadioGroup" orient="horizontal">
- <radio id="desktop-notification#0" command="cmd_desktop-notificationToggle" label="&permAskAlways;"/>
- <radio id="desktop-notification#1" command="cmd_desktop-notificationToggle" label="&permAllow;"/>
- <radio id="desktop-notification#2" command="cmd_desktop-notificationToggle" label="&permBlock;"/>
- </radiogroup>
- </hbox>
- </vbox>
- <vbox class="permission" id="permInstallRow">
- <label class="permissionLabel" id="permInstallLabel"
- value="&permInstall;" control="installRadioGroup"/>
- <hbox id="permInstallBox" role="group" aria-labelledby="permInstallLabel">
- <checkbox id="installDef" command="cmd_installDef" label="&permUseDefault;"/>
- <spacer flex="1"/>
- <radiogroup id="installRadioGroup" orient="horizontal">
- <radio id="install#1" command="cmd_installToggle" label="&permAllow;"/>
- <radio id="install#2" command="cmd_installToggle" label="&permBlock;"/>
- </radiogroup>
- </hbox>
- </vbox>
- <vbox class="permission" id="permGeoRow" >
- <label class="permissionLabel" id="permGeoLabel"
- value="&permGeo;" control="geoRadioGroup"/>
- <hbox id="permGeoBox" role="group" aria-labelledby="permGeoLabel">
- <checkbox id="geoDef" command="cmd_geoDef" label="&permAskAlways;"/>
- <spacer flex="1"/>
- <radiogroup id="geoRadioGroup" orient="horizontal">
- <radio id="geo#1" command="cmd_geoToggle" label="&permAllow;"/>
- <radio id="geo#2" command="cmd_geoToggle" label="&permBlock;"/>
- </radiogroup>
- </hbox>
- </vbox>
- <vbox class="permission" id="permPluginsRow">
- <label class="permissionLabel" id="permPluginsLabel"
- value="&permPlugins;" control="pluginsRadioGroup"/>
- <hbox id="permPluginTemplate" role="group" aria-labelledby="permPluginsLabel" align="baseline">
- <label class="permPluginTemplateLabel"/>
- <spacer flex="1"/>
- <radiogroup class="permPluginTemplateRadioGroup" orient="horizontal" command="cmd_pluginsToggle">
- <radio class="permPluginTemplateRadioDefault" label="&permUseDefault;"/>
- <radio class="permPluginTemplateRadioAsk" label="&permAskAlways;"/>
- <radio class="permPluginTemplateRadioAllow" label="&permAllow;"/>
- <radio class="permPluginTemplateRadioBlock" label="&permBlock;"/>
- </radiogroup>
- </hbox>
- </vbox>
- </vbox>
- </vbox>
-
- <!-- Security & Privacy -->
- <vbox id="securityPanel">
- <!-- Identity Section -->
- <groupbox id="security-identity-groupbox" flex="1">
- <caption id="security-identity" label="&securityView.identity.header;"/>
- <grid id="security-identity-grid" flex="1">
- <columns>
- <column/>
- <column flex="1"/>
- </columns>
- <rows id="security-identity-rows">
- <!-- Domain -->
- <row id="security-identity-domain-row">
- <label id="security-identity-domain-label"
- class="fieldLabel"
- value="&securityView.identity.domain;"
- control="security-identity-domain-value"/>
- <textbox id="security-identity-domain-value"
- class="fieldValue" readonly="true"/>
- </row>
- <!-- Owner -->
- <row id="security-identity-owner-row">
- <label id="security-identity-owner-label"
- class="fieldLabel"
- value="&securityView.identity.owner;"
- control="security-identity-owner-value"/>
- <textbox id="security-identity-owner-value"
- class="fieldValue" readonly="true"/>
- </row>
- <!-- Verifier -->
- <row id="security-identity-verifier-row">
- <label id="security-identity-verifier-label"
- class="fieldLabel"
- value="&securityView.identity.verifier;"
- control="security-identity-verifier-value"/>
- <textbox id="security-identity-verifier-value"
- class="fieldValue" readonly="true" />
- </row>
- </rows>
- </grid>
- <spacer flex="1"/>
- <!-- Cert button -->
- <hbox id="security-view-cert-box" pack="end">
- <button id="security-view-cert" label="&securityView.certView;"
- accesskey="&securityView.accesskey;"
- oncommand="security.viewCert();"/>
- </hbox>
- </groupbox>
-
- <!-- Privacy & History section -->
- <groupbox id="security-privacy-groupbox" flex="1">
- <caption id="security-privacy" label="&securityView.privacy.header;" />
- <grid id="security-privacy-grid">
- <columns>
- <column flex="1"/>
- <column flex="1"/>
- </columns>
- <rows id="security-privacy-rows">
- <!-- History -->
- <row id="security-privacy-history-row">
- <label id="security-privacy-history-label"
- control="security-privacy-history-value"
- class="fieldLabel">&securityView.privacy.history;</label>
- <textbox id="security-privacy-history-value"
- class="fieldValue"
- value="&securityView.unknown;"
- readonly="true"/>
- </row>
- <!-- Cookies -->
- <row id="security-privacy-cookies-row">
- <label id="security-privacy-cookies-label"
- control="security-privacy-cookies-value"
- class="fieldLabel">&securityView.privacy.cookies;</label>
- <hbox id="security-privacy-cookies-box" align="center">
- <textbox id="security-privacy-cookies-value"
- class="fieldValue"
- value="&securityView.unknown;"
- flex="1"
- readonly="true"/>
- <button id="security-view-cookies"
- label="&securityView.privacy.viewCookies;"
- accesskey="&securityView.privacy.viewCookies.accessKey;"
- oncommand="security.viewCookies();"/>
- </hbox>
- </row>
- <!-- Passwords -->
- <row id="security-privacy-passwords-row">
- <label id="security-privacy-passwords-label"
- control="security-privacy-passwords-value"
- class="fieldLabel">&securityView.privacy.passwords;</label>
- <hbox id="security-privacy-passwords-box" align="center">
- <textbox id="security-privacy-passwords-value"
- class="fieldValue"
- value="&securityView.unknown;"
- flex="1"
- readonly="true"/>
- <button id="security-view-password"
- label="&securityView.privacy.viewPasswords;"
- accesskey="&securityView.privacy.viewPasswords.accessKey;"
- oncommand="security.viewPasswords();"/>
- </hbox>
- </row>
- </rows>
- </grid>
- </groupbox>
-
- <!-- Technical Details section -->
- <groupbox id="security-technical-groupbox" flex="1">
- <caption id="security-technical" label="&securityView.technical.header;" />
- <vbox id="security-technical-box" flex="1">
- <label id="security-technical-shortform" class="fieldValue"/>
- <description id="security-technical-longform1" class="fieldLabel"/>
- <description id="security-technical-longform2" class="fieldLabel"/>
- </vbox>
- </groupbox>
- </vbox>
- <!-- Others added by overlay -->
- </deck>
-
-#ifdef XP_MACOSX
-#include ../browserMountPoints.inc
-#endif
-
-</window>
diff --git a/application/palemoon/base/content/pageinfo/permissions.js b/application/palemoon/base/content/pageinfo/permissions.js
deleted file mode 100644
index 4f8382f66..000000000
--- a/application/palemoon/base/content/pageinfo/permissions.js
+++ /dev/null
@@ -1,341 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-const UNKNOWN = nsIPermissionManager.UNKNOWN_ACTION; // 0
-const ALLOW = nsIPermissionManager.ALLOW_ACTION; // 1
-const DENY = nsIPermissionManager.DENY_ACTION; // 2
-const SESSION = nsICookiePermission.ACCESS_SESSION; // 8
-
-const IMAGE_DENY = 2;
-
-const COOKIE_DENY = 2;
-const COOKIE_SESSION = 2;
-
-var gPermURI;
-var gPermPrincipal;
-var gPrefs;
-var gUsageRequest;
-
-var gPermObj = {
- image: function getImageDefaultPermission()
- {
- if (gPrefs.getIntPref("permissions.default.image") == IMAGE_DENY) {
- return DENY;
- }
- return ALLOW;
- },
- popup: function getPopupDefaultPermission()
- {
- if (gPrefs.getBoolPref("dom.disable_open_during_load")) {
- return DENY;
- }
- return ALLOW;
- },
- cookie: function getCookieDefaultPermission()
- {
- if (gPrefs.getIntPref("network.cookie.cookieBehavior") == COOKIE_DENY) {
- return DENY;
- }
- if (gPrefs.getIntPref("network.cookie.lifetimePolicy") == COOKIE_SESSION) {
- return SESSION;
- }
- return ALLOW;
- },
- "desktop-notification": function getNotificationDefaultPermission()
- {
- if (!gPrefs.getBoolPref("dom.webnotifications.enabled")) {
- return DENY;
- }
- return UNKNOWN;
- },
- install: function getInstallDefaultPermission()
- {
- if (Services.prefs.getBoolPref("xpinstall.whitelist.required")) {
- return DENY;
- }
- return ALLOW;
- },
- geo: function getGeoDefaultPermissions()
- {
- if (!gPrefs.getBoolPref("geo.enabled")) {
- return DENY;
- }
- return ALLOW;
- },
- plugins: function getPluginsDefaultPermissions()
- {
- return UNKNOWN;
- },
-};
-
-var permissionObserver = {
- observe: function (aSubject, aTopic, aData)
- {
- if (aTopic == "perm-changed") {
- var permission = aSubject.QueryInterface(
- Components.interfaces.nsIPermission);
- if (permission.matchesURI(gPermURI, true)) {
- if (permission.type in gPermObj)
- initRow(permission.type);
- else if (permission.type.startsWith("plugin"))
- setPluginsRadioState();
- }
- }
- }
-};
-
-function onLoadPermission(principal)
-{
- gPrefs = Components.classes[PREFERENCES_CONTRACTID]
- .getService(Components.interfaces.nsIPrefBranch);
-
- var uri = gDocument.documentURIObject;
- var permTab = document.getElementById("permTab");
- if (/^https?$/.test(uri.scheme)) {
- gPermURI = uri;
- gPermPrincipal = principal;
- var hostText = document.getElementById("hostText");
- hostText.value = gPermURI.prePath;
-
- for (var i in gPermObj)
- initRow(i);
- var os = Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService);
- os.addObserver(permissionObserver, "perm-changed", false);
- onUnloadRegistry.push(onUnloadPermission);
- permTab.hidden = false;
- }
- else
- permTab.hidden = true;
-}
-
-function onUnloadPermission()
-{
- var os = Components.classes["@mozilla.org/observer-service;1"]
- .getService(Components.interfaces.nsIObserverService);
- os.removeObserver(permissionObserver, "perm-changed");
-
- if (gUsageRequest) {
- gUsageRequest.cancel();
- gUsageRequest = null;
- }
-}
-
-function initRow(aPartId)
-{
- if (aPartId == "plugins") {
- initPluginsRow();
- return;
- }
-
- var permissionManager = Components.classes[PERMISSION_CONTRACTID]
- .getService(nsIPermissionManager);
-
- var checkbox = document.getElementById(aPartId + "Def");
- var command = document.getElementById("cmd_" + aPartId + "Toggle");
- // Desktop Notification, Geolocation and PointerLock permission consumers
- // use testExactPermission, not testPermission.
- var perm;
- if (aPartId == "desktop-notification" || aPartId == "geo" || aPartId == "pointerLock")
- perm = permissionManager.testExactPermission(gPermURI, aPartId);
- else
- perm = permissionManager.testPermission(gPermURI, aPartId);
-
- if (perm) {
- checkbox.checked = false;
- command.removeAttribute("disabled");
- }
- else {
- checkbox.checked = true;
- command.setAttribute("disabled", "true");
- perm = gPermObj[aPartId]();
- }
- setRadioState(aPartId, perm);
-}
-
-function onCheckboxClick(aPartId)
-{
- var permissionManager = Components.classes[PERMISSION_CONTRACTID]
- .getService(nsIPermissionManager);
-
- var command = document.getElementById("cmd_" + aPartId + "Toggle");
- var checkbox = document.getElementById(aPartId + "Def");
- if (checkbox.checked) {
- permissionManager.remove(gPermURI, aPartId);
- command.setAttribute("disabled", "true");
- var perm = gPermObj[aPartId]();
- setRadioState(aPartId, perm);
- }
- else {
- onRadioClick(aPartId);
- command.removeAttribute("disabled");
- }
-}
-
-function onPluginRadioClick(aEvent) {
- onRadioClick(aEvent.originalTarget.getAttribute("id").split('#')[0]);
-}
-
-function onRadioClick(aPartId)
-{
- var permissionManager = Components.classes[PERMISSION_CONTRACTID]
- .getService(nsIPermissionManager);
-
- var radioGroup = document.getElementById(aPartId + "RadioGroup");
- var id = radioGroup.selectedItem.id;
- var permission = id.split('#')[1];
- if (permission == UNKNOWN) {
- permissionManager.remove(gPermURI, aPartId);
- } else {
- permissionManager.add(gPermURI, aPartId, permission);
- }
-}
-
-function setRadioState(aPartId, aValue)
-{
- var radio = document.getElementById(aPartId + "#" + aValue);
- radio.radioGroup.selectedItem = radio;
-}
-
-// XXX copied this from browser-plugins.js - is there a way to share?
-function makeNicePluginName(aName) {
- if (aName == "Shockwave Flash")
- return "Adobe Flash";
-
- // Clean up the plugin name by stripping off any trailing version numbers
- // or "plugin". EG, "Foo Bar Plugin 1.23_02" --> "Foo Bar"
- // Do this by first stripping the numbers, etc. off the end, and then
- // removing "Plugin" (and then trimming to get rid of any whitespace).
- // (Otherwise, something like "Java(TM) Plug-in 1.7.0_07" gets mangled)
- let newName = aName.replace(/[\s\d\.\-\_\(\)]+$/, "").replace(/\bplug-?in\b/i, "").trim();
- return newName;
-}
-
-function fillInPluginPermissionTemplate(aPermissionString, aPluginObject) {
- let permPluginTemplate = document.getElementById("permPluginTemplate")
- .cloneNode(true);
- permPluginTemplate.setAttribute("permString", aPermissionString);
- permPluginTemplate.setAttribute("tooltiptext", aPluginObject.description);
- let attrs = [];
- attrs.push([".permPluginTemplateLabel", "value", aPluginObject.name]);
- attrs.push([".permPluginTemplateRadioGroup", "id", aPermissionString + "RadioGroup"]);
- attrs.push([".permPluginTemplateRadioDefault", "id", aPermissionString + "#0"]);
- let permPluginTemplateRadioAsk = ".permPluginTemplateRadioAsk";
- if (Services.prefs.getBoolPref("plugins.click_to_play") ||
- aPluginObject.vulnerable) {
- attrs.push([permPluginTemplateRadioAsk, "id", aPermissionString + "#3"]);
- } else {
- permPluginTemplate.querySelector(permPluginTemplateRadioAsk)
- .setAttribute("disabled", "true");
- }
- attrs.push([".permPluginTemplateRadioAllow", "id", aPermissionString + "#1"]);
- attrs.push([".permPluginTemplateRadioBlock", "id", aPermissionString + "#2"]);
-
- for (let attr of attrs) {
- permPluginTemplate.querySelector(attr[0]).setAttribute(attr[1], attr[2]);
- }
-
- return permPluginTemplate;
-}
-
-function clearPluginPermissionTemplate() {
- let permPluginTemplate = document.getElementById("permPluginTemplate");
- permPluginTemplate.hidden = true;
- permPluginTemplate.removeAttribute("permString");
- permPluginTemplate.removeAttribute("tooltiptext");
- document.querySelector(".permPluginTemplateLabel").removeAttribute("value");
- document.querySelector(".permPluginTemplateRadioGroup").removeAttribute("id");
- document.querySelector(".permPluginTemplateRadioAsk").removeAttribute("id");
- document.querySelector(".permPluginTemplateRadioAllow").removeAttribute("id");
- document.querySelector(".permPluginTemplateRadioBlock").removeAttribute("id");
-}
-
-function initPluginsRow() {
- let vulnerableLabel = document.getElementById("browserBundle")
- .getString("pluginActivateVulnerable.label");
- let pluginHost = Components.classes["@mozilla.org/plugin/host;1"]
- .getService(Components.interfaces.nsIPluginHost);
- let tags = pluginHost.getPluginTags();
-
- let permissionMap = new Map();
-
- for (let plugin of tags) {
- if (plugin.disabled) {
- continue;
- }
- for (let mimeType of plugin.getMimeTypes()) {
- if (mimeType == "application/x-shockwave-flash" && plugin.name != "Shockwave Flash") {
- continue;
- }
- let permString = pluginHost.getPermissionStringForType(mimeType);
- if (!permissionMap.has(permString)) {
- let name = makeNicePluginName(plugin.name) + " " + plugin.version;
- let vulnerable = false;
- if (permString.startsWith("plugin-vulnerable:")) {
- name += " \u2014 " + vulnerableLabel;
- vulnerable = true;
- }
- permissionMap.set(permString, {
- "name": name,
- "description": plugin.description,
- "vulnerable": vulnerable
- });
- }
- }
- }
-
- // Tycho:
- // let entries = [
- // {
- // "permission": item[0],
- // "obj": item[1],
- // }
- // for (item of permissionMap)
- // ];
- let entries = [];
- for (let item of permissionMap) {
- entries.push({
- "permission": item[0],
- "obj": item[1]
- });
- }
- entries.sort(function(a, b) {
- return ((a.obj.name < b.obj.name) ? -1 : (a.obj.name == b.obj.name ? 0 : 1));
- });
-
- // Tycho:
- // let permissionEntries = [
- // fillInPluginPermissionTemplate(p.permission, p.obj) for (p of entries)
- // ];
- let permissionEntries = [];
- entries.forEach(function (p) {
- permissionEntries.push(fillInPluginPermissionTemplate(p.permission, p.obj));
- });
-
- let permPluginsRow = document.getElementById("permPluginsRow");
- clearPluginPermissionTemplate();
- if (permissionEntries.length < 1) {
- permPluginsRow.hidden = true;
- return;
- }
-
- for (let permissionEntry of permissionEntries) {
- permPluginsRow.appendChild(permissionEntry);
- }
-
- setPluginsRadioState();
-}
-
-function setPluginsRadioState() {
- var permissionManager = Components.classes[PERMISSION_CONTRACTID]
- .getService(nsIPermissionManager);
- let box = document.getElementById("permPluginsRow");
- for (let permissionEntry of box.childNodes) {
- if (permissionEntry.hasAttribute("permString")) {
- let permString = permissionEntry.getAttribute("permString");
- let permission = permissionManager.testPermission(gPermURI, permString);
- setRadioState(permString, permission);
- }
- }
-}
diff --git a/application/palemoon/base/content/pageinfo/security.js b/application/palemoon/base/content/pageinfo/security.js
deleted file mode 100644
index e791ab92a..000000000
--- a/application/palemoon/base/content/pageinfo/security.js
+++ /dev/null
@@ -1,378 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-var security = {
- // Display the server certificate (static)
- viewCert : function () {
- var cert = security._cert;
- viewCertHelper(window, cert);
- },
-
- _getSecurityInfo : function() {
- const nsIX509Cert = Components.interfaces.nsIX509Cert;
- const nsIX509CertDB = Components.interfaces.nsIX509CertDB;
- const nsX509CertDB = "@mozilla.org/security/x509certdb;1";
- const nsISSLStatusProvider = Components.interfaces.nsISSLStatusProvider;
- const nsISSLStatus = Components.interfaces.nsISSLStatus;
-
- // We don't have separate info for a frame, return null until further notice
- // (see bug 138479)
- if (gWindow != gWindow.top)
- return null;
-
- var hName = null;
- try {
- hName = gWindow.location.host;
- }
- catch (exception) { }
-
- var ui = security._getSecurityUI();
- if (!ui)
- return null;
-
- var isBroken =
- (ui.state & Components.interfaces.nsIWebProgressListener.STATE_IS_BROKEN);
- var isMixed =
- (ui.state & (Components.interfaces.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT |
- Components.interfaces.nsIWebProgressListener.STATE_LOADED_MIXED_DISPLAY_CONTENT));
- var isInsecure =
- (ui.state & Components.interfaces.nsIWebProgressListener.STATE_IS_INSECURE);
- var isEV =
- (ui.state & Components.interfaces.nsIWebProgressListener.STATE_IDENTITY_EV_TOPLEVEL);
- ui.QueryInterface(nsISSLStatusProvider);
- var status = ui.SSLStatus;
-
- if (!isInsecure && status) {
- status.QueryInterface(nsISSLStatus);
- var cert = status.serverCert;
- var issuerName =
- this.mapIssuerOrganization(cert.issuerOrganization) || cert.issuerName;
-
- var retval = {
- hostName : hName,
- cAName : issuerName,
- encryptionAlgorithm : undefined,
- encryptionStrength : undefined,
- encryptionSuite : undefined,
- version: undefined,
- isBroken : isBroken,
- isMixed : isMixed,
- isEV : isEV,
- cert : cert,
- fullLocation : gWindow.location
- };
-
- var version;
- try {
- retval.encryptionAlgorithm = status.cipherName;
- retval.encryptionStrength = status.secretKeyLength;
- retval.encryptionSuite = status.cipherSuite;
- version = status.protocolVersion;
- }
- catch (e) {
- }
-
- switch (version) {
- case nsISSLStatus.SSL_VERSION_3:
- retval.version = "SSL 3";
- break;
- case nsISSLStatus.TLS_VERSION_1:
- retval.version = "TLS 1.0";
- break;
- case nsISSLStatus.TLS_VERSION_1_1:
- retval.version = "TLS 1.1";
- break;
- case nsISSLStatus.TLS_VERSION_1_2:
- retval.version = "TLS 1.2"
- break;
- case nsISSLStatus.TLS_VERSION_1_3:
- retval.version = "TLS 1.3"
- break;
- }
-
- return retval;
- } else {
- return {
- hostName : hName,
- cAName : "",
- encryptionAlgorithm : "",
- encryptionStrength : 0,
- encryptionSuite : "",
- version: "",
- isBroken : isBroken,
- isMixed : isMixed,
- isEV : isEV,
- cert : null,
- fullLocation : gWindow.location
- };
- }
- },
-
- // Find the secureBrowserUI object (if present)
- _getSecurityUI : function() {
- if (window.opener.gBrowser)
- return window.opener.gBrowser.securityUI;
- return null;
- },
-
- // Interface for mapping a certificate issuer organization to
- // the value to be displayed.
- // Bug 82017 - this implementation should be moved to pipnss C++ code
- mapIssuerOrganization: function(name) {
- if (!name) return null;
-
- if (name == "RSA Data Security, Inc.") return "Verisign, Inc.";
-
- // No mapping required
- return name;
- },
-
- /**
- * Open the cookie manager window
- */
- viewCookies : function()
- {
- var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
- .getService(Components.interfaces.nsIWindowMediator);
- var win = wm.getMostRecentWindow("Browser:Cookies");
- var eTLDService = Components.classes["@mozilla.org/network/effective-tld-service;1"].
- getService(Components.interfaces.nsIEffectiveTLDService);
-
- var eTLD;
- var uri = gDocument.documentURIObject;
- try {
- eTLD = eTLDService.getBaseDomain(uri);
- }
- catch (e) {
- // getBaseDomain will fail if the host is an IP address or is empty
- eTLD = uri.asciiHost;
- }
-
- if (win) {
- win.gCookiesWindow.setFilter(eTLD);
- win.focus();
- }
- else
- window.openDialog("chrome://browser/content/preferences/cookies.xul",
- "Browser:Cookies", "", {filterString : eTLD});
- },
-
- /**
- * Open the login manager window
- */
- viewPasswords : function()
- {
- var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
- .getService(Components.interfaces.nsIWindowMediator);
- var win = wm.getMostRecentWindow("Toolkit:PasswordManager");
- if (win) {
- win.setFilter(this._getSecurityInfo().hostName);
- win.focus();
- }
- else
- window.openDialog("chrome://passwordmgr/content/passwordManager.xul",
- "Toolkit:PasswordManager", "",
- {filterString : this._getSecurityInfo().hostName});
- },
-
- _cert : null
-};
-
-function securityOnLoad() {
- var info = security._getSecurityInfo();
- if (!info) {
- document.getElementById("securityTab").hidden = true;
- document.getElementById("securityBox").collapsed = true;
- return;
- }
- else {
- document.getElementById("securityTab").hidden = false;
- document.getElementById("securityBox").collapsed = false;
- }
-
- const pageInfoBundle = document.getElementById("pageinfobundle");
-
- /* Set Identity section text */
- setText("security-identity-domain-value", info.hostName);
-
- var owner, verifier, generalPageIdentityString;
- if (info.cert && !info.isBroken) {
- // Try to pull out meaningful values. Technically these fields are optional
- // so we'll employ fallbacks where appropriate. The EV spec states that Org
- // fields must be specified for subject and issuer so that case is simpler.
- if (info.isEV) {
- owner = info.cert.organization;
- verifier = security.mapIssuerOrganization(info.cAName);
- generalPageIdentityString = pageInfoBundle.getFormattedString("generalSiteIdentity",
- [owner, verifier]);
- }
- else {
- // Technically, a non-EV cert might specify an owner in the O field or not,
- // depending on the CA's issuing policies. However we don't have any programmatic
- // way to tell those apart, and no policy way to establish which organization
- // vetting standards are good enough (that's what EV is for) so we default to
- // treating these certs as domain-validated only.
- owner = pageInfoBundle.getString("securityNoOwner");
- verifier = security.mapIssuerOrganization(info.cAName ||
- info.cert.issuerCommonName ||
- info.cert.issuerName);
- generalPageIdentityString = owner;
- }
- }
- else {
- // We don't have valid identity credentials.
- owner = pageInfoBundle.getString("securityNoOwner");
- verifier = pageInfoBundle.getString("notset");
- generalPageIdentityString = owner;
- }
-
- setText("security-identity-owner-value", owner);
- setText("security-identity-verifier-value", verifier);
- setText("general-security-identity", generalPageIdentityString);
-
- /* Manage the View Cert button*/
- var viewCert = document.getElementById("security-view-cert");
- if (info.cert) {
- security._cert = info.cert;
- viewCert.collapsed = false;
- }
- else
- viewCert.collapsed = true;
-
- /* Set Privacy & History section text */
- var yesStr = pageInfoBundle.getString("yes");
- var noStr = pageInfoBundle.getString("no");
-
- var uri = gDocument.documentURIObject;
- setText("security-privacy-cookies-value",
- hostHasCookies(uri) ? yesStr : noStr);
- setText("security-privacy-passwords-value",
- realmHasPasswords(uri) ? yesStr : noStr);
-
- var visitCount = previousVisitCount(info.hostName);
- if(visitCount > 1) {
- setText("security-privacy-history-value",
- pageInfoBundle.getFormattedString("securityNVisits", [visitCount.toLocaleString()]));
- }
- else if (visitCount == 1) {
- setText("security-privacy-history-value",
- pageInfoBundle.getString("securityOneVisit"));
- }
- else {
- setText("security-privacy-history-value", noStr);
- }
-
- /* Set the Technical Detail section messages */
- const pkiBundle = document.getElementById("pkiBundle");
- var hdr;
- var msg1;
- var msg2;
-
- if (info.isBroken) {
- if (info.isMixed) {
- hdr = pkiBundle.getString("pageInfo_MixedContent");
- } else {
- hdr = pkiBundle.getFormattedString("pageInfo_BrokenEncryption",
- [info.encryptionAlgorithm,
- info.encryptionStrength + "",
- info.version]);
- }
- msg1 = pkiBundle.getString("pageInfo_Privacy_Broken1");
- msg2 = pkiBundle.getString("pageInfo_Privacy_None2");
- }
- else if (info.encryptionStrength > 0) {
- hdr = pkiBundle.getFormattedString("pageInfo_EncryptionWithBitsAndProtocol",
- [info.encryptionAlgorithm,
- info.encryptionStrength + "",
- info.version]);
- msg1 = pkiBundle.getString("pageInfo_Privacy_Encrypted1");
- msg2 = pkiBundle.getString("pageInfo_Privacy_Encrypted2");
- security._cert = info.cert;
- }
- else {
- hdr = pkiBundle.getString("pageInfo_NoEncryption");
- if (info.hostName != null)
- msg1 = pkiBundle.getFormattedString("pageInfo_Privacy_None1", [info.hostName]);
- else
- msg1 = pkiBundle.getString("pageInfo_Privacy_None3");
- msg2 = pkiBundle.getString("pageInfo_Privacy_None2");
- }
- setText("security-technical-shortform", hdr);
- setText("security-technical-longform1", msg1);
- setText("security-technical-longform2", msg2);
- setText("general-security-privacy", hdr);
-}
-
-function setText(id, value)
-{
- var element = document.getElementById(id);
- if (!element)
- return;
- if (element.localName == "textbox" || element.localName == "label")
- element.value = value;
- else {
- if (element.hasChildNodes())
- element.removeChild(element.firstChild);
- var textNode = document.createTextNode(value);
- element.appendChild(textNode);
- }
-}
-
-function viewCertHelper(parent, cert)
-{
- if (!cert)
- return;
-
- var cd = Components.classes[CERTIFICATEDIALOGS_CONTRACTID].getService(nsICertificateDialogs);
- cd.viewCert(parent, cert);
-}
-
-/**
- * Return true iff we have cookies for uri
- */
-function hostHasCookies(uri) {
- var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
- .getService(Components.interfaces.nsICookieManager2);
-
- return cookieManager.countCookiesFromHost(uri.asciiHost) > 0;
-}
-
-/**
- * Return true iff realm (proto://host:port) (extracted from uri) has
- * saved passwords
- */
-function realmHasPasswords(uri) {
- var passwordManager = Components.classes["@mozilla.org/login-manager;1"]
- .getService(Components.interfaces.nsILoginManager);
- return passwordManager.countLogins(uri.prePath, "", "") > 0;
-}
-
-/**
- * Return the number of previous visits recorded for host before today.
- *
- * @param host - the domain name to look for in history
- */
-function previousVisitCount(host, endTimeReference) {
- if (!host)
- return false;
-
- var historyService = Components.classes["@mozilla.org/browser/nav-history-service;1"]
- .getService(Components.interfaces.nsINavHistoryService);
-
- var options = historyService.getNewQueryOptions();
- options.resultType = options.RESULTS_AS_VISIT;
-
- // Search for visits to this host before today
- var query = historyService.getNewQuery();
- query.endTimeReference = query.TIME_RELATIVE_TODAY;
- query.endTime = 0;
- query.domain = host;
-
- var result = historyService.executeQuery(query, options);
- result.root.containerOpen = true;
- var cc = result.root.childCount;
- result.root.containerOpen = false;
- return cc;
-}