Accessibility: Fix crash in windowHelper
When accessing the parent, we cannot be sure that the parent interfaces are all valid. Invalid parents can happen during destruction. Another cause is unusual hierarchies, the QAbstractItemView::columnDelegate test triggers a situation where this used to crash. In addition to the actual problem, add checks for every parent() call. Change-Id: I70b2bf7bc3c02b0f33e22b81023fd24519adeba9 Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
This commit is contained in:
parent
6d9541ae96
commit
fe52d1853e
@ -645,7 +645,8 @@ HRESULT STDMETHODCALLTYPE QWindowsIA2Accessible::get_locationInParent(long *x, l
|
|||||||
|
|
||||||
QPoint topLeft = accessible->rect().topLeft();
|
QPoint topLeft = accessible->rect().topLeft();
|
||||||
|
|
||||||
if (QAccessibleInterface *parentIface = accessible->parent())
|
QAccessibleInterface *parentIface = accessible->parent();
|
||||||
|
if (parentIface && parentIface->isValid())
|
||||||
topLeft -= parentIface->rect().topLeft();
|
topLeft -= parentIface->rect().topLeft();
|
||||||
|
|
||||||
*x = topLeft.x();
|
*x = topLeft.x();
|
||||||
@ -1596,7 +1597,7 @@ uint QWindowsIA2Accessible::uniqueID() const
|
|||||||
if (!uid) {
|
if (!uid) {
|
||||||
QAccessibleInterface *acc = accessible;
|
QAccessibleInterface *acc = accessible;
|
||||||
QVector<int> indexOfNodes;
|
QVector<int> indexOfNodes;
|
||||||
while (acc && !acc->object()) {
|
while (acc && acc->isValid() && !acc->object()) {
|
||||||
QAccessibleInterface *par = acc->parent();
|
QAccessibleInterface *par = acc->parent();
|
||||||
indexOfNodes.append(par->indexOfChild(acc));
|
indexOfNodes.append(par->indexOfChild(acc));
|
||||||
if (acc != accessible)
|
if (acc != accessible)
|
||||||
|
@ -215,7 +215,7 @@ QWindow *QWindowsAccessibility::windowHelper(const QAccessibleInterface *iface)
|
|||||||
QWindow *window = iface->window();
|
QWindow *window = iface->window();
|
||||||
if (!window) {
|
if (!window) {
|
||||||
QAccessibleInterface *acc = iface->parent();
|
QAccessibleInterface *acc = iface->parent();
|
||||||
while (acc && !window) {
|
while (acc && acc->isValid() && !window) {
|
||||||
window = acc->window();
|
window = acc->window();
|
||||||
QAccessibleInterface *par = acc->parent();
|
QAccessibleInterface *par = acc->parent();
|
||||||
delete acc;
|
delete acc;
|
||||||
|
@ -612,7 +612,7 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::accNavigate(long navDir, VARIA
|
|||||||
case NAVDIR_PREVIOUS:
|
case NAVDIR_PREVIOUS:
|
||||||
if (!varStart.lVal){
|
if (!varStart.lVal){
|
||||||
QAccessibleInterface *parent = accessible->parent();
|
QAccessibleInterface *parent = accessible->parent();
|
||||||
if (parent) {
|
if (parent && parent->isValid()) {
|
||||||
int index = parent->indexOfChild(accessible);
|
int index = parent->indexOfChild(accessible);
|
||||||
index += (navDir == NAVDIR_NEXT) ? 1 : -1;
|
index += (navDir == NAVDIR_NEXT) ? 1 : -1;
|
||||||
if (index >= 0 && index < parent->childCount())
|
if (index >= 0 && index < parent->childCount())
|
||||||
@ -631,8 +631,9 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::accNavigate(long navDir, VARIA
|
|||||||
case NAVDIR_UP:
|
case NAVDIR_UP:
|
||||||
case NAVDIR_DOWN:
|
case NAVDIR_DOWN:
|
||||||
case NAVDIR_LEFT:
|
case NAVDIR_LEFT:
|
||||||
case NAVDIR_RIGHT:
|
case NAVDIR_RIGHT: {
|
||||||
if (QAccessibleInterface *pIface = accessible->parent()) {
|
QAccessibleInterface *pIface = accessible->parent();
|
||||||
|
if (pIface && pIface->isValid()) {
|
||||||
const int indexOfOurself = pIface->indexOfChild(accessible);
|
const int indexOfOurself = pIface->indexOfChild(accessible);
|
||||||
QRect startg = accessible->rect();
|
QRect startg = accessible->rect();
|
||||||
QPoint startc = startg.center();
|
QPoint startc = startg.center();
|
||||||
@ -709,6 +710,7 @@ HRESULT STDMETHODCALLTYPE QWindowsMsaaAccessible::accNavigate(long navDir, VARIA
|
|||||||
delete pIface;
|
delete pIface;
|
||||||
acc = candidate;
|
acc = candidate;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user