releases-comm-central/mailnews/jsaccount
Sean Burke ac9d5b1490 Bug 1888569 - Only include headers as needed. r=darktrojan
Differential Revision: https://phabricator.services.mozilla.com/D212592

--HG--
extra : rebase_source : a3cd8b6adb9f2e215e6228e922ea52ee199471d3
extra : amend_source : bc6be7a8dee1a5cbe6b6b45074c1c8f9b30a4eaf
2024-06-05 17:20:38 +00:00
..
modules Bug 1824260 - esmify mailnews/. r=freaktechnik 2024-03-12 17:01:01 +02:00
public Bug 1794250 - remove msgJsAccountCID.h. r=benc 2022-10-25 13:47:20 +11:00
src Bug 1888569 - Only include headers as needed. r=darktrojan 2024-06-05 17:20:38 +00:00
test Bug 1886948 - Part 3: AutoFix for ./mailnews directory. r=mkmelin 2024-03-22 19:12:04 +00:00
moz.build Bug 1824260 - esmify mailnews/. r=freaktechnik 2024-03-12 17:01:01 +02:00
readme.html Bug 1834327 - Port bug 1826063: Automatic HTML prettier fixes (mailnews/). r=aleca 2023-05-31 22:33:22 +00: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,
      "@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>