a11y: Do not cache classes that don't have a factory plugin
For Qt Widgets we thought it was a good idea to also store in the cache if a class didn't have a factory plugin. This worked fine there, since the number of QWidget classnames is quite limited (so the factory plugin cache will soon reach a limit) In QML however, classes are often suffixed with e.g. Button_QMLTYPE_123, Button_QMLTYPE_124 etc. This number suffix is just increased continuously. This could lead to that the factory plugin cache will grow ad infinitum, which will cause "memory leaks" in addition to a performance penalty. Fixes: QTBUG-75106 Change-Id: I9ba189f989f0b90ab62a2c54a2e9230236a998d8 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> (cherry picked from commit 583668005d4d6399fc16d165dcb6a5af2b94323d) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
4b3417f0f4
commit
e15d63baa3
@ -695,15 +695,14 @@ QAccessibleInterface *QAccessible::queryAccessibleInterface(QObject *object)
|
|||||||
// Find a QAccessiblePlugin (factory) for the class name. If there's
|
// Find a QAccessiblePlugin (factory) for the class name. If there's
|
||||||
// no entry in the cache try to create it using the plugin loader.
|
// no entry in the cache try to create it using the plugin loader.
|
||||||
if (!qAccessiblePlugins()->contains(cn)) {
|
if (!qAccessiblePlugins()->contains(cn)) {
|
||||||
QAccessiblePlugin *factory = nullptr; // 0 means "no plugin found". This is cached as well.
|
|
||||||
const int index = loader()->indexOf(cn);
|
const int index = loader()->indexOf(cn);
|
||||||
if (index != -1)
|
if (index != -1) {
|
||||||
factory = qobject_cast<QAccessiblePlugin *>(loader()->instance(index));
|
QAccessiblePlugin *factory = qobject_cast<QAccessiblePlugin *>(loader()->instance(index));
|
||||||
qAccessiblePlugins()->insert(cn, factory);
|
qAccessiblePlugins()->insert(cn, factory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point the cache should contain a valid factory pointer or 0:
|
// At this point the cache should contain a valid factory pointer or 0:
|
||||||
Q_ASSERT(qAccessiblePlugins()->contains(cn));
|
|
||||||
QAccessiblePlugin *factory = qAccessiblePlugins()->value(cn);
|
QAccessiblePlugin *factory = qAccessiblePlugins()->value(cn);
|
||||||
if (factory) {
|
if (factory) {
|
||||||
QAccessibleInterface *result = factory->create(cn, object);
|
QAccessibleInterface *result = factory->create(cn, object);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user