Bug 595654 - MultiMessageSummary and ThreadSummary should ensure multimessageview.xhtml is loaded before proceeding; r=protz
This commit is contained in:
Родитель
5d7a86492f
Коммит
2407b20a5b
|
@ -51,6 +51,7 @@ Components.utils.import("resource:///modules/errUtils.js");
|
|||
Components.utils.import("resource:///modules/IOUtils.js");
|
||||
Components.utils.import("resource:///modules/mailnewsMigrator.js");
|
||||
Components.utils.import("resource:///modules/sessionStoreManager.js");
|
||||
Components.utils.import("resource:///modules/summaryFrameManager.js");
|
||||
Components.utils.import("resource:///modules/mailInstrumentation.js");
|
||||
|
||||
/* This is where functions related to the 3 pane window are kept */
|
||||
|
@ -88,6 +89,9 @@ var gNewAccountToLoad = null;
|
|||
|
||||
var gDisplayStartupPage = false;
|
||||
|
||||
// The object in charge of managing the mail summary pane
|
||||
var gSummaryFrameManager;
|
||||
|
||||
// the folderListener object
|
||||
var folderListener = {
|
||||
OnItemAdded: function(parentItem, item) { },
|
||||
|
@ -411,6 +415,11 @@ function OnLoadMessenger()
|
|||
specialTabs.openSpecialTabsOnStartup();
|
||||
tabmail.registerTabType(webSearchTabType);
|
||||
|
||||
// Set up the summary frame manager to handle loading pages in the
|
||||
// multi-message pane
|
||||
gSummaryFrameManager = new SummaryFrameManager(
|
||||
document.getElementById("multimessage"));
|
||||
|
||||
window.addEventListener("AppCommand", HandleAppCommandEvent, true);
|
||||
}
|
||||
|
||||
|
|
|
@ -226,10 +226,15 @@ MultiMessageSummary.prototype = {
|
|||
return senderName;
|
||||
},
|
||||
|
||||
summarize: function() {
|
||||
const URL = "chrome://messenger/content/multimessageview.xhtml";
|
||||
gSummaryFrameManager.loadAndCallback(URL, this._onLoad.bind(this));
|
||||
},
|
||||
|
||||
/**
|
||||
* Fill in the summary pane describing the selected messages
|
||||
**/
|
||||
summarize: function() {
|
||||
_onLoad: function() {
|
||||
let htmlpane = document.getElementById('multimessage');
|
||||
// First, we group the messages in threads.
|
||||
// count threads
|
||||
|
@ -542,7 +547,7 @@ function ThreadSummary(aMessages, aListener)
|
|||
ThreadSummary.prototype = {
|
||||
__proto__: MultiMessageSummary.prototype,
|
||||
|
||||
summarize: function() {
|
||||
_onLoad: function() {
|
||||
this._msgNodes = {};
|
||||
|
||||
let htmlpane = document.getElementById('multimessage');
|
||||
|
|
|
@ -53,6 +53,7 @@ EXTRA_JS_MODULES = \
|
|||
searchSpec.js \
|
||||
MsgHdrSyntheticView.js \
|
||||
sessionStoreManager.js \
|
||||
summaryFrameManager.js \
|
||||
mailMigrator.js \
|
||||
mailInstrumentation.js \
|
||||
glodaWebSearch.js \
|
||||
|
|
|
@ -0,0 +1,120 @@
|
|||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is summary frame manager
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* the Mozilla Foundation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2009-2011
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* David Ascher <dascher@mozillamessaging.com>
|
||||
* Jim Porter <squibblyflabbetydoo@gmail.com>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
const EXPORTED_SYMBOLS = ["SummaryFrameManager"];
|
||||
|
||||
/**
|
||||
* The SummaryFrameManager manages the source attribute of iframes which can
|
||||
* be multi-purposed. For example, the thread/multimessage summary and the
|
||||
* folder summary both use it. The SummaryFrameManager takes care of
|
||||
* causing the content file to be reloaded as necessary, and manages event
|
||||
* handlers, so that the right callback is called when the specified
|
||||
* document is loaded.
|
||||
*
|
||||
* @param aFrame the iframe that we're managing
|
||||
*/
|
||||
function SummaryFrameManager(aFrame) {
|
||||
this.iframe = aFrame;
|
||||
this.iframe.addEventListener("DOMContentLoaded", this._onLoad.bind(this),
|
||||
true);
|
||||
this.pendingCallback = null;
|
||||
this.callback = null;
|
||||
this.url = "";
|
||||
}
|
||||
|
||||
SummaryFrameManager.prototype = {
|
||||
/**
|
||||
* Clear the summary frame.
|
||||
*/
|
||||
clear: function() {
|
||||
this.loadAndCallback("about:blank");
|
||||
},
|
||||
|
||||
/**
|
||||
* Load the specified URL if necessary, and cause the specified callback to be
|
||||
* called either when the document is loaded, or immediately if the document
|
||||
* is already loaded.
|
||||
*
|
||||
* @param aUrl the URL to load
|
||||
* @param aCallback the callback to run when the URL has loaded; this function
|
||||
* is passed a single boolean indicating if the URL was changed
|
||||
*/
|
||||
loadAndCallback: function(aUrl, aCallback) {
|
||||
this.url = aUrl;
|
||||
if (this.iframe.contentDocument.location.href != aUrl) {
|
||||
// We're changing the document. Stash the callback that we want to call
|
||||
// when it's done loading
|
||||
this.pendingCallback = aCallback;
|
||||
this.callback = null; // clear it
|
||||
this.iframe.contentDocument.location.href = aUrl;
|
||||
}
|
||||
else {
|
||||
// We're being called, but the document has been set already -- either
|
||||
// we've already received the DOMContentLoaded event, in which case we can
|
||||
// just call the callback directly, or we're still loading in which case
|
||||
// we should just wait for the dom event handler, but update the callback.
|
||||
|
||||
if (!this.pendingCallback) {
|
||||
this.callback = aCallback;
|
||||
if (this.callback) {
|
||||
this.callback(false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
this.pendingCallback = aCallback;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_onLoad: function(event) {
|
||||
try {
|
||||
// Make sure we're responding to the summary frame being loaded, and not
|
||||
// some subnode.
|
||||
if (event.originalTarget != this.iframe.contentDocument)
|
||||
return;
|
||||
|
||||
this.callback = this.pendingCallback;
|
||||
this.pendingCallback = null;
|
||||
if (this.callback)
|
||||
this.callback(true);
|
||||
}
|
||||
catch (e) {
|
||||
Components.utils.reportError(e);
|
||||
}
|
||||
}
|
||||
};
|
|
@ -574,6 +574,7 @@ regxpcom.exe
|
|||
modules/quickFilterManager.js
|
||||
modules/searchSpec.js
|
||||
modules/sessionStoreManager.js
|
||||
modules/summaryFrameManager.js
|
||||
modules/templateUtils.js
|
||||
modules/traceHelper.js
|
||||
modules/utils.js
|
||||
|
|
Загрузка…
Ссылка в новой задаче