diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /toolkit/modules/FirstStartup.jsm | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/modules/FirstStartup.jsm')
-rw-r--r-- | toolkit/modules/FirstStartup.jsm | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/toolkit/modules/FirstStartup.jsm b/toolkit/modules/FirstStartup.jsm new file mode 100644 index 0000000000..e00e593682 --- /dev/null +++ b/toolkit/modules/FirstStartup.jsm @@ -0,0 +1,81 @@ +/* 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 = ["FirstStartup"]; + +const { AppConstants } = ChromeUtils.import( + "resource://gre/modules/AppConstants.jsm" +); +const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); +const { XPCOMUtils } = ChromeUtils.import( + "resource://gre/modules/XPCOMUtils.jsm" +); + +XPCOMUtils.defineLazyModuleGetters(this, { + Normandy: "resource://normandy/Normandy.jsm", +}); + +const PREF_TIMEOUT = "first-startup.timeout"; +const PROBE_NAME = "firstStartup"; + +/** + * Service for blocking application startup, to be used on the first install. The intended + * use case is for `FirstStartup` to be invoked when the application is called by an installer, + * such as the Windows Stub Installer, to allow the application to do some first-install tasks + * such as performance tuning and downloading critical data. + * + * In this scenario, the installer does not exit until the first application window appears, + * which gives the user experience of the application starting up quickly on first install. + */ +var FirstStartup = { + NOT_STARTED: 0, + IN_PROGRESS: 1, + TIMED_OUT: 2, + SUCCESS: 3, + UNSUPPORTED: 4, + + _state: 0, // NOT_STARTED, + /** + * Initialize and run first-startup services. This will always run synchronously + * and spin the event loop until either all required services have + * completed, or until a timeout is reached. + * + * In the latter case, services are expected to run post-UI instead as usual. + */ + init() { + this._state = this.IN_PROGRESS; + const timeout = Services.prefs.getIntPref(PREF_TIMEOUT, 30000); // default to 30 seconds + let startingTime = Date.now(); + + if (AppConstants.MOZ_NORMANDY) { + let normandyInitialized = false; + + Normandy.init({ runAsync: false }).then( + () => (normandyInitialized = true) + ); + + this.elapsed = 0; + Services.tm.spinEventLoopUntil(() => { + this.elapsed = Date.now() - startingTime; + if (this.elapsed >= timeout) { + this._state = this.TIMED_OUT; + return true; + } else if (normandyInitialized) { + this._state = this.SUCCESS; + return true; + } + return false; + }); + } else { + this._state = this.UNSUPPORTED; + } + + Services.telemetry.scalarSet(`${PROBE_NAME}.statusCode`, this._state); + Services.telemetry.scalarSet(`${PROBE_NAME}.elapsed`, this.elapsed); + }, + + get state() { + return this._state; + }, +}; |