diff options
author | Michael Weghorn <m.weghorn@posteo.de> | 2022-08-25 18:21:37 +0200 |
---|---|---|
committer | Michael Weghorn <m.weghorn@posteo.de> | 2022-08-30 22:53:09 +0200 |
commit | 8b947bae72bf661d31372d1bb5e3a16db50fca08 (patch) | |
tree | 16349d3fb7bd20d83387c44775ea25145c319bc7 /src/gui/accessible | |
parent | 56ec6a392a0301b733d0cb2f3d63453236ecdbff (diff) |
a11y: Don't reassign unique ID to other object right away
For the case that a newly created and registered accessible
interface gets removed again from the cache before another one
gets registered, the next registered interface was
previously assigned the same "unique ID" again, which e.g. breaks
assistive technology when using caching
with AT-SPI, since that relies on the assumption
that the ID is actually unique for each object.
(But here, the new object was using the same object path
as the old one, so data from the old object would be
used for the new one.)
To prevent that from happening, increment the
counter for the next ID to try at the end of
QAccessibleCache::acquireId, so the next time
the method gets called, it doesn't try again
whether the same ID as used previously is
available again.
For consistency, also rename the variable used
for the counter from lastUsedId to nextId.
This also adds a corresponding test case.
Fixes: QTBUG-105962
Pick-to: 6.4
Change-Id: Iddf4f3b35c57895bcfbb623a5377edf8344ab6c2
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/gui/accessible')
-rw-r--r-- | src/gui/accessible/qaccessiblecache.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/gui/accessible/qaccessiblecache.cpp b/src/gui/accessible/qaccessiblecache.cpp index d9586519c7..3010ffdd2b 100644 --- a/src/gui/accessible/qaccessiblecache.cpp +++ b/src/gui/accessible/qaccessiblecache.cpp @@ -48,18 +48,18 @@ QAccessibleCache *QAccessibleCache::instance() QAccessible::Id QAccessibleCache::acquireId() const { static const QAccessible::Id FirstId = QAccessible::Id(INT_MAX) + 1; - static QAccessible::Id lastUsedId = FirstId; + static QAccessible::Id nextId = FirstId; - while (idToInterface.contains(lastUsedId)) { + while (idToInterface.contains(nextId)) { // (wrap back when when we reach UINT_MAX - 1) // -1 because on Android -1 is taken for the "View" so just avoid it completely for consistency - if (lastUsedId == UINT_MAX - 1) - lastUsedId = FirstId; + if (nextId == UINT_MAX - 1) + nextId = FirstId; else - ++lastUsedId; + ++nextId; } - return lastUsedId; + return nextId++; } QAccessibleInterface *QAccessibleCache::interfaceForId(QAccessible::Id id) const |