releases-comm-central/mailnews/jsaccount
Martin Giger ea05927888 Bug 1792869 - Convert XPCOMUtils imports to esm in mailnews/. r=mkmelin
Differential Revision: https://phabricator.services.mozilla.com/D159063

--HG--
extra : rebase_source : 332a690910fc8c17ac702d3af4e3693faede08e0
extra : amend_source : cd0bb3cabc7d2322bec1024b82f5fd89b5fe6899
2022-10-12 21:41:55 +11:00
..
modules Bug 1769595 - Port bug 1514936 - Get rid of support for aggregated components. r=#thunderbird-reviewers,john.bieling 2022-05-17 12:42:24 +12:00
public Bug 1672798 - Run black formatting on mozbuild and mozconfigure files. r=mkmelin 2020-10-30 14:28:33 -04:00
src Bug 1773772 part 14 - Convert JS account binary components registration to components.conf. r=freaktechnik 2022-07-04 17:00:27 +12:00
test Bug 1792869 - Convert XPCOMUtils imports to esm in mailnews/. r=mkmelin 2022-10-12 21:41:55 +11:00
moz.build Bug 1672798 - Run black formatting on mozbuild and mozconfigure files. r=mkmelin 2020-10-30 14:28:33 -04:00
readme.html Bug 430716 - part 1, Use mailnews url override as initial conceptual demo of JsAccount, r=jorgk 2016-04-19 16:47:56 -07:00

readme.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>JsAccount Usage and Architecture</title>
  </head>
  <body>
    <h1>Overview</h1>
    <p>JsAccount is a technology that allows message account types to be created
      in Mozilla Mailnews code using JavaScript. Although this is primarily
      targeted at allowing extensions to create new accounts, it might also be
      useful as a bridge to convert existing account types from being C++ based
      to JavaScript based.</p>
    <h2>Existing C++-based architecture of mailnews accounts</h2>
    <p>In mailnews code, an account type is a set of classes that allow
      implementation of a messaging particular protocol. The account type is
      given a short string identifier ("imap", "news", "pop3") and is then used
      to create objects of the appropriate type by appending that string to the
      end of a base XPCOM contractID. So, for example, to create an imap server,
      you generate a contractID using a base ID,
      NS_MSGINCOMINGSERVER_CONTRACTID_PREFIX
      "@mozilla.org/messenger/server;1?type=", then append "imap" to get:</p>
    <p>@mozilla.org/messenger/server;1?type=imap</p>
    <p>In the C++ code, there is a base object implementing shared
      functionality. An account-specific class inherits that base functionality,
      then extends it to represent the account-specific behavior that is needed.
      This same basic concept is used to represent a whole series of classes
      that are necessary to implement a specific mailnews account type.</p>
    <p>For the server example, there is a base class named
      nsMsgIncomingServer.cpp that implements that base interface
      nsIMsgIncomingServer.idl. For imap, there is a specific class
      nsImapIncomingServer.cpp that inherits from nsMsgIncomingServer.cpp,
      overrides some of the methods in nsIMsgIncomingServer.idl, and also
      implements an imap-specific interface nsIImapIncomingServer.idl. All of
      this works fine using C++ inheritance and polymorphism.</p>
    <p>Although JsAccount is intended mostly for mailnews accounts, the same
      basic method of using a base class extended for specific types is also used
      in other ways in mailnews code, including for addressbook types and views.
      The technology may also be applied to those other object types as well.</p>
    <h2>Role of JsAccount</h2>
    <p>The JavaScript class system works very differently than the C++ system,
      and you cannot use normal language constructs to override a C++ class with
      a JavaScript class. What JsAccount allows you to do is to create XPCOM
      objects in JavaScript, and use those objects to override or extend the
      methods from the C++ base class in a way that will function correctly
      whether those objects are executed from within C++ code or JavaScript
      code. This allows you to create a new account using JavaScript code, while
      using the same base class functionality that is used by the core C++
      account types. Thus a new account type may be created in JavaScript-based
      extension. The technology may also be used to create JavaScript
      versions of existing account types in an incremental manner, slowly
      converting methods from C++ to JavaScript.</p>
    <p><br>
    </p>
  </body>
</html>