Lots of preferences changes. The main new things:

- implement cookie whitelisting
- split up cookie manager
- make popup, image and cookie lists behave like other prefs, i.e., don't save them until you hit OK in prefs (so, for example, removing all cookies is no longer a "live" change).

I expect bugs =)


git-svn-id: svn://10.0.0.236/trunk@146278 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
blakeross%telocity.com 2003-08-23 09:23:36 +00:00
parent b08a0896df
commit 6265b7deb2
20 changed files with 868 additions and 770 deletions

View File

@ -0,0 +1,62 @@
# -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is Mozilla Communicator client code, released March
# 31, 1998.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Blake Ross (original author)
var permType = "cookie";
function onOK() {
window.opener.top.wsm.savePageData(window.location.href, window);
window.opener.top.hPrefWindow.registerOKCallbackFunc(window.opener.onPrefsOK);
}
function manageSite(perm)
{
var url = document.getElementById("url").value;
var uri = Components.classes["@mozilla.org/network/standard-url;1"]
.createInstance(Components.interfaces.nsIURI);
uri.spec = url;
var exists = false;
for (var i = 0; i < permissions.length; ++i) {
if (permissions[i].rawHost == url) {
exists = true;
permissions[i].capability = permBundle.getString(perm == permissionmanager.ALLOW_ACTION?"can":"cannot");
permissions[i].perm = perm;
break;
}
}
if (!exists) {
permissions[permissions.length] = new Permission(permissions.length, url, (url.charAt(0)==".") ? url.substring(1,url.length) : url, "cookie", permBundle.getString(perm==permissionmanager.ALLOW_ACTION?"can":"cannot"), perm);
permissionsTreeView.rowCount = permissions.length;
permissionsTree.treeBoxObject.rowCountChanged(permissions.length-1, 1);
permissionsTree.treeBoxObject.ensureRowIsVisible(permissions.length-1)
}
}
function Startup()
{
loadPermissions();
}

View File

@ -0,0 +1,75 @@
<?xml version="1.0"?> <!-- -*- Mode: SGML; indent-tabs-mode: nil -*- -->
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is Mozilla Communicator client code, released
# March 31, 1998.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998-1999 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Blake Ross (original author)
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<!DOCTYPE dialog SYSTEM "chrome://browser/locale/cookieviewer/CookieExceptions.dtd" >
<dialog buttons="accept,cancel"
title="&window.title;"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
style="width: 30em;"
onload="window.opener.top.initPanel(window.location.href, window);"
ondialogaccept="return onOK();"
persist="screenX screenY width height">
<script src="chrome://browser/content/cookieviewer/CookieExceptions.js"/>
<script src="chrome://browser/content/pref/permissions.js"/>
<script src="chrome://browser/content/cookieviewer/treeUtils.js"/>
<stringbundle id="permBundle"
src="chrome://browser/locale/pref/prefutilities.properties"/>
<description id="permissionsText">&div.bannedservers.label;</description>
<separator class="thin"/>
<label value="&address.label;"/>
<hbox align="start">
<textbox id="url" flex="1" oninput="if (event.keyCode == 13) manageSite(permissionmanager.DENY_ACTION);"/>
<vbox>
<button label="&block.label;" oncommand="manageSite(permissionmanager.DENY_ACTION);"/>
<button label="&allow.label;" oncommand="manageSite(permissionmanager.ALLOW_ACTION);"/>
</vbox>
</hbox>
<separator class="thin"/>
<tree id="permissionsTree" flex="1" style="height: 18em;"
hidecolumnpicker="true"
onkeypress="HandlePermissionKeyPress(event)"
onselect="PermissionSelected();">
<treecols>
<treecol id="siteCol" label="&treehead.sitename.label;" flex="5"
onclick="PermissionColumnSort('rawHost', true);"/>
<splitter class="tree-splitter"/>
<treecol id="statusCol" label="&treehead.status.label;" flex="5"
onclick="PermissionColumnSort('capability', true);"/>
</treecols>
<treechildren/>
</tree>
<separator class="thin"/>
<hbox>
<button id="removePermission" disabled="true"
label="&removepermission.label;"
oncommand="DeletePermission();"/>
<button id="removeAllPermissions"
label="&removeallpermissions.label;"
oncommand="DeleteAllPermissions();"/>
</hbox>
</dialog>

View File

@ -21,49 +21,21 @@
# Contributor(s):
# Ben Goodger
var kObserverService;
// interface variables
var cookiemanager = null; // cookiemanager interface
var permissionmanager = null; // permissionmanager interface
var popupmanager = null; // popup manager
var cookiemanager = Components.classes["@mozilla.org/cookiemanager;1"].getService();
cookiemanager = cookiemanager.QueryInterface(Components.interfaces.nsICookieManager);
var gDateService = null;
// cookies and permissions list
// cookies list
var cookies = [];
var permissions = [];
var deletedCookies = [];
var deletedPermissions = [];
// differentiate between cookies, images, and popups
const nsIPermissionManager = Components.interfaces.nsIPermissionManager;
const cookieType = "cookie";
const imageType = "image";
const popupType = "popup";
var dialogType = cookieType;
if (window.arguments[0] == "imageManager")
dialogType = imageType;
else if (window.arguments[0] == "popupManager")
dialogType = popupType;
var cookieBundle;
var cookiesTree;
const nsICookie = Components.interfaces.nsICookie;
function Startup() {
// arguments passed to this routine:
// cookieManager
// cookieManagerFromIcon
// imageManager
// xpconnect to cookiemanager/permissionmanager/popupmanager interfaces
cookiemanager = Components.classes["@mozilla.org/cookiemanager;1"].getService();
cookiemanager = cookiemanager.QueryInterface(Components.interfaces.nsICookieManager);
permissionmanager = Components.classes["@mozilla.org/permissionmanager;1"].getService();
permissionmanager = permissionmanager.QueryInterface(Components.interfaces.nsIPermissionManager);
popupmanager = Components.classes["@mozilla.org/PopupWindowManager;1"].getService();
popupmanager = popupmanager.QueryInterface(Components.interfaces.nsIPopupWindowManager);
// intialize gDateService
if (!gDateService) {
const nsScriptableDateFormat_CONTRACTID = "@mozilla.org/intl/scriptabledateformat;1";
@ -72,86 +44,45 @@ function Startup() {
.getService(nsIScriptableDateFormat);
}
// intialize string bundle
cookieBundle = document.getElementById("cookieBundle");
// label the close button
document.documentElement.getButton("accept").label = cookieBundle.getString("close");
// determine if labelling is for cookies or images
try {
var tabBox = document.getElementById("tabbox");
var element;
if (dialogType == cookieType) {
element = document.getElementById("cookiesTab");
tabBox.selectedTab = element;
} else if (dialogType == imageType) {
element = document.getElementById("cookieviewer");
element.setAttribute("title", cookieBundle.getString("imageTitle"));
element = document.getElementById("permissionsTab");
element.label = cookieBundle.getString("tabBannedImages");
tabBox.selectedTab = element;
element = document.getElementById("permissionsText");
element.value = cookieBundle.getString("textBannedImages");
element = document.getElementById("cookiesTab");
element.hidden = "true";
} else {
element = document.getElementById("cookieviewer");
element.setAttribute("title", cookieBundle.getString("popupTitle"));
element = document.getElementById("permissionsTab");
element.label = cookieBundle.getString("tabBannedPopups");
tabBox.selectedTab = element;
element = document.getElementById("permissionsText");
element.value = cookieBundle.getString("textBannedPopups");
element = document.getElementById("cookiesTab");
element.hidden = "true";
}
} catch(e) {
}
// load in the cookies and permissions
cookiesTree = document.getElementById("cookiesTree");
permissionsTree = document.getElementById("permissionsTree");
if (dialogType == cookieType) {
loadCookies();
}
loadPermissions();
// be prepared to reload the display if anything changes
kObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
kObserverService.addObserver(cookieReloadDisplay, "cookieChanged", false);
kObserverService.addObserver(cookieReloadDisplay, "perm-changed", false);
//XXXBlake
// I removed the observer stuff, so yes, there are edge cases where
// if you're loading a page when you open prefs/cookie manager,
// the cookie manager won't display the new cookie added.
// I don't think it's a big deal (considering how hard it would be to fix)
}
function Shutdown() {
kObserverService.removeObserver(cookieReloadDisplay, "cookieChanged");
kObserverService.removeObserver(cookieReloadDisplay, "perm-changed");
function onOK() {
window.opener.top.wsm.savePageData(window.location.href, window);
window.opener.top.hPrefWindow.registerOKCallbackFunc(window.opener.cookieViewerOnPrefsOK);
}
var cookieReloadDisplay = {
observe: function(subject, topic, state) {
if (topic == "cookieChanged") {
if (state == "cookies") {
cookies.length = 0;
if (lastCookieSortColumn == "rawHost") {
lastCookieSortAscending = !lastCookieSortAscending; // prevents sort from being reversed
}
loadCookies();
}
} else if (topic == "perm-changed") {
permissions.length = 0;
if (lastPermissionSortColumn == "rawHost") {
lastPermissionSortAscending = !lastPermissionSortAscending; // prevents sort from being reversed
}
loadPermissions();
}
}
function GetFields()
{
var dataObject = {};
dataObject.deletedCookies = deletedCookies;
dataObject.cookies = cookies;
dataObject.cookieBool = document.getElementById("checkbox").checked;
return dataObject;
}
function SetFields()
{
var dataObject = window.opener.top.hPrefWindow.wsm.dataManager.pageData[window.location.href];
if ('cookies' in dataObject)
cookies = dataObject.cookies;
if ('deletedCookies' in dataObject)
deletedCookies = dataObject.deletedCookies;
if ('cookieBool' in dataObject)
document.getElementById("checkbox").checked = dataObject.cookieBool;
loadCookies();
}
/*** =================== COOKIES CODE =================== ***/
const nsICookie = Components.interfaces.nsICookie;
var cookiesTreeView = {
rowCount : 0,
setTree : function(tree){},
@ -164,8 +95,6 @@ var cookiesTreeView = {
rv = cookies[row].rawHost;
} else if (column=="nameCol") {
rv = cookies[row].name;
} else if (column=="statusCol") {
rv = GetStatusString(cookies[row].status);
}
return rv;
},
@ -177,7 +106,6 @@ var cookiesTreeView = {
getColumnProperties : function(column,columnElement,prop){},
getCellProperties : function(row,prop){}
};
var cookiesTree;
function Cookie(number,name,value,isDomain,host,rawHost,path,isSecure,expires,
status,policy) {
@ -195,62 +123,41 @@ function Cookie(number,name,value,isDomain,host,rawHost,path,isSecure,expires,
}
function loadCookies() {
// load cookies into a table
var enumerator = cookiemanager.enumerator;
var count = 0;
var showPolicyField = false;
while (enumerator.hasMoreElements()) {
var nextCookie = enumerator.getNext();
if (!nextCookie) break;
nextCookie = nextCookie.QueryInterface(Components.interfaces.nsICookie);
var host = nextCookie.host;
if (nextCookie.policy != nsICookie.POLICY_UNKNOWN) {
showPolicyField = true;
if (!cookieBundle)
cookieBundle = document.getElementById("cookieBundle");
if (!cookiesTree)
cookiesTree = document.getElementById("cookiesTree");
var dataObject = window.opener.top.hPrefWindow.wsm.dataManager.pageData[window.location.href];
if (!('cookies' in dataObject)) {
// load cookies into a table
var enumerator = cookiemanager.enumerator;
var count = 0;
while (enumerator.hasMoreElements()) {
var nextCookie = enumerator.getNext();
if (!nextCookie) break;
nextCookie = nextCookie.QueryInterface(Components.interfaces.nsICookie);
var host = nextCookie.host;
if (nextCookie.policy != nsICookie.POLICY_UNKNOWN) {
showPolicyField = true;
}
cookies[count] =
new Cookie(count++, nextCookie.name, nextCookie.value, nextCookie.isDomain, host,
(host.charAt(0)==".") ? host.substring(1,host.length) : host,
nextCookie.path, nextCookie.isSecure, nextCookie.expires,
nextCookie.status, nextCookie.policy);
}
cookies[count] =
new Cookie(count++, nextCookie.name, nextCookie.value, nextCookie.isDomain, host,
(host.charAt(0)==".") ? host.substring(1,host.length) : host,
nextCookie.path, nextCookie.isSecure, nextCookie.expires,
nextCookie.status, nextCookie.policy);
}
cookiesTreeView.rowCount = cookies.length;
// sort and display the table
cookiesTree.treeBoxObject.view = cookiesTreeView;
if (window.arguments[0] == "cookieManagerFromIcon") { // came here by clicking on cookie icon
// turn off the icon
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(null, "cookieIcon", "off");
// unhide the status column and sort by reverse order on that column
// Note that the sort routine normally does an ascending sort. The only
// exception is if you sort on the same column more than once in a row.
// In that case, the subsequent sorts will be the reverse of the previous ones.
// So we are now going to force an initial reverse sort by fooling the sort routine
// into thinking that it previously sorted on the status column and in ascending
// order.
document.getElementById("statusCol").removeAttribute("hidden");
lastCookieSortAscending = true; // force order to have blanks last instead of vice versa
lastCookieSortColumn = 'status';
CookieColumnSort('status');
} else {
// sort by host column
CookieColumnSort('rawHost');
}
// sort by host column
CookieColumnSort('rawHost');
// disable "remove all cookies" button if there are no cookies
if (cookies.length == 0) {
document.getElementById("removeAllCookies").setAttribute("disabled","true");
} else {
document.getElementById("removeAllCookies").removeAttribute("disabled");
}
// show policy field if at least one cookie has a policy
if (showPolicyField) {
document.getElementById("policyField").removeAttribute("hidden");
}
document.getElementById("removeAllCookies").disabled = cookies.length == 0;
}
function GetExpiresString(expires) {
@ -264,18 +171,6 @@ function GetExpiresString(expires) {
return cookieBundle.getString("AtEndOfSession");
}
function GetStatusString(status) {
switch (status) {
case nsICookie.STATUS_ACCEPTED:
return cookieBundle.getString("accepted");
case nsICookie.STATUS_FLAGGED:
return cookieBundle.getString("flagged");
case nsICookie.STATUS_DOWNGRADED:
return cookieBundle.getString("downgraded");
}
return "";
}
function GetPolicyString(policy) {
switch (policy) {
case nsICookie.POLICY_NONE:
@ -354,7 +249,6 @@ function DeleteCookie() {
if (!cookies.length) {
ClearCookieProperties();
}
FinalizeCookieDeletions();
}
function DeleteAllCookies() {
@ -362,17 +256,6 @@ function DeleteAllCookies() {
DeleteAllFromTree(cookiesTree, cookiesTreeView,
cookies, deletedCookies,
"removeCookie", "removeAllCookies");
FinalizeCookieDeletions();
}
function FinalizeCookieDeletions() {
for (var c=0; c<deletedCookies.length; c++) {
cookiemanager.remove(deletedCookies[c].host,
deletedCookies[c].name,
deletedCookies[c].path,
document.getElementById("checkbox").checked);
}
deletedCookies.length = 0;
}
function HandleCookieKeyPress(e) {
@ -390,160 +273,3 @@ function CookieColumnSort(column) {
column, lastCookieSortColumn, lastCookieSortAscending);
lastCookieSortColumn = column;
}
/*** =================== PERMISSIONS CODE =================== ***/
var permissionsTreeView = {
rowCount : 0,
setTree : function(tree){},
getImageSrc : function(row,column) {},
getProgressMode : function(row,column) {},
getCellValue : function(row,column) {},
getCellText : function(row,column){
var rv="";
if (column=="siteCol") {
rv = permissions[row].rawHost;
} else if (column=="statusCol") {
rv = permissions[row].capability;
}
return rv;
},
isSeparator : function(index) {return false;},
isSorted: function() { return false; },
isContainer : function(index) {return false;},
cycleHeader : function(aColId, aElt) {},
getRowProperties : function(row,column,prop){},
getColumnProperties : function(column,columnElement,prop){},
getCellProperties : function(row,prop){}
};
var permissionsTree;
function Permission(number, host, rawHost, type, capability) {
this.number = number;
this.host = host;
this.rawHost = rawHost;
this.type = type;
this.capability = capability;
}
function loadPermissions() {
// load permissions into a table
var enumerator = permissionmanager.enumerator;
var count = 0;
var contentStr;
var canStr, cannotStr;
if (dialogType == cookieType) {
canStr="can";
cannotStr="cannot";
} else if (dialogType == imageType) {
canStr="canImages";
cannotStr="cannotImages";
} else {
canStr="canPopups";
cannotStr="cannotPopups";
}
while (enumerator.hasMoreElements()) {
var nextPermission = enumerator.getNext();
nextPermission = nextPermission.QueryInterface(Components.interfaces.nsIPermission);
if (nextPermission.type == dialogType) {
var host = nextPermission.host;
var capability = ( nextPermission.capability == nsIPermissionManager.ALLOW_ACTION ) ? true : false;
permissions[count] =
new Permission(count++, host,
(host.charAt(0)==".") ? host.substring(1,host.length) : host,
nextPermission.type,
cookieBundle.getString(capability?canStr:cannotStr));
}
}
permissionsTreeView.rowCount = permissions.length;
// sort and display the table
permissionsTree.treeBoxObject.view = permissionsTreeView;
PermissionColumnSort('rawHost', false);
// disable "remove all" button if there are no cookies/images
if (permissions.length == 0) {
document.getElementById("removeAllPermissions").setAttribute("disabled","true");
} else {
document.getElementById("removeAllPermissions").removeAttribute("disabled");
}
}
function PermissionSelected() {
var selections = GetTreeSelections(permissionsTree);
if (selections.length) {
document.getElementById("removePermission").removeAttribute("disabled");
}
}
function DeletePermission() {
DeleteSelectedItemFromTree(permissionsTree, permissionsTreeView,
permissions, deletedPermissions,
"removePermission", "removeAllPermissions");
FinalizePermissionDeletions();
}
function DeleteAllPermissions() {
DeleteAllFromTree(permissionsTree, permissionsTreeView,
permissions, deletedPermissions,
"removePermission", "removeAllPermissions");
FinalizePermissionDeletions();
}
function FinalizePermissionDeletions() {
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
for (var p=0; p<deletedPermissions.length; p++) {
if (deletedPermissions[p].type == popupType) {
// we lost the URI's original scheme, but this will do because the scheme
// is stripped later anyway.
var uri = ioService.newURI("http://"+deletedPermissions[p].host, null, null);
popupmanager.remove(uri);
} else
permissionmanager.remove(deletedPermissions[p].host, deletedPermissions[p].type);
}
deletedPermissions.length = 0;
}
function HandlePermissionKeyPress(e) {
if (e.keyCode == 46) {
DeletePermission();
}
}
var lastPermissionSortColumn = "";
var lastPermissionSortAscending = false;
function PermissionColumnSort(column, updateSelection) {
lastPermissionSortAscending =
SortTree(permissionsTree, permissionsTreeView, permissions,
column, lastPermissionSortColumn, lastPermissionSortAscending,
updateSelection);
lastPermissionSortColumn = column;
}
/*** ============ CODE FOR HELP BUTTON =================== ***/
function getSelectedTab()
{
var selTab = document.getElementById('tabbox').selectedTab;
var selTabID = selTab.getAttribute('id');
if (selTabID == 'cookiesTab') {
key = "cookies_stored";
} else {
key = "cookie_sites";
}
return key;
}
function doHelpButton() {
if (dialogType == imageType) {
openHelp("image_mgr");
} else {
var uri = getSelectedTab();
openHelp(uri);
}
// XXX missing popup help
}

View File

@ -20,158 +20,113 @@
# Contributor(s):
# Ben Goodger
<!-- CHANGE THIS WHEN MOVING FILES -->
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<!-- CHANGE THIS WHEN MOVING FILES -->
<!DOCTYPE dialog SYSTEM "chrome://browser/locale/cookieviewer/CookieViewer.dtd" >
<dialog id="cookieviewer"
buttons="accept,help"
title="&windowtitle.label;"
<dialog buttons="accept,cancel"
title="&window.title;"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
style="width: 30em;"
onload="Startup()"
onunload="Shutdown()"
ondialoghelp="doHelpButton();"
onload="window.opener.top.initPanel(window.location.href, window);"
ondialogaccept="return onOK();"
persist="screenX screenY width height">
<script src="chrome://browser/content/cookieviewer/CookieViewer.js"/>
<script src="chrome://global/content/strres.js"/>
<script src="chrome://browser/content/cookieviewer/nsWalletTreeUtils.js"/>
# <script type="application/x-javascript" src="chrome://help/content/contextHelp.js" />
<script src="chrome://browser/content/cookieviewer/treeUtils.js"/>
<keyset id="dialogKeys"/>
<stringbundle id="cookieBundle"
src="chrome://browser/locale/cookieviewer/CookieViewer.properties"/>
<tabbox id="tabbox" flex="1">
<tabs>
<tab id="cookiesTab" label="&tab.cookiesonsystem.label;"/>
<tab id="permissionsTab" label="&tab.bannedservers.label;"/>
</tabs>
<tabpanels id="panel" flex="1">
<vbox class="tabpanel" id="system" flex="1">
<label value="&div.cookiesonsystem.label;"/>
<separator class="thin"/>
<tree id="cookiesTree" flex="1" style="height: 10em;"
onkeypress="HandleCookieKeyPress(event)"
onselect="CookieSelected();">
<treecols>
<treecol id="domainCol" label="&treehead.cookiedomain.label;" flex="6"
onclick="CookieColumnSort('rawHost', true);"/>
<splitter class="tree-splitter"/>
<treecol id="nameCol" label="&treehead.cookiename.label;" flex="14"
onclick="CookieColumnSort('name', true);"/>
<splitter class="tree-splitter"/>
<treecol id="statusCol" label="&treehead.cookiestatus.label;" flex="1"
hidden="true" onclick="CookieColumnSort('status', true);"/>
</treecols>
<treechildren/>
</tree>
<groupbox>
<caption label="&treehead.infoselected.label;"/>
<!-- labels -->
<grid flex="1">
<columns>
<column/>
<column flex="1"/>
</columns>
<rows>
<vbox flex="1">
<label value="&div.cookiesonsystem.label;"/>
<separator class="thin"/>
<tree id="cookiesTree" flex="1" style="height: 10em;"
onkeypress="HandleCookieKeyPress(event)"
onselect="CookieSelected();"
hidecolumnpicker="true">
<treecols>
<treecol id="domainCol" label="&treehead.cookiedomain.label;" flex="6"
onclick="CookieColumnSort('rawHost', true);"/>
<splitter class="tree-splitter"/>
<treecol id="nameCol" label="&treehead.cookiename.label;" flex="14"
onclick="CookieColumnSort('name', true);"/>
</treecols>
<treechildren/>
</tree>
<groupbox>
<caption label="&treehead.infoselected.label;"/>
<!-- labels -->
<grid flex="1">
<columns>
<column/>
<column flex="1"/>
</columns>
<rows>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.name.label;"/>
</hbox>
<textbox id="ifl_name" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.name.label;"/>
</hbox>
<textbox id="ifl_name" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.value.label;"/>
</hbox>
<textbox id="ifl_value" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.value.label;"/>
</hbox>
<textbox id="ifl_value" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label id="ifl_isDomain" value="&props.domain.label;"/>
</hbox>
<textbox id="ifl_host" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label id="ifl_isDomain" value="&props.domain.label;"/>
</hbox>
<textbox id="ifl_host" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.path.label;"/>
</hbox>
<textbox id="ifl_path" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.path.label;"/>
</hbox>
<textbox id="ifl_path" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.secure.label;"/>
</hbox>
<textbox id="ifl_isSecure" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.secure.label;"/>
</hbox>
<textbox id="ifl_isSecure" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.expires.label;"/>
</hbox>
<textbox id="ifl_expires" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.expires.label;"/>
</hbox>
<textbox id="ifl_expires" readonly="true" class="plain"/>
</row>
<row align="center" id="policyField" hidden="true">
<hbox align="center" pack="end">
<label value="&props.policy.label;"/>
</hbox>
<textbox id="ifl_policy" readonly="true" class="plain"/>
</row>
<row align="center">
<hbox align="center" pack="end">
<label value="&props.policy.label;"/>
</hbox>
<textbox id="ifl_policy" readonly="true" class="plain"/>
</row>
</rows>
</grid>
</groupbox>
<hbox>
<button id="removeCookie" disabled="true"
label="&button.removecookie.label;"
oncommand="DeleteCookie();"/>
<button id="removeAllCookies"
label="&button.removeallcookies.label;"
oncommand="DeleteAllCookies();"/>
<!-- todo: <button id="restoreCookies" class="dialog push" disabled="true" label="&button.restorecookie.label;" oncommand="RestoreCookies();"/> -->
</hbox>
<separator class="thin"/>
<hbox align="start">
<checkbox id="checkbox" label="&checkbox.label;" />
</hbox>
</vbox>
<vbox id="servers" flex="1">
<description id="permissionsText" value="&div.bannedservers.label;"/>
<separator class="thin"/>
<tree id="permissionsTree" flex="1" style="height: 10em;"
hidecolumnpicker="true"
onkeypress="HandlePermissionKeyPress(event)"
onselect="PermissionSelected();">
<treecols>
<treecol id="siteCol" label="&treehead.sitename.label;" flex="5"
onclick="PermissionColumnSort('rawHost', true);"/>
<splitter class="tree-splitter"/>
<treecol id="statusCol" label="&treehead.status.label;" flex="5"
onclick="PermissionColumnSort('capability', true);"/>
</treecols>
<treechildren/>
</tree>
<hbox>
<button id="removePermission" disabled="true"
label="&removepermission.label;"
oncommand="DeletePermission();"/>
<button id="removeAllPermissions"
label="&removeallpermissions.label;"
oncommand="DeleteAllPermissions();"/>
</hbox>
</vbox>
</tabpanels>
</tabbox>
</rows>
</grid>
</groupbox>
<hbox>
<button id="removeCookie" disabled="true"
label="&button.removecookie.label;"
oncommand="DeleteCookie();"/>
<button id="removeAllCookies"
label="&button.removeallcookies.label;"
oncommand="DeleteAllCookies();"/>
</hbox>
<separator class="thin"/>
<hbox align="start">
<checkbox id="checkbox" label="&checkbox.label;" />
</hbox>
</vbox>
</dialog>

View File

@ -0,0 +1,145 @@
function DeleteAllFromTree
(tree, view, table, deletedTable, removeButton, removeAllButton) {
// remove all items from table and place in deleted table
for (var i=0; i<table.length; i++) {
deletedTable[deletedTable.length] = table[i];
}
table.length = 0;
// clear out selections
tree.treeBoxObject.view.selection.select(-1);
// redisplay
view.rowCount = 0;
tree.treeBoxObject.invalidate();
// disable buttons
document.getElementById(removeButton).setAttribute("disabled", "true")
document.getElementById(removeAllButton).setAttribute("disabled","true");
}
function DeleteSelectedItemFromTree
(tree, view, table, deletedTable, removeButton, removeAllButton) {
// remove selected items from list (by setting them to null) and place in deleted list
var selections = GetTreeSelections(tree);
for (var s=selections.length-1; s>= 0; s--) {
var i = selections[s];
deletedTable[deletedTable.length] = table[i];
table[i] = null;
}
// collapse list by removing all the null entries
for (var j=0; j<table.length; j++) {
if (table[j] == null) {
var k = j;
while ((k < table.length) && (table[k] == null)) {
k++;
}
table.splice(j, k-j);
}
}
// redisplay
var box = tree.treeBoxObject;
var firstRow = box.getFirstVisibleRow();
if (firstRow > (table.length-1) ) {
firstRow = table.length-1;
}
view.rowCount = table.length;
box.rowCountChanged(0, table.length);
box.scrollToRow(firstRow)
// update selection and/or buttons
if (table.length) {
// update selection
// note: we need to deselect before reselecting in order to trigger ...Selected method
var nextSelection = (selections[0] < table.length) ? selections[0] : table.length-1;
tree.treeBoxObject.view.selection.select(-1);
tree.treeBoxObject.view.selection.select(nextSelection);
} else {
// disable buttons
document.getElementById(removeButton).setAttribute("disabled", "true")
document.getElementById(removeAllButton).setAttribute("disabled","true");
// clear out selections
tree.treeBoxObject.view.selection.select(-1);
}
}
function GetTreeSelections(tree) {
var selections = [];
var select = tree.treeBoxObject.selection;
if (select) {
var count = select.getRangeCount();
var min = new Object();
var max = new Object();
for (var i=0; i<count; i++) {
select.getRangeAt(i, min, max);
for (var k=min.value; k<=max.value; k++) {
if (k != -1) {
selections[selections.length] = k;
}
}
}
}
return selections;
}
function SortTree(tree, view, table, column, lastSortColumn, lastSortAscending, updateSelection) {
// remember which item was selected so we can restore it after the sort
var selections = GetTreeSelections(tree);
var selectedNumber = selections.length ? table[selections[0]].number : -1;
// determine if sort is to be ascending or descending
var ascending = (column == lastSortColumn) ? !lastSortAscending : true;
// do the sort
var compareFunc;
if (ascending) {
compareFunc = function compare(first, second) {
if (first[column] < second[column])
return -1;
if (first[column] > second[column])
return 1;
return 0;
}
} else {
compareFunc = function compare(first, second) {
if (first[column] < second[column])
return 1;
if (first[column] > second[column])
return -1;
return 0;
}
}
table.sort(compareFunc);
// restore the selection
var selectedRow = -1;
if (selectedNumber>=0 && updateSelection) {
for (var s=0; s<table.length; s++) {
if (table[s].number == selectedNumber) {
// update selection
// note: we need to deselect before reselecting in order to trigger ...Selected()
tree.treeBoxObject.view.selection.select(-1);
tree.treeBoxObject.view.selection.select(s);
selectedRow = s;
break;
}
}
}
// display the results
tree.treeBoxObject.invalidate();
if (selectedRow >= 0) {
tree.treeBoxObject.ensureRowIsVisible(selectedRow)
}
return ascending;
}

View File

@ -1,8 +1,11 @@
browser.jar:
* content/browser/cookieviewer/CookieViewer.xul (content/CookieViewer.xul)
* content/browser/cookieviewer/CookieViewer.js (content/CookieViewer.js)
* content/browser/cookieviewer/nsWalletTreeUtils.js (content/nsWalletTreeUtils.js)
* content/browser/cookieviewer/CookieExceptions.xul (content/CookieExceptions.xul)
* content/browser/cookieviewer/CookieExceptions.js (content/CookieExceptions.js)
* content/browser/cookieviewer/treeUtils.js (content/treeUtils.js)
en-US.jar:
* locale/en-US/browser/cookieviewer/CookieViewer.dtd (locale/CookieViewer.dtd)
* locale/en-US/browser/cookieviewer/CookieExceptions.dtd (locale/CookieExceptions.dtd)
* locale/en-US/browser/cookieviewer/CookieViewer.properties (locale/CookieViewer.properties)

View File

@ -0,0 +1,10 @@
<!ENTITY window.title "Exceptions">
<!ENTITY treehead.sitename.label "Site">
<!ENTITY treehead.status.label "Status">
<!ENTITY addpermission.label "New Site">
<!ENTITY removepermission.label "Remove Site">
<!ENTITY removeallpermissions.label "Remove All Sites">
<!ENTITY div.bannedservers.label "You can specify which web sites are always or never allowed to use cookies. Type the exact address of the site you want to manage and then click Block or Allow.">
<!ENTITY address.label "Address of website:">
<!ENTITY block.label "Block">
<!ENTITY allow.label "Allow">

View File

@ -36,7 +36,6 @@
<!ENTITY tab.cookiesonsystem.label "Stored Cookies">
<!ENTITY tab.bannedservers.label "Cookie Sites">
<!ENTITY div.bannedservers.label "Sites that can and cannot store cookies on your computer.">
<!ENTITY div.cookiesonsystem.label "View and remove cookies that are stored on your computer.">
<!ENTITY treehead.cookiename.label "Cookie Name">
<!ENTITY treehead.cookiedomain.label "Site">
@ -53,19 +52,6 @@
<!ENTITY props.expires.label "Expires:">
<!ENTITY props.policy.label "Policy:">
<!ENTITY treehead.sitename.label "Site">
<!ENTITY treehead.status.label "Status">
<!ENTITY windowtitle.label "Cookie Manager">
<!ENTITY addpermission.label "New Site">
<!ENTITY removepermission.label "Remove Site">
<!ENTITY removeallpermissions.label "Remove All Sites">
<!ENTITY removeimage.label "Remove Site">
<!ENTITY removeallimages.label "Remove All Sites">
<!ENTITY canSet.label "can set cookies">
<!ENTITY cannotSet.label "cannot set cookies">
<!ENTITY canLoad.label "can load images">
<!ENTITY cannotLoad.label "cannot load images">
<!ENTITY window.title "Cookie Manager">
<!ENTITY checkbox.label "Don't allow sites that set removed cookies to set future cookies">

View File

@ -20,25 +20,13 @@
# note this section of the code may require some tinkering in other languages =(
# format in dialog: site [can/cannot] set cookies
can=site can set cookies
cannot=site cannot set cookies
canImages=site can load images
cannotImages=site cannot load images
canPopups=site can show popups
cannotPopups=site cannot show popups
domain=Domain for which this cookie applies:
host=Server which set the cookie:
imageTitle=Image Manager
popupTitle=Pop-up Manager
hostColon=Host:
domainColon=Domain:
yes=yes
no=no
AtEndOfSession = at end of session
tabBannedImages=Image Sites
tabBannedPopups=Pop-up Sites
textBannedImages=Sites from which images are or are not loaded.
textBannedPopups=Sites from which pop-up windows are or are not allowed.
accepted=accepted
downgraded=session
flagged=flagged

View File

@ -0,0 +1,171 @@
# -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
#
# 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 mozilla.org code.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Blake Ross (original author)
#
var permissionsTree;
var permissions = [];
var deletedPermissions = [];
var permissionmanager = Components.classes["@mozilla.org/permissionmanager;1"].getService();
permissionmanager = permissionmanager.QueryInterface(Components.interfaces.nsIPermissionManager);
var permBundle;
const nsIPermissionManager = Components.interfaces.nsIPermissionManager;
function GetFields()
{
var dataObject = {};
dataObject.permissions = permissions;
dataObject.deletedPermissions = deletedPermissions;
return dataObject;
}
function SetFields()
{
var win;
if ('opener' in window && window.opener)
win = window.opener.top;
else
win = window.top;
var dataObject = win.hPrefWindow.wsm.dataManager.pageData[window.location.href];
if ('permissions' in dataObject)
permissions = dataObject.permissions;
if ('deletedPermissions' in dataObject)
deletedPermissions = dataObject.deletedPermissions;
return true;
}
var permissionsTreeView = {
rowCount : 0,
setTree : function(tree){},
getImageSrc : function(row,column) {},
getProgressMode : function(row,column) {},
getCellValue : function(row,column) {},
getCellText : function(row,column){
var rv="";
if (column=="siteCol") {
rv = permissions[row].rawHost;
} else if (column=="statusCol") {
rv = permissions[row].capability;
}
return rv;
},
isSeparator : function(index) {return false;},
isSorted: function() { return false; },
isContainer : function(index) {return false;},
cycleHeader : function(aColId, aElt) {},
getRowProperties : function(row,column,prop){},
getColumnProperties : function(column,columnElement,prop){},
getCellProperties : function(row,prop){}
};
function Permission(number, host, rawHost, type, capability, perm) {
this.number = number;
this.host = host;
this.rawHost = rawHost;
this.type = type;
this.capability = capability;
this.perm = perm;
}
function PermissionSelected() {
var selections = GetTreeSelections(permissionsTree);
document.getElementById("removePermission").disabled = (selections.length < 1);
}
function DeletePermission() {
DeleteSelectedItemFromTree(permissionsTree, permissionsTreeView,
permissions, deletedPermissions,
"removePermission", "removeAllPermissions");
}
function DeleteAllPermissions() {
DeleteAllFromTree(permissionsTree, permissionsTreeView,
permissions, deletedPermissions,
"removePermission", "removeAllPermissions");
}
function HandlePermissionKeyPress(e) {
if (e.keyCode == 46) {
DeletePermission();
}
}
var lastPermissionSortColumn = "";
var lastPermissionSortAscending = false;
function PermissionColumnSort(column, updateSelection) {
lastPermissionSortAscending =
SortTree(permissionsTree, permissionsTreeView, permissions,
column, lastPermissionSortColumn, lastPermissionSortAscending,
updateSelection);
lastPermissionSortColumn = column;
}
function loadPermissions() {
if (!permBundle)
permBundle = document.getElementById("permBundle");
if (!permissionsTree)
permissionsTree = document.getElementById("permissionsTree");
var win;
if ('opener' in window && window.opener)
win = window.opener.top;
else
win = window.top;
var dataObject = win.hPrefWindow.wsm.dataManager.pageData[window.location.href];
// load permissions into a table
if (!('permissions' in dataObject)) {
var enumerator = permissionmanager.enumerator;
var count = 0;
while (enumerator.hasMoreElements()) {
var nextPermission = enumerator.getNext();
nextPermission = nextPermission.QueryInterface(Components.interfaces.nsIPermission);
if (nextPermission.type == permType) {
var host = nextPermission.host;
var capability = ( nextPermission.capability == nsIPermissionManager.ALLOW_ACTION ) ? true : false;
permissions[count] = new Permission(count++, host,
(host.charAt(0)==".") ? host.substring(1,host.length) : host,
nextPermission.type,
permBundle ? permBundle.getString(capability?"can":"cannot") : "", nextPermission.capability);
}
}
}
permissionsTreeView.rowCount = permissions.length;
// sort and display the table
permissionsTree.treeBoxObject.view = permissionsTreeView;
PermissionColumnSort('rawHost', false);
// disable "remove all" button if there are none
document.getElementById("removeAllPermissions").disabled = permissions.length == 0;
}

View File

@ -0,0 +1,35 @@
# -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
#
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is Mozilla Communicator client code, released March
# 31, 1998.
#
# The Initial Developer of the Original Code is Netscape Communications
# Corporation. Portions created by Netscape are
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Blake Ross (original author)
#
var permType = "image";
function Startup()
{
loadPermissions();
}
function onOK() {
window.opener.top.wsm.savePageData(window.location.href, window);
window.opener.top.hPrefWindow.registerOKCallbackFunc(window.opener.onImagePrefsOK);
}

View File

@ -0,0 +1,63 @@
<?xml version="1.0"?> <!-- -*- Mode: SGML; indent-tabs-mode: nil -*- -->
# The contents of this file are subject to the Netscape Public
# License Version 1.1 (the "License"); you may not use this file
# except in compliance with the License. You may obtain a copy of
# the License at http://www.mozilla.org/NPL/
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# The Original Code is Mozilla Communicator client code, released
# March 31, 1998.
#
# The Initial Developer of the Original Code is Netscape
# Communications Corporation. Portions created by Netscape are
# Copyright (C) 1998-1999 Netscape Communications Corporation. All
# Rights Reserved.
#
# Contributor(s):
# Blake Ross (original author)
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<!DOCTYPE dialog SYSTEM "chrome://browser/locale/pref/pref-features-images.dtd" >
<dialog buttons="accept,cancel"
title="&window.title;"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
style="width: 30em;"
onload="window.opener.top.initPanel(window.location.href, window);"
ondialogaccept="return onOK();"
persist="screenX screenY width height">
<script src="chrome://browser/content/pref/pref-features-images.js"/>
<script src="chrome://browser/content/pref/permissions.js"/>
<script src="chrome://browser/content/cookieviewer/treeUtils.js"/>
<stringbundle id="permBundle"
src="chrome://browser/locale/pref/prefutilities.properties"/>
<tree id="permissionsTree" flex="1" style="height: 18em;"
hidecolumnpicker="true"
onkeypress="HandlePermissionKeyPress(event)"
onselect="PermissionSelected();">
<treecols>
<treecol id="siteCol" label="&treehead.sitename.label;" flex="5"
onclick="PermissionColumnSort('rawHost', true);"/>
<splitter class="tree-splitter"/>
<treecol id="statusCol" label="&treehead.status.label;" flex="5"
onclick="PermissionColumnSort('capability', true);"/>
</treecols>
<treechildren/>
</tree>
<hbox>
<button id="removePermission" disabled="true"
label="&removepermission.label;"
oncommand="DeletePermission();"/>
<button id="removeAllPermissions"
label="&removeallpermissions.label;"
oncommand="DeleteAllPermissions();"/>
</hbox>
</dialog>

View File

@ -37,19 +37,13 @@
var _elementIDs = ["advancedJavaAllow", "enableJavaScript", "enableImagePref",
"popupPolicy", "allowWindowMoveResize", "allowWindowFlip", "allowHideStatusBar",
"allowWindowStatusChange", "allowImageSrcChange"];
var permType = "popup";
var gImagesPref, gImagesEnabled, gImagesRestricted;
var policyButton = null;
var manageTree = null;
var permissionsExist = null;
const nsIPermissionManager = Components.interfaces.nsIPermissionManager;
function Startup()
{
policyButton = document.getElementById("popupPolicy");
manageTree = document.getElementById("permissionsTree");
loadPermissions();
javascriptEnabledChange()
gImagesPref = document.getElementById("enableImagePref");
@ -64,6 +58,8 @@ function Startup()
}
if (!gImagesEnabled.checked)
gImagesRestricted.disabled=true;
top.hPrefWindow.registerOKCallbackFunc(onPopupPrefsOK);
}
function updateImagePref()
@ -79,7 +75,7 @@ function updateImagePref()
function viewImages()
{
openDialog("chrome://browser/content/cookieviewer/CookieViewer.xul","_blank",
openDialog("chrome://browser/content/pref/pref-features-images.xul","_blank",
"chrome,resizable=yes,modal", "imageManager" );
}
@ -96,203 +92,6 @@ function javascriptEnabledChange()
advancedButton.disabled = !isEnabled;
}
function togglePermissionEnabling()
{
var enabled = policyButton.checked;
var add = document.getElementById("addPermission");
var remove1 = document.getElementById("removePermission");
var remove2 = document.getElementById("removeAllPermissions");
var description = document.getElementById("popupDescription");
add.disabled = !enabled;
if (enabled && permissionsExist) {
remove1.disabled = false;
remove2.disabled = false;
} else {
remove1.disabled = true;
remove2.disabled = true;
}
description.disabled = !enabled;
manageTree.disabled = !enabled;
}
/*** =================== PERMISSIONS CODE =================== ***/
var permissionsTreeView = {
rowCount : 0,
setTree : function(tree){},
getImageSrc : function(row,column) {},
getProgressMode : function(row,column) {},
getCellValue : function(row,column) {},
getCellText : function(row,column){
var rv="";
if (column=="siteCol") {
rv = permissions[row].rawHost;
} else if (column=="statusCol") {
rv = permissions[row].capability;
}
return rv;
},
isSeparator : function(index) {return false;},
isSorted: function() { return false; },
isContainer : function(index) {return false;},
cycleHeader : function(aColId, aElt) {},
getRowProperties : function(row,column,prop){},
getColumnProperties : function(column,columnElement,prop){},
getCellProperties : function(row,prop){}
};
var permissionsTree;
var permissions = [];
var deletedPermissions = [];
function Permission(number, host, rawHost, type, capability) {
this.number = number;
this.host = host;
this.rawHost = rawHost;
this.type = type;
this.capability = capability;
}
var permissionmanager = Components.classes["@mozilla.org/permissionmanager;1"].getService();
permissionmanager = permissionmanager.QueryInterface(Components.interfaces.nsIPermissionManager);
var popupmanager = Components.classes["@mozilla.org/PopupWindowManager;1"].getService();
popupmanager = popupmanager.QueryInterface(Components.interfaces.nsIPopupWindowManager);
function DeleteAllFromTree
(tree, view, table, deletedTable, removeButton, removeAllButton) {
// remove all items from table and place in deleted table
for (var i=0; i<table.length; i++) {
deletedTable[deletedTable.length] = table[i];
}
table.length = 0;
// clear out selections
tree.treeBoxObject.view.selection.select(-1);
// redisplay
view.rowCount = 0;
tree.treeBoxObject.invalidate();
// disable buttons
permissionsExist = false;
togglePermissionEnabling();
}
function DeleteSelectedItemFromTree
(tree, view, table, deletedTable, removeButton, removeAllButton) {
// remove selected items from list (by setting them to null) and place in deleted list
var selections = GetTreeSelections(tree);
for (var s=selections.length-1; s>= 0; s--) {
var i = selections[s];
deletedTable[deletedTable.length] = table[i];
table[i] = null;
}
// collapse list by removing all the null entries
for (var j=0; j<table.length; j++) {
if (table[j] == null) {
var k = j;
while ((k < table.length) && (table[k] == null)) {
k++;
}
table.splice(j, k-j);
}
}
// redisplay
var box = tree.treeBoxObject;
var firstRow = box.getFirstVisibleRow();
if (firstRow > (table.length-1) ) {
firstRow = table.length-1;
}
view.rowCount = table.length;
box.rowCountChanged(0, table.length);
box.scrollToRow(firstRow)
// update selection and/or buttons
if (table.length) {
// update selection
// note: we need to deselect before reselecting in order to trigger ...Selected method
var nextSelection = (selections[0] < table.length) ? selections[0] : table.length-1;
tree.treeBoxObject.view.selection.select(-1);
tree.treeBoxObject.view.selection.select(nextSelection);
} else {
// disable buttons
document.getElementById(removeButton).setAttribute("disabled", "true")
document.getElementById(removeAllButton).setAttribute("disabled","true");
// clear out selections
tree.treeBoxObject.view.selection.select(-1);
permissionsExist = false;
togglePermissionEnabling();
}
}
function GetTreeSelections(tree) {
var selections = [];
var select = tree.treeBoxObject.selection;
if (select) {
var count = select.getRangeCount();
var min = new Object();
var max = new Object();
for (var i=0; i<count; i++) {
select.getRangeAt(i, min, max);
for (var k=min.value; k<=max.value; k++) {
if (k != -1) {
selections[selections.length] = k;
}
}
}
}
return selections;
}
function loadPermissions() {
// load permissions into a table
if (!permissionsTree)
permissionsTree = document.getElementById("permissionsTree");
var enumerator = permissionmanager.enumerator;
var count = 0;
var contentStr;
var dialogType = "popup"; // Popups
while (enumerator.hasMoreElements()) {
var nextPermission = enumerator.getNext();
nextPermission = nextPermission.QueryInterface(Components.interfaces.nsIPermission);
if (nextPermission.type == dialogType) {
var host = nextPermission.host;
permissions[count] =
new Permission(count++, host,
(host.charAt(0)==".") ? host.substring(1,host.length) : host,
nextPermission.type,
"");
}
}
permissionsTreeView.rowCount = permissions.length;
// sort and display the table
permissionsTree.treeBoxObject.view = permissionsTreeView;
if (permissions.length == 0)
permissionsExist = false;
else
permissionsExist = true;
togglePermissionEnabling();
}
function PermissionSelected() {
var selections = GetTreeSelections(permissionsTree);
document.getElementById("removePermission").disabled = (selections.length < 1);
}
function AddPermission() {
var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
@ -304,43 +103,15 @@ function AddPermission() {
var name = {};
if (!promptService.prompt(window, title, message, name, null, {}))
return;
var nameToURI = name.value.replace(" ", "");
var uri = Components.classes['@mozilla.org/network/standard-url;1'].createInstance(Components.interfaces.nsIURI);
uri.spec = nameToURI;
permissionmanager.add(uri, "popup", nsIPermissionManager.ALLOW_ACTION);
loadPermissions();
}
function DeletePermission() {
DeleteSelectedItemFromTree(permissionsTree, permissionsTreeView,
permissions, deletedPermissions,
"removePermission", "removeAllPermissions");
FinalizePermissionDeletions();
}
function DeleteAllPermissions() {
DeleteAllFromTree(permissionsTree, permissionsTreeView,
permissions, deletedPermissions,
"removePermission", "removeAllPermissions");
FinalizePermissionDeletions();
}
function FinalizePermissionDeletions() {
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
for (var p=0; p<deletedPermissions.length; p++) {
permissionmanager.remove(deletedPermissions[p].host, deletedPermissions[p].type);
}
deletedPermissions.length = 0;
loadPermissions();
}
function HandlePermissionKeyPress(e) {
if (e.keyCode == 46) {
DeletePermission();
}
var host = name.value.replace(/ /g, "");
permissions[permissions.length] = new Permission(permissions.length, host,
(host.charAt(0)==".") ? host.substring(1,host.length) : host,
"popup",
"");
permissionsTreeView.rowCount = permissions.length;
permissionsTree.treeBoxObject.rowCountChanged(permissions.length-1, 1);
permissionsTree.treeBoxObject.ensureRowIsVisible(permissions.length-1)
}
function showFontsAndColors()
@ -423,3 +194,53 @@ function saveFontPrefs()
}
}
function onPopupPrefsOK()
{
var permissionmanager = Components.classes["@mozilla.org/permissionmanager;1"].getService();
permissionmanager = permissionmanager.QueryInterface(Components.interfaces.nsIPermissionManager);
var dataObject = parent.hPrefWindow.wsm.dataManager.pageData[window.location.href];
if ('deletedPermissions' in dataObject) {
for (var p = 0; p < dataObject.deletedPermissions.length; ++p) {
permissionmanager.remove(dataObject.deletedPermissions[p].host, dataObject.deletedPermissions[p].type);
}
}
if ('permissions' in dataObject) {
var uri = Components.classes["@mozilla.org/network/standard-url;1"]
.createInstance(Components.interfaces.nsIURI);
for (p = 0; p < dataObject.permissions.length; ++p) {
uri.spec = dataObject.permissions[p].host;
if (permissionmanager.testPermission(uri, "popup") != dataObject.permissions[p].perm)
permissionmanager.add(uri, "popup", nsIPermissionManager.ALLOW_ACTION);
}
}
}
function onImagePrefsOK()
{
var permissionmanager = Components.classes["@mozilla.org/permissionmanager;1"].getService();
permissionmanager = permissionmanager.QueryInterface(Components.interfaces.nsIPermissionManager);
var dataObject = parent.hPrefWindow.wsm.dataManager.pageData["chrome://browser/content/pref/pref-features-images.xul"];
if ('deletedPermissions' in dataObject) {
for (var p = 0; p < dataObject.deletedPermissions.length; ++p) {
permissionmanager.remove(dataObject.deletedPermissions[p].host, dataObject.deletedPermissions[p].type);
}
}
if ('permissions' in dataObject) {
var uri = Components.classes["@mozilla.org/network/standard-url;1"]
.createInstance(Components.interfaces.nsIURI);
for (p = 0; p < dataObject.permissions.length; ++p) {
uri.spec = dataObject.permissions[p].host;
if (permissionmanager.testPermission(uri, "image") != dataObject.permissions[p].perm)
permissionmanager.add(uri, "image", nsIPermissionManager.ALLOW_ACTION);
}
}
}

View File

@ -45,6 +45,8 @@
headertitle="&lHeader;">
<script type="application/x-javascript" src="chrome://browser/content/pref/pref-features.js"/>
<script type="application/x-javascript" src="chrome://browser/content/pref/permissions.js"/>
<script src="chrome://browser/content/cookieviewer/treeUtils.js"/>
<stringbundle id="stringBundle" src="chrome://browser/locale/pref/addPopup.properties"/>
@ -52,7 +54,7 @@
<checkbox label="&popupReject.label;"
prefstring="dom.disable_open_during_load"
accesskey="&popupReject.accesskey;"
oncommand="togglePermissionEnabling()" id="popupPolicy"/>
id="popupPolicy"/>
<vbox id="servers" class="indent" flex="1">
<label id="popupDescription" value="&div.blessedservers.label;"/>
<separator class="thin"/>
@ -66,7 +68,7 @@
<treechildren/>
</tree>
<hbox>
<button id="addPermission" disabled="true"
<button id="addPermission"
label="&addpermission.label;"
oncommand="AddPermission();"/>
<button id="removePermission" disabled="true"

View File

@ -38,8 +38,7 @@
var _elementIDs = ["histDay", "browserCacheDiskCache", "enableCookies",
"enableCookiesForOriginatingSiteOnly", "enableCookiesForCurrentSessionOnly",
"enableCookiesButAskFirst", "enableFormFill", "enablePasswords",
"downloadsRetentionPolicy"];
"enableCookiesButAskFirst", "enableFormFill", "enablePasswords"];
function Startup() {
var cookiesEnabled = document.getElementById("enableCookies").checked;
@ -93,11 +92,11 @@ function Startup() {
// the bound element. dbaron is helping me with this with a reduced test case, but in
// the meantime, I'm working around this bug by placing the menulist outside the bound element
// until it is completely initialized and then scooting it in, which is what this code does.
var drb = document.getElementById("downloadsRetentionBox");
var drp = document.getElementById("downloadsRetentionPolicy");
drp.removeAttribute("hidden");
document.documentElement.removeChild(drp);
drb.appendChild(drp);
// var drb = document.getElementById("downloadsRetentionBox");
// var drp = document.getElementById("downloadsRetentionPolicy");
// drp.removeAttribute("hidden");
// document.documentElement.removeChild(drp);
// drb.appendChild(drp);
}
function unload()
@ -109,6 +108,22 @@ function unload()
}
}
function cookieViewerOnPrefsOK()
{
var dataObject = parent.hPrefWindow.wsm.dataManager.pageData["chrome://browser/content/cookieviewer/CookieViewer.xul"];
if ('deletedCookies' in dataObject) {
var cookiemanager = Components.classes["@mozilla.org/cookiemanager;1"].getService();
cookiemanager = cookiemanager.QueryInterface(Components.interfaces.nsICookieManager);
for (var p = 0; p < dataObject.deletedCookies.length; ++p) {
cookiemanager.remove(dataObject.deletedCookies[p].host,
dataObject.deletedCookies[p].name,
dataObject.deletedCookies[p].path,
dataObject.cookieBool);
}
}
}
var PrivacyPanel = {
confirm: function (aTitle, aMessage, aActionButtonLabel)
{
@ -278,6 +293,12 @@ function viewCookies()
"chrome,resizable=yes", "cookieManager");
}
function cookieExceptions()
{
window.openDialog("chrome://browser/content/cookieviewer/CookieExceptions.xul","_blank",
"chrome,resizable=yes", "cookieExceptions");
}
function viewSignons()
{
window.openDialog("chrome://passwordmgr/content/passwordManager.xul","_blank",
@ -299,3 +320,27 @@ function updateBroadcaster(aDisable)
else
broadcaster.removeAttribute("disabled");
}
function onPrefsOK()
{
var permissionmanager = Components.classes["@mozilla.org/permissionmanager;1"].getService();
permissionmanager = permissionmanager.QueryInterface(Components.interfaces.nsIPermissionManager);
var dataObject = parent.hPrefWindow.wsm.dataManager.pageData["chrome://browser/content/cookieviewer/CookieExceptions.xul"];
if ('deletedPermissions' in dataObject) {
for (var p = 0; p < dataObject.deletedPermissions.length; ++p) {
permissionmanager.remove(dataObject.deletedPermissions[p].host, dataObject.deletedPermissions[p].type);
}
}
if ('permissions' in dataObject) {
var uri = Components.classes["@mozilla.org/network/standard-url;1"]
.createInstance(Components.interfaces.nsIURI);
for (p = 0; p < dataObject.permissions.length; ++p) {
uri.spec = dataObject.permissions[p].host;
if (permissionmanager.testPermission(uri, "cookie") != dataObject.permissions[p].perm)
permissionmanager.add(uri, "cookie", dataObject.permissions[p].perm);
}
}
}

View File

@ -45,6 +45,8 @@
onunload="unload();" headertitle="&lHeader;">
<script type="application/x-javascript" src="chrome://browser/content/pref/pref-privacy.js"/>
<script src="chrome://browser/content/pref/permissions.js"/>
<script src="chrome://browser/content/cookieviewer/treeUtils.js"/>
<stringbundle id="privacyBundle" src="chrome://browser/locale/pref/prefutilities.properties"/>
@ -78,7 +80,7 @@
<checkbox id="enablePasswords" label="&passwordsEnable.label;" accesskey="&passwordsEnable.accesskey;"
prefstring="signon.rememberSignons"/>
</vbox>
<vbox pack="start">
<vbox>
<button label="&viewPasswords.label;" oncommand="viewSignons();"/>
</vbox>
</hbox>
@ -86,12 +88,7 @@
<!-- Downloaded Files List -->
<expander id="downloads" label="&downloads.label;" clearlabel="&clearDownloads.label;" persist="open">
<description>&downloadsDescription.label;</description>
<hbox align="center" id="downloadsRetentionBox">
<description>&downloadsRetentionPolicy.label;</description>
</hbox>
<description>&downloadsDescription.label;</description>
</expander>
<!-- Cookies -->
@ -117,9 +114,10 @@
prefstring="network.cookie.warnAboutCookies"
style="margin-left: 23px;"/>
</vbox>
<vbox pack="start">
<hbox align="start" pack="end">
<button label="&exceptions.label;" oncommand="cookieExceptions();"/>
<button label="&viewCookies.label;" oncommand="viewCookies();"/>
</vbox>
</hbox>
</hbox>
</expander>
@ -141,14 +139,14 @@
<button label="&clearAll.label;" oncommand="PrivacyPanel.clearAll();"/>
</hbox>
<menulist id="downloadsRetentionPolicy" hidden="true"
preftype="int" prefstring="browser.download.retention" prefdefval="0">
<menupopup>
<menuitem value="0" label="&downloadsRemoveImmediately.label;"/>
<menuitem value="1" label="&downloadsRemoveExit.label;"/>
<menuitem value="2" label="&downloadsRemoveManually.label;"/>
</menupopup>
</menulist>
# <menulist id="downloadsRetentionPolicy" hidden="true"
# preftype="int" prefstring="browser.download.retention" prefdefval="0">
# <menupopup>
# <menuitem value="0" label="&downloadsRemoveImmediately.label;"/>
# <menuitem value="1" label="&downloadsRemoveExit.label;"/>
# <menuitem value="2" label="&downloadsRemoveManually.label;"/>
# </menupopup>
# </menulist>
</page>

View File

@ -17,6 +17,8 @@ browser.jar:
* content/browser/pref/pref-navigator.xul (content/pref-navigator.xul)
* content/browser/pref/pref-privacy.xul (content/pref-privacy.xul)
* content/browser/pref/pref-privacy.js (content/pref-privacy.js)
* content/browser/pref/pref-features-images.xul (content/pref-features-images.xul)
* content/browser/pref/pref-features-images.js (content/pref-features-images.js)
* content/browser/pref/pref-themes.xul (content/pref-themes.xul)
* content/browser/pref/pref-themes.js (content/pref-themes.js)
* content/browser/pref/pref-downloads.xul (content/pref-downloads.xul)
@ -25,6 +27,7 @@ browser.jar:
* content/browser/pref/editAction.js (content/editAction.js)
* content/browser/pref/plugins.xul (content/plugins.xul)
* content/browser/pref/plugins.js (content/plugins.js)
* content/browser/pref/permissions.js (content/permissions.js)
en-US.jar:
*+ locale/en-US/browser/pref/pref-navigator.dtd (locale/pref-navigator.dtd)
@ -35,6 +38,8 @@ en-US.jar:
locale/en-US/browser/pref/pref-connection.dtd (locale/pref-connection.dtd)
locale/en-US/browser/pref/pref-extensions.dtd (locale/pref-extensions.dtd)
locale/en-US/browser/pref/pref-features.dtd (locale/pref-features.dtd)
locale/en-US/browser/pref/pref-features-images.dtd (locale/pref-features-images.dtd)
locale/en-US/browser/pref/pref-features-images.properties (locale/pref-features-images.properties)
locale/en-US/browser/pref/pref-fonts.dtd (locale/pref-fonts.dtd)
locale/en-US/browser/pref/pref-privacy.dtd (locale/pref-privacy.dtd)
locale/en-US/browser/pref/pref-themes.dtd (locale/pref-themes.dtd)

View File

@ -0,0 +1,5 @@
<!ENTITY window.title "Image Manager">
<!ENTITY treehead.sitename.label "Site">
<!ENTITY treehead.status.label "Status">
<!ENTITY removepermission.label "Remove Site">
<!ENTITY removeallpermissions.label "Remove All Sites">

View File

@ -26,7 +26,8 @@
<!ENTITY butAskFirst.label "but ask before accepting">
<!ENTITY butAskFirst.accesskey "b">
<!ENTITY clearCookies.label "Clear">
<!ENTITY viewCookies.label "View Cookies...">
<!ENTITY viewCookies.label "Stored Cookies...">
<!ENTITY exceptions.label "Exceptions...">
<!ENTITY formfill.label "Saved Form Information">
<!ENTITY formfillDescription.label "Information entered in web page forms and the Search Bar is saved to make filling out forms and searching faster.">
@ -35,7 +36,7 @@
<!ENTITY clearFormfill.label "Clear">
<!ENTITY downloads.label "Download Manager History">
<!ENTITY downloadsDescription.label "The Download Manager keeps track of recently downloaded files. THESE OPTIONS DO NOT WORK YET.">
<!ENTITY downloadsDescription.label "The Download Manager keeps track of recently downloaded files.">
<!ENTITY downloadsRetentionPolicy.label "Remove files from the Download Manager:">
<!ENTITY downloadsRemoveImmediately.label "Upon successful download">
<!ENTITY downloadsRemoveExit.label "When Firebird exits">

View File

@ -1,3 +1,5 @@
can=Allow
cannot=Block
cachefolder=Choose Cache Folder
choosehomepage=Choose Home Page
choosebookmark=%brand% can set your home page to a site you have already added to your Bookmarks. Select a Bookmark below and click OK.