summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikolaj Boc <mikolaj.boc@qt.io>2023-08-09 16:08:01 +0200
committerPiotr Wierciński <piotr.wiercinski@qt.io>2023-10-18 19:01:45 +0200
commit0607c25f3e6906707d1464306cee047fdd755294 (patch)
tree9379ee5cc3fca2efec8718b6cfc43437fc6e765f
parent8a6a9295ebd3409b1b818c6e04dc210ca93e51c0 (diff)
Make WASM IDB settings use the fallback mechanism correctly
Change-Id: Ibb65efc0faa5ec6e6c60782747c9295e4fc5ff21 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
-rw-r--r--src/corelib/io/qsettings_p.h3
-rw-r--r--src/corelib/io/qsettings_wasm.cpp46
-rw-r--r--tests/auto/corelib/io/qsettings/tst_qsettings.cpp10
3 files changed, 39 insertions, 20 deletions
diff --git a/src/corelib/io/qsettings_p.h b/src/corelib/io/qsettings_p.h
index d79c10e643..4229abd874 100644
--- a/src/corelib/io/qsettings_p.h
+++ b/src/corelib/io/qsettings_p.h
@@ -243,6 +243,9 @@ public:
qsizetype &lineStart, qsizetype &lineLen,
qsizetype &equalsPos);
+protected:
+ const QList<QConfFile *> &getConfFiles() const { return confFiles; }
+
private:
void initFormat();
virtual void initAccess();
diff --git a/src/corelib/io/qsettings_wasm.cpp b/src/corelib/io/qsettings_wasm.cpp
index 960938fb25..7d80ff82d3 100644
--- a/src/corelib/io/qsettings_wasm.cpp
+++ b/src/corelib/io/qsettings_wasm.cpp
@@ -238,10 +238,11 @@ public:
void clear() override;
void sync() override;
- void flush() override;
private:
bool writeSettingsToTemporaryFile(const QString &fileName, void *dataPtr, int size);
+ void loadIndexedDBFiles();
+
QString databaseName;
QString id;
@@ -264,22 +265,7 @@ QWasmIDBSettingsPrivate::QWasmIDBSettingsPrivate(QSettings::Scope scope,
databaseName = organization;
id = application;
- int exists = 0;
- int error = 0;
- emscripten_idb_exists(DbName, fileName().toLocal8Bit(), &exists, &error);
- if (error) {
- setStatus(QSettings::AccessError);
- return;
- }
- if (exists) {
- void *contents;
- int size;
- emscripten_idb_load(DbName, fileName().toLocal8Bit(), &contents, &size, &error);
- if (error || !writeSettingsToTemporaryFile(fileName(), contents, size)) {
- setStatus(QSettings::AccessError);
- return;
- }
- }
+ loadIndexedDBFiles();
QConfFileSettingsPrivate::initAccess();
}
@@ -288,7 +274,6 @@ QWasmIDBSettingsPrivate::~QWasmIDBSettingsPrivate() = default;
bool QWasmIDBSettingsPrivate::writeSettingsToTemporaryFile(const QString &fileName, void *dataPtr,
int size)
-
{
QFile file(fileName);
QFileInfo fileInfo(fileName);
@@ -313,6 +298,10 @@ void QWasmIDBSettingsPrivate::clear()
void QWasmIDBSettingsPrivate::sync()
{
+ // Reload the files, in case there were any changes in IndexedDB, and flush them to disk.
+ // Thanks to this, QConfFileSettingsPrivate::sync will handle key merging correctly.
+ loadIndexedDBFiles();
+
QConfFileSettingsPrivate::sync();
QFile file(fileName());
@@ -327,9 +316,26 @@ void QWasmIDBSettingsPrivate::sync()
}
}
-void QWasmIDBSettingsPrivate::flush()
+void QWasmIDBSettingsPrivate::loadIndexedDBFiles()
{
- sync();
+ for (const auto *confFile : getConfFiles()) {
+ int exists = 0;
+ int error = 0;
+ emscripten_idb_exists(DbName, confFile->name.toLocal8Bit(), &exists, &error);
+ if (error) {
+ setStatus(QSettings::AccessError);
+ return;
+ }
+ if (exists) {
+ void *contents;
+ int size;
+ emscripten_idb_load(DbName, confFile->name.toLocal8Bit(), &contents, &size, &error);
+ if (error || !writeSettingsToTemporaryFile(confFile->name, contents, size)) {
+ setStatus(QSettings::AccessError);
+ return;
+ }
+ }
+ }
}
QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format, QSettings::Scope scope,
diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
index 74784fb3c2..b9ae472028 100644
--- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
+++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
@@ -2058,6 +2058,14 @@ void tst_QSettings::testChildKeysAndGroups()
l.sort();
QCOMPARE(l, QStringList() << "bar" << "foo");
}
+
+#if defined(Q_OS_WASM)
+ // WebIndexedDBFormat does not use the cached settings file on creation, but instead always uses
+ // the file from the indexed DB anew.
+ if (format == QSettings::Format::WebIndexedDBFormat)
+ settings1.sync();
+#endif
+
{
QSettings settings3(format, QSettings::UserScope, "software.org", "application");
settings3.setFallbacksEnabled(false);
@@ -3542,6 +3550,8 @@ void tst_QSettings::rainersSyncBugOnMac()
#if defined(Q_OS_WASM)
if (format == QSettings::NativeFormat)
QSKIP("WASM's localStorage backend recognizes no concept of file");
+ if (format == QSettings::WebIndexedDBFormat)
+ QSKIP("WASM's indexedDB backend uses the virtual FS file only as a backing store");
#endif // Q_OS_WASM
QString fileName;