From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../imap/src/ImapFolderContentHandler.sys.mjs | 71 ++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 comm/mailnews/imap/src/ImapFolderContentHandler.sys.mjs (limited to 'comm/mailnews/imap/src/ImapFolderContentHandler.sys.mjs') diff --git a/comm/mailnews/imap/src/ImapFolderContentHandler.sys.mjs b/comm/mailnews/imap/src/ImapFolderContentHandler.sys.mjs new file mode 100644 index 0000000000..da33c08829 --- /dev/null +++ b/comm/mailnews/imap/src/ImapFolderContentHandler.sys.mjs @@ -0,0 +1,71 @@ +/* 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/. */ + +import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; + +const { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); + +const lazy = {}; +XPCOMUtils.defineLazyModuleGetters(lazy, { + MailUtils: "resource:///modules/MailUtils.jsm", +}); + +/** + * A service for handling content type x-application-imapfolder; + * that is, opening IMAP folder URLs. + * + * Set mailnews.imap.jsmodule to true to use this module. + * + * @implements {nsIContentHandler} + */ +export class ImapFolderContentHandler { + QueryInterface = ChromeUtils.generateQI(["nsIContentHandler"]); + + /** + * @param contentType - The content type of request. + * @param windowContest - Window context, used to get things like the current + * nsIDOMWindow for this request. + * @param request - A request whose content type is already known. + * @see {nsIContentHandler} + */ + handleContent(contentType, windowContext, request) { + if (contentType != "x-application-imapfolder") { + throw Components.Exception( + `Won't handle ${contentType}`, + Cr.NS_ERROR_WONT_HANDLE_CONTENT + ); + } + request = request.QueryInterface(Ci.nsIChannel); + + let imapFolderURL = Services.io.unescapeString( + request.URI.spec, + Ci.nsINetUtil.ESCAPE_URL_PATH + ); + + if (Services.wm.getMostRecentWindow("mail:3pane")) { + // Clicked IMAP folder URL in the window. + let folder = MailServices.folderLookup.getFolderForURL(imapFolderURL); + if (folder) { + lazy.MailUtils.displayFolderIn3Pane(folder.URI); + } else { + folder = + MailServices.folderLookup.getOrCreateFolderForURL(imapFolderURL); + // TODO: ask and maybe subscribe, like + // https://searchfox.org/comm-central/rev/1dd06be9d6c1178a34e6c28db03161e07e97d98c/mailnews/imap/src/nsImapService.cpp#2471-2534 + dump(`Maybe subscribe to folder ${folder.URI}\n`); + } + } else { + // Got IMAP folder URL from command line (most likely). + Cc["@mozilla.org/messenger/windowservice;1"] + .getService(Ci.nsIMessengerWindowService) + .openMessengerWindowWithUri("mail:3pane", imapFolderURL, -1); + } + } +} + +ImapFolderContentHandler.prototype.classID = Components.ID( + "{d927a82f-2d15-4972-ab88-6d84601aae68}" +); -- cgit v1.2.3