diff options
author | Mikolaj Boc <mikolaj.boc@qt.io> | 2023-08-09 16:08:01 +0200 |
---|---|---|
committer | Piotr Wierciński <piotr.wiercinski@qt.io> | 2023-10-18 19:01:45 +0200 |
commit | 0607c25f3e6906707d1464306cee047fdd755294 (patch) | |
tree | 9379ee5cc3fca2efec8718b6cfc43437fc6e765f | |
parent | 8a6a9295ebd3409b1b818c6e04dc210ca93e51c0 (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.h | 3 | ||||
-rw-r--r-- | src/corelib/io/qsettings_wasm.cpp | 46 | ||||
-rw-r--r-- | tests/auto/corelib/io/qsettings/tst_qsettings.cpp | 10 |
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; |