Bug 1358921: Lazily load ContentPrefServiceParent.jsm when first needed. r=florian
MozReview-Commit-ID: 4JSdg1eJFbP
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -49,17 +49,17 @@ let initializedModules = {};
["AddonManager", "resource://gre/modules/AddonManager.jsm"],
["AsyncShutdown", "resource://gre/modules/AsyncShutdown.jsm"],
["AutoCompletePopup", "resource://gre/modules/AutoCompletePopup.jsm"],
["BookmarkHTMLUtils", "resource://gre/modules/BookmarkHTMLUtils.jsm"],
["BookmarkJSONUtils", "resource://gre/modules/BookmarkJSONUtils.jsm"],
["BrowserUITelemetry", "resource:///modules/BrowserUITelemetry.jsm"],
["BrowserUsageTelemetry", "resource:///modules/BrowserUsageTelemetry.jsm"],
["ContentClick", "resource:///modules/ContentClick.jsm"],
- ["ContentPrefServiceParent", "resource://gre/modules/ContentPrefServiceParent.jsm"],
+ ["ContentPrefServiceParent", "resource://gre/modules/ContentPrefServiceParent.jsm", "alwaysInit"],
["ContentSearch", "resource:///modules/ContentSearch.jsm", "init"],
["DateTimePickerHelper", "resource://gre/modules/DateTimePickerHelper.jsm"],
["DirectoryLinksProvider", "resource:///modules/DirectoryLinksProvider.jsm"],
["ExtensionsUI", "resource:///modules/ExtensionsUI.jsm"],
["Feeds", "resource:///modules/Feeds.jsm"],
["FileUtils", "resource://gre/modules/FileUtils.jsm"],
["FormValidationHandler", "resource:///modules/FormValidationHandler.jsm"],
["Integration", "resource://gre/modules/Integration.jsm"],
@@ -122,16 +122,21 @@ XPCOMUtils.defineLazyGetter(this, "gBrow
const global = this;
const listeners = {
observers: {
},
ppmm: {
+ // PLEASE KEEP THIS LIST IN SYNC WITH THE LISTENERS ADDED IN ContentPrefServiceParent.init
+ "ContentPrefs:FunctionCall": ["ContentPrefServiceParent"],
+ "ContentPrefs:AddObserverForName": ["ContentPrefServiceParent"],
+ "ContentPrefs:RemoveObserverForName": ["ContentPrefServiceParent"],
+ // PLEASE KEEP THIS LIST IN SYNC WITH THE LISTENERS ADDED IN ContentPrefServiceParent.init
"FeedConverter:addLiveBookmark": ["Feeds"],
"WCCR:setAutoHandler": ["Feeds"],
"webrtc:UpdateGlobalIndicators": ["webrtcUI"],
"webrtc:UpdatingIndicators": ["webrtcUI"],
},
mm: {
"AboutHome:MaybeShowAutoMigrationUndoNotification": ["AboutHome"],
@@ -587,18 +592,16 @@ BrowserGlue.prototype = {
NewTabUtils.init();
NewTabUtils.links.addProvider(DirectoryLinksProvider);
AboutNewTab.init();
SessionStore.init();
BrowserUsageTelemetry.init();
BrowserUITelemetry.init();
- ContentPrefServiceParent.init();
-
LoginManagerParent.init();
ReaderParent.init();
SelfSupportBackend.init();
if (AppConstants.INSTALL_COMPACT_THEMES) {
let vendorShortName = gBrandBundle.GetStringFromName("vendorShortName");
--- a/toolkit/components/contentprefs/ContentPrefServiceParent.jsm
+++ b/toolkit/components/contentprefs/ContentPrefServiceParent.jsm
@@ -6,45 +6,54 @@
"use strict";
this.EXPORTED_SYMBOLS = [ "ContentPrefServiceParent" ];
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
-Cu.import("resource://gre/modules/ContentPrefUtils.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "_methodsCallableFromChild",
+ "resource://gre/modules/ContentPrefUtils.jsm");
let loadContext = Cc["@mozilla.org/loadcontext;1"].
createInstance(Ci.nsILoadContext);
let privateLoadContext = Cc["@mozilla.org/privateloadcontext;1"].
createInstance(Ci.nsILoadContext);
function contextArg(context) {
return (context && context.usePrivateBrowsing) ?
privateLoadContext :
loadContext;
}
var ContentPrefServiceParent = {
- _cps2: null,
+ // Called on all platforms.
+ alwaysInit() {
+ let globalMM = Cc["@mozilla.org/parentprocessmessagemanager;1"]
+ .getService(Ci.nsIMessageListenerManager);
+ globalMM.addMessageListener("child-process-shutdown", this);
+ },
+
+ // Only called on Android. Listeners are added in nsBrowserGlue.js on other
+ // platforms.
init() {
let globalMM = Cc["@mozilla.org/parentprocessmessagemanager;1"]
.getService(Ci.nsIMessageListenerManager);
- this._cps2 = Cc["@mozilla.org/content-pref/service;1"]
- .getService(Ci.nsIContentPrefService2);
-
+ // PLEASE KEEP THIS LIST IN SYNC WITH THE LISTENERS ADDED IN nsBrowserGlue
globalMM.addMessageListener("ContentPrefs:FunctionCall", this);
+ globalMM.addMessageListener("ContentPrefs:AddObserverForName", this);
+ globalMM.addMessageListener("ContentPrefs:RemoveObserverForName", this);
+ // PLEASE KEEP THIS LIST IN SYNC WITH THE LISTENERS ADDED IN nsBrowserGlue
- let observerChangeHandler = this.handleObserverChange.bind(this);
- globalMM.addMessageListener("ContentPrefs:AddObserverForName", observerChangeHandler);
- globalMM.addMessageListener("ContentPrefs:RemoveObserverForName", observerChangeHandler);
- globalMM.addMessageListener("child-process-shutdown", observerChangeHandler);
+ this.alwaysInit();
},
// Map from message manager -> content pref observer.
_observers: new Map(),
handleObserverChange(msg) {
let observer = this._observers.get(msg.target);
if (msg.name === "child-process-shutdown") {
@@ -100,17 +109,23 @@ var ContentPrefServiceParent = {
observer._names.delete(prefName);
if (observer._names.size === 0) {
// This was the last use for this observer.
this._observers.delete(msg.target);
}
}
},
+ // Listeners are added in nsBrowserGlue.js
receiveMessage(msg) {
+ if (msg.name != "ContentPrefs:FunctionCall") {
+ this.handleObserverChange(msg);
+ return;
+ }
+
let data = msg.data;
let signature;
if (!_methodsCallableFromChild.some(([method, args]) => {
if (method == data.call) {
signature = args;
return true;
}
@@ -154,8 +169,12 @@ var ContentPrefServiceParent = {
if (contextIndex > -1) {
args[contextIndex] = contextArg(args[contextIndex]);
}
// And call the function.
this._cps2[data.call](...args);
}
};
+
+XPCOMUtils.defineLazyServiceGetter(ContentPrefServiceParent, "_cps2",
+ "@mozilla.org/content-pref/service;1",
+ "nsIContentPrefService2");