Commit 73e3b75d authored by Carsten Schoenert's avatar Carsten Schoenert
Browse files

New upstream version 91.1.1

parent 0b1d9f92
---
GECKO_BASE_REPOSITORY: https://hg.mozilla.org/mozilla-unified
GECKO_HEAD_REPOSITORY: https://hg.mozilla.org/releases/mozilla-esr91
GECKO_HEAD_REF: FIREFOX_91_1_0esr_BUILD1
GECKO_HEAD_REF: FIREFOX_91_1_0esr_RELEASE
GECKO_HEAD_REV: d015edeaf1a75b6bd672f9f9a413251482b715d6
### For comm-central
......
......@@ -624,11 +624,19 @@ function loadDialog(aItem) {
// Description
let editorElement = document.getElementById("item-description");
let editor = editorElement.getHTMLEditor(editorElement.contentWindow);
let link = editorElement.contentDocument.createElement("link");
link.rel = "stylesheet";
link.href = "chrome://messenger/content/messengercompose/EditorContent.css";
editorElement.contentDocument.head.appendChild(link);
try {
let checker = editor.getInlineSpellChecker(true);
checker.enableRealTimeSpell = Services.prefs.getBoolPref("mail.spellcheck.inline", true);
} catch (ex) {
// No dictionaries.
}
if (aItem.descriptionText) {
let docFragment = cal.view.textToHtmlDocumentFragment(
aItem.descriptionText,
......
......@@ -83,6 +83,7 @@ const { clearTimeout, requestIdleCallback, setTimeout } = ChromeUtils.import(
var NS_ERROR_MODULE_NETWORK = 2152398848;
var NS_ERROR_NET_TIMEOUT = NS_ERROR_MODULE_NETWORK + 14;
var NS_ERROR_NET_RESET = NS_ERROR_MODULE_NETWORK + 20;
var NS_ERROR_UNKNOWN_HOST = NS_ERROR_MODULE_NETWORK + 30;
var ScriptableInputStream = Components.Constructor(
"@mozilla.org/scriptableinputstream;1",
......@@ -455,7 +456,9 @@ var Socket = {
return;
}
this.disconnected = true;
if (aStatus == NS_ERROR_NET_RESET) {
// If the host cannot be resolved, reset the connection to attempt to
// reconnect.
if (aStatus == NS_ERROR_NET_RESET || aStatus == NS_ERROR_UNKNOWN_HOST) {
this.onConnectionReset();
} else if (aStatus == NS_ERROR_NET_TIMEOUT) {
this.onConnectionTimedOut();
......
......@@ -4,6 +4,7 @@
const EXPORTED_SYMBOLS = ["LDAPClient"];
var { CommonUtils } = ChromeUtils.import("resource://services-common/utils.js");
var { setTimeout } = ChromeUtils.import("resource://gre/modules/Timer.jsm");
var {
AbandonRequest,
......@@ -70,9 +71,9 @@ class LDAPClient {
* @param {string} service - The service host name to bind.
* @param {string} mechanism - The SASL mechanism to use, e.g. GSSAPI.
* @param {string} authModuleType - The auth module type, @see nsIMailAuthModule.
* @param {string} serverCredentials - The challenge token returned from the
* server, or emtpy string for the first request, must be used to generate a
* new request token.
* @param {ArrayBuffer} serverCredentials - The challenge token returned from
* the server, which must be used to generate a new request token. Or
* undefined for the first request.
* @param {Function} callback - Callback function when receiving BindResponse.
* @returns {number} The id of the sent request.
*/
......@@ -92,7 +93,18 @@ class LDAPClient {
null // password
);
}
let credentials = this._authModule.getNextToken(serverCredentials);
// getNextToken expects a base64 string.
let token = this._authModule.getNextToken(
serverCredentials
? btoa(
CommonUtils.arrayBufferToByteString(
new Uint8Array(serverCredentials)
)
)
: ""
);
// token is a base64 string, convert it to Uint8Array.
let credentials = CommonUtils.byteStringToArrayBuffer(atob(token));
let req = new BindRequest("", "", { mechanism, credentials });
return this._send(req, callback);
}
......@@ -109,7 +121,7 @@ class LDAPClient {
* @returns {number} The id of the sent request.
*/
search(dn, scope, filter, attributes, timeout, limit, callback) {
this._logger.debug(`Searching ${dn}`);
this._logger.debug(`Searching dn="${dn}" filter="${filter}"`);
let req = new SearchRequest(dn, scope, filter, attributes, timeout, limit);
return this._send(req, callback);
}
......@@ -176,7 +188,12 @@ class LDAPClient {
}
throw e;
}
this._logger.debug(`S: [${res.messageId}] ${res.constructor.name}`);
this._logger.debug(
`S: [${res.messageId}] ${res.constructor.name}`,
res.result.resultCode >= 0
? `resultCode=${res.result.resultCode} message="${res.result.diagnosticMessage}"`
: ""
);
let callback = this._callbackMap.get(res.messageId);
if (callback) {
callback(res);
......
......@@ -71,7 +71,7 @@ class BindRequest extends LDAPMessage {
* @param {string} password - The password.
* @param {Object} sasl - The SASL configs.
* @param {string} sasl.mechanism - The SASL mechanism e.g. sasl-gssapi.
* @param {string} sasl.credentials - The credential token for the request.
* @param {Uint8Array} sasl.credentials - The credential token for the request.
*/
constructor(dn, password, sasl) {
super();
......@@ -84,7 +84,7 @@ class BindRequest extends LDAPMessage {
valueHex: new TextEncoder().encode(sasl.mechanism),
}),
new asn1js.OctetString({
valueHex: new TextEncoder().encode(sasl.credentials),
valueHex: sasl.credentials,
}),
],
});
......@@ -488,9 +488,7 @@ class BindResponse extends LDAPResponse {
super.parse();
let serverSaslCredsBlock = this.protocolOp.valueBlock.value[3];
if (serverSaslCredsBlock) {
this.result.serverSaslCreds = new TextDecoder().decode(
serverSaslCredsBlock.valueBlock.valueHex
);
this.result.serverSaslCreds = serverSaslCredsBlock.valueBlock.valueHex;
}
}
}
......
......@@ -31,7 +31,7 @@ class LDAPOperation {
);
}
saslBind(service, mechanism, authModuleType, serverCredentials = "") {
saslBind(service, mechanism, authModuleType, serverCredentials) {
this._client.saslBind(
service,
mechanism,
......
......@@ -183,6 +183,10 @@ pref("extensions.webextOptionalPermissionPrompts", true);
// pinning checks.
pref("security.cert_pinning.enforcement_level", 1);
// Whether to use client certificates stored in OS certificate storage.
// This does not work for S/MIME. See bug 1726442.
pref("security.osclientcerts.autoload", false);
// Symmetric (can be overridden by individual extensions) update preferences.
// e.g.
// extensions.{GUID}.update.enabled
......
......@@ -826,7 +826,11 @@ function rebuildFilterList() {
listitem.setAttribute("label", filter.filterName);
// Set the listitem values to represent the current filter.
nameCell.setAttribute("value", filter.filterName);
enabledCell.setAttribute("checked", filter.enabled);
if (filter.enabled) {
enabledCell.setAttribute("checked", "true");
} else {
enabledCell.removeAttribute("checked");
}
listitem.setAttribute("aria-checked", filter.enabled);
listitem._filter = filter;
......
<?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/global.css" type="text/css"?>
<?xml-stylesheet href="chrome://global/content/commonDialog.css" type="text/css"?>
<?xml-stylesheet href="chrome://global/skin/commonDialog.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/themeableDialog.css" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://global/locale/commonDialog.dtd">
<window id="commonDialogWindow"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
aria-describedby="infoBody"
headerparent="dialogGrid"
lightweightthemes="true"
onunload="commonDialogOnUnload();">
<dialog id="commonDialog"
buttonpack="end">
<linkset>
<html:link rel="localization" href="branding/brand.ftl"/>
<html:link rel="localization" href="toolkit/global/commonDialog.ftl"/>
</linkset>
<script src="chrome://global/content/adjustableTitle.js"/>
<script src="chrome://global/content/commonDialog.js"/>
<script src="chrome://global/content/globalOverlay.js"/>
<script src="chrome://global/content/editMenuOverlay.js"/>
<script src="chrome://global/content/customElements.js"/>
<script src="chrome://messenger/content/dialogShadowDom.js"/>
<script>
/* eslint-disable no-undef */
document.addEventListener("DOMContentLoaded", function() {
commonDialogOnLoad();
});
</script>
<commandset id="selectEditMenuItems">
<command id="cmd_copy" oncommand="goDoCommand('cmd_copy')" disabled="true"/>
<command id="cmd_selectAll" oncommand="goDoCommand('cmd_selectAll')"/>
</commandset>
<popupset id="contentAreaContextSet">
<menupopup id="contentAreaContextMenu"
onpopupshowing="goUpdateCommand('cmd_copy')">
<menuitem id="context-copy"
label="&copyCmd.label;"
accesskey="&copyCmd.accesskey;"
command="cmd_copy"
disabled="true"/>
<menuitem id="context-selectall"
label="&selectAllCmd.label;"
accesskey="&selectAllCmd.accesskey;"
command="cmd_selectAll"/>
</menupopup>
</popupset>
<!-- The <div> was added in bug 1606617 to workaround bug 1614447 -->
<div xmlns="http://www.w3.org/1999/xhtml">
<div id="dialogGrid">
<div class="dialogRow" id="infoRow" hidden="hidden">
<div id="iconContainer">
<xul:image id="infoIcon"/>
</div>
<div id="infoContainer">
<xul:description id="infoTitle"/>
<xul:description id="infoBody" context="contentAreaContextMenu" noinitialfocus="true"/>
</div>
</div>
<div id="loginContainer" class="dialogRow" hidden="hidden">
<xul:label id="loginLabel" data-l10n-id="common-dialog-username" control="loginTextbox"/>
<input type="text" id="loginTextbox" dir="ltr"/>
</div>
<div id="password1Container" class="dialogRow" hidden="hidden">
<xul:label id="password1Label" data-l10n-id="common-dialog-password" control="password1Textbox"/>
<input type="password" id="password1Textbox" dir="ltr"/>
</div>
<div id="checkboxContainer" class="dialogRow" hidden="hidden">
<div/> <!-- spacer -->
<xul:checkbox id="checkbox" oncommand="Dialog.onCheckbox()"/>
</div>
</div>
</div>
</dialog>
</window>
......@@ -368,7 +368,6 @@ var DefaultController = {
case "cmd_editTemplateMsg":
case "cmd_openMessage":
case "button_print":
case "cmd_print":
case "cmd_viewPageSource":
case "cmd_reload":
case "cmd_applyFiltersToSelection":
......@@ -417,6 +416,14 @@ var DefaultController = {
return true;
}
return false;
case "cmd_print":
// We can't print messages unless they're being displayed, so enable
// printing only if exactly one message is selected and it is the
// message being displayed.
return (
gFolderDisplay.selectedCount == 1 &&
gFolderDisplay.selectedMessage == gMessageDisplay.displayedMessage
);
case "cmd_newMessage":
return CanComposeMessages();
case "cmd_viewAllHeader":
......
......@@ -11,7 +11,7 @@
<?xml-stylesheet href="chrome://messenger/skin/folderMenus.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/attachmentList.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/searchBox.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/customizableui/panelUI.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/panelUI.css" type="text/css"?>
<?xml-stylesheet href="chrome://calendar/skin/calendar.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/openpgp/inlineNotification.css" type="text/css"?>
......@@ -116,7 +116,7 @@
<script defer="defer" src="chrome://communicator/content/utilityOverlay.js"></script>
<script defer="defer" src="chrome://messenger/content/mailCore.js"></script>
<script defer="defer" src="chrome://messenger/content/quickFilterBar.js"></script>
<script defer="defer" src="chrome://messenger/content/customizableui/panelUI.js"></script>
<script defer="defer" src="chrome://messenger/content/panelUI.js"></script>
<script defer="defer" src="chrome://messenger/content/chat/toolbarbutton-badge-button.js"></script>
<script defer="defer" src="chrome://messenger/content/messenger-customization.js"></script>
#ifdef XP_MACOSX
......
......@@ -19,7 +19,7 @@
<?xml-stylesheet href="chrome://messenger/skin/folderMenus.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/attachmentList.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/searchBox.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/customizableui/panelUI.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/panelUI.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/input-fields.css" type="text/css"?>
<?xml-stylesheet href="chrome://messenger/skin/openpgp/inlineNotification.css" type="text/css"?>
......@@ -150,7 +150,7 @@
<script defer="defer" src="chrome://messenger/content/messenger-customization.js"></script>
<script defer="defer" src="chrome://messenger/content/customizable-toolbar.js"></script>
<!-- panelUI.js is for the appmenus. -->
<script defer="defer" src="chrome://messenger/content/customizableui/panelUI.js"></script>
<script defer="defer" src="chrome://messenger/content/panelUI.js"></script>
#ifdef XP_MACOSX
<script defer="defer" src="chrome://messenger/content/macMessengerMenu.js"></script>
<script defer="defer" src="chrome://global/content/macWindowMenu.js"></script>
......
......@@ -2075,11 +2075,26 @@
}
_setupEventListeners() {
this.addEventListener("blur", event => {
// Prevent deselecting a pill on blur if:
// - The related target is null (context menu was opened, bug 1729741).
// - The related target is another pill (multi selection and deslection
// are handled by the click event listener added on pill creation).
if (
!event.relatedTarget ||
event.relatedTarget.tagName == "mail-address-pill"
) {
return;
}
this.removeAttribute("selected");
});
this.emailInput.addEventListener("keypress", event => {
if (this.hasAttribute("disabled")) {
return;
}
this.finishEditing(event);
this.onEmailInputKeyPress(event);
});
// Disable the inbuilt autocomplete on blur as we handle it here.
......@@ -2150,10 +2165,8 @@
*
* @param {Event} event - The DOM Event.
*/
finishEditing(event = null) {
let key = event ? event.key : "Escape";
switch (key) {
onEmailInputKeyPress(event) {
switch (event.key) {
case "Escape":
this.emailInput.value = this.fullAddress;
this.resetPill();
......@@ -2483,27 +2496,6 @@
);
addressContainer.classList.remove("drag-address-container");
});
// We want to deselect pills when focus moves away from them. To simplify
// things, we listen to focusout event which bubbles from any element of
// the entire mail-recipients-area, including all pills.
this.addEventListener("focusout", event => {
// Return if focusout did not occur on a pill (nothing to deselect),
// if the element receiving focus is a pill (allow preserving selection),
// or if event.target remains the active element, i.e. focus was
// moved to another window (do nothing, preserve selection if any).
if (
event.target.tagName != "mail-address-pill" ||
event?.relatedTarget?.tagName == "mail-address-pill" ||
event.target == document.activeElement
) {
return;
}
// If focus moves out from pills, deselect all of them. Luckily,
// pill context menu does not trigger focusout on addressing area.
this.deselectAllPills();
});
}
/**
......@@ -2766,7 +2758,7 @@
!event.shiftKey
) {
if (!pill.hasAttribute("selected")) {
this.clearSelected();
this.deselectAllPills();
pill.setAttribute("selected", "selected");
}
this.removeSelectedPills();
......@@ -2806,18 +2798,6 @@
this.handleKeyPress(pill, event);
});
pill.addEventListener("contextmenu", event => {
if (pill.hasAttribute("disabled")) {
event.preventDefault();
return;
}
// Update the context menu options only if opened via the context menu
// keyboard button.
if (event.buttons == 0) {
emailAddressPillOnPopupShown();
}
});
element.closest(".address-container").insertBefore(pill, element);
// The emailInput attribute is accessible only after the pill has been
......@@ -2930,7 +2910,7 @@
if (!event.ctrlKey) {
// Unmodified navigation: select only first pill and focus it below.
// ### Todo: We can't handle Shift+Home yet, so it ends up here.
this.clearSelected();
this.deselectAllPills();
firstPill.setAttribute("selected", "selected");
}
firstPill.focus();
......@@ -3009,17 +2989,15 @@
* @param {Event} event - A DOM click or keypress Event.
*/
checkSelected(pill, event) {
if (pill.isEditing) {
return;
}
if (pill.hasAttribute("selected") && event.button == 2) {
emailAddressPillOnPopupShown();
// Interrupt if the pill is in edit mode or a right click was detected.
// Selecting pills on right click will be handled by the opening of the
// context menu.
if (pill.isEditing || event.button == 2) {
return;
}
if (!event.ctrlKey && !event.metaKey && event.key != " ") {
this.clearSelected();
this.deselectAllPills();
}
pill.toggleAttribute("selected");
......@@ -3028,12 +3006,6 @@
// (or a spacebar keypress), as macOS doesn't automatically move the focus
// on this custom element (bug 1645643, bug 1645916).
pill.focus();
// Update the options in the context menu only after the pills were
// selected and if the event was a right click.
if (event.button == 2) {
emailAddressPillOnPopupShown();
}
}
/**
......@@ -3064,7 +3036,7 @@
} else if (!event.ctrlKey) {
// Non-modified navigation keys must select the target pill and deselect
// all others. Also some other keys like Backspace from rowInput.
this.clearSelected();
this.deselectAllPills();
if (targetPill) {
targetPill.setAttribute("selected", "selected");
} else {
......@@ -3079,12 +3051,6 @@
}
}
clearSelected() {
for (let pill of this.getAllPills()) {
pill.removeAttribute("selected");
}
}
/**
* Trigger the pill.startEditing() method.
*
......
......@@ -4,6 +4,7 @@ messenger.jar:
% content messagebody %content/messagebody/ contentaccessible=yes
% content messenger %content/messenger/ contentaccessible=yes
% override chrome://messagebody/skin/messageBody.css chrome://messenger/skin/messageBody.css
% override chrome://global/content/commonDialog.xhtml chrome://messenger/content/commonDialog.xhtml
content/messenger/aboutAddonsExtra.css (content/aboutAddonsExtra.css)
content/messenger/aboutAddonsExtra.js (content/aboutAddonsExtra.js)
content/messenger/aboutDialog-appUpdater.js (content/aboutDialog-appUpdater.js)
......@@ -14,6 +15,7 @@ messenger.jar:
content/messenger/browserRequest.js (content/browserRequest.js)
content/messenger/browserRequest.xhtml (content/browserRequest.xhtml)
content/messenger/commandglue.js (content/commandglue.js)
content/messenger/commonDialog.xhtml (content/commonDialog.xhtml)
content/messenger/compactFoldersDialog.js (content/compactFoldersDialog.js)
content/messenger/compactFoldersDialog.xhtml (content/compactFoldersDialog.xhtml)
content/messenger/composerOverlay.css (content/composerOverlay.css)
......
......@@ -313,7 +313,6 @@ FetchHTTP.prototype = {
} catch (e) {
// In case .statusText throws (it's marked as [Throws] in the webidl),
// continue with empty errorStr.
console.error(e);
}
if (!errorStr) {
// If we can't resolve the hostname in DNS etc., .statusText is empty.
......@@ -330,7 +329,6 @@ FetchHTTP.prototype = {
try {
this._successCallback(this.result);
} catch (e) {
Cu.reportError(e);
e.stack = this._callStack;
this._error(e);
}
......@@ -352,7 +350,6 @@ FetchHTTP.prototype = {
}
} catch (e) {
// error in our fetchhttp._response() code
Cu.reportError(e);
this._error(e);
}
},
......
......@@ -781,7 +781,7 @@
<button id="addressBookLDAPButton" type="button"
data-l10n-id="account-setup-address-book-ldap-button"
class="quick-link"
onclick="addCardDAVAddressBook();">
onclick="addLDAPAddressBook();">
</button>
</section>
......
......@@ -155,7 +155,6 @@ if (!customElements.get("menulist")) {
this._directories.unshift(null);
let listItem = this.appendItem(this.getAttribute("none"), "");
listItem.setAttribute("class", "menuitem-iconic abMenuItem");
listItem.setAttribute("IsNone", "true");
}
if (this.hasAttribute("alladdressbooks")) {
......@@ -169,8 +168,10 @@ if (!customElements.get("menulist")) {
this._directories.unshift(null);
let listItem = this.appendItem(allABLabel, "moz-abdirectory://?");
listItem.setAttribute("class", "menuitem-iconic abMenuItem");
listItem.setAttribute("AddrBook", "true");
listItem.setAttribute("IsAllAB", "true");
listItem.setAttribute(
"image",
"chrome://messenger/skin/icons/address.svg"
);
}
// Now create menuitems for all displayed directories.
......@@ -186,16 +187,25 @@ if (!customElements.get("menulist")) {
// Style the items by type.
if (ab.isMailList) {
listItem.setAttribute("MailList", "true");
listItem.setAttribute(
"image",
"chrome://messenger/skin/icons/ablist.svg"
);
} else if (ab.isRemote && ab.isSecure) {
listItem.setAttribute(
"image",
"chrome://messenger/skin/icons/globe-secure.svg"
);
} else if (ab.isRemote) {
listItem.setAttribute(
"image",
"chrome://messenger/skin/icons/globe.svg"
);
} else {
listItem.setAttribute("AddrBook", "true");
}
if (ab.isRemote) {
listItem.setAttribute("IsRemote", "true");
}
if (ab.isSecure) {
listItem.setAttribute("IsSecure", "true");
listItem.setAttribute(
"image",
"chrome://messenger/skin/icons/address.svg"
);
}
}
......
......@@ -140,9 +140,12 @@ var gSendEncryptedInitial = false;
var gOptionalEncryption = false; // Only encrypt if possible. Ignored if !gSendEncrypted.
var gOptionalEncryptionInitial = false;
var gEncryptSubject = false;
var gUserTouchedSendEncrypted = false;
var gUserTouchedSendSigned = false;
var gUserTouchedAttachMyPubKey = false;
var gUserTouchedEncryptSubject = false;
var gIsRelatedToEncryptedOriginal = false;
var gIsRelatedToSignedOriginal = false;
......@@ -218,6 +221,9 @@ window.addEventListener("close", event => {
window.addEventListener("focus", event => {
EditorOnFocus();
});
window.addEventListener("click", event => {
composeWindowOnClick(event);
});