Bug-1562313 - Convert javascript components from chat to static registration. r=mkmelin draft
authorKhushil Mistry <khushil324@gmail.com>
Sat, 09 Nov 2019 02:16:29 +0530
changeset 81042 9460d3d076b9e6e451dc2e29e18e5f91d82aa98a
parent 81035 c9940c8a906127b111583461c97825cb4b1e247e
child 81043 20a2de6e1573db31a36b1ef101193833269ca044
push id9742
push userkhushil324@gmail.com
push dateFri, 08 Nov 2019 20:46:51 +0000
treeherdertry-comm-central@20a2de6e1573 [default view] [failures only]
reviewersmkmelin
bugs1562313
Bug-1562313 - Convert javascript components from chat to static registration. r=mkmelin
chat/components/src/components.conf
chat/components/src/imAccounts.js
chat/components/src/imAccounts.jsm
chat/components/src/imAccounts.manifest
chat/components/src/imCommands.js
chat/components/src/imCommands.jsm
chat/components/src/imCommands.manifest
chat/components/src/imContacts.js
chat/components/src/imContacts.jsm
chat/components/src/imContacts.manifest
chat/components/src/imConversations.js
chat/components/src/imConversations.jsm
chat/components/src/imConversations.manifest
chat/components/src/imCore.js
chat/components/src/imCore.jsm
chat/components/src/imCore.manifest
chat/components/src/logger.js
chat/components/src/logger.jsm
chat/components/src/logger.manifest
chat/components/src/moz.build
chat/components/src/smileProtocolHandler.js
chat/components/src/smileProtocolHandler.jsm
chat/components/src/smileProtocolHandler.manifest
chat/components/src/test/test_commands.js
chat/components/src/test/test_conversations.js
chat/components/src/test/test_logger.js
chat/protocols/facebook/components.conf
chat/protocols/facebook/facebook.js
chat/protocols/facebook/facebook.jsm
chat/protocols/facebook/facebook.manifest
chat/protocols/facebook/moz.build
chat/protocols/gtalk/components.conf
chat/protocols/gtalk/gtalk.js
chat/protocols/gtalk/gtalk.jsm
chat/protocols/gtalk/gtalk.manifest
chat/protocols/gtalk/moz.build
chat/protocols/irc/components.conf
chat/protocols/irc/irc.js
chat/protocols/irc/irc.jsm
chat/protocols/irc/irc.manifest
chat/protocols/irc/ircISUPPORT.jsm
chat/protocols/irc/moz.build
chat/protocols/irc/test/test_ctcpQuote.js
chat/protocols/irc/test/test_ircCAP.js
chat/protocols/irc/test/test_ircCommands.js
chat/protocols/irc/test/test_ircMessage.js
chat/protocols/irc/test/test_ircNonStandard.js
chat/protocols/irc/test/test_ircServerTime.js
chat/protocols/irc/test/test_sendBufferedCommand.js
chat/protocols/irc/test/test_setMode.js
chat/protocols/irc/test/test_splitLongMessages.js
chat/protocols/irc/test/test_tryNewNick.js
chat/protocols/jsTest/components.conf
chat/protocols/jsTest/jsTestProtocol.js
chat/protocols/jsTest/jsTestProtocol.jsm
chat/protocols/jsTest/jsTestProtocol.manifest
chat/protocols/jsTest/moz.build
chat/protocols/matrix/components.conf
chat/protocols/matrix/matrix.js
chat/protocols/matrix/matrix.jsm
chat/protocols/matrix/matrix.manifest
chat/protocols/matrix/moz.build
chat/protocols/odnoklassniki/components.conf
chat/protocols/odnoklassniki/moz.build
chat/protocols/odnoklassniki/odnoklassniki.js
chat/protocols/odnoklassniki/odnoklassniki.jsm
chat/protocols/odnoklassniki/odnoklassniki.manifest
chat/protocols/skype/components.conf
chat/protocols/skype/moz.build
chat/protocols/skype/skype.js
chat/protocols/skype/skype.jsm
chat/protocols/skype/skype.manifest
chat/protocols/skype/test/test_MagicSha256.js
chat/protocols/skype/test/test_contactUrlToName.js
chat/protocols/twitter/components.conf
chat/protocols/twitter/moz.build
chat/protocols/twitter/twitter.js
chat/protocols/twitter/twitter.jsm
chat/protocols/twitter/twitter.manifest
chat/protocols/xmpp/components.conf
chat/protocols/xmpp/moz.build
chat/protocols/xmpp/xmpp-base.jsm
chat/protocols/xmpp/xmpp.js
chat/protocols/xmpp/xmpp.manifest
chat/protocols/yahoo/components.conf
chat/protocols/yahoo/moz.build
chat/protocols/yahoo/yahoo.js
chat/protocols/yahoo/yahoo.jsm
chat/protocols/yahoo/yahoo.manifest
mail/installer/package-manifest.in
new file mode 100644
--- /dev/null
+++ b/chat/components/src/components.conf
@@ -0,0 +1,57 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{a94b5427-cd8d-40cf-b47e-b67671953e70}',
+    'contract_ids': ['@mozilla.org/chat/accounts-service;1'],
+    'jsm': 'resource:///modules/imAccounts.jsm',
+    'constructor': 'AccountsService',
+  },
+  {
+    'cid': '{7cb20c68-ccc8-4a79-b6f1-0b4771ed6c23}',
+    'contract_ids': ['@mozilla.org/chat/commands-service;1'],
+    'jsm': 'resource:///modules/imCommands.jsm',
+    'constructor': 'CommandsService',
+  },
+  {
+    'cid': '{8c3725dd-ee26-489d-8135-736015af8c7f}',
+    'contract_ids': ['@mozilla.org/chat/contacts-service;1'],
+    'jsm': 'resource:///modules/imContacts.jsm',
+    'constructor': 'ContactsService',
+  },
+  {
+    'cid': '{1fa92237-4303-4384-b8ac-4e65b50810a5}',
+    'contract_ids': ['@mozilla.org/chat/tags-service;1'],
+    'jsm': 'resource:///modules/imContacts.jsm',
+    'constructor': 'TagsService',
+  },
+  {
+    'cid': '{b2397cd5-c76d-4618-8410-f344c7c6443a}',
+    'contract_ids': ['@mozilla.org/chat/conversations-service;1'],
+    'jsm': 'resource:///modules/imConversations.jsm',
+    'constructor': 'ConversationsService',
+  },
+  {
+    'cid': '{073f5953-853c-4a38-bd81-255510c31c2e}',
+    'contract_ids': ['@mozilla.org/chat/core-service;1'],
+    'jsm': 'resource:///modules/imCore.jsm',
+    'constructor': 'CoreService',
+  },
+  {
+    'cid': '{fb0dc220-2c7a-4216-9f19-6b8f3480eae9}',
+    'contract_ids': ['@mozilla.org/chat/logger;1'],
+    'jsm': 'resource:///modules/logger.jsm',
+    'constructor': 'Logger',
+    'categories': {'profile-after-change': 'Logger'},
+  },
+  {
+    'cid': '{04e58eae-dfbc-4c9e-8130-6d9ef19cbff4}',
+    'contract_ids': ['@mozilla.org/network/protocol;1?name=smile'],
+    'jsm': 'resource:///modules/smileProtocolHandler.jsm',
+    'constructor': 'smileProtocolHandler',
+  },
+]
rename from chat/components/src/imAccounts.js
rename to chat/components/src/imAccounts.jsm
--- a/chat/components/src/imAccounts.js
+++ b/chat/components/src/imAccounts.jsm
@@ -1,11 +1,14 @@
 /* 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/. */
+
+var EXPORTED_SYMBOLS = ["AccountsService"];
+
 var {
   ClassInfo,
   EmptyEnumerator,
   nsSimpleEnumerator,
   XPCOMUtils,
   setTimeout,
   clearTimeout,
   executeSoon,
@@ -1290,13 +1293,9 @@ AccountsService.prototype = {
     this._accountList = list
       .split(",")
       .filter(k => k.trim() != aAccountId)
       .join(",");
   },
 
   QueryInterface: ChromeUtils.generateQI([Ci.imIAccountsService]),
   classDescription: "Accounts",
-  classID: Components.ID("{a94b5427-cd8d-40cf-b47e-b67671953e70}"),
-  contractID: "@mozilla.org/chat/accounts-service;1",
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([AccountsService]);
deleted file mode 100644
--- a/chat/components/src/imAccounts.manifest
+++ /dev/null
@@ -1,2 +0,0 @@
-component {a94b5427-cd8d-40cf-b47e-b67671953e70} imAccounts.js
-contract @mozilla.org/chat/accounts-service;1 {a94b5427-cd8d-40cf-b47e-b67671953e70}
rename from chat/components/src/imCommands.js
rename to chat/components/src/imCommands.jsm
--- a/chat/components/src/imCommands.js
+++ b/chat/components/src/imCommands.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["CommandsService"];
+
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var { XPCOMUtils, l10nHelper } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 
 XPCOMUtils.defineLazyGetter(this, "_", () =>
   l10nHelper("chrome://chat/locale/commands.properties")
 );
@@ -280,13 +282,9 @@ CommandsService.prototype = {
       // If they all failed, print help message.
       this.executeCommand("/help " + name, aConversation);
     }
     return true;
   },
 
   QueryInterface: ChromeUtils.generateQI([Ci.imICommandsService]),
   classDescription: "Commands",
-  classID: Components.ID("{7cb20c68-ccc8-4a79-b6f1-0b4771ed6c23}"),
-  contractID: "@mozilla.org/chat/commands-service;1",
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([CommandsService]);
deleted file mode 100644
--- a/chat/components/src/imCommands.manifest
+++ /dev/null
@@ -1,2 +0,0 @@
-component {7cb20c68-ccc8-4a79-b6f1-0b4771ed6c23} imCommands.js
-contract @mozilla.org/chat/commands-service;1 {7cb20c68-ccc8-4a79-b6f1-0b4771ed6c23}
rename from chat/components/src/imContacts.js
rename to chat/components/src/imContacts.jsm
--- a/chat/components/src/imContacts.js
+++ b/chat/components/src/imContacts.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["TagsService", "ContactsService"];
+
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var { XPCOMUtils, executeSoon, ClassInfo, l10nHelper } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 
 XPCOMUtils.defineLazyGetter(this, "_", () =>
   l10nHelper("chrome://chat/locale/contacts.properties")
 );
@@ -196,18 +198,16 @@ TagsService.prototype = {
   },
   get otherContactsTag() {
     otherContactsTag._initContacts();
     return otherContactsTag;
   },
 
   QueryInterface: ChromeUtils.generateQI([Ci.imITagsService]),
   classDescription: "Tags",
-  classID: Components.ID("{1fa92237-4303-4384-b8ac-4e65b50810a5}"),
-  contractID: "@mozilla.org/chat/tags-service;1",
 };
 
 // TODO move into the tagsService
 var Tags = [];
 var TagsById = {};
 
 function Tag(aId, aName) {
   this._id = aId;
@@ -1795,16 +1795,9 @@ ContactsService.prototype = {
       statement.execute();
     } finally {
       statement.finalize();
     }
   },
 
   QueryInterface: ChromeUtils.generateQI([Ci.imIContactsService]),
   classDescription: "Contacts",
-  classID: Components.ID("{8c3725dd-ee26-489d-8135-736015af8c7f}"),
-  contractID: "@mozilla.org/chat/contacts-service;1",
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([
-  ContactsService,
-  TagsService,
-]);
deleted file mode 100644
--- a/chat/components/src/imContacts.manifest
+++ /dev/null
@@ -1,4 +0,0 @@
-component {8c3725dd-ee26-489d-8135-736015af8c7f} imContacts.js
-contract @mozilla.org/chat/contacts-service;1 {8c3725dd-ee26-489d-8135-736015af8c7f}
-component {1fa92237-4303-4384-b8ac-4e65b50810a5} imContacts.js
-contract @mozilla.org/chat/tags-service;1 {1fa92237-4303-4384-b8ac-4e65b50810a5}
rename from chat/components/src/imConversations.js
rename to chat/components/src/imConversations.jsm
--- a/chat/components/src/imConversations.js
+++ b/chat/components/src/imConversations.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["ConversationsService"];
+
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var { Status } = ChromeUtils.import("resource:///modules/imStatusUtils.jsm");
 var { XPCOMUtils, nsSimpleEnumerator, ClassInfo } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 var { Message } = ChromeUtils.import("resource:///modules/jsProtoHelper.jsm");
 
 var gLastUIConvId = 0;
@@ -821,13 +823,9 @@ ConversationsService.prototype = {
         return conv;
       }
     }
     return null;
   },
 
   QueryInterface: ChromeUtils.generateQI([Ci.imIConversationsService]),
   classDescription: "Conversations",
-  classID: Components.ID("{b2397cd5-c76d-4618-8410-f344c7c6443a}"),
-  contractID: "@mozilla.org/chat/conversations-service;1",
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([ConversationsService]);
deleted file mode 100644
--- a/chat/components/src/imConversations.manifest
+++ /dev/null
@@ -1,2 +0,0 @@
-component {b2397cd5-c76d-4618-8410-f344c7c6443a} imConversations.js
-contract @mozilla.org/chat/conversations-service;1 {b2397cd5-c76d-4618-8410-f344c7c6443a}
rename from chat/components/src/imCore.js
rename to chat/components/src/imCore.jsm
--- a/chat/components/src/imCore.js
+++ b/chat/components/src/imCore.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["CoreService"];
+
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var {
   XPCOMUtils,
   ClassInfo,
   initLogModule,
   nsSimpleEnumerator,
 } = ChromeUtils.import("resource:///modules/imXPCOMUtils.jsm");
 
@@ -268,20 +270,17 @@ UserStatus.prototype = {
   },
   _notifyObservers(aTopic, aData) {
     for (let observer of this._observers) {
       observer.observe(this, aTopic, aData);
     }
   },
 };
 
-var gCoreService;
-function CoreService() {
-  gCoreService = this;
-}
+function CoreService() {}
 CoreService.prototype = {
   globalUserStatus: null,
 
   _initialized: false,
   get initialized() {
     return this._initialized;
   },
   init() {
@@ -408,13 +407,9 @@ CoreService.prototype = {
     }
 
     this._protos[aPrplId] = proto;
     return proto;
   },
 
   QueryInterface: ChromeUtils.generateQI([Ci.imICoreService]),
   classDescription: "Core",
-  classID: Components.ID("{073f5953-853c-4a38-bd81-255510c31c2e}"),
-  contractID: "@mozilla.org/chat/core-service;1",
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([CoreService]);
deleted file mode 100644
--- a/chat/components/src/imCore.manifest
+++ /dev/null
@@ -1,2 +0,0 @@
-component {073f5953-853c-4a38-bd81-255510c31c2e} imCore.js
-contract @mozilla.org/chat/core-service;1 {073f5953-853c-4a38-bd81-255510c31c2e}
rename from chat/components/src/logger.js
rename to chat/components/src/logger.jsm
--- a/chat/components/src/logger.js
+++ b/chat/components/src/logger.jsm
@@ -1,13 +1,13 @@
 /* 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/. */
 
-var CC = Components.Constructor;
+var EXPORTED_SYMBOLS = ["Logger"];
 
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var { EmptyEnumerator, l10nHelper, XPCOMUtils } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 var { GenericMessagePrototype } = ChromeUtils.import(
   "resource:///modules/jsProtoHelper.jsm"
 );
@@ -1125,13 +1125,9 @@ Logger.prototype = {
         break;
       default:
         throw new Error("Unexpected notification " + aTopic);
     }
   },
 
   QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver, Ci.imILogger]),
   classDescription: "Logger",
-  classID: Components.ID("{fb0dc220-2c7a-4216-9f19-6b8f3480eae9}"),
-  contractID: "@mozilla.org/chat/logger;1",
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([Logger]);
deleted file mode 100644
--- a/chat/components/src/logger.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {fb0dc220-2c7a-4216-9f19-6b8f3480eae9} logger.js
-contract @mozilla.org/chat/logger;1 {fb0dc220-2c7a-4216-9f19-6b8f3480eae9}
-category profile-after-change Logger @mozilla.org/chat/logger;1
--- a/chat/components/src/moz.build
+++ b/chat/components/src/moz.build
@@ -1,24 +1,20 @@
 # vim: set filetype=python:
 # 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/.
 
 XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell.ini']
 
-EXTRA_COMPONENTS += [
-    'imAccounts.js',
-    'imAccounts.manifest',
-    'imCommands.js',
-    'imCommands.manifest',
-    'imContacts.js',
-    'imContacts.manifest',
-    'imConversations.js',
-    'imConversations.manifest',
-    'imCore.js',
-    'imCore.manifest',
-    'logger.js',
-    'logger.manifest',
-    'smileProtocolHandler.js',
-    'smileProtocolHandler.manifest',
+EXTRA_JS_MODULES += [
+    'imAccounts.jsm',
+    'imCommands.jsm',
+    'imContacts.jsm',
+    'imConversations.jsm',
+    'imCore.jsm',
+    'logger.jsm',
+    'smileProtocolHandler.jsm'
 ]
 
+XPCOM_MANIFESTS += [
+    'components.conf',
+]
rename from chat/components/src/smileProtocolHandler.js
rename to chat/components/src/smileProtocolHandler.jsm
--- a/chat/components/src/smileProtocolHandler.js
+++ b/chat/components/src/smileProtocolHandler.jsm
@@ -1,16 +1,15 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["smileProtocolHandler"];
+
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-var { XPCOMUtils } = ChromeUtils.import(
-  "resource://gre/modules/XPCOMUtils.jsm"
-);
 var { getSmileRealURI } = ChromeUtils.import(
   "resource:///modules/imSmileys.jsm"
 );
 
 var kSmileRegexp = /^smile:\/\//;
 
 function smileProtocolHandler() {}
 
@@ -28,15 +27,11 @@ smileProtocolHandler.prototype = {
     let channel = Services.io.newChannelFromURIWithLoadInfo(uri, aLoadInfo);
     channel.originalURI = aURI;
     return channel;
   },
   allowPort(aPort, aScheme) {
     return false;
   },
 
+  QueryInterface: ChromeUtils.generateQI([Ci.nsIProtocolHandler]),
   classDescription: "Smile Protocol Handler",
-  classID: Components.ID("{04e58eae-dfbc-4c9e-8130-6d9ef19cbff4}"),
-  contractID: "@mozilla.org/network/protocol;1?name=smile",
-  QueryInterface: ChromeUtils.generateQI([Ci.nsIProtocolHandler]),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([smileProtocolHandler]);
deleted file mode 100644
--- a/chat/components/src/smileProtocolHandler.manifest
+++ /dev/null
@@ -1,2 +0,0 @@
-component {04e58eae-dfbc-4c9e-8130-6d9ef19cbff4} smileProtocolHandler.js
-contract @mozilla.org/network/protocol;1?name=smile {04e58eae-dfbc-4c9e-8130-6d9ef19cbff4}
--- a/chat/components/src/test/test_commands.js
+++ b/chat/components/src/test/test_commands.js
@@ -2,17 +2,17 @@
  * 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/. */
 
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 // We don't load the command service via Services as we want to access
 // _findCommands in order to avoid having to intercept command execution.
 var imCommands = {};
 Services.scriptloader.loadSubScript(
-  "resource:///components/imCommands.js",
+  "resource:///modules/imCommands.jsm",
   imCommands
 );
 
 var kPrplId = "green";
 var kPrplId2 = "red";
 
 var fakeAccount = {
   connected: true,
--- a/chat/components/src/test/test_conversations.js
+++ b/chat/components/src/test/test_conversations.js
@@ -1,19 +1,18 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var { GenericConvIMPrototype, Message } = ChromeUtils.import(
   "resource:///modules/jsProtoHelper.jsm"
 );
-
 var imConversations = {};
 Services.scriptloader.loadSubScript(
-  "resource:///components/imConversations.js",
+  "resource:///modules/imConversations.jsm",
   imConversations
 );
 
 // Fake prplConversation
 var _id = 0;
 function Conversation(aName) {
   this._name = aName;
   this._observers = [];
--- a/chat/components/src/test/test_logger.js
+++ b/chat/components/src/test/test_logger.js
@@ -3,20 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 do_get_profile();
 
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 const { OS } = ChromeUtils.import("resource://gre/modules/osfile.jsm");
 
 var gLogger = {};
-Services.scriptloader.loadSubScript(
-  "resource:///components/logger.js",
-  gLogger
-);
+Services.scriptloader.loadSubScript("resource:///modules/logger.jsm", gLogger);
 
 var logDirPath = OS.Path.join(OS.Constants.Path.profileDir, "logs");
 
 var dummyAccount = {
   name: "dummy-account",
   normalizedName: "dummyaccount",
   protocol: {
     normalizedName: "dummy",
new file mode 100644
--- /dev/null
+++ b/chat/protocols/facebook/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{1d1d0bc5-610c-472f-b2cb-4b89857d80dc}',
+    'contract_ids': ['@mozilla.org/chat/facebook;1'],
+    'jsm': 'resource:///modules/facebook.jsm',
+    'constructor': 'FacebookProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-facebook'},
+  },
+]
rename from chat/protocols/facebook/facebook.js
rename to chat/protocols/facebook/facebook.jsm
--- a/chat/protocols/facebook/facebook.js
+++ b/chat/protocols/facebook/facebook.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["FacebookProtocol"];
+
 var { XPCOMUtils, l10nHelper } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 var { GenericAccountPrototype, GenericProtocolPrototype } = ChromeUtils.import(
   "resource:///modules/jsProtoHelper.jsm"
 );
 
 XPCOMUtils.defineLazyGetter(this, "_", () =>
@@ -45,12 +47,9 @@ FacebookProtocol.prototype = {
     return _("facebook.chat.name");
   },
   get iconBaseURI() {
     return "chrome://prpl-facebook/skin/";
   },
   getAccount(aImAccount) {
     return new FacebookAccount(this, aImAccount);
   },
-  classID: Components.ID("{1d1d0bc5-610c-472f-b2cb-4b89857d80dc}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([FacebookProtocol]);
deleted file mode 100644
--- a/chat/protocols/facebook/facebook.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {1d1d0bc5-610c-472f-b2cb-4b89857d80dc} facebook.js
-contract @mozilla.org/chat/facebook;1 {1d1d0bc5-610c-472f-b2cb-4b89857d80dc}
-category im-protocol-plugin prpl-facebook @mozilla.org/chat/facebook;1
--- a/chat/protocols/facebook/moz.build
+++ b/chat/protocols/facebook/moz.build
@@ -1,11 +1,14 @@
 # vim: set filetype=python:
 # 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/.
 
-EXTRA_COMPONENTS += [
-    'facebook.js',
-    'facebook.manifest',
+JAR_MANIFESTS += ['jar.mn']
+
+EXTRA_JS_MODULES += [
+    'facebook.jsm',
 ]
 
-JAR_MANIFESTS += ['jar.mn']
+XPCOM_MANIFESTS += [
+    'components.conf',
+]
new file mode 100644
--- /dev/null
+++ b/chat/protocols/gtalk/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{38a224c1-6748-49a9-8ab2-efc362b1000d}',
+    'contract_ids': ['@mozilla.org/chat/gtalk;1'],
+    'jsm': 'resource:///modules/gtalk.jsm',
+    'constructor': 'GTalkProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-gtalk'},
+  },
+]
rename from chat/protocols/gtalk/gtalk.js
rename to chat/protocols/gtalk/gtalk.jsm
--- a/chat/protocols/gtalk/gtalk.js
+++ b/chat/protocols/gtalk/gtalk.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["GTalkProtocol"];
+
 var { XPCOMUtils, l10nHelper } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 var { GenericProtocolPrototype } = ChromeUtils.import(
   "resource:///modules/jsProtoHelper.jsm"
 );
 var { XMPPAccountPrototype } = ChromeUtils.import(
   "resource:///modules/xmpp.jsm"
@@ -107,12 +109,9 @@ GTalkProtocol.prototype = {
         return _("options.resource");
       },
       default: "",
     },
   },
   get chatHasTopic() {
     return true;
   },
-  classID: Components.ID("{38a224c1-6748-49a9-8ab2-efc362b1000d}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([GTalkProtocol]);
deleted file mode 100644
--- a/chat/protocols/gtalk/gtalk.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {38a224c1-6748-49a9-8ab2-efc362b1000d} gtalk.js
-contract @mozilla.org/chat/gtalk;1 {38a224c1-6748-49a9-8ab2-efc362b1000d}
-category im-protocol-plugin prpl-gtalk @mozilla.org/chat/gtalk;1
--- a/chat/protocols/gtalk/moz.build
+++ b/chat/protocols/gtalk/moz.build
@@ -1,11 +1,14 @@
 # vim: set filetype=python:
 # 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/.
 
-EXTRA_COMPONENTS += [
-    'gtalk.js',
-    'gtalk.manifest',
+JAR_MANIFESTS += ['jar.mn']
+
+EXTRA_JS_MODULES += [
+    'gtalk.jsm',
 ]
 
-JAR_MANIFESTS += ['jar.mn']
+XPCOM_MANIFESTS += [
+    'components.conf',
+]
new file mode 100644
--- /dev/null
+++ b/chat/protocols/irc/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{607b2c0b-9504-483f-ad62-41de09238aec}',
+    'contract_ids': ['@mozilla.org/chat/irc;1'],
+    'jsm': 'resource:///modules/irc.jsm',
+    'constructor': 'ircProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-irc'},
+  },
+]
rename from chat/protocols/irc/irc.js
rename to chat/protocols/irc/irc.jsm
--- a/chat/protocols/irc/irc.js
+++ b/chat/protocols/irc/irc.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["ircProtocol"];
+
 var {
   ClassInfo,
   clearTimeout,
   EmptyEnumerator,
   setTimeout,
   executeSoon,
   l10nHelper,
   XPCOMUtils,
@@ -225,17 +227,17 @@ var GenericIRCConversation = {
       " :\r\n";
     return (
       this._account.maxMessageLength - this._account.countBytes(baseMessage)
     );
   },
   /**
    * @param {string} aWho - Message author's username.
    * @param {string} aMessage - Message text.
-   * @param {Object} aObject - Other properties to set on the imMessage.
+   * @param {Object} aObject - Other properties to set on the IMMessage.
    */
   handleTags(aWho, aMessage, aObject) {
     let messageProps = aObject;
     if ("tags" in aObject && ircHandlers.hasTagHandlers) {
       // Merge extra info for the handler into the props.
       messageProps = Object.assign(
         {
           who: aWho,
@@ -249,17 +251,17 @@ var GenericIRCConversation = {
       for (let tag of aObject.tags.keys()) {
         // Unhandled tags may be common, since a tag does not have to be handled
         // with a tag handler, it may also be handled by a message command handler.
         ircHandlers.handleTag(this._account, new TagMessage(messageProps, tag));
       }
 
       // Remove helper prop for tag handlers. We don't want to remove the other
       // ones, since they might have been changed and will override aWho and
-      // aMessage in the imMessage constructor.
+      // aMessage in the IMMessage constructor.
       delete messageProps.originalMessage;
     }
     // Remove the IRC tags, as those were passed in just for this step.
     delete messageProps.tags;
     return messageProps;
   },
   // Apply CTCP formatting before displaying.
   prepareForDisplaying(aMsg) {
@@ -2406,12 +2408,9 @@ ircProtocol.prototype = {
   //  Passwords in IRC are optional, and are needed for certain functionality.
   get passwordOptional() {
     return true;
   },
 
   getAccount(aImAccount) {
     return new ircAccount(this, aImAccount);
   },
-  classID: Components.ID("{607b2c0b-9504-483f-ad62-41de09238aec}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([ircProtocol]);
deleted file mode 100644
--- a/chat/protocols/irc/irc.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {607b2c0b-9504-483f-ad62-41de09238aec} irc.js
-contract @mozilla.org/chat/irc;1 {607b2c0b-9504-483f-ad62-41de09238aec}
-category im-protocol-plugin prpl-irc @mozilla.org/chat/irc;1
--- a/chat/protocols/irc/ircISUPPORT.jsm
+++ b/chat/protocols/irc/ircISUPPORT.jsm
@@ -14,17 +14,17 @@
 
 this.EXPORTED_SYMBOLS = ["ircISUPPORT", "isupportBase"];
 
 const { ircHandlers } = ChromeUtils.import(
   "resource:///modules/ircHandlers.jsm"
 );
 
 /*
- * Parses an ircMessage into an ISUPPORT message for each token of the form:
+ * Parses an IRCMessage into an ISUPPORT message for each token of the form:
  *   <parameter>=<value> or -<value>
  * The isupport field is added to the message and it has the following fields:
  *   parameter  What is being configured by this ISUPPORT token.
  *   useDefault Whether this parameter should be reset to the default value, as
  *              defined by the RFC.
  *   value      The new value for the parameter.
  */
 function isupportMessage(aMessage) {
--- a/chat/protocols/irc/moz.build
+++ b/chat/protocols/irc/moz.build
@@ -1,21 +1,17 @@
 # vim: set filetype=python:
 # 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/.
 
 XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell.ini']
 
-EXTRA_COMPONENTS += [
-    'irc.js',
-    'irc.manifest',
-]
-
 EXTRA_JS_MODULES += [
+    'IRC.jsm',
     'ircBase.jsm',
     'ircCAP.jsm',
     'ircCommands.jsm',
     'ircCTCP.jsm',
     'ircDCC.jsm',
     'ircHandlers.jsm',
     'ircISUPPORT.jsm',
     'ircMultiPrefix.jsm',
@@ -23,8 +19,12 @@ EXTRA_JS_MODULES += [
     'ircSASL.jsm',
     'ircServerTime.jsm',
     'ircServices.jsm',
     'ircUtils.jsm',
     'ircWatchMonitor.jsm',
 ]
 
 JAR_MANIFESTS += ['jar.mn']
+
+XPCOM_MANIFESTS += [
+    'components.conf',
+]
--- a/chat/protocols/irc/test/test_ctcpQuote.js
+++ b/chat/protocols/irc/test/test_ctcpQuote.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 
 var input = [
   undefined,
   "test",
   "\\test",
   "te\\st",
   "test\\",
   "\\\\test",
--- a/chat/protocols/irc/test/test_ircCAP.js
+++ b/chat/protocols/irc/test/test_ircCAP.js
@@ -177,25 +177,25 @@ function run_test() {
   run_next_test();
 }
 
 /*
  * Test round tripping parsing and then rebuilding the messages from RFC 2812.
  */
 function testCapMessages() {
   for (let data of testData) {
-    // Generate an ircMessage to send into capMessage.
+    // Generate an IRCMessage to send into capMessage.
     let i = 0;
     let message;
     let outputs;
     const account = {
       _queuedCAPs: [],
     };
 
-    // Generate an ircMessage to send into capMessage.
+    // Generate an IRCMessage to send into capMessage.
     while (typeof data[i][0] == "string") {
       message = {
         params: data[i],
       };
 
       // Create the CAP message.
       outputs = cap.capMessage(message, account);
       ++i;
--- a/chat/protocols/irc/test/test_ircCommands.js
+++ b/chat/protocols/irc/test/test_ircCommands.js
@@ -1,16 +1,15 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var { commands } = ChromeUtils.import("resource:///modules/ircCommands.jsm");
-
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 
 // Ensure the commands have been initialized.
 Services.conversations.initConversations();
 
 var fakeProto = {
   id: "fake-proto",
 };
 
--- a/chat/protocols/irc/test/test_ircMessage.js
+++ b/chat/protocols/irc/test/test_ircMessage.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 
 var testData = [
   // First off, let's test the messages from RFC 2812.
   "PASS secretpasswordhere",
   "NICK Wiz",
   ":WiZ!jto@tolsun.oulu.fi NICK Kilroy",
   "USER guest 0 * :Ronnie Reagan",
   "USER guest 8 * :Ronnie Reagan",
@@ -148,17 +148,17 @@ function testRFC2812Messages() {
     }
 
     equal(stringMessage, expectedStringMessage);
   }
 
   run_next_test();
 }
 
-// Unreal sends a couple of broken messages, see ircMessage in irc.js for a
+// Unreal sends a couple of broken messages, see IRCMessage in IRC.jsm for a
 // description of what's wrong.
 function testBrokenUnrealMessages() {
   let messages = {
     // Two spaces after command.
     ":gravel.mozilla.org 432  #momo :Erroneous Nickname: Illegal characters": {
       rawMessage:
         ":gravel.mozilla.org 432  #momo :Erroneous Nickname: Illegal characters",
       command: "432",
--- a/chat/protocols/irc/test/test_ircNonStandard.js
+++ b/chat/protocols/irc/test/test_ircNonStandard.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 const { ircNonStandard } = ChromeUtils.import(
   "resource:///modules/ircNonStandard.jsm"
 );
 
 // The function that is under test here.
 var NOTICE = ircNonStandard.commands.NOTICE;
 
 function FakeConversation() {}
--- a/chat/protocols/irc/test/test_ircServerTime.js
+++ b/chat/protocols/irc/test/test_ircServerTime.js
@@ -2,17 +2,17 @@
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { tagServerTime } = ChromeUtils.import(
   "resource:///modules/ircServerTime.jsm"
 );
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 
 function getTags(aRawMsg) {
   const { tags } = irc.ircMessage(aRawMsg, "doesnt@matter");
 
   return tags;
 }
 
 function run_test() {
--- a/chat/protocols/irc/test/test_sendBufferedCommand.js
+++ b/chat/protocols/irc/test/test_sendBufferedCommand.js
@@ -1,15 +1,15 @@
 /* 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/. */
 
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 
 function FakeAccount() {
   this._commandBuffers = new Map();
   this.callbacks = [];
 }
 FakeAccount.prototype = {
   __proto__: irc.ircAccount.prototype,
   maxMessageLength: 60,
--- a/chat/protocols/irc/test/test_setMode.js
+++ b/chat/protocols/irc/test/test_setMode.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 Services.conversations.initConversations();
 
 function FakeAccount() {
   this.normalizeNick = irc.ircAccount.prototype.normalizeNick.bind(this);
 }
 FakeAccount.prototype = {
   __proto__: irc.ircAccount.prototype,
   setWhois: (n, f) => true,
--- a/chat/protocols/irc/test/test_splitLongMessages.js
+++ b/chat/protocols/irc/test/test_splitLongMessages.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 
 var messages = {
   // Exactly 51 characters.
   "This is a test.": ["This is a test."],
   // Too long.
   "This is a message that is too long.": [
     "This is a",
     "message that is",
--- a/chat/protocols/irc/test/test_tryNewNick.js
+++ b/chat/protocols/irc/test/test_tryNewNick.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 var irc = {};
-Services.scriptloader.loadSubScript("resource:///components/irc.js", irc);
+Services.scriptloader.loadSubScript("resource:///modules/irc.jsm", irc);
 
 var fakeProto = {
   id: "fake-proto",
   options: { alternateNicks: "" },
   _getOptionDefault(aOption) {
     return this.options[aOption];
   },
 };
new file mode 100644
--- /dev/null
+++ b/chat/protocols/jsTest/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{a0774c5a-4aea-458b-9fbc-8d3cbf1a4630}',
+    'contract_ids': ['@mozilla.org/chat/jstest;1'],
+    'jsm': 'resource:///modules/jsTestProtocol.jsm',
+    'constructor': 'JSTestProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-jstest'},
+  },
+]
rename from chat/protocols/jsTest/jsTestProtocol.js
rename to chat/protocols/jsTest/jsTestProtocol.jsm
--- a/chat/protocols/jsTest/jsTestProtocol.js
+++ b/chat/protocols/jsTest/jsTestProtocol.jsm
@@ -1,15 +1,15 @@
 /* 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/. */
 
-var { XPCOMUtils, setTimeout } = ChromeUtils.import(
-  "resource:///modules/imXPCOMUtils.jsm"
-);
+var EXPORTED_SYMBOLS = ["JSTestProtocol"];
+
+var { setTimeout } = ChromeUtils.import("resource:///modules/imXPCOMUtils.jsm");
 var {
   GenericAccountPrototype,
   GenericConvIMPrototype,
   GenericProtocolPrototype,
 } = ChromeUtils.import("resource:///modules/jsProtoHelper.jsm");
 
 function Conversation(aAccount) {
   this._init(aAccount);
@@ -102,18 +102,18 @@ Account.prototype = {
       required: true,
     },
   },
 
   // Nothing to do.
   unInit() {},
 };
 
-function jsTestProtocol() {}
-jsTestProtocol.prototype = {
+function JSTestProtocol() {}
+JSTestProtocol.prototype = {
   __proto__: GenericProtocolPrototype,
   get name() {
     return "JS Test";
   },
   options: {
     text: { label: "Text option", default: "foo" },
     bool: { label: "Boolean option", default: true },
     int: { label: "Integer option", default: 42 },
@@ -133,12 +133,9 @@ jsTestProtocol.prototype = {
       separator: "@",
       defaultValue: "default.server",
       reverse: true,
     },
   ],
   getAccount(aImAccount) {
     return new Account(this, aImAccount);
   },
-  classID: Components.ID("{a0774c5a-4aea-458b-9fbc-8d3cbf1a4630}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([jsTestProtocol]);
deleted file mode 100644
--- a/chat/protocols/jsTest/jsTestProtocol.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {a0774c5a-4aea-458b-9fbc-8d3cbf1a4630} jsTestProtocol.js
-contract @mozilla.org/chat/jstest;1 {a0774c5a-4aea-458b-9fbc-8d3cbf1a4630}
-category im-protocol-plugin prpl-jstest @mozilla.org/chat/jstest;1
--- a/chat/protocols/jsTest/moz.build
+++ b/chat/protocols/jsTest/moz.build
@@ -1,11 +1,14 @@
 # vim: set filetype=python:
 # 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/.
 
 if CONFIG['MOZ_DEBUG']:
-    EXTRA_COMPONENTS += [
-        'jsTestProtocol.js',
-        'jsTestProtocol.manifest',
+    EXTRA_JS_MODULES += [
+        'jsTestProtocol.jsm',
     ]
 
+    XPCOM_MANIFESTS += [
+        'components.conf',
+    ]
+
new file mode 100644
--- /dev/null
+++ b/chat/protocols/matrix/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{e9653ac6-a671-11e6-bf84-60a44c717042}',
+    'contract_ids': ['@mozilla.org/chat/matrix;1'],
+    'jsm': 'resource:///modules/matrix.jsm',
+    'constructor': 'MatrixProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-matrix'},
+  },
+]
rename from chat/protocols/matrix/matrix.js
rename to chat/protocols/matrix/matrix.jsm
--- a/chat/protocols/matrix/matrix.js
+++ b/chat/protocols/matrix/matrix.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["MatrixProtocol"];
+
 var { XPCOMUtils, nsSimpleEnumerator, l10nHelper } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 var {
   GenericAccountPrototype,
   GenericConvChatPrototype,
   GenericConvChatBuddyPrototype,
   GenericProtocolPrototype,
@@ -355,13 +357,9 @@ MatrixProtocol.prototype = {
       },
       default: 443,
     },
   },
 
   get chatHasTopic() {
     return true;
   },
-
-  classID: Components.ID("{e9653ac6-a671-11e6-bf84-60a44c717042}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([MatrixProtocol]);
deleted file mode 100644
--- a/chat/protocols/matrix/matrix.manifest
+++ /dev/null
@@ -1,4 +0,0 @@
-component {e9653ac6-a671-11e6-bf84-60a44c717042} matrix.js
-contract @mozilla.org/chat/matrix;1 {e9653ac6-a671-11e6-bf84-60a44c717042}
-category im-protocol-plugin prpl-matrix @mozilla.org/chat/matrix;1
-
--- a/chat/protocols/matrix/moz.build
+++ b/chat/protocols/matrix/moz.build
@@ -5,20 +5,20 @@
 
 # XPCSHELL_TESTS_MANIFESTS += []
 
 DIRS += [
     'lib',
     'shims',
 ]
 
-EXTRA_COMPONENTS += [
-    'matrix.js',
-    'matrix.manifest',
-]
-
 EXTRA_JS_MODULES += [
     'matrix-sdk.jsm',
+    'matrix.jsm',
 ]
 
 JAR_MANIFESTS += [
     'jar.mn',
 ]
+
+XPCOM_MANIFESTS += [
+    'components.conf',
+]
new file mode 100644
--- /dev/null
+++ b/chat/protocols/odnoklassniki/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{29b09a83-81c1-2032-11e2-6d9bc4f8e969}',
+    'contract_ids': ['@mozilla.org/chat/odnoklassniki;1'],
+    'jsm': 'resource:///modules/odnoklassniki.jsm',
+    'constructor': 'OdnoklassnikiProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-odnoklassniki'},
+  },
+]
--- a/chat/protocols/odnoklassniki/moz.build
+++ b/chat/protocols/odnoklassniki/moz.build
@@ -1,11 +1,14 @@
 # vim: set filetype=python:
 # 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/.
 
-EXTRA_COMPONENTS += [
-    'odnoklassniki.js',
-    'odnoklassniki.manifest',
+JAR_MANIFESTS += ['jar.mn']
+
+XPCOM_MANIFESTS += [
+    'components.conf',
 ]
 
-JAR_MANIFESTS += ['jar.mn']
+EXTRA_JS_MODULES += [
+    'odnoklassniki.jsm',
+]
rename from chat/protocols/odnoklassniki/odnoklassniki.js
rename to chat/protocols/odnoklassniki/odnoklassniki.jsm
--- a/chat/protocols/odnoklassniki/odnoklassniki.js
+++ b/chat/protocols/odnoklassniki/odnoklassniki.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["OdnoklassnikiProtocol"];
+
 var { XPCOMUtils, l10nHelper } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 var { GenericProtocolPrototype } = ChromeUtils.import(
   "resource:///modules/jsProtoHelper.jsm"
 );
 var { XMPPAccountPrototype } = ChromeUtils.import(
   "resource:///modules/xmpp.jsm"
@@ -70,12 +72,9 @@ OdnoklassnikiProtocol.prototype = {
     return "chrome://prpl-odnoklassniki/skin/";
   },
   get usernameEmptyText() {
     return _("odnoklassniki.usernameHint");
   },
   getAccount(aImAccount) {
     return new OdnoklassnikiAccount(this, aImAccount);
   },
-  classID: Components.ID("{29b09a83-81c1-2032-11e2-6d9bc4f8e969}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([OdnoklassnikiProtocol]);
deleted file mode 100644
--- a/chat/protocols/odnoklassniki/odnoklassniki.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {29b09a83-81c1-2032-11e2-6d9bc4f8e969} odnoklassniki.js
-contract @mozilla.org/chat/odnoklassniki;1 {29b09a83-81c1-2032-11e2-6d9bc4f8e969}
-category im-protocol-plugin prpl-odnoklassniki @mozilla.org/chat/odnoklassniki;1
new file mode 100644
--- /dev/null
+++ b/chat/protocols/skype/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{8446c0f6-9f59-4710-844e-eaa6c1f49d35}',
+    'contract_ids': ['@mozilla.org/chat/skype;1'],
+    'jsm': 'resource:///modules/skype.jsm',
+    'constructor': 'SkypeProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-skype'},
+  },
+]
--- a/chat/protocols/skype/moz.build
+++ b/chat/protocols/skype/moz.build
@@ -1,13 +1,16 @@
 # vim: set filetype=python:
 # 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/.
 
 XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell.ini']
 
-EXTRA_COMPONENTS += [
-    'skype.js',
-    'skype.manifest',
+JAR_MANIFESTS += ['jar.mn']
+
+EXTRA_JS_MODULES += [
+    'skype.jsm',
 ]
 
-JAR_MANIFESTS += ['jar.mn']
+XPCOM_MANIFESTS += [
+    'components.conf',
+]
rename from chat/protocols/skype/skype.js
rename to chat/protocols/skype/skype.jsm
--- a/chat/protocols/skype/skype.js
+++ b/chat/protocols/skype/skype.jsm
@@ -1,12 +1,13 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["SkypeProtocol"];
 var { httpRequest } = ChromeUtils.import("resource://gre/modules/Http.jsm");
 var { StringToArrayBuffer } = ChromeUtils.import(
   "resource:///modules/ArrayBufferUtils.jsm"
 );
 var { bigInt } = ChromeUtils.import("resource:///modules/BigInteger.jsm");
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var {
   XPCOMUtils,
@@ -951,12 +952,9 @@ SkypeProtocol.prototype = {
 
   get passwordOptional() {
     return false;
   },
 
   getAccount(aImAccount) {
     return new SkypeAccount(this, aImAccount);
   },
-  classID: Components.ID("{8446c0f6-9f59-4710-844e-eaa6c1f49d35}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([SkypeProtocol]);
deleted file mode 100644
--- a/chat/protocols/skype/skype.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {8446c0f6-9f59-4710-844e-eaa6c1f49d35} skype.js
-contract @mozilla.org/chat/skype;1 {8446c0f6-9f59-4710-844e-eaa6c1f49d35}
-category im-protocol-plugin prpl-skype @mozilla.org/chat/skype;1
--- a/chat/protocols/skype/test/test_MagicSha256.js
+++ b/chat/protocols/skype/test/test_MagicSha256.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 var skype = {};
-Services.scriptloader.loadSubScript("resource:///components/skype.js", skype);
+Services.scriptloader.loadSubScript("resource:///modules/skype.jsm", skype);
 
 var data = {
   "1416264993": "3a33ac47fe2ec1a33d569f4be5c69ddc",
   "1416387358": "eca9716e1eedcbe93320ba794cea3388",
   "1416392361": "2ed6fc80c3303caa137ae3fd4fcc7d80",
 };
 
 function run_test() {
--- a/chat/protocols/skype/test/test_contactUrlToName.js
+++ b/chat/protocols/skype/test/test_contactUrlToName.js
@@ -1,14 +1,14 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 var skype = {};
-Services.scriptloader.loadSubScript("resource:///components/skype.js", skype);
+Services.scriptloader.loadSubScript("resource:///modules/skype.jsm", skype);
 
 var data = {
   "https://bay-client-s.gateway.messenger.live.com/v1/users/ME/contacts/8:clokep":
     "clokep",
   "https://bay-client-s.gateway.messenger.live.com/v1/users/8:clokep/presenceDocs/messagingService":
     "clokep",
 };
 
new file mode 100644
--- /dev/null
+++ b/chat/protocols/twitter/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{31082ff6-1de8-422b-ab60-ca0ac0b2af13}',
+    'contract_ids': ['@mozilla.org/chat/twitter;1'],
+    'jsm': 'resource:///modules/twitter.jsm',
+    'constructor': 'TwitterProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-twitter'},
+  },
+]
--- a/chat/protocols/twitter/moz.build
+++ b/chat/protocols/twitter/moz.build
@@ -1,14 +1,15 @@
 # vim: set filetype=python:
 # 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/.
 
-EXTRA_COMPONENTS += [
-    'twitter.js',
-    'twitter.manifest',
+EXTRA_JS_MODULES += [
+    'twitter-text.jsm',
+    'twitter.jsm',
 ]
 
-EXTRA_JS_MODULES += [
-    'twitter-text.jsm',
+JAR_MANIFESTS += ['jar.mn']
+
+XPCOM_MANIFESTS += [
+    'components.conf',
 ]
-JAR_MANIFESTS += ['jar.mn']
rename from chat/protocols/twitter/twitter.js
rename to chat/protocols/twitter/twitter.jsm
--- a/chat/protocols/twitter/twitter.js
+++ b/chat/protocols/twitter/twitter.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["TwitterProtocol"];
+
 var { httpRequest, percentEncode } = ChromeUtils.import(
   "resource://gre/modules/Http.jsm"
 );
 var { Services } = ChromeUtils.import("resource:///modules/imServices.jsm");
 var {
   XPCOMUtils,
   setTimeout,
   clearTimeout,
@@ -1567,12 +1569,9 @@ TwitterProtocol.prototype = {
         aMsg.split(" ").forEach(account.stopFollowing, account);
         return true;
       },
     },
   ],
   getAccount(aImAccount) {
     return new Account(this, aImAccount);
   },
-  classID: Components.ID("{31082ff6-1de8-422b-ab60-ca0ac0b2af13}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([TwitterProtocol]);
deleted file mode 100644
--- a/chat/protocols/twitter/twitter.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {31082ff6-1de8-422b-ab60-ca0ac0b2af13} twitter.js
-contract @mozilla.org/chat/twitter;1 {31082ff6-1de8-422b-ab60-ca0ac0b2af13}
-category im-protocol-plugin prpl-twitter @mozilla.org/chat/twitter;1
new file mode 100644
--- /dev/null
+++ b/chat/protocols/xmpp/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{dde786d1-6f59-43d0-9bc8-b505a757fb30}',
+    'contract_ids': ['@mozilla.org/chat/xmpp;1'],
+    'jsm': 'resource:///modules/xmpp-base.jsm',
+    'constructor': 'XMPPProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-jabber'},
+  },
+]
--- a/chat/protocols/xmpp/moz.build
+++ b/chat/protocols/xmpp/moz.build
@@ -1,21 +1,21 @@
 # vim: set filetype=python:
 # 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/.
 
 XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell.ini']
 
-EXTRA_COMPONENTS += [
-    'xmpp.js',
-    'xmpp.manifest',
-]
-
 EXTRA_JS_MODULES += [
     'xmpp-authmechs.jsm',
+    'xmpp-base.jsm',
     'xmpp-commands.jsm',
     'xmpp-session.jsm',
     'xmpp-xml.jsm',
     'xmpp.jsm',
 ]
 
 JAR_MANIFESTS += ['jar.mn']
+
+XPCOM_MANIFESTS += [
+    'components.conf',
+]
rename from chat/protocols/xmpp/xmpp.js
rename to chat/protocols/xmpp/xmpp-base.jsm
--- a/chat/protocols/xmpp/xmpp.js
+++ b/chat/protocols/xmpp/xmpp-base.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["XMPPProtocol"];
+
 var { XPCOMUtils, l10nHelper } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 var { GenericProtocolPrototype } = ChromeUtils.import(
   "resource:///modules/jsProtoHelper.jsm"
 );
 var { XMPPAccountPrototype } = ChromeUtils.import(
   "resource:///modules/xmpp.jsm"
@@ -94,13 +96,9 @@ XMPPProtocol.prototype = {
         return _("options.connectPort");
       },
       default: 5222,
     },
   },
   get chatHasTopic() {
     return true;
   },
-
-  classID: Components.ID("{dde786d1-6f59-43d0-9bc8-b505a757fb30}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([XMPPProtocol]);
deleted file mode 100644
--- a/chat/protocols/xmpp/xmpp.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {dde786d1-6f59-43d0-9bc8-b505a757fb30} xmpp.js
-contract @mozilla.org/chat/xmpp;1 {dde786d1-6f59-43d0-9bc8-b505a757fb30}
-category im-protocol-plugin prpl-jabber @mozilla.org/chat/xmpp;1
new file mode 100644
--- /dev/null
+++ b/chat/protocols/yahoo/components.conf
@@ -0,0 +1,15 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Classes = [
+  {
+    'cid': '{50ea817e-5d79-4657-91ae-aa0a52bdb98c}',
+    'contract_ids': ['@mozilla.org/chat/yahoo;1'],
+    'jsm': 'resource:///modules/yahoo.jsm',
+    'constructor': 'YahooProtocol',
+    'categories': {'im-protocol-plugin': 'prpl-yahoo'},
+  },
+]
--- a/chat/protocols/yahoo/moz.build
+++ b/chat/protocols/yahoo/moz.build
@@ -1,11 +1,14 @@
 # vim: set filetype=python:
 # 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/.
 
-EXTRA_COMPONENTS += [
-    'yahoo.js',
-    'yahoo.manifest',
+JAR_MANIFESTS += ['jar.mn']
+
+EXTRA_JS_MODULES += [
+    'yahoo.jsm',
 ]
 
-JAR_MANIFESTS += ['jar.mn']
+XPCOM_MANIFESTS += [
+    'components.conf',
+]
rename from chat/protocols/yahoo/yahoo.js
rename to chat/protocols/yahoo/yahoo.jsm
--- a/chat/protocols/yahoo/yahoo.js
+++ b/chat/protocols/yahoo/yahoo.jsm
@@ -1,12 +1,14 @@
 /* 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/. */
 
+var EXPORTED_SYMBOLS = ["YahooProtocol"];
+
 var { XPCOMUtils, l10nHelper } = ChromeUtils.import(
   "resource:///modules/imXPCOMUtils.jsm"
 );
 var { GenericAccountPrototype, GenericProtocolPrototype } = ChromeUtils.import(
   "resource:///modules/jsProtoHelper.jsm"
 );
 
 XPCOMUtils.defineLazyGetter(this, "_", () =>
@@ -46,12 +48,9 @@ YahooProtocol.prototype = {
     return "Yahoo";
   },
   get iconBaseURI() {
     return "chrome://prpl-yahoo/skin/";
   },
   getAccount(aImAccount) {
     return new YahooAccount(this, aImAccount);
   },
-  classID: Components.ID("{50ea817e-5d79-4657-91ae-aa0a52bdb98c}"),
 };
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([YahooProtocol]);
deleted file mode 100644
--- a/chat/protocols/yahoo/yahoo.manifest
+++ /dev/null
@@ -1,3 +0,0 @@
-component {50ea817e-5d79-4657-91ae-aa0a52bdb98c} yahoo.js
-contract @mozilla.org/chat/yahoo;1 {50ea817e-5d79-4657-91ae-aa0a52bdb98c}
-category im-protocol-plugin prpl-yahoo @mozilla.org/chat/yahoo;1
--- a/mail/installer/package-manifest.in
+++ b/mail/installer/package-manifest.in
@@ -242,48 +242,16 @@
 @RESPATH@/components/smime-service.manifest
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; instant messaging
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 @RESPATH@/@PREF_DIR@/chat-prefs.js
 @RESPATH@/chrome/chat@JAREXT@
 @RESPATH@/chrome/chat.manifest
-@RESPATH@/components/imAccounts.js
-@RESPATH@/components/imAccounts.manifest
-@RESPATH@/components/imCommands.js
-@RESPATH@/components/imCommands.manifest
-@RESPATH@/components/imContacts.js
-@RESPATH@/components/imContacts.manifest
-@RESPATH@/components/imConversations.js
-@RESPATH@/components/imConversations.manifest
-@RESPATH@/components/imCore.js
-@RESPATH@/components/imCore.manifest
-@RESPATH@/components/facebook.js
-@RESPATH@/components/facebook.manifest
-@RESPATH@/components/gtalk.js
-@RESPATH@/components/gtalk.manifest
-@RESPATH@/components/irc.js
-@RESPATH@/components/irc.manifest
-@RESPATH@/components/matrix.js
-@RESPATH@/components/matrix.manifest
-@RESPATH@/components/odnoklassniki.js
-@RESPATH@/components/odnoklassniki.manifest
-@RESPATH@/components/skype.js
-@RESPATH@/components/skype.manifest
-@RESPATH@/components/twitter.js
-@RESPATH@/components/twitter.manifest
-@RESPATH@/components/xmpp.js
-@RESPATH@/components/xmpp.manifest
-@RESPATH@/components/yahoo.js
-@RESPATH@/components/yahoo.manifest
-@RESPATH@/components/smileProtocolHandler.js
-@RESPATH@/components/smileProtocolHandler.manifest
-@RESPATH@/components/logger.js
-@RESPATH@/components/logger.manifest
 
 ; Thunderbird specific
 @RESPATH@/@PREF_DIR@/all-im.js
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; Chrome Files
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;