summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/modules/system/Startup.js
diff options
context:
space:
mode:
Diffstat (limited to 'addon-sdk/source/modules/system/Startup.js')
-rw-r--r--addon-sdk/source/modules/system/Startup.js57
1 files changed, 57 insertions, 0 deletions
diff --git a/addon-sdk/source/modules/system/Startup.js b/addon-sdk/source/modules/system/Startup.js
new file mode 100644
index 000000000..b9e5d88b3
--- /dev/null
+++ b/addon-sdk/source/modules/system/Startup.js
@@ -0,0 +1,57 @@
+/* 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/. */
+"use strict";
+
+var EXPORTED_SYMBOLS = ["Startup"];
+
+var { utils: Cu, interfaces: Ci, classes: Cc } = Components;
+const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
+const { defer } = Cu.import("resource://gre/modules/Promise.jsm", {}).Promise;
+
+const { XulApp } = Cu.import("resource://gre/modules/commonjs/sdk/system/xul-app.jsm", {});
+
+const appStartupSrv = Cc["@mozilla.org/toolkit/app-startup;1"]
+ .getService(Ci.nsIAppStartup);
+
+const NAME2TOPIC = {
+ 'Firefox': 'sessionstore-windows-restored',
+ 'Fennec': 'sessionstore-windows-restored',
+ 'SeaMonkey': 'sessionstore-windows-restored',
+ 'Thunderbird': 'mail-startup-done',
+ 'Instantbird': 'xul-window-visible'
+};
+
+var Startup = {
+ initialized: !appStartupSrv.startingUp
+};
+var exports = Startup;
+
+var gOnceInitializedDeferred = defer();
+exports.onceInitialized = gOnceInitializedDeferred.promise;
+
+// Set 'final-ui-startup' as default topic for unknown applications
+var appStartup = 'final-ui-startup';
+
+if (Startup.initialized) {
+ gOnceInitializedDeferred.resolve()
+}
+else {
+ // Gets the topic that fit best as application startup event, in according with
+ // the current application (e.g. Firefox, Fennec, Thunderbird...)
+ for (let name of Object.keys(NAME2TOPIC)) {
+ if (XulApp.is(name)) {
+ appStartup = NAME2TOPIC[name];
+ break;
+ }
+ }
+
+ let listener = function (subject, topic) {
+ Services.obs.removeObserver(this, topic);
+ Startup.initialized = true;
+ Services.tm.currentThread.dispatch(() => gOnceInitializedDeferred.resolve(),
+ Ci.nsIThread.DISPATCH_NORMAL);
+ }
+
+ Services.obs.addObserver(listener, appStartup, false);
+}