зеркало из https://github.com/mozilla/pjs.git
Fix for bug 79792. Added observers for ldap prefs. Added sessions list for all the
recipients. Added AddSession, RemoveSession and SyncSessions r=ducarroz, sr=hewitt, a=asa
This commit is contained in:
Родитель
a821a77707
Коммит
c5f6c14b8a
|
@ -48,6 +48,10 @@ var LDAPPrefsService = Components.classes[
|
||||||
LDAPPrefsService = LDAPPrefsService.QueryInterface(
|
LDAPPrefsService = LDAPPrefsService.QueryInterface(
|
||||||
Components.interfaces.nsILDAPPrefsService);
|
Components.interfaces.nsILDAPPrefsService);
|
||||||
|
|
||||||
|
var ldapSession = Components.classes[
|
||||||
|
"@mozilla.org/autocompleteSession;1?type=ldap"].createInstance().
|
||||||
|
QueryInterface(Components.interfaces.nsILDAPAutoCompleteSession);
|
||||||
|
|
||||||
var msgCompose = null;
|
var msgCompose = null;
|
||||||
var MAX_RECIPIENTS = 0;
|
var MAX_RECIPIENTS = 0;
|
||||||
var currentAttachment = null;
|
var currentAttachment = null;
|
||||||
|
@ -56,6 +60,8 @@ var contentChanged = false;
|
||||||
var currentIdentity = null;
|
var currentIdentity = null;
|
||||||
var defaultSaveOperation = "draft";
|
var defaultSaveOperation = "draft";
|
||||||
var sendOrSaveOperationInProgress = false;
|
var sendOrSaveOperationInProgress = false;
|
||||||
|
var isOffline = false;
|
||||||
|
var sessionAdded = false;
|
||||||
|
|
||||||
var gComposeMsgsBundle;
|
var gComposeMsgsBundle;
|
||||||
|
|
||||||
|
@ -563,7 +569,12 @@ var messageComposeOfflineObserver = {
|
||||||
Observe: function(subject, topic, state) {
|
Observe: function(subject, topic, state) {
|
||||||
// sanity checks
|
// sanity checks
|
||||||
if (topic != "network:offline-status-changed") return;
|
if (topic != "network:offline-status-changed") return;
|
||||||
MessageComposeOfflineStateChanged(state == "offline");
|
if (state == "offline")
|
||||||
|
isOffline = true;
|
||||||
|
else
|
||||||
|
isOffline = false;
|
||||||
|
MessageComposeOfflineStateChanged(isOffline);
|
||||||
|
setupLdapAutocompleteSession();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,8 +583,9 @@ function AddMessageComposeOfflineObserver()
|
||||||
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
|
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
|
||||||
observerService.AddObserver(messageComposeOfflineObserver, "network:offline-status-changed");
|
observerService.AddObserver(messageComposeOfflineObserver, "network:offline-status-changed");
|
||||||
|
|
||||||
|
isOffline = ioService.offline;
|
||||||
// set the initial state of the send button
|
// set the initial state of the send button
|
||||||
MessageComposeOfflineStateChanged(ioService.offline);
|
MessageComposeOfflineStateChanged(isOffline);
|
||||||
}
|
}
|
||||||
|
|
||||||
function RemoveMessageComposeOfflineObserver()
|
function RemoveMessageComposeOfflineObserver()
|
||||||
|
@ -601,6 +613,135 @@ function MessageComposeOfflineStateChanged(goingOffline)
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var directoryServerObserver = {
|
||||||
|
Observe: function(subject, topic, value) {
|
||||||
|
setupLdapAutocompleteSession();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function AddDirectoryServerObserver(flag) {
|
||||||
|
if (flag) {
|
||||||
|
prefs.addObserver("ldap_2.autoComplete.useDirectory", directoryServerObserver);
|
||||||
|
prefs.addObserver("ldap_2.autoComplete.directoryServer", directoryServerObserver);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var prefstring = "mail.identity." + currentIdentity.key + ".overrideGlobal_Pref";
|
||||||
|
prefs.addObserver(prefstring, directoryServerObserver);
|
||||||
|
prefstring = "mail.identity." + currentIdentity.key + ".directoryServer";
|
||||||
|
prefs.addObserver(prefstring, directoryServerObserver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function RemoveDirectoryServerObserver(prefstring)
|
||||||
|
{
|
||||||
|
if (!prefstring) {
|
||||||
|
prefs.removeObserver("ldap_2.autoComplete.useDirectory", directoryServerObserver);
|
||||||
|
prefs.removeObserver("ldap_2.autoComplete.directoryServer", directoryServerObserver);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var str = prefstring + ".overrideGlobal_Pref";
|
||||||
|
prefs.removeObserver(str, directoryServerObserver);
|
||||||
|
str = prefstring + ".directoryServer";
|
||||||
|
prefs.removeObserver(str, directoryServerObserver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupLdapAutocompleteSession()
|
||||||
|
{
|
||||||
|
var autocompleteLdap = false;
|
||||||
|
var autocompleteDirectory = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
autocompleteLdap = prefs.GetBoolPref(
|
||||||
|
"ldap_2.autoComplete.useDirectory");
|
||||||
|
if (autocompleteLdap)
|
||||||
|
autocompleteDirectory = prefs.CopyCharPref(
|
||||||
|
"ldap_2.autoComplete.directoryServer");
|
||||||
|
} catch(ex) {
|
||||||
|
dump("ERROR: " + ex + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(currentIdentity.overrideGlobalPref) {
|
||||||
|
autocompleteDirectory = currentIdentity.directoryServer;
|
||||||
|
}
|
||||||
|
if (autocompleteDirectory && !isOffline) {
|
||||||
|
|
||||||
|
if (ldapSession) {
|
||||||
|
if (!sessionAdded) {
|
||||||
|
// add session for all the recipients
|
||||||
|
for (var i=1; i <= MAX_RECIPIENTS; i++)
|
||||||
|
document.getElementById("msgRecipient#" + i).addSession(ldapSession);
|
||||||
|
sessionAdded = true;
|
||||||
|
}
|
||||||
|
var serverURL = Components.classes[
|
||||||
|
"@mozilla.org/network/ldap-url;1"].
|
||||||
|
createInstance().QueryInterface(
|
||||||
|
Components.interfaces.nsILDAPURL);
|
||||||
|
|
||||||
|
try {
|
||||||
|
serverURL.spec = prefs.CopyCharPref(autocompleteDirectory +
|
||||||
|
".uri");
|
||||||
|
} catch (ex) {
|
||||||
|
dump("ERROR: " + ex + "\n");
|
||||||
|
}
|
||||||
|
ldapSession.serverURL = serverURL;
|
||||||
|
|
||||||
|
// don't search on strings shorter than this
|
||||||
|
//
|
||||||
|
try {
|
||||||
|
ldapSession.minStringLength = prefs.GetIntPref(
|
||||||
|
autocompleteDirectory + ".autoComplete.minStringLength");
|
||||||
|
} catch (ex) {
|
||||||
|
// if this pref isn't there, no big deal. just let
|
||||||
|
// nsLDAPAutoCompleteSession use its default.
|
||||||
|
}
|
||||||
|
|
||||||
|
// override autocomplete entry formatting?
|
||||||
|
//
|
||||||
|
try {
|
||||||
|
ldapSession.outputFormat =
|
||||||
|
prefs.CopyUnicharPref(autocompleteDirectory +
|
||||||
|
".autoComplete.outputFormat");
|
||||||
|
} catch (ex) {
|
||||||
|
// if this pref isn't there, no big deal. just let
|
||||||
|
// nsLDAPAutoCompleteSession use its default.
|
||||||
|
}
|
||||||
|
|
||||||
|
// override default search filter template?
|
||||||
|
//
|
||||||
|
try {
|
||||||
|
ldapSession.filterTemplate = prefs.CopyUnicharPref(
|
||||||
|
autocompleteDirectory + ".autoComplete.filterTemplate");
|
||||||
|
} catch (ex) {
|
||||||
|
// if this pref isn't there, no big deal. just let
|
||||||
|
// nsLDAPAutoCompleteSession use its default
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// override default maxHits (currently 100)
|
||||||
|
//
|
||||||
|
try {
|
||||||
|
// XXXdmose should really use .autocomplete.maxHits,
|
||||||
|
// but there's no UI for that yet
|
||||||
|
//
|
||||||
|
ldapSession.maxHits =
|
||||||
|
prefs.GetIntPref(autocompleteDirectory + ".maxHits");
|
||||||
|
} catch (ex) {
|
||||||
|
// if this pref isn't there, or is out of range, no big deal.
|
||||||
|
// just let nsLDAPAutoCompleteSession use its default.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ldapSession && sessionAdded) {
|
||||||
|
for (var i=1; i <= MAX_RECIPIENTS; i++)
|
||||||
|
document.getElementById("msgRecipient#" + i).removeSession(ldapSession);
|
||||||
|
sessionAdded = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function DoCommandClose()
|
function DoCommandClose()
|
||||||
{
|
{
|
||||||
var retVal;
|
var retVal;
|
||||||
|
@ -713,6 +854,7 @@ function ComposeFieldsReady(msgType)
|
||||||
}
|
}
|
||||||
|
|
||||||
CompFields2Recipients(msgCompose.compFields, msgCompose.type);
|
CompFields2Recipients(msgCompose.compFields, msgCompose.type);
|
||||||
|
setupLdapAutocompleteSession();
|
||||||
SetComposeWindowTitle(13);
|
SetComposeWindowTitle(13);
|
||||||
AdjustFocus();
|
AdjustFocus();
|
||||||
try {
|
try {
|
||||||
|
@ -914,6 +1056,7 @@ function WizCallback(state)
|
||||||
function ComposeLoad()
|
function ComposeLoad()
|
||||||
{
|
{
|
||||||
AddMessageComposeOfflineObserver();
|
AddMessageComposeOfflineObserver();
|
||||||
|
AddDirectoryServerObserver(true);
|
||||||
|
|
||||||
if (msgComposeService)
|
if (msgComposeService)
|
||||||
msgComposeService.TimeStamp("Start Initializing the compose window (ComposeLoad)", false);
|
msgComposeService.TimeStamp("Start Initializing the compose window (ComposeLoad)", false);
|
||||||
|
@ -961,6 +1104,8 @@ function ComposeUnload()
|
||||||
{
|
{
|
||||||
dump("\nComposeUnload from XUL\n");
|
dump("\nComposeUnload from XUL\n");
|
||||||
RemoveMessageComposeOfflineObserver();
|
RemoveMessageComposeOfflineObserver();
|
||||||
|
RemoveDirectoryServerObserver(null);
|
||||||
|
RemoveDirectoryServerObserver("mail.identity." + currentIdentity.key);
|
||||||
msgCompose.UnregisterStateListener(stateListener);
|
msgCompose.UnregisterStateListener(stateListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1786,7 +1931,7 @@ function LoadIdentity(startup)
|
||||||
{
|
{
|
||||||
var identityElement = document.getElementById("msgIdentity");
|
var identityElement = document.getElementById("msgIdentity");
|
||||||
var prevIdentity = currentIdentity;
|
var prevIdentity = currentIdentity;
|
||||||
|
|
||||||
if (identityElement) {
|
if (identityElement) {
|
||||||
var item = identityElement.selectedItem;
|
var item = identityElement.selectedItem;
|
||||||
var idKey = item.getAttribute('id');
|
var idKey = item.getAttribute('id');
|
||||||
|
@ -1794,6 +1939,8 @@ function LoadIdentity(startup)
|
||||||
|
|
||||||
if (!startup && prevIdentity && idKey != prevIdentity.key)
|
if (!startup && prevIdentity && idKey != prevIdentity.key)
|
||||||
{
|
{
|
||||||
|
var prefstring = "mail.identity." + prevIdentity.key;
|
||||||
|
RemoveDirectoryServerObserver(prefstring);
|
||||||
var prevReplyTo = prevIdentity.replyTo;
|
var prevReplyTo = prevIdentity.replyTo;
|
||||||
var prevBcc = "";
|
var prevBcc = "";
|
||||||
if (prevIdentity.bccSelf)
|
if (prevIdentity.bccSelf)
|
||||||
|
@ -1853,82 +2000,9 @@ function LoadIdentity(startup)
|
||||||
var start = emailAddr.lastIndexOf("@");
|
var start = emailAddr.lastIndexOf("@");
|
||||||
session.defaultDomain = emailAddr.slice(start + 1, emailAddr.length);
|
session.defaultDomain = emailAddr.slice(start + 1, emailAddr.length);
|
||||||
}
|
}
|
||||||
var autocompleteLdap = false;
|
AddDirectoryServerObserver(false);
|
||||||
var autocompleteDirectory = null;
|
if (!startup)
|
||||||
try {
|
setupLdapAutocompleteSession();
|
||||||
autocompleteLdap = prefs.GetBoolPref("ldap_2.autoComplete.useDirectory");
|
|
||||||
if (autocompleteLdap)
|
|
||||||
autocompleteDirectory = prefs.CopyCharPref("ldap_2.autoComplete.directoryServer");
|
|
||||||
}
|
|
||||||
catch(ex) {dump("ERROR: " + ex + "\n");}
|
|
||||||
if(currentIdentity.overrideGlobalPref)
|
|
||||||
{
|
|
||||||
autocompleteDirectory = currentIdentity.directoryServer;
|
|
||||||
}
|
|
||||||
if (autocompleteDirectory)
|
|
||||||
{
|
|
||||||
document.getElementById('msgRecipient#1').setAttribute("searchSessions", "addrbook ldap");
|
|
||||||
var session2 = Components.classes["@mozilla.org/autocompleteSession;1?type=ldap"].getService(Components.interfaces.nsILDAPAutoCompleteSession);
|
|
||||||
if (session2)
|
|
||||||
{
|
|
||||||
var serverURL = Components.classes[
|
|
||||||
"@mozilla.org/network/ldap-url;1"].
|
|
||||||
createInstance().QueryInterface(
|
|
||||||
Components.interfaces.nsILDAPURL);
|
|
||||||
|
|
||||||
try {
|
|
||||||
serverURL.spec = prefs.CopyCharPref(autocompleteDirectory + ".uri");
|
|
||||||
} catch (ex) {dump("ERROR: " + ex + "\n");}
|
|
||||||
session2.serverURL = serverURL;
|
|
||||||
|
|
||||||
// don't search on strings shorter than this
|
|
||||||
//
|
|
||||||
try {
|
|
||||||
session2.minStringLength =
|
|
||||||
prefs.GetIntPref(autocompleteDirectory +
|
|
||||||
".autoComplete.minStringLength");
|
|
||||||
} catch (ex) {
|
|
||||||
// if this pref isn't there, no big deal. just let
|
|
||||||
// nsLDAPAutoCompleteSession use its default.
|
|
||||||
}
|
|
||||||
|
|
||||||
// override autocomplete entry formatting?
|
|
||||||
//
|
|
||||||
try {
|
|
||||||
session2.outputFormat =
|
|
||||||
prefs.CopyUnicharPref(autocompleteDirectory +
|
|
||||||
".autoComplete.outputFormat");
|
|
||||||
} catch (ex) {
|
|
||||||
// if this pref isn't there, no big deal. just let
|
|
||||||
// nsLDAPAutoCompleteSession use its default.
|
|
||||||
}
|
|
||||||
|
|
||||||
// override default search filter template?
|
|
||||||
//
|
|
||||||
try {
|
|
||||||
session2.filterTemplate =
|
|
||||||
prefs.CopyUnicharPref(autocompleteDirectory +
|
|
||||||
".autoComplete.filterTemplate");
|
|
||||||
} catch (ex) {
|
|
||||||
// if this pref isn't there, no big deal. just let
|
|
||||||
// nsLDAPAutoCompleteSession use its default
|
|
||||||
}
|
|
||||||
|
|
||||||
// override default maxHits (currently 100)
|
|
||||||
//
|
|
||||||
try {
|
|
||||||
// XXXdmose should really use .autocomplete.maxHits,
|
|
||||||
// but there's no UI for that yet
|
|
||||||
//
|
|
||||||
session2.maxHits =
|
|
||||||
prefs.GetIntPref(autocompleteDirectory +
|
|
||||||
".maxHits");
|
|
||||||
} catch (ex) {
|
|
||||||
// if this pref isn't there, or is out of range, no big deal.
|
|
||||||
// just let nsLDAPAutoCompleteSession use its default.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -430,6 +430,9 @@ function awAppendNewRow(setFocus)
|
||||||
input[0].setAttribute("value", "");
|
input[0].setAttribute("value", "");
|
||||||
input[0].setAttribute("id", "msgRecipient#" + top.MAX_RECIPIENTS);
|
input[0].setAttribute("id", "msgRecipient#" + top.MAX_RECIPIENTS);
|
||||||
|
|
||||||
|
//this copies the autocomplete sessions list from recipient#1
|
||||||
|
input[0].syncSessions(document.getElementById('msgRecipient#1'));
|
||||||
|
|
||||||
// We always clone the first row. The problem is that the first row
|
// We always clone the first row. The problem is that the first row
|
||||||
// could be focused. When we clone that row, we end up with a cloned
|
// could be focused. When we clone that row, we end up with a cloned
|
||||||
// XUL textbox that has a focused attribute set. Therefore we think
|
// XUL textbox that has a focused attribute set. Therefore we think
|
||||||
|
|
|
@ -326,6 +326,47 @@
|
||||||
]]></body>
|
]]></body>
|
||||||
</method>
|
</method>
|
||||||
|
|
||||||
|
<!-- add a session by reference -->
|
||||||
|
<method name="addSession">
|
||||||
|
<parameter name="aSession"/>
|
||||||
|
<body><![CDATA[
|
||||||
|
++this.sessionCount;
|
||||||
|
var name = "anon_"+this.sessionCount;
|
||||||
|
this.mSessions[name] = aSession;
|
||||||
|
this.mListeners[name] = new (this.mAutoCompleteListener)(name);
|
||||||
|
]]></body>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!-- remove a session by reference -->
|
||||||
|
<method name="removeSession">
|
||||||
|
<parameter name="aSession"/>
|
||||||
|
<body><![CDATA[
|
||||||
|
for (var name in this.mSessions) {
|
||||||
|
if (this.mSessions[name] == aSession) {
|
||||||
|
delete this.mSessions[name];
|
||||||
|
delete this.mListeners[name];
|
||||||
|
--this.sessionCount;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]></body>
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!-- make this widget listen to all of the same autocomplete sessions
|
||||||
|
from another autocomplete widget -->
|
||||||
|
<method name="syncSessions">
|
||||||
|
<parameter name="aCopyFrom"/>
|
||||||
|
<body><![CDATA[
|
||||||
|
this.sessionCount = aCopyFrom.sessionCount;
|
||||||
|
this.mSessions = {};
|
||||||
|
this.mListeners = {};
|
||||||
|
for (var name in aCopyFrom.mSessions) {
|
||||||
|
this.mSessions[name] = aCopyFrom.mSessions[name];
|
||||||
|
this.mListeners[name] = new (this.mAutoCompleteListener)(name);
|
||||||
|
}
|
||||||
|
]]></body>
|
||||||
|
</method>
|
||||||
|
|
||||||
<!-- get the first session that has results -->
|
<!-- get the first session that has results -->
|
||||||
<method name="getDefaultSession">
|
<method name="getDefaultSession">
|
||||||
<body><![CDATA[
|
<body><![CDATA[
|
||||||
|
|
Загрузка…
Ссылка в новой задаче