RetroZilla/extensions/p3p/resources/content/p3pSummary.js
2015-10-20 23:03:22 -04:00

205 lines
7.3 KiB
JavaScript

/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla 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/MPL/
*
* 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 the Platform for Privacy Preferences.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2002
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Harish Dhurvasula <harishd@netscape.com>
*
* 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
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
const nsIDocShell = Components.interfaces.nsIDocShell;
var gBrowser = null;
var gDocument = null;
function renderMachineReadable()
{
var xsltp = window.arguments[0];
var source = window.arguments[1];
var style = window.arguments[2];
var policyuri = window.arguments[3].clone().QueryInterface(nsIURL);
policyuri.ref = "";
try {
var docshell = getBrowser().docShell.QueryInterface(nsIDocShell);
// For browser security do not allow javascript on the transformed document.
docshell.allowJavascript = false;
// Set the policy url on the result document ( fabricated ) where
// the transformation would result. Also, set the policy uri on the
// docshell for named anchors to work correctly.
var resultDocument = getDocument();
docshell.setCurrentURI(policyuri);
xsltp.reset();
xsltp.setParameter("", "policyUri", policyuri.spec);
xsltp.importStylesheet(style);
var result = xsltp.transformToFragment(source, resultDocument);
// XXX Replacing the documentElement makes scrollbars disappear.
// See http://bugzilla.mozilla.org/show_bug.cgi?id=205725.
//while (resultDocument.lastChild} {
// resultDocument.removeChild(resultDocument.lastChild);
//}
// XXX appendChild of a DocumentFragment should work but doesn't.
// See http://bugzilla.mozilla.org/show_bug.cgi?id=209027.
//resultDocument.appendChild(result);
transferToDocument(result, resultDocument);
document.title = resultDocument.getElementById("topic").firstChild.nodeValue;
}
catch (ex) {
alertMessage(getBundle().GetStringFromName("InternalError"));
}
}
// XXX Temporary function to workaround disappearing scrollbars
// and bug in document.appendChild(DocumentFragment).
// See http://bugzilla.mozilla.org/show_bug.cgi?id=205725
// and http://bugzilla.mozilla.org/show_bug.cgi?id=209027.
function transferToDocument(aResult, aResultDocument)
{
var docElement = aResultDocument.documentElement;
while (aResultDocument.firstChild &&
aResultDocument.firstChild != docElement) {
aResultDocument.removeChild(aResultDocument.firstChild);
}
while (docElement.lastChild) {
docElement.removeChild(docElement.lastChild);
}
while (aResultDocument.lastChild &&
aResultDocument.lastChild != docElement) {
aResultDocument.removeChild(aResultDocument.lastChild);
}
var pastDocumentElement = false;
for (var i = 0; i < aResult.childNodes.length; ++i) {
var childNode = aResult.childNodes.item(i);
if (childNode instanceof HTMLElement) {
while (childNode.firstChild) {
aResultDocument.documentElement.appendChild(childNode.removeChild(childNode.firstChild));
}
pastDocumentElement = true;
}
else {
if (pastDocumentElement) {
aResultDocument.appendChild(childNode);
}
else {
aResultDocument.insertBefore(childNode, aResultDocument.documentElement);
}
// We removed the node from the list, which will cause it
// to shrink by one element. "i" is now pointing to the
// node that used to be _after_ the node we just removed.
// Decrement i, so when it increments (at the start of the
// next iteration) we'll point at the right place.
--i;
}
}
}
function getBrowser()
{
if (!gBrowser)
gBrowser = document.getElementById("content");
return gBrowser;
}
function getDocument()
{
if (!gDocument)
gDocument = getBrowser().contentDocument;
return gDocument;
}
function p3pSummarySavePage()
{
try
{
// make user pick target file
const kIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"].
createInstance(kIFilePicker);
fp.init(window, getBundle().GetStringFromName("savePolicy.title"),
kIFilePicker.modeSave);
fp.appendFilters(kIFilePicker.filterAll | kIFilePicker.filterHTML);
fp.defaultString = document.title;
fp.defaultExtension = "html";
var rv = fp.show();
// write ``pretty printed'' source to file
if (rv == kIFilePicker.returnOK || rv == kIFilePicker.returnReplace)
{
const kIPersist = Components.interfaces.nsIWebBrowserPersist;
var persistor = Components.
classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].
createInstance(kIPersist);
persistor.saveDocument(getDocument(), fp.file, null, "text/html",
kIPersist.ENCODE_FLAGS_FORMATTED |
kIPersist.ENCODE_FLAGS_ENCODE_BASIC_ENTITIES, 0);
}
}
catch (ex)
{
try
{
alertMessage(getBundle().GetStringFromName("saveError"));
}
catch (ex)
{
}
}
}
/* This method displays additional information, in an alert box, upon request.
* Note that since javascript is disabled, for security reasons, in the policy viewer
* we have to capture the specific event, that bubbles up to the chrome, containing
* the requested message.
*/
function captureContentClick(aEvent)
{
if (aEvent.target.hasAttribute("message"))
alertMessage(aEvent.target.getAttribute("message"));
return true;
}
function updateSavePageItems()
{
var autoDownload = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch)
.getBoolPref("browser.download.autoDownload");
goSetMenuValue("savepage", autoDownload ? "valueSave" : "valueSaveAs");
}