summaryrefslogtreecommitdiffstats
path: root/dom/notification/old/NotificationDB.sys.mjs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:14:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:14:29 +0000
commitfbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8 (patch)
tree4c1ccaf5486d4f2009f9a338a98a83e886e29c97 /dom/notification/old/NotificationDB.sys.mjs
parentReleasing progress-linux version 124.0.1-1~progress7.99u1. (diff)
downloadfirefox-fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8.tar.xz
firefox-fbaf0bb26397aa498eb9156f06d5a6fe34dd7dd8.zip
Merging upstream version 125.0.1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/notification/old/NotificationDB.sys.mjs')
-rw-r--r--dom/notification/old/NotificationDB.sys.mjs32
1 files changed, 30 insertions, 2 deletions
diff --git a/dom/notification/old/NotificationDB.sys.mjs b/dom/notification/old/NotificationDB.sys.mjs
index 79a9965628..7de9734450 100644
--- a/dom/notification/old/NotificationDB.sys.mjs
+++ b/dom/notification/old/NotificationDB.sys.mjs
@@ -7,6 +7,12 @@ function debug(s) {
dump("-*- NotificationDB component: " + s + "\n");
}
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ AsyncShutdown: "resource://gre/modules/AsyncShutdown.sys.mjs",
+});
+
const NOTIFICATION_STORE_DIR = PathUtils.profileDir;
const NOTIFICATION_STORE_PATH = PathUtils.join(
NOTIFICATION_STORE_DIR,
@@ -23,6 +29,11 @@ var NotificationDB = {
// Ensure we won't call init() while xpcom-shutdown is performed
_shutdownInProgress: false,
+ // A promise that resolves once the ongoing task queue has been drained.
+ // The value will be reset when the queue starts again.
+ _queueDrainedPromise: null,
+ _queueDrainedPromiseResolve: null,
+
init() {
if (this._shutdownInProgress) {
return;
@@ -37,6 +48,13 @@ var NotificationDB = {
Services.obs.addObserver(this, "xpcom-shutdown");
this.registerListeners();
+
+ // This assumes that nothing will queue a new task at profile-change-teardown phase,
+ // potentially replacing the _queueDrainedPromise if there was no existing task run.
+ lazy.AsyncShutdown.profileChangeTeardown.addBlocker(
+ "NotificationDB: Need to make sure that all notification messages are processed",
+ () => this._queueDrainedPromise
+ );
},
registerListeners() {
@@ -51,7 +69,7 @@ var NotificationDB = {
}
},
- observe(aSubject, aTopic, aData) {
+ observe(aSubject, aTopic) {
if (DEBUG) {
debug("Topic: " + aTopic);
}
@@ -114,7 +132,7 @@ var NotificationDB = {
},
// If read failed, we assume we have no notifications to load.
- reason => {
+ () => {
this.loaded = true;
return this.createStore();
}
@@ -251,6 +269,9 @@ var NotificationDB = {
debug("Task queue was not running, starting now...");
}
this.runNextTask();
+ this._queueDrainedPromise = new Promise(resolve => {
+ this._queueDrainedPromiseResolve = resolve;
+ });
}
return promise;
@@ -262,6 +283,13 @@ var NotificationDB = {
debug("No more tasks to run, queue depleted");
}
this.runningTask = null;
+ if (this._queueDrainedPromiseResolve) {
+ this._queueDrainedPromiseResolve();
+ } else if (DEBUG) {
+ debug(
+ "_queueDrainedPromiseResolve was null somehow, no promise to resolve"
+ );
+ }
return;
}
this.runningTask = this.tasks.shift();