summaryrefslogtreecommitdiffstats
path: root/application/palemoon/components/preferences
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@gmail.com>2018-07-18 08:24:24 +0200
committerwolfbeast <mcwerewolf@gmail.com>2018-07-18 08:24:24 +0200
commitfc61780b35af913801d72086456f493f63197da6 (patch)
treef85891288a7bd988da9f0f15ae64e5c63f00d493 /application/palemoon/components/preferences
parent69f7f9e5f1475891ce11cc4f431692f965b0cd30 (diff)
parent50d3e596bbe89c95615f96eb71f6bc5be737a1db (diff)
downloadUXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.tar
UXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.tar.gz
UXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.tar.lz
UXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.tar.xz
UXP-9ccb235f04529c1ec345d87dad6521cb567d20bb.zip
Merge commit '50d3e596bbe89c95615f96eb71f6bc5be737a1db' into Basilisk-releasev2018.07.18
# Conflicts: # browser/app/profile/firefox.js # browser/components/preferences/jar.mn
Diffstat (limited to 'application/palemoon/components/preferences')
-rw-r--r--application/palemoon/components/preferences/aboutPermissions.css11
-rw-r--r--application/palemoon/components/preferences/aboutPermissions.js1336
-rw-r--r--application/palemoon/components/preferences/aboutPermissions.xml113
-rw-r--r--application/palemoon/components/preferences/aboutPermissions.xul342
-rw-r--r--application/palemoon/components/preferences/cookies.js8
-rw-r--r--application/palemoon/components/preferences/jar.mn4
-rw-r--r--application/palemoon/components/preferences/privacy.js36
-rw-r--r--application/palemoon/components/preferences/privacy.xul19
-rw-r--r--application/palemoon/components/preferences/security.xul6
9 files changed, 14 insertions, 1861 deletions
diff --git a/application/palemoon/components/preferences/aboutPermissions.css b/application/palemoon/components/preferences/aboutPermissions.css
deleted file mode 100644
index cec82a030..000000000
--- a/application/palemoon/components/preferences/aboutPermissions.css
+++ /dev/null
@@ -1,11 +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/. */
-
-.site {
- -moz-binding: url("chrome://browser/content/preferences/aboutPermissions.xml#site");
-}
-
-.pluginPermission {
- -moz-binding: url("chrome://browser/content/preferences/aboutPermissions.xml#pluginPermission");
-}
diff --git a/application/palemoon/components/preferences/aboutPermissions.js b/application/palemoon/components/preferences/aboutPermissions.js
deleted file mode 100644
index 9fb12d081..000000000
--- a/application/palemoon/components/preferences/aboutPermissions.js
+++ /dev/null
@@ -1,1336 +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/. */
-
-"use strict";
-
-var Ci = Components.interfaces;
-var Cc = Components.classes;
-var Cu = Components.utils;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/DownloadUtils.jsm");
-Cu.import("resource://gre/modules/AddonManager.jsm");
-Cu.import("resource://gre/modules/NetUtil.jsm");
-Cu.import("resource://gre/modules/ForgetAboutSite.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "PluralForm",
- "resource://gre/modules/PluralForm.jsm");
-
-var gSecMan = Cc["@mozilla.org/scriptsecuritymanager;1"].
- getService(Ci.nsIScriptSecurityManager);
-
-var gFaviconService = Cc["@mozilla.org/browser/favicon-service;1"].
- getService(Ci.nsIFaviconService);
-
-var gPlacesDatabase = Cc["@mozilla.org/browser/nav-history-service;1"].
- getService(Ci.nsPIPlacesDatabase).
- DBConnection.
- clone(true);
-
-var gSitesStmt = gPlacesDatabase.createAsyncStatement(
- "SELECT url " +
- "FROM moz_places " +
- "WHERE rev_host > '.' " +
- "AND visit_count > 0 " +
- "GROUP BY rev_host " +
- "ORDER BY MAX(frecency) DESC " +
- "LIMIT :limit");
-
-var gVisitStmt = gPlacesDatabase.createAsyncStatement(
- "SELECT SUM(visit_count) AS count " +
- "FROM moz_places " +
- "WHERE rev_host = :rev_host");
-
-var gFlash = {
- name: "Shockwave Flash",
- betterName: "Adobe Flash",
- type: "application/x-shockwave-flash",
-};
-
-// XXX:
-// Is there a better way to do this rather than this hacky comparison?
-// Copied this from toolkit/components/passwordmgr/crypto-SDR.js
-const MASTER_PASSWORD_MESSAGE = "User canceled master password entry";
-
-/**
- * Permission types that should be tested with testExactPermission, as opposed
- * to testPermission. This is based on what consumers use to test these
- * permissions.
- */
-const TEST_EXACT_PERM_TYPES = ["desktop-notification", "geo", "pointerLock"];
-
-/**
- * Site object represents a single site, uniquely identified by a principal.
- */
-function Site(principal) {
- this.principal = principal;
- this.listitem = null;
-}
-
-Site.prototype = {
- /**
- * Gets the favicon to use for the site. The callback only gets called if
- * a favicon is found for either the http URI or the https URI.
- *
- * @param aCallback
- * A callback function that takes a favicon image URL as a parameter.
- */
- getFavicon: function Site_getFavicon(aCallback) {
- function invokeCallback(aFaviconURI) {
- try {
- // Use getFaviconLinkForIcon to get image data from the database instead
- // of using the favicon URI to fetch image data over the network.
- aCallback(gFaviconService.getFaviconLinkForIcon(aFaviconURI).spec);
- } catch (e) {
- Cu.reportError("AboutPermissions: " + e);
- }
- }
-
- // Get the favicon for the origin
- gFaviconService.getFaviconURLForPage(this.principal.URI, function (aURI) {
- if (aURI) {
- invokeCallback(aURI);
- }
- }.bind(this));
- },
-
- /**
- * Gets the number of history visits for the site.
- *
- * @param aCallback
- * A function that takes the visit count (a number) as a parameter.
- */
- getVisitCount: function Site_getVisitCount(aCallback) {
- // XXX This won't be a very reliable system, as it will count both http: and https: visits
- // Unfortunately, I don't think that there is a much better way to do it right now.
- let rev_host = this.principal.URI.host.split("").reverse().join("") + ".";
- gVisitStmt.params.rev_host = rev_host;
- gVisitStmt.executeAsync({
- handleResult: function(aResults) {
- let row = aResults.getNextRow();
- let count = row.getResultByName("count") || 0;
- try {
- aCallback(count);
- } catch (e) {
- Cu.reportError("AboutPermissions: " + e);
- }
- },
- handleError: function(aError) {
- Cu.reportError("AboutPermissions: " + aError);
- },
- handleCompletion: function(aReason) {
- }
- });
- },
-
- /**
- * Gets the permission value stored for a specified permission type.
- *
- * @param aType
- * The permission type string stored in permission manager.
- * e.g. "cookie", "geo", "indexedDB", "popup", "image"
- * @param aResultObj
- * An object that stores the permission value set for aType.
- *
- * @return A boolean indicating whether or not a permission is set.
- */
- getPermission: function Site_getPermission(aType, aResultObj) {
- // Password saving isn't a nsIPermissionManager permission type, so handle
- // it seperately.
- if (aType == "password") {
- aResultObj.value = this.loginSavingEnabled
- ? Ci.nsIPermissionManager.ALLOW_ACTION
- : Ci.nsIPermissionManager.DENY_ACTION;
- return true;
- }
-
- let permissionValue;
- if (TEST_EXACT_PERM_TYPES.indexOf(aType) == -1) {
- permissionValue = Services.perms.testPermissionFromPrincipal(this.principal, aType);
- } else {
- permissionValue = Services.perms.testExactPermissionFromPrincipal(this.principal, aType);
- }
- aResultObj.value = permissionValue;
-
- if (aType.startsWith("plugin")) {
- if (permissionValue == Ci.nsIPermissionManager.PROMPT_ACTION) {
- aResultObj.value = Ci.nsIPermissionManager.UNKNOWN_ACTION;
- return true;
- }
- }
-
- return permissionValue != Ci.nsIPermissionManager.UNKNOWN_ACTION;
- },
-
- /**
- * Sets a permission for the site given a permission type and value.
- *
- * @param aType
- * The permission type string stored in permission manager.
- * e.g. "cookie", "geo", "indexedDB", "popup", "image"
- * @param aPerm
- * The permission value to set for the permission type. This should
- * be one of the constants defined in nsIPermissionManager.
- */
- setPermission: function Site_setPermission(aType, aPerm) {
- // Password saving isn't a nsIPermissionManager permission type, so handle
- // it seperately.
- if (aType == "password") {
- this.loginSavingEnabled = aPerm == Ci.nsIPermissionManager.ALLOW_ACTION;
- return;
- }
-
- if (aType.startsWith("plugin")) {
- if (aPerm == Ci.nsIPermissionManager.UNKNOWN_ACTION) {
- aPerm = Ci.nsIPermissionManager.PROMPT_ACTION;
- }
- }
-
- Services.perms.addFromPrincipal(this.principal, aType, aPerm);
- },
-
- /**
- * Clears a user-set permission value for the site given a permission type.
- *
- * @param aType
- * The permission type string stored in permission manager.
- * e.g. "cookie", "geo", "indexedDB", "popup", "image"
- */
- clearPermission: function Site_clearPermission(aType) {
- Services.perms.removeFromPrincipal(this.principal, aType);
- },
-
- /**
- * Gets logins stored for the site.
- *
- * @return An array of the logins stored for the site.
- */
- get logins() {
- try {
- let logins = Services.logins.findLogins({},
- this.principal.originNoSuffix, "", "");
- return logins;
- } catch (e) {
- if (!e.message.includes(MASTER_PASSWORD_MESSAGE)) {
- Cu.reportError("AboutPermissions: " + e);
- }
- return [];
- }
- },
-
- get loginSavingEnabled() {
- // Only say that login saving is blocked if it is blocked for both
- // http and https.
- try {
- return Services.logins.getLoginSavingEnabled(this.principal.originNoSuffix);
- } catch (e) {
- if (!e.message.includes(MASTER_PASSWORD_MESSAGE)) {
- Cu.reportError("AboutPermissions: " + e);
- }
- return false;
- }
- },
-
- set loginSavingEnabled(isEnabled) {
- try {
- Services.logins.setLoginSavingEnabled(this.principal.originNoSuffix, isEnabled);
- } catch (e) {
- if (!e.message.includes(MASTER_PASSWORD_MESSAGE)) {
- Cu.reportError("AboutPermissions: " + e);
- }
- }
- },
-
- /**
- * Gets cookies stored for the site and base domain.
- *
- * @return An array of the cookies set for the site and base domain.
- */
- get cookies() {
- let cookies = [];
- let enumerator = Services.cookies.enumerator;
- while (enumerator.hasMoreElements()) {
- let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
- if (cookie.host.hasRootDomain(
- AboutPermissions.domainFromHost(this.host))) {
- cookies.push(cookie);
- }
- }
- return cookies;
- },
-
- /**
- * Removes a set of specific cookies from the browser.
- */
- clearCookies: function Site_clearCookies() {
- this.cookies.forEach(function(aCookie) {
- Services.cookies.remove(aCookie.host, aCookie.name, aCookie.path, false);
- });
- },
-
- /**
- * Removes all data from the browser corresponding to the site.
- */
- forgetSite: function Site_forgetSite() {
- // XXX This removes data for an entire domain, rather than just
- // an origin. This may produce confusing results, as data will
- // be cleared for the http:// as well as the https:// domain
- // if you try to forget the https:// site.
- ForgetAboutSite.removeDataFromDomain(this.principal.URI.host)
- .catch(Cu.reportError);
- }
-}
-
-/**
- * PermissionDefaults object keeps track of default permissions for sites based
- * on global preferences.
- *
- * Inspired by pageinfo/permissions.js
- */
-var PermissionDefaults = {
- UNKNOWN: Ci.nsIPermissionManager.UNKNOWN_ACTION, // 0
- ALLOW: Ci.nsIPermissionManager.ALLOW_ACTION, // 1
- DENY: Ci.nsIPermissionManager.DENY_ACTION, // 2
- SESSION: Ci.nsICookiePermission.ACCESS_SESSION, // 8
-
- get password() {
- if (Services.prefs.getBoolPref("signon.rememberSignons")) {
- return this.ALLOW;
- }
- return this.DENY;
- },
- set password(aValue) {
- let value = (aValue != this.DENY);
- Services.prefs.setBoolPref("signon.rememberSignons", value);
- },
-
- IMAGE_ALLOW: 1,
- IMAGE_DENY: 2,
- IMAGE_ALLOW_FIRST_PARTY_ONLY: 3,
-
- get image() {
- if (Services.prefs.getIntPref("permissions.default.image")
- == this.IMAGE_DENY) {
- return this.IMAGE_DENY;
- } else if (Services.prefs.getIntPref("permissions.default.image")
- == this.IMAGE_ALLOW_FIRST_PARTY_ONLY) {
- return this.IMAGE_ALLOW_FIRST_PARTY_ONLY;
- }
- return this.IMAGE_ALLOW;
- },
- set image(aValue) {
- let value = this.IMAGE_ALLOW;
- if (aValue == this.IMAGE_DENY) {
- value = this.IMAGE_DENY;
- } else if (aValue == this.IMAGE_ALLOW_FIRST_PARTY_ONLY) {
- value = this.IMAGE_ALLOW_FIRST_PARTY_ONLY;
- }
- Services.prefs.setIntPref("permissions.default.image", value);
- },
-
- get popup() {
- if (Services.prefs.getBoolPref("dom.disable_open_during_load")) {
- return this.DENY;
- }
- return this.ALLOW;
- },
- set popup(aValue) {
- let value = (aValue == this.DENY);
- Services.prefs.setBoolPref("dom.disable_open_during_load", value);
- },
-
- // For use with network.cookie.* prefs.
- COOKIE_ACCEPT: 0,
- COOKIE_DENY: 2,
- COOKIE_NORMAL: 0,
- COOKIE_SESSION: 2,
-
- get cookie() {
- if (Services.prefs.getIntPref("network.cookie.cookieBehavior")
- == this.COOKIE_DENY) {
- return this.DENY;
- }
-
- if (Services.prefs.getIntPref("network.cookie.lifetimePolicy")
- == this.COOKIE_SESSION) {
- return this.SESSION;
- }
- return this.ALLOW;
- },
- set cookie(aValue) {
- let value = (aValue == this.DENY) ? this.COOKIE_DENY : this.COOKIE_ACCEPT;
- Services.prefs.setIntPref("network.cookie.cookieBehavior", value);
-
- let lifetimeValue = aValue == this.SESSION ? this.COOKIE_SESSION :
- this.COOKIE_NORMAL;
- Services.prefs.setIntPref("network.cookie.lifetimePolicy", lifetimeValue);
- },
-
- get ["desktop-notification"]() {
- if (!Services.prefs.getBoolPref("dom.webnotifications.enabled")) {
- return this.DENY;
- }
- // We always ask for permission to enable notifications for a specific
- // site, so there is no global ALLOW.
- return this.UNKNOWN;
- },
- set ["desktop-notification"](aValue) {
- let value = (aValue != this.DENY);
- Services.prefs.setBoolPref("dom.webnotifications.enabled", value);
- },
-
- get install() {
- if (Services.prefs.getBoolPref("xpinstall.whitelist.required")) {
- return this.DENY;
- }
- return this.ALLOW;
- },
- set install(aValue) {
- let value = (aValue == this.DENY);
- Services.prefs.setBoolPref("xpinstall.whitelist.required", value);
- },
-
- get geo() {
- if (!Services.prefs.getBoolPref("geo.enabled")) {
- return this.DENY;
- }
- // We always ask for permission to share location with a specific site,
- // so there is no global ALLOW.
- return this.UNKNOWN;
- },
- set geo(aValue) {
- let value = (aValue != this.DENY);
- Services.prefs.setBoolPref("geo.enabled", value);
- },
-
- get indexedDB() {
- if (!Services.prefs.getBoolPref("dom.indexedDB.enabled")) {
- return this.DENY;
- }
- // We always ask for permission to enable indexedDB storage for a specific
- // site, so there is no global ALLOW.
- return this.UNKNOWN;
- },
- set indexedDB(aValue) {
- let value = (aValue != this.DENY);
- Services.prefs.setBoolPref("dom.indexedDB.enabled", value);
- },
-
-}
-
-/**
- * AboutPermissions manages the about:permissions page.
- */
-var AboutPermissions = {
- /**
- * Maximum number of sites to return from the places database.
- */
- PLACES_SITES_LIMIT_MAX: 100,
-
- /**
- * When adding sites to the dom sites-list, divide workload into intervals.
- */
- LIST_BUILD_DELAY: 100, // delay between intervals
-
- /**
- * Stores a mapping of origin strings to Site objects.
- */
- _sites: {},
-
- /**
- * Using a getter for sitesFilter to avoid races with tests.
- */
- get sitesFilter () {
- delete this.sitesFilter;
- return this.sitesFilter = document.getElementById("sites-filter");
- },
-
- sitesList: null,
- _selectedSite: null,
-
- /**
- * For testing, track initializations so we can send notifications.
- */
- _initPlacesDone: false,
- _initServicesDone: false,
-
- /**
- * This reflects the permissions that we expose in the UI. These correspond
- * to permission type strings in the permission manager, PermissionDefaults,
- * and element ids in aboutPermissions.xul.
- *
- * Potential future additions: "sts/use", "sts/subd"
- */
- _supportedPermissions: ["password", "image", "popup", "cookie",
- "desktop-notification", "install", "geo", "indexedDB"],
-
- /**
- * Permissions that don't have a global "Allow" option.
- */
- _noGlobalAllow: ["desktop-notification", "geo", "indexedDB"],
-
- /**
- * Permissions that don't have a global "Deny" option.
- */
- _noGlobalDeny: [],
-
- _stringBundleBrowser: Services.strings
- .createBundle("chrome://browser/locale/browser.properties"),
-
- _stringBundleAboutPermissions: Services.strings.createBundle(
- "chrome://browser/locale/preferences/aboutPermissions.properties"),
-
- _initPart1: function() {
- this.initPluginList();
- this.cleanupPluginList();
-
- this.getSitesFromPlaces();
-
- this.enumerateServicesGenerator = this.getEnumerateServicesGenerator();
- setTimeout(this.enumerateServicesDriver.bind(this), this.LIST_BUILD_DELAY);
- },
-
- _initPart2: function() {
- this._supportedPermissions.forEach(function(aType) {
- this.updatePermission(aType);
- }, this);
- },
-
- /**
- * Called on page load.
- */
- init: function() {
- this.sitesList = document.getElementById("sites-list");
-
- this._initPart1();
-
- // Attach observers in case data changes while the page is open.
- Services.prefs.addObserver("signon.rememberSignons", this, false);
- Services.prefs.addObserver("permissions.default.image", this, false);
- Services.prefs.addObserver("dom.disable_open_during_load", this, false);
- Services.prefs.addObserver("network.cookie.", this, false);
- Services.prefs.addObserver("dom.webnotifications.enabled", this, false);
- Services.prefs.addObserver("xpinstall.whitelist.required", this, false);
- Services.prefs.addObserver("geo.enabled", this, false);
- Services.prefs.addObserver("dom.indexedDB.enabled", this, false);
- Services.prefs.addObserver("plugins.click_to_play", this, false);
- Services.prefs.addObserver("permissions.places-sites-limit", this, false);
-
- Services.obs.addObserver(this, "perm-changed", false);
- Services.obs.addObserver(this, "passwordmgr-storage-changed", false);
- Services.obs.addObserver(this, "cookie-changed", false);
- Services.obs.addObserver(this, "browser:purge-domain-data", false);
- Services.obs.addObserver(this, "plugin-info-updated", false);
- Services.obs.addObserver(this, "plugin-list-updated", false);
- Services.obs.addObserver(this, "blocklist-updated", false);
-
- this._observersInitialized = true;
- Services.obs.notifyObservers(null, "browser-permissions-preinit", null);
-
- this._initPart2();
- },
-
- sitesReload: function() {
- Object.getOwnPropertyNames(this._sites).forEach(function(prop) {
- AboutPermissions.deleteFromSitesList(prop);
- });
- this._initPart1();
- this._initPart2();
- },
-
- // XXX copied this from browser-plugins.js - is there a way to share?
- // Map the plugin's name to a filtered version more suitable for user UI.
- makeNicePluginName: function(aName) {
- if (aName == gFlash.name) {
- return gFlash.betterName;
- }
-
- // 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;
- },
-
- initPluginList: function() {
- let pluginHost = Cc["@mozilla.org/plugin/host;1"]
- .getService(Ci.nsIPluginHost);
- let tags = pluginHost.getPluginTags();
-
- let permissionMap = new Map();
-
- let permissionEntries = [];
- let XUL_NS =
- "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
- for (let plugin of tags) {
- for (let mimeType of plugin.getMimeTypes()) {
- if ((mimeType == gFlash.type) && (plugin.name != gFlash.name)) {
- continue;
- }
- let permString = pluginHost.getPermissionStringForType(mimeType);
- if (!permissionMap.has(permString)) {
- let permissionEntry = document.createElementNS(XUL_NS, "box");
- permissionEntry.setAttribute("label",
- this.makeNicePluginName(plugin.name)
- + " " + plugin.version);
- permissionEntry.setAttribute("tooltiptext", plugin.description);
- permissionEntry.setAttribute("vulnerable", "");
- permissionEntry.setAttribute("mimeType", mimeType);
- permissionEntry.setAttribute("permString", permString);
- permissionEntry.setAttribute("class", "pluginPermission");
- permissionEntry.setAttribute("id", permString + "-entry");
- // If the plugin is disabled, it makes no sense to change its
- // click-to-play status, so don't add it.
- // If the click-to-play pref is not set and the plugin is not
- // click-to-play blocklisted, again click-to-play doesn't apply,
- // so don't add it.
- if (plugin.disabled ||
- (!Services.prefs.getBoolPref("plugins.click_to_play") &&
- (pluginHost.getStateForType(mimeType)
- != Ci.nsIPluginTag.STATE_CLICKTOPLAY))) {
- permissionEntry.hidden = true;
- } else {
- permissionEntry.hidden = false;
- }
- permissionEntries.push(permissionEntry);
- this._supportedPermissions.push(permString);
- this._noGlobalDeny.push(permString);
- Object.defineProperty(PermissionDefaults, permString, {
- get: function() {
- return this.isClickToPlay()
- ? PermissionDefaults.UNKNOWN
- : PermissionDefaults.ALLOW;
- }.bind(permissionEntry),
- set: function(aValue) {
- this.clicktoplay = (aValue == PermissionDefaults.UNKNOWN);
- }.bind(plugin),
- configurable: true
- });
- permissionMap.set(permString, "");
- }
- }
- }
-
- if (permissionEntries.length > 0) {
- permissionEntries.sort(function(entryA, entryB) {
- let labelA = entryA.getAttribute("label");
- let labelB = entryB.getAttribute("label");
- return ((labelA < labelB) ? -1 : (labelA == labelB ? 0 : 1));
- });
- }
-
- let pluginsBox = document.getElementById("plugins-box");
- while (pluginsBox.hasChildNodes()) {
- pluginsBox.removeChild(pluginsBox.firstChild);
- }
- for (let permissionEntry of permissionEntries) {
- pluginsBox.appendChild(permissionEntry);
- }
- },
-
- cleanupPluginList: function() {
- let pluginsPrefItem = document.getElementById("plugins-pref-item");
- let pluginsBox = document.getElementById("plugins-box");
- let pluginsBoxEmpty = true;
- let pluginsBoxSibling = pluginsBox.firstChild;
- while (pluginsBoxSibling) {
- if (!pluginsBoxSibling.hidden) {
- pluginsBoxEmpty = false;
- break;
- }
- pluginsBoxSibling = pluginsBoxSibling.nextSibling;
- }
- if (pluginsBoxEmpty) {
- pluginsPrefItem.collapsed = true;
- } else {
- pluginsPrefItem.collapsed = false;
- }
- },
-
- /**
- * Called on page unload.
- */
- cleanUp: function() {
- if (this._observersInitialized) {
- Services.prefs.removeObserver("signon.rememberSignons", this, false);
- Services.prefs.removeObserver("permissions.default.image", this, false);
- Services.prefs.removeObserver("dom.disable_open_during_load", this, false);
- Services.prefs.removeObserver("network.cookie.", this, false);
- Services.prefs.removeObserver("dom.webnotifications.enabled", this, false);
- Services.prefs.removeObserver("xpinstall.whitelist.required", this, false);
- Services.prefs.removeObserver("geo.enabled", this, false);
- Services.prefs.removeObserver("dom.indexedDB.enabled", this, false);
- Services.prefs.removeObserver("plugins.click_to_play", this, false);
- Services.prefs.removeObserver("permissions.places-sites-limit", this, false);
-
- Services.obs.removeObserver(this, "perm-changed");
- Services.obs.removeObserver(this, "passwordmgr-storage-changed");
- Services.obs.removeObserver(this, "cookie-changed");
- Services.obs.removeObserver(this, "browser:purge-domain-data");
- Services.obs.removeObserver(this, "plugin-info-updated");
- Services.obs.removeObserver(this, "plugin-list-updated");
- Services.obs.removeObserver(this, "blocklist-updated");
- }
-
- gSitesStmt.finalize();
- gVisitStmt.finalize();
- gPlacesDatabase.asyncClose(null);
- },
-
- observe: function(aSubject, aTopic, aData) {
- switch(aTopic) {
- case "perm-changed":
- // Permissions changes only affect individual sites.
- if (!this._selectedSite) {
- break;
- }
- // aSubject is null when nsIPermisionManager::removeAll() is called.
- if (!aSubject) {
- this._supportedPermissions.forEach(function(aType) {
- this.updatePermission(aType);
- }, this);
- break;
- }
- let permission = aSubject.QueryInterface(Ci.nsIPermission);
- // We can't compare selectedSite.principal and permission.principal here
- // because we need to handle the case where a parent domain was changed
- // in a way that affects the subdomain.
- if (this._supportedPermissions.indexOf(permission.type) != -1) {
- this.updatePermission(permission.type);
- }
- break;
- case "nsPref:changed":
- if (aData == "permissions.places-sites-limit") {
- this.sitesReload();
- return;
- }
- let plugin = false;
- if (aData.startsWith("plugin")) {
- plugin = true;
- }
- if (plugin) {
- this.initPluginList();
- }
- this._supportedPermissions.forEach(function(aType) {
- if (!plugin || (plugin && aType.startsWith("plugin"))) {
- this.updatePermission(aType);
- }
- }, this);
- if (plugin) {
- this.cleanupPluginList();
- }
- break;
- case "passwordmgr-storage-changed":
- this.updatePermission("password");
- if (this._selectedSite) {
- this.updatePasswordsCount();
- }
- break;
- case "cookie-changed":
- if (this._selectedSite) {
- this.updateCookiesCount();
- }
- break;
- case "browser:purge-domain-data":
- this.deleteFromSitesList(aData);
- break;
- case "plugin-info-updated":
- case "plugin-list-updated":
- case "blocklist-updated":
- this.initPluginList();
- this._supportedPermissions.forEach(function(aType) {
- if (aType.startsWith("plugin")) {
- this.updatePermission(aType);
- }
- }, this);
- this.cleanupPluginList();
- break;
- }
- },
-
- /**
- * Creates Site objects for the top-frecency sites in the places database
- * and stores them in _sites.
- * The number of sites created is controlled by _placesSitesLimit.
- */
- getSitesFromPlaces: function() {
- let _placesSitesLimit = Services.prefs.getIntPref(
- "permissions.places-sites-limit");
- if (_placesSitesLimit <= 0) {
- return;
- }
- if (_placesSitesLimit > this.PLACES_SITES_LIMIT_MAX) {
- _placesSitesLimit = this.PLACES_SITES_LIMIT_MAX;
- }
-
- gSitesStmt.params.limit = _placesSitesLimit;
- gSitesStmt.executeAsync({
- handleResult: function(aResults) {
- AboutPermissions.startSitesListBatch();
- let row;
- while (row = aResults.getNextRow()) {
- let spec = row.getResultByName("url");
- let uri = NetUtil.newURI(spec);
- let principal = gSecMan.getNoAppCodebasePrincipal(uri);
-
- AboutPermissions.addPrincipal(principal);
- }
- AboutPermissions.endSitesListBatch();
- },
- handleError: function(aError) {
- Cu.reportError("AboutPermissions: " + aError);
- },
- handleCompletion: function(aReason) {
- // Notify oberservers for testing purposes.
- AboutPermissions._initPlacesDone = true;
- if (AboutPermissions._initServicesDone) {
- Services.obs.notifyObservers(
- null, "browser-permissions-initialized", null);
- }
- }
- });
- },
-
- /**
- * Drives getEnumerateServicesGenerator to work in intervals.
- */
- enumerateServicesDriver: function() {
- if (this.enumerateServicesGenerator.next()) {
- // Build top sitesList items faster so that the list never seems sparse
- let delay = Math.min(this.sitesList.itemCount * 5, this.LIST_BUILD_DELAY);
- setTimeout(this.enumerateServicesDriver.bind(this), delay);
- } else {
- this.enumerateServicesGenerator.close();
- this._initServicesDone = true;
- if (this._initPlacesDone) {
- Services.obs.notifyObservers(
- null, "browser-permissions-initialized", null);
- }
- }
- },
-
- /**
- * Finds sites that have non-default permissions and creates Site objects
- * for them if they are not already stored in _sites.
- */
- getEnumerateServicesGenerator: function() {
- let itemCnt = 1;
- let schemeChrome = "chrome";
-
- try {
- let logins = Services.logins.getAllLogins();
- logins.forEach(function(aLogin) {
- try {
- // aLogin.hostname is a string in origin URL format
- // (e.g. "http://foo.com").
- // newURI will throw for add-ons logins stored in chrome:// URIs
- // i.e.: "chrome://weave" (Sync)
- if (!aLogin.hostname.startsWith(schemeChrome + ":")) {
- let uri = NetUtil.newURI(aLogin.hostname);
- let principal = gSecMan.getNoAppCodebasePrincipal(uri);
- this.addPrincipal(principal);
- }
- } catch (e) {
- Cu.reportError("AboutPermissions: " + e);
- }
- itemCnt++;
- }, this);
-
- let disabledHosts = Services.logins.getAllDisabledHosts();
- disabledHosts.forEach(function(aHostname) {
- try {
- // aHostname is a string in origin URL format (e.g. "http://foo.com").
- // newURI will throw for add-ons logins stored in chrome:// URIs
- // i.e.: "chrome://weave" (Sync)
- if (!aHostname.startsWith(schemeChrome + ":")) {
- let uri = NetUtil.newURI(aHostname);
- let principal = gSecMan.getNoAppCodebasePrincipal(uri);
- this.addPrincipal(principal);
- }
- } catch (e) {
- Cu.reportError("AboutPermissions: " + e);
- }
- itemCnt++;
- }, this);
- } catch (e) {
- if (!e.message.includes(MASTER_PASSWORD_MESSAGE)) {
- Cu.reportError("AboutPermissions: " + e);
- }
- }
-
- let enumerator = Services.perms.enumerator;
- while (enumerator.hasMoreElements()) {
- let permission = enumerator.getNext().QueryInterface(Ci.nsIPermission);
- // Only include sites with exceptions set for supported permission types.
- if (this._supportedPermissions.indexOf(permission.type) != -1) {
- this.addPrincipal(permission.principal);
- }
- itemCnt++;
- }
-
- yield false;
- },
-
- /**
- * Creates a new Site and adds it to _sites if it's not already there.
- *
- * @param aPrincipal
- * A principal.
- */
- addPrincipal: function(aPrincipal) {
- if (aPrincipal.origin in this._sites) {
- return;
- }
- let site = new Site(aPrincipal);
- this._sites[aPrincipal.origin] = site;
- this.addToSitesList(site);
- },
-
- /**
- * Populates sites-list richlistbox with data from Site object.
- *
- * @param aSite
- * A Site object.
- */
- addToSitesList: function(aSite) {
- let item = document.createElement("richlistitem");
- item.setAttribute("class", "site");
- item.setAttribute("value", aSite.principal.origin);
-
- aSite.getFavicon(function(aURL) {
- item.setAttribute("favicon", aURL);
- });
- aSite.listitem = item;
-
- // Make sure to only display relevant items when list is filtered.
- let filterValue = this.sitesFilter.value.toLowerCase();
- item.collapsed = aSite.principal.origin.toLowerCase().indexOf(filterValue) == -1;
-
- (this._listFragment || this.sitesList).appendChild(item);
- },
-
- startSitesListBatch: function() {
- if (!this._listFragment)
- this._listFragment = document.createDocumentFragment();
- },
-
- endSitesListBatch: function() {
- if (this._listFragment) {
- this.sitesList.appendChild(this._listFragment);
- this._listFragment = null;
- }
- },
-
- /**
- * Hides sites in richlistbox based on search text in sites-filter textbox.
- */
- filterSitesList: function() {
- let siteItems = this.sitesList.children;
- let filterValue = this.sitesFilter.value.toLowerCase();
-
- if (filterValue == "") {
- for (let i = 0, iLen = siteItems.length; i < iLen; i++) {
- siteItems[i].collapsed = false;
- }
- return;
- }
-
- for (let i = 0, iLen = siteItems.length; i < iLen; i++) {
- let siteValue = siteItems[i].value.toLowerCase();
- siteItems[i].collapsed = siteValue.indexOf(filterValue) == -1;
- }
- },
-
- /**
- * Removes all evidence of the selected site. The "forget this site" observer
- * will call deleteFromSitesList to update the UI.
- */
- forgetSite: function() {
- this._selectedSite.forgetSite();
- },
-
- /**
- * Deletes sites for a host and all of its sub-domains. Removes these sites
- * from _sites and removes their corresponding elements from the DOM.
- *
- * @param aHost
- * The host string corresponding to the site to delete.
- */
- deleteFromSitesList: function(aHost) {
- for (let origin in this._sites) {
- let site = this._sites[origin];
- if (site.principal.URI.host.hasRootDomain(aHost)) {
- if (site == this._selectedSite) {
- // Replace site-specific interface with "All Sites" interface.
- this.sitesList.selectedItem =
- document.getElementById("all-sites-item");
- }
-
- this.sitesList.removeChild(site.listitem);
- delete this._sites[site.principal.origin];
- }
- }
- },
-
- /**
- * Shows interface for managing site-specific permissions.
- */
- onSitesListSelect: function(event) {
- if (event.target.selectedItem.id == "all-sites-item") {
- // Clear the header label value from the previously selected site.
- document.getElementById("site-label").value = "";
- this.manageDefaultPermissions();
- return;
- }
-
- let origin = event.target.value;
- let site = this._selectedSite = this._sites[origin];
- document.getElementById("site-label").value = origin;
- document.getElementById("header-deck").selectedPanel =
- document.getElementById("site-header");
-
- this.updateVisitCount();
- this.updatePermissionsBox();
- },
-
- /**
- * Shows interface for managing default permissions. This corresponds to
- * the "All Sites" list item.
- */
- manageDefaultPermissions: function() {
- this._selectedSite = null;
-
- document.getElementById("header-deck").selectedPanel =
- document.getElementById("defaults-header");
-
- this.updatePermissionsBox();
- },
-
- /**
- * Updates permissions interface based on selected site.
- */
- updatePermissionsBox: function() {
- this._supportedPermissions.forEach(function(aType) {
- this.updatePermission(aType);
- }, this);
-
- this.updatePasswordsCount();
- this.updateCookiesCount();
- },
-
- /**
- * Sets menulist for a given permission to the correct state, based on
- * the stored permission.
- *
- * @param aType
- * The permission type string stored in permission manager.
- * e.g. "cookie", "geo", "indexedDB", "popup", "image"
- */
- updatePermission: function(aType) {
- let allowItem = document.getElementById(
- aType + "-" + PermissionDefaults.ALLOW);
- allowItem.hidden = !this._selectedSite &&
- this._noGlobalAllow.indexOf(aType) != -1;
- let denyItem = document.getElementById(
- aType + "-" + PermissionDefaults.DENY);
- denyItem.hidden = !this._selectedSite &&
- this._noGlobalDeny.indexOf(aType) != -1;
-
- let permissionMenulist = document.getElementById(aType + "-menulist");
- let permissionSetDefault = document.getElementById(aType + "-set-default");
- let permissionValue;
- let permissionDefault;
- let pluginPermissionEntry;
- let elementsPrefSetDefault = document.querySelectorAll(".pref-set-default");
- if (!this._selectedSite) {
- let _visibility = "collapse";
- for (let i = 0, iLen = elementsPrefSetDefault.length; i < iLen; i++) {
- elementsPrefSetDefault[i].style.visibility = _visibility;
- }
- permissionSetDefault.style.visibility = _visibility;
- // If there is no selected site, we are updating the default permissions
- // interface.
- permissionValue = PermissionDefaults[aType];
- permissionDefault = permissionValue;
- if (aType == "image") {
- // (aType + "-3") corresponds to ALLOW_FIRST_PARTY_ONLY,
- // which is reserved for global preferences only.
- document.getElementById(aType + "-3").hidden = false;
- } else if (aType == "cookie") {
- // (aType + "-9") corresponds to ALLOW_FIRST_PARTY_ONLY,
- // which is reserved for site-specific preferences only.
- document.getElementById(aType + "-9").hidden = true;
- } else if (aType.startsWith("plugin")) {
- if (!Services.prefs.getBoolPref("plugins.click_to_play")) {
- // It is reserved for site-specific preferences only.
- document.getElementById(aType + "-0").disabled = true;
- }
- pluginPermissionEntry = document.getElementById(aType + "-entry");
- pluginPermissionEntry.setAttribute("vulnerable", "");
- if (pluginPermissionEntry.isBlocklisted()) {
- permissionMenulist.disabled = true;
- permissionMenulist.setAttribute("tooltiptext",
- AboutPermissions._stringBundleAboutPermissions
- .GetStringFromName("pluginBlocklisted"));
- } else {
- permissionMenulist.disabled = false;
- permissionMenulist.setAttribute("tooltiptext", "");
- }
- }
- } else {
- let _visibility = "visible";
- for (let i = 0, iLen = elementsPrefSetDefault.length; i < iLen; i++) {
- elementsPrefSetDefault[i].style.visibility = _visibility;
- }
- permissionSetDefault.style.visibility = _visibility;
- permissionDefault = PermissionDefaults[aType];
- if (aType == "image") {
- document.getElementById(aType + "-3").hidden = true;
- } else if (aType == "cookie") {
- document.getElementById(aType + "-9").hidden = false;
- } else if (aType.startsWith("plugin")) {
- document.getElementById(aType + "-0").disabled = false;
- pluginPermissionEntry = document.getElementById(aType + "-entry");
- let permString = pluginPermissionEntry.getAttribute("permString");
- if (permString.startsWith("plugin-vulnerable:")) {
- let nameVulnerable = " \u2014 "
- + AboutPermissions._stringBundleBrowser
- .GetStringFromName("pluginActivateVulnerable.label");
- pluginPermissionEntry.setAttribute("vulnerable", nameVulnerable);
- }
- permissionMenulist.disabled = false;
- permissionMenulist.setAttribute("tooltiptext", "");
- }
- let result = {};
- permissionValue = this._selectedSite.getPermission(aType, result) ?
- result.value : permissionDefault;
- }
-
- if (aType == "image") {
- if (document.getElementById(aType + "-" + permissionValue).hidden) {
- // ALLOW
- permissionValue = 1;
- }
- }
- if (aType.startsWith("plugin")) {
- if (document.getElementById(aType + "-" + permissionValue).disabled) {
- // ALLOW
- permissionValue = 1;
- }
- }
-
- if (!aType.startsWith("plugin")) {
- let _elementDefault = document.getElementById(aType + "-default");
- if (!this._selectedSite || (permissionValue == permissionDefault)) {
- _elementDefault.setAttribute("value", "");
- } else {
- _elementDefault.setAttribute("value", "*");
- }
- } else {
- let _elementDefaultVisibility;
- if (!this._selectedSite || (permissionValue == permissionDefault)) {
- _elementDefaultVisibility = false;
- } else {
- _elementDefaultVisibility = true;
- }
- pluginPermissionEntry.setDefaultVisibility(_elementDefaultVisibility);
- }
-
- permissionMenulist.selectedItem = document.getElementById(
- aType + "-" + permissionValue);
- },
-
- onPermissionCommand: function(event, _default) {
- let pluginHost = Cc["@mozilla.org/plugin/host;1"]
- .getService(Ci.nsIPluginHost);
- let permissionMimeType = event.currentTarget.getAttribute("mimeType");
- let permissionType = event.currentTarget.getAttribute("type");
- let permissionValue = event.target.value;
-
- if (!this._selectedSite) {
- if (permissionType.startsWith("plugin")) {
- let addonValue = AddonManager.STATE_ASK_TO_ACTIVATE;
- switch(permissionValue) {
- case "1":
- addonValue = false;
- break;
- case "2":
- addonValue = true;
- break;
- }
-
- AddonManager.getAddonsByTypes(["plugin"], function(addons) {
- for (let addon of addons) {
- for (let type of addon.pluginMimeTypes) {
- if ((type.type == gFlash.type) && (addon.name != gFlash.name)) {
- continue;
- }
- if (type.type.toLowerCase() == permissionMimeType.toLowerCase()) {
- addon.userDisabled = addonValue;
- return;
- }
- }
- }
- });
- } else {
- // If there is no selected site, we are setting the default permission.
- PermissionDefaults[permissionType] = permissionValue;
- }
- } else {
- if (_default) {
- this._selectedSite.clearPermission(permissionType);
- } else {
- this._selectedSite.setPermission(permissionType, permissionValue);
- }
- }
- },
-
- updateVisitCount: function() {
- this._selectedSite.getVisitCount(function(aCount) {
- let visitForm = AboutPermissions._stringBundleAboutPermissions
- .GetStringFromName("visitCount");
- let visitLabel = PluralForm.get(aCount, visitForm)
- .replace("#1", aCount);
- document.getElementById("site-visit-count").value = visitLabel;
- });
- },
-
- updatePasswordsCount: function() {
- if (!this._selectedSite) {
- document.getElementById("passwords-count").hidden = true;
- document.getElementById("passwords-manage-all-button").hidden = false;
- return;
- }
-
- let passwordsCount = this._selectedSite.logins.length;
- let passwordsForm = this._stringBundleAboutPermissions
- .GetStringFromName("passwordsCount");
- let passwordsLabel = PluralForm.get(passwordsCount, passwordsForm)
- .replace("#1", passwordsCount);
-
- document.getElementById("passwords-label").value = passwordsLabel;
- document.getElementById("passwords-manage-button").disabled =
- (passwordsCount < 1);
- document.getElementById("passwords-manage-all-button").hidden = true;
- document.getElementById("passwords-count").hidden = false;
- },
-
- /**
- * Opens password manager dialog.
- */
- managePasswords: function() {
- let selectedOrigin = "";
- if (this._selectedSite) {
- selectedOrigin = this._selectedSite.principal.URI.prePath;
- }
-
- let win = Services.wm.getMostRecentWindow("Toolkit:PasswordManager");
- if (win) {
- win.setFilter(selectedOrigin);
- win.focus();
- } else {
- window.openDialog("chrome://passwordmgr/content/passwordManager.xul",
- "Toolkit:PasswordManager", "",
- {filterString : selectedOrigin});
- }
- },
-
- domainFromHost: function(aHost) {
- let domain = aHost;
- try {
- domain = Services.eTLD.getBaseDomainFromHost(aHost);
- } catch (e) {
- // getBaseDomainFromHost will fail if the host is an IP address
- // or is empty.
- }
-
- return domain;
- },
-
- updateCookiesCount: function() {
- if (!this._selectedSite) {
- document.getElementById("cookies-count").hidden = true;
- document.getElementById("cookies-clear-all-button").hidden = false;
- document.getElementById("cookies-manage-all-button").hidden = false;
- return;
- }
-
- let cookiesCount = this._selectedSite.cookies.length;
- let cookiesForm = this._stringBundleAboutPermissions
- .GetStringFromName("cookiesCount");
- let cookiesLabel = PluralForm.get(cookiesCount, cookiesForm)
- .replace("#1", cookiesCount);
-
- document.getElementById("cookies-label").value = cookiesLabel;
- document.getElementById("cookies-clear-button").disabled =
- (cookiesCount < 1);
- document.getElementById("cookies-manage-button").disabled =
- (cookiesCount < 1);
- document.getElementById("cookies-clear-all-button").hidden = true;
- document.getElementById("cookies-manage-all-button").hidden = true;
- document.getElementById("cookies-count").hidden = false;
- },
-
- /**
- * Clears cookies for the selected site and base domain.
- */
- clearCookies: function() {
- if (!this._selectedSite) {
- return;
- }
- let site = this._selectedSite;
- site.clearCookies(site.cookies);
- this.updateCookiesCount();
- },
-
- /**
- * Opens cookie manager dialog.
- */
- manageCookies: function() {
- // Cookies are stored by-host, and thus we filter the cookie window
- // using only the host of the selected principal's origin
- let selectedHost = "";
- let selectedDomain = "";
- if (this._selectedSite) {
- selectedHost = this._selectedSite.principal.URI.host;
- selectedDomain = this.domainFromHost(selectedHost);
- }
-
- let win = Services.wm.getMostRecentWindow("Browser:Cookies");
- if (win) {
- win.gCookiesWindow.setFilter(selectedDomain);
- win.focus();
- } else {
- window.openDialog("chrome://browser/content/preferences/cookies.xul",
- "Browser:Cookies", "", {filterString : selectedDomain});
- }
- },
-
- /**
- * Focusses the filter box.
- */
- focusFilterBox: function() {
- this.sitesFilter.focus();
- }
-}
-
-// See toolkit/forgetaboutsite/ForgetAboutSite.jsm
-String.prototype.hasRootDomain = function hasRootDomain(aDomain) {
- let index = this.indexOf(aDomain);
- if (index == -1) {
- return false;
- }
-
- if (this == aDomain) {
- return true;
- }
-
- let prevChar = this[index - 1];
- return (index == (this.length - aDomain.length)) &&
- (prevChar == "." || prevChar == "/");
-}
diff --git a/application/palemoon/components/preferences/aboutPermissions.xml b/application/palemoon/components/preferences/aboutPermissions.xml
deleted file mode 100644
index 4df0d964d..000000000
--- a/application/palemoon/components/preferences/aboutPermissions.xml
+++ /dev/null
@@ -1,113 +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 % aboutPermissionsDTD SYSTEM "chrome://browser/locale/preferences/aboutPermissions.dtd" >
-%aboutPermissionsDTD;
-]>
-
-<bindings 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="site" extends="chrome://global/content/bindings/richlistbox.xml#richlistitem">
- <content>
- <xul:hbox class="site-container" align="center" flex="1">
- <xul:image xbl:inherits="src=favicon" class="site-favicon"/>
- <xul:label xbl:inherits="value,selected" class="site-domain" crop="end" flex="1"/>
- </xul:hbox>
- </content>
- </binding>
-
- <binding id="pluginPermission">
- <content>
- <xul:hbox flex="1" align="baseline">
- <xul:label xbl:inherits="value=label" class="plugins-label"/>
- <xul:label xbl:inherits="value=vulnerable" class="plugins-vulnerable"/>
- <xul:label xbl:inherits="value=default" anonid="plugins-default" class="plugins-default"/>
- <xul:spacer flex="1"/>
- <xul:menulist anonid="plugins-menulist"
- class="pref-menulist"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <xul:menupopup>
- <xul:menuitem anonid="ask" value="0" label="&permission.alwaysAsk;"/>
- <xul:menuitem anonid="allow" value="1" label="&permission.allow;"/>
- <xul:menuitem anonid="block" value="2" label="&permission.block;"/>
- </xul:menupopup>
- </xul:menulist>
- <xul:button xbl:inherits="value=set-default"
- anonid="plugins-set-default"
- class="pref-set-default"
- label="&permission.default;"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- </xul:hbox>
- </content>
- <implementation>
- <constructor><![CDATA[
- let mimeType = this.getAttribute("mimeType");
- let permString = this.getAttribute("permString");
- let menulist = document.getAnonymousElementByAttribute(this, "anonid", "plugins-menulist");
- menulist.setAttribute("id", permString + "-menulist");
- menulist.setAttribute("mimeType", mimeType);
- menulist.setAttribute("type", permString);
- let askitem = document.getAnonymousElementByAttribute(this, "anonid", "ask");
- askitem.setAttribute("id", permString + "-0");
- let allowitem = document.getAnonymousElementByAttribute(this, "anonid", "allow");
- allowitem.setAttribute("id", permString + "-1");
- let blockitem = document.getAnonymousElementByAttribute(this, "anonid", "block");
- blockitem.setAttribute("id", permString + "-2");
- let _default = document.getAnonymousElementByAttribute(this, "anonid", "plugins-default");
- this.setDefaultVisibility(false);
- _default.setAttribute("value", "*");
- let _setDefault = document.getAnonymousElementByAttribute(this, "anonid", "plugins-set-default");
- _setDefault.setAttribute("id", permString + "-set-default");
- _setDefault.setAttribute("class", "pref-set-default");
- _setDefault.setAttribute("type", permString);
- ]]>
- </constructor>
- <method name="setDefaultVisibility">
- <parameter name="visibility" />
- <body><![CDATA[
- let _default = document.getAnonymousElementByAttribute(this, "anonid", "plugins-default");
- if (visibility) {
- _default.style.visibility = "visible";
- } else {
- _default.style.visibility = "hidden";
- }
- ]]>
- </body>
- </method>
- <method name="isClickToPlay">
- <body><![CDATA[
- let pluginHost = Components.classes["@mozilla.org/plugin/host;1"]
- .getService(Components.interfaces.nsIPluginHost);
- let mimeType = this.getAttribute("mimeType");
- return (pluginHost.getStateForType(mimeType)
- == Components.interfaces.nsIPluginTag.STATE_CLICKTOPLAY);
- ]]>
- </body>
- </method>
- <method name="isBlocklisted">
- <body><![CDATA[
- let pluginHost = Components.classes["@mozilla.org/plugin/host;1"]
- .getService(Components.interfaces.nsIPluginHost);
- let blocklistService = Components.classes["@mozilla.org/extensions/blocklist;1"]
- .getService(Components.interfaces.nsIBlocklistService);
- let mimeType = this.getAttribute("mimeType");
- let tags = pluginHost.getPluginTags();
- let blocklistState = Components.interfaces.nsIBlocklistService.STATE_NOT_BLOCKED;
- for (let plugin of tags) {
- if (plugin.getMimeTypes()[0] == mimeType) {
- blocklistState = blocklistService.getPluginBlocklistState(plugin);
- break;
- }
- }
- return (blocklistState == Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_UPDATE_AVAILABLE ||
- blocklistState == Components.interfaces.nsIBlocklistService.STATE_VULNERABLE_NO_UPDATE);
- ]]>
- </body>
- </method>
- </implementation>
- </binding>
-</bindings>
diff --git a/application/palemoon/components/preferences/aboutPermissions.xul b/application/palemoon/components/preferences/aboutPermissions.xul
deleted file mode 100644
index 56d6cfbbf..000000000
--- a/application/palemoon/components/preferences/aboutPermissions.xul
+++ /dev/null
@@ -1,342 +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://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/content/preferences/aboutPermissions.css"?>
-<?xml-stylesheet href="chrome://browser/skin/preferences/aboutPermissions.css"?>
-
-<!DOCTYPE page [
-<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" >
-%brandDTD;
-<!ENTITY % aboutPermissionsDTD SYSTEM "chrome://browser/locale/preferences/aboutPermissions.dtd" >
-%aboutPermissionsDTD;
-]>
-
-<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- xmlns:xhtml="http://www.w3.org/1999/xhtml"
- id="permissions-page" title="&permissionsManager.title;"
- onload="AboutPermissions.init();"
- onunload="AboutPermissions.cleanUp();"
- disablefastfind="true"
- role="application">
-
- <script type="application/javascript"
- src="chrome://browser/content/preferences/aboutPermissions.js"/>
-
- <keyset>
- <key key="&focusSearch.key;" modifiers="accel" oncommand="AboutPermissions.focusFilterBox();"/>
- </keyset>
-
- <hbox flex="1" id="permissions-header">
- <label id="permissions-pagetitle">&permissionsManager.title;</label>
- </hbox>
- <hbox flex="1" id="permissions-content" class="main-content">
-
- <vbox id="sites-box">
- <button id="sites-reload"
- label="&permissions.sitesReload;"
- oncommand="AboutPermissions.sitesReload();"/>
- <textbox id="sites-filter"
- emptytext="&sites.search;"
- oncommand="AboutPermissions.filterSitesList();"
- type="search"/>
- <richlistbox id="sites-list"
- flex="1"
- class="list"
- onselect="AboutPermissions.onSitesListSelect(event);">
- <richlistitem id="all-sites-item"
- class="site"
- value="&sites.allSites;"/>
- </richlistbox>
- </vbox>
-
- <vbox id="permissions-box" flex="1">
-
- <deck id="header-deck">
- <hbox id="site-header" class="pref-item" align="center">
- <description id="site-description">
- &header.site.start;<label id="site-label"/>&header.site.end;
- </description>
- <label id="site-visit-count"/>
- <spacer flex="1"/>
- <button id="forget-site-button"
- label="&permissions.forgetSite;"
- oncommand="AboutPermissions.forgetSite();"/>
- </hbox>
-
- <hbox id="defaults-header" class="pref-item" align="center">
- <description id="defaults-description">
- &header.defaults;
- </description>
- </hbox>
- </deck>
-
- <!-- Passwords -->
- <hbox id="password-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="password"/>
- <vbox>
- <hbox>
- <label class="pref-title" value="&password.label;"/>
- <label id="password-default" class="pref-default" value="*"/>
- </hbox>
- <hbox align="center">
- <menulist id="password-menulist"
- class="pref-menulist"
- type="password"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <menupopup>
- <menuitem id="password-1" value="1" label="&permission.allow;"/>
- <menuitem id="password-2" value="2" label="&permission.block;"/>
- </menupopup>
- </menulist>
- <button id="password-set-default"
- class="pref-set-default"
- label="&permission.default;"
- type="password"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- <button id="passwords-manage-all-button"
- label="&password.manage;"
- oncommand="AboutPermissions.managePasswords();"/>
- </hbox>
- <hbox id="passwords-count" align="center">
- <label id="passwords-label"/>
- <button id="passwords-manage-button"
- label="&password.manage;"
- oncommand="AboutPermissions.managePasswords();"/>
- </hbox>
- </vbox>
- </hbox>
-
- <!-- Image Blocking -->
- <hbox id="image-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="image"/>
- <vbox>
- <hbox>
- <label class="pref-title" value="&image.label;"/>
- <label id="image-default" class="pref-default" value="*"/>
- </hbox>
- <hbox>
- <menulist id="image-menulist"
- class="pref-menulist"
- type="image"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <menupopup>
- <menuitem id="image-1" value="1" label="&permission.allow;"/>
- <menuitem id="image-2" value="2" label="&permission.block;"/>
- <menuitem id="image-3" value="3" label="&permission.allowFirstPartyOnly;"/>
- </menupopup>
- </menulist>
- <button id="image-set-default"
- class="pref-set-default"
- label="&permission.default;"
- type="image"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- </hbox>
- </vbox>
- </hbox>
-
- <!-- Pop-up Blocking -->
- <hbox id="popup-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="popup"/>
- <vbox>
- <hbox>
- <label class="pref-title" value="&popup.label;"/>
- <label id="popup-default" class="pref-default" value="*"/>
- </hbox>
- <hbox>
- <menulist id="popup-menulist"
- class="pref-menulist"
- type="popup"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <menupopup>
- <menuitem id="popup-1" value="1" label="&permission.allow;"/>
- <menuitem id="popup-2" value="2" label="&permission.block;"/>
- </menupopup>
- </menulist>
- <button id="popup-set-default"
- class="pref-set-default"
- label="&permission.default;"
- type="popup"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- </hbox>
- </vbox>
- </hbox>
-
- <!-- Cookies -->
- <hbox id="cookie-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="cookie"/>
- <vbox>
- <hbox>
- <label class="pref-title" value="&cookie.label;"/>
- <label id="cookie-default" class="pref-default" value="*"/>
- </hbox>
- <hbox align="center">
- <menulist id="cookie-menulist"
- class="pref-menulist"
- type="cookie"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <menupopup>
- <menuitem id="cookie-1" value="1" label="&permission.allow;"/>
- <menuitem id="cookie-8" value="8" label="&permission.allowForSession;"/>
- <menuitem id="cookie-9" value="9" label="&permission.allowFirstPartyOnly;"/>
- <menuitem id="cookie-2" value="2" label="&permission.block;"/>
- </menupopup>
- </menulist>
- <button id="cookie-set-default"
- class="pref-set-default"
- label="&permission.default;"
- type="cookie"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- <button id="cookies-clear-all-button"
- label="&cookie.removeAll;"
- oncommand="Services.cookies.removeAll();"/>
- <button id="cookies-manage-all-button"
- label="&cookie.manage;"
- oncommand="AboutPermissions.manageCookies();"/>
- </hbox>
- <hbox id="cookies-count" align="center">
- <label id="cookies-label"/>
- <button id="cookies-clear-button"
- label="&cookie.remove;"
- oncommand="AboutPermissions.clearCookies();"/>
- <button id="cookies-manage-button"
- label="&cookie.manage;"
- oncommand="AboutPermissions.manageCookies();"/>
- </hbox>
- </vbox>
- </hbox>
-
- <!-- Desktop Notifications -->
- <hbox id="desktop-notification-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="desktop-notification"/>
- <vbox>
- <hbox>
- <label class="pref-title" value="&desktop-notification.label;"/>
- <label id="desktop-notification-default" class="pref-default" value="*"/>
- </hbox>
- <hbox>
- <menulist id="desktop-notification-menulist"
- class="pref-menulist"
- type="desktop-notification"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <menupopup>
- <menuitem id="desktop-notification-0" value="0" label="&permission.alwaysAsk;"/>
- <menuitem id="desktop-notification-1" value="1" label="&permission.allow;"/>
- <menuitem id="desktop-notification-2" value="2" label="&permission.block;"/>
- </menupopup>
- </menulist>
- <button id="desktop-notification-set-default"
- class="pref-set-default"
- label="&permission.default;"
- type="desktop-notification"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- </hbox>
- </vbox>
- </hbox>
-
- <!-- Addons Blocking -->
- <hbox id="install-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="install"/>
- <vbox>
- <hbox>
- <label class="pref-title" value="&install.label;"/>
- <label id="install-default" class="pref-default" value="*"/>
- </hbox>
- <hbox>
- <menulist id="install-menulist"
- class="pref-menulist"
- type="install"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <menupopup>
- <menuitem id="install-1" value="1" label="&permission.allow;"/>
- <menuitem id="install-2" value="2" label="&permission.block;"/>
- </menupopup>
- </menulist>
- <button id="install-set-default"
- class="pref-set-default"
- label="&permission.default;"
- type="install"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- </hbox>
- </vbox>
- </hbox>
-
- <!-- Geolocation -->
- <hbox id="geo-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="geo"/>
- <vbox>
- <hbox>
- <label class="pref-title" value="&geo.label;"/>
- <label id="geo-default" class="pref-default" value="*"/>
- </hbox>
- <hbox>
- <menulist id="geo-menulist"
- class="pref-menulist"
- type="geo"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <menupopup>
- <menuitem id="geo-0" value="0" label="&permission.alwaysAsk;"/>
- <menuitem id="geo-1" value="1" label="&permission.allow;"/>
- <menuitem id="geo-2" value="2" label="&permission.block;"/>
- </menupopup>
- </menulist>
- <button id="geo-set-default"
- class="pref-set-default"
- label="&permission.default;"
- type="geo"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- </hbox>
- </vbox>
- </hbox>
-
- <!-- IndexedDB Storage -->
- <hbox id="indexedDB-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="indexedDB"/>
- <vbox>
- <hbox>
- <label class="pref-title" value="&indexedDB.label;"/>
- <label id="indexedDB-default" class="pref-default" value="*"/>
- </hbox>
- <hbox>
- <menulist id="indexedDB-menulist"
- class="pref-menulist"
- type="indexedDB"
- oncommand="AboutPermissions.onPermissionCommand(event, false);">
- <menupopup>
- <menuitem id="indexedDB-0" value="0" label="&permission.alwaysAsk;"/>
- <menuitem id="indexedDB-1" value="1" label="&permission.allow;"/>
- <menuitem id="indexedDB-2" value="2" label="&permission.block;"/>
- </menupopup>
- </menulist>
- <button id="indexedDB-set-default"
- class="pref-set-default"
- label="&permission.default;"
- type="indexedDB"
- oncommand="AboutPermissions.onPermissionCommand(event, true);"/>
- </hbox>
- </vbox>
- </hbox>
-
- <!-- Opt-in activation of Plug-ins -->
- <hbox id="plugins-pref-item"
- class="pref-item" align="top">
- <image class="pref-icon" type="plugins"/>
- <vbox>
- <label class="pref-title" value="&plugins.label;"/>
- <vbox id="plugins-box"/>
- </vbox>
- </hbox>
- </vbox>
- </hbox>
-
-</page>
diff --git a/application/palemoon/components/preferences/cookies.js b/application/palemoon/components/preferences/cookies.js
index 4ef30d48e..4fa47ee4e 100644
--- a/application/palemoon/components/preferences/cookies.js
+++ b/application/palemoon/components/preferences/cookies.js
@@ -540,6 +540,8 @@ var gCookiesWindow = {
onCookieSelected: function () {
var properties, item;
var seln = this._tree.view.selection;
+ var hasRows = this._tree.view.rowCount > 0;
+ var hasSelection = seln.count > 0;
if (!this._view._filtered)
item = this._view._getItemAtIndex(seln.currentIndex);
else
@@ -570,7 +572,7 @@ var gCookiesWindow = {
removeSelectedCookies.label = PluralForm.get(selectedCookieCount, buttonLabel)
.replace("#1", selectedCookieCount);
- removeSelectedCookies.disabled = !(seln.count > 0);
+ removeSelectedCookies.disabled = !hasRows || !hasSelection;
},
performDeletion: function gCookiesWindow_performDeletion(deleteItems) {
@@ -786,7 +788,9 @@ var gCookiesWindow = {
this._view._invalidateCache(0);
this._view.selection.clearSelection();
- this._view.selection.select(0);
+ if (this._view.rowCount > 0) {
+ this._view.selection.select(0);
+ }
this._tree.treeBoxObject.invalidate();
this._tree.treeBoxObject.ensureRowIsVisible(0);
diff --git a/application/palemoon/components/preferences/jar.mn b/application/palemoon/components/preferences/jar.mn
index 798a2dae4..2e2949306 100644
--- a/application/palemoon/components/preferences/jar.mn
+++ b/application/palemoon/components/preferences/jar.mn
@@ -3,10 +3,6 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
browser.jar:
- content/browser/preferences/aboutPermissions.xul
- content/browser/preferences/aboutPermissions.js
- content/browser/preferences/aboutPermissions.css
- content/browser/preferences/aboutPermissions.xml
* content/browser/preferences/advanced.xul
* content/browser/preferences/advanced.js
content/browser/preferences/applications.xul
diff --git a/application/palemoon/components/preferences/privacy.js b/application/palemoon/components/preferences/privacy.js
index 18e38395d..05c2f9b8a 100644
--- a/application/palemoon/components/preferences/privacy.js
+++ b/application/palemoon/components/preferences/privacy.js
@@ -151,42 +151,6 @@ var gPrivacyPane = {
},
/**
- * Update the Tracking preferences based on controls.
- */
- setTrackingPrefs: function PPP_setTrackingPrefs()
- {
- let dntRadioGroup = document.getElementById("doNotTrackSelection"),
- dntValuePref = document.getElementById("privacy.donottrackheader.value"),
- dntEnabledPref = document.getElementById("privacy.donottrackheader.enabled");
-
- // if the selected radio button says "no preference", set on/off pref to
- // false and don't change the value pref.
- if (dntRadioGroup.selectedItem.value == -1) {
- dntEnabledPref.value = false;
- return dntValuePref.value;
- }
-
- dntEnabledPref.value = true;
- return dntRadioGroup.selectedItem.value;
- },
-
- /**
- * Obtain the tracking preference value and reflect it in the UI.
- */
- getTrackingPrefs: function PPP_getTrackingPrefs()
- {
- let dntValuePref = document.getElementById("privacy.donottrackheader.value"),
- dntEnabledPref = document.getElementById("privacy.donottrackheader.enabled");
-
- // if DNT is enbaled, select the value from the selected radio
- // button, otherwise choose the "no preference" radio button
- if (dntEnabledPref.value)
- return dntValuePref.value;
-
- return document.getElementById("dntnopref").value;
- },
-
- /**
* Update the private browsing auto-start pref and the history mode
* micro-management prefs based on the history mode menulist
*/
diff --git a/application/palemoon/components/preferences/privacy.xul b/application/palemoon/components/preferences/privacy.xul
index 057d549a9..bdb227c63 100644
--- a/application/palemoon/components/preferences/privacy.xul
+++ b/application/palemoon/components/preferences/privacy.xul
@@ -30,9 +30,6 @@
<preference id="privacy.donottrackheader.enabled"
name="privacy.donottrackheader.enabled"
type="bool"/>
- <preference id="privacy.donottrackheader.value"
- name="privacy.donottrackheader.value"
- type="int"/>
<!-- XXX button prefs -->
<preference id="pref.privacy.disable_button.cookie_exceptions"
@@ -239,17 +236,11 @@
<!-- Tracking -->
<tabpanel id="trackingPanel" orient="vertical">
- <radiogroup id="doNotTrackSelection" orient="vertical"
- preference="privacy.donottrackheader.value"
- onsynctopreference="return gPrivacyPane.setTrackingPrefs()"
- onsyncfrompreference="return gPrivacyPane.getTrackingPrefs()">
- <radio id="dntnotrack" value="1" label="&dntTrackingNotOkay.label2;"
- accesskey="&dntTrackingNotOkay.accesskey;" />
- <radio id="dntdotrack" value="0" label="&dntTrackingOkay.label2;"
- accesskey="&dntTrackingOkay.accesskey;" />
- <radio id="dntnopref" value="-1" label="&dntTrackingNopref.label2;"
- accesskey="&dntTrackingNopref.accesskey;" />
- </radiogroup>
+ <checkbox id="privacyDoNotTrackCheckbox"
+ label="&dntTrackingNotOkay.label2;"
+ accesskey="&dntTrackingNotOkay.accesskey;"
+ preference="privacy.donottrackheader.enabled"/>
+ <separator class="thin"/>
<label class="text-link" id="doNotTrackInfo"
href="https://www.mozilla.org/dnt"
value="&doNotTrackInfo.label;"/>
diff --git a/application/palemoon/components/preferences/security.xul b/application/palemoon/components/preferences/security.xul
index 43352b926..d3d321b16 100644
--- a/application/palemoon/components/preferences/security.xul
+++ b/application/palemoon/components/preferences/security.xul
@@ -43,8 +43,8 @@
<!-- Security Protocols -->
- <preference id="network.stricttransportsecurity.enabled"
- name="network.stricttransportsecurity.enabled"
+ <preference id="network.stricttransportsecurity.preloadlist"
+ name="network.stricttransportsecurity.preloadlist"
type="bool"/>
<preference id="security.cert_pinning.enforcement_level"
name="security.cert_pinning.enforcement_level"
@@ -137,7 +137,7 @@
<checkbox id="enableHSTS"
label="&enableHSTS.label;"
accesskey="&enableHSTS.accesskey;"
- preference="network.stricttransportsecurity.enabled" />
+ preference="network.stricttransportsecurity.preloadlist" />
<checkbox id="enableHPKP"
label="&enableHPKP.label;"
accesskey="&enableHPKP.accesskey;"