Bug 747219 - decomtaminate GetCellAt() on accessible tables, r=tbsaunde, f=surkov

This commit is contained in:
Mark Capella 2012-05-22 12:41:01 -04:00
parent b25b771f56
commit e3962f8a5a
10 changed files with 69 additions and 71 deletions

View File

@ -80,24 +80,14 @@ ARIAGridAccessible::RowCount()
return rowCount;
}
NS_IMETHODIMP
ARIAGridAccessible::GetCellAt(PRInt32 aRowIndex, PRInt32 aColumnIndex,
nsIAccessible** aCell)
{
NS_ENSURE_ARG_POINTER(aCell);
*aCell = nsnull;
nsAccessible*
ARIAGridAccessible::CellAt(PRUint32 aRowIndex, PRUint32 aColumnIndex)
{
nsAccessible* row = GetRowAt(aRowIndex);
if (!row)
return nsnull;
if (IsDefunct())
return NS_ERROR_FAILURE;
nsAccessible *row = GetRowAt(aRowIndex);
NS_ENSURE_ARG(row);
nsAccessible *cell = GetCellInRowAt(row, aColumnIndex);
NS_ENSURE_ARG(cell);
NS_ADDREF(*aCell = cell);
return NS_OK;
return GetCellInRowAt(row, aColumnIndex);
}
NS_IMETHODIMP

View File

@ -41,6 +41,7 @@ public:
// TableAccessible
virtual PRUint32 ColCount();
virtual PRUint32 RowCount();
virtual nsAccessible* CellAt(PRUint32 aRowIndex, PRUint32 aColumnIndex);
virtual void UnselectCol(PRUint32 aColIdx);
virtual void UnselectRow(PRUint32 aRowIdx);

View File

@ -842,28 +842,23 @@ nsHTMLTableAccessible::GetSelectedRowIndices(PRUint32 *aNumRows,
return rv;
}
NS_IMETHODIMP
nsHTMLTableAccessible::GetCellAt(PRInt32 aRow, PRInt32 aColumn,
nsIAccessible **aTableCellAccessible)
{
nsAccessible*
nsHTMLTableAccessible::CellAt(PRUint32 aRowIndex, PRUint32 aColumnIndex)
{
nsCOMPtr<nsIDOMElement> cellElement;
nsresult rv = GetCellAt(aRow, aColumn, *getter_AddRefs(cellElement));
NS_ENSURE_SUCCESS(rv, rv);
GetCellAt(aRowIndex, aColumnIndex, *getter_AddRefs(cellElement));
if (!cellElement)
return nsnull;
nsCOMPtr<nsIContent> cellContent(do_QueryInterface(cellElement));
if (!cellContent)
return nsnull;
nsAccessible* cell = mDoc->GetAccessible(cellContent);
if (!cell) {
return NS_ERROR_INVALID_ARG;
}
if (cell != this) {
// XXX bug 576838: crazy tables (like table6 in tables/test_table2.html) may
// return itself as a cell what makes Orca hang.
NS_ADDREF(*aTableCellAccessible = cell);
}
return NS_OK;
// XXX bug 576838: crazy tables (like table6 in tables/test_table2.html) may
// return itself as a cell what makes Orca hang.
return cell == this ? nsnull : cell;
}
PRInt32

View File

@ -99,6 +99,7 @@ public:
virtual void Summary(nsString& aSummary);
virtual PRUint32 ColCount();
virtual PRUint32 RowCount();
virtual nsAccessible* CellAt(PRUint32 aRowIndex, PRUint32 aColumnIndex);
virtual PRInt32 CellIndexAt(PRUint32 aRowIdx, PRUint32 aColIdx);
virtual void UnselectCol(PRUint32 aColIdx);
virtual void UnselectRow(PRUint32 aRowIdx);

View File

@ -47,6 +47,24 @@ xpcAccessibleTable::GetRowCount(PRInt32* aRowCount)
return NS_OK;
}
nsresult
xpcAccessibleTable::GetCellAt(PRInt32 aRowIndex, PRInt32 aColumnIndex,
nsIAccessible** aCell)
{
NS_ENSURE_ARG_POINTER(aCell);
*aCell = nsnull;
if (!mTable)
return NS_ERROR_FAILURE;
if (aRowIndex < 0 || aRowIndex >= mTable->RowCount() ||
aColumnIndex < 0 || aColumnIndex >= mTable->ColCount())
return NS_ERROR_INVALID_ARG;
NS_IF_ADDREF(*aCell = mTable->CellAt(aRowIndex, aColumnIndex));
return NS_OK;
}
nsresult
xpcAccessibleTable::GetCellIndexAt(PRInt32 aRowIndex, PRInt32 aColumnIndex,
PRInt32* aCellIndex)

View File

@ -26,6 +26,8 @@ public:
nsresult GetSummary(nsAString& aSummary);
nsresult GetColumnCount(PRInt32* aColumnCount);
nsresult GetRowCount(PRInt32* aRowCount);
nsresult GetCellAt(PRInt32 aRowIndex, PRInt32 aColumnIndex,
nsIAccessible** aCell);
nsresult GetCellIndexAt(PRInt32 aRowIndex, PRInt32 aColumnIndex,
PRInt32* aCellIndex);
nsresult UnselectColumn(PRInt32 aColIdx);
@ -45,7 +47,8 @@ protected:
{ return xpcAccessibleTable::GetColumnCount(aColumnCount); } \
NS_SCRIPTABLE NS_IMETHOD GetRowCount(PRInt32* aRowCount) \
{ return xpcAccessibleTable::GetRowCount(aRowCount); } \
NS_SCRIPTABLE NS_IMETHOD GetCellAt(PRInt32 rowIndex, PRInt32 columnIndex, nsIAccessible * *_retval NS_OUTPARAM); \
NS_SCRIPTABLE NS_IMETHOD GetCellAt(PRInt32 rowIndex, PRInt32 columnIndex, nsIAccessible** _retval NS_OUTPARAM) \
{ return xpcAccessibleTable::GetCellAt(rowIndex, columnIndex, _retval); } \
NS_SCRIPTABLE NS_IMETHOD GetCellIndexAt(PRInt32 rowIndex, PRInt32 columnIndex, PRInt32 *_retval NS_OUTPARAM) \
{ return xpcAccessibleTable::GetCellIndexAt(rowIndex, columnIndex, _retval); } \
NS_SCRIPTABLE NS_IMETHOD GetColumnIndexAt(PRInt32 cellIndex, PRInt32 *_retval NS_OUTPARAM); \

View File

@ -244,32 +244,26 @@ nsXULListboxAccessible::RowCount()
return itemCount;
}
NS_IMETHODIMP
nsXULListboxAccessible::GetCellAt(PRInt32 aRow, PRInt32 aColumn,
nsIAccessible **aAccessibleCell)
{
NS_ENSURE_ARG_POINTER(aAccessibleCell);
*aAccessibleCell = nsnull;
if (IsDefunct())
return NS_OK;
nsAccessible*
nsXULListboxAccessible::CellAt(PRUint32 aRowIndex, PRUint32 aColumnIndex)
{
nsCOMPtr<nsIDOMXULSelectControlElement> control =
do_QueryInterface(mContent);
NS_ENSURE_TRUE(control, nsnull);
nsCOMPtr<nsIDOMXULSelectControlItemElement> item;
control->GetItemAtIndex(aRow, getter_AddRefs(item));
NS_ENSURE_TRUE(item, NS_ERROR_INVALID_ARG);
control->GetItemAtIndex(aRowIndex, getter_AddRefs(item));
if (!item)
return nsnull;
nsCOMPtr<nsIContent> itemContent(do_QueryInterface(item));
NS_ENSURE_TRUE(mDoc, NS_ERROR_FAILURE);
nsAccessible *row = mDoc->GetAccessible(itemContent);
NS_ENSURE_STATE(row);
if (!itemContent)
return nsnull;
nsresult rv = row->GetChildAt(aColumn, aAccessibleCell);
NS_ENSURE_SUCCESS(rv, NS_ERROR_INVALID_ARG);
nsAccessible* row = mDoc->GetAccessible(itemContent);
NS_ENSURE_TRUE(row, nsnull);
return NS_OK;
return row->GetChildAt(aColumnIndex);
}
NS_IMETHODIMP

View File

@ -72,6 +72,7 @@ public:
// TableAccessible
virtual PRUint32 ColCount();
virtual PRUint32 RowCount();
virtual nsAccessible* CellAt(PRUint32 aRowIndex, PRUint32 aColumnIndex);
virtual void UnselectRow(PRUint32 aRowIdx);
// nsAccessNode

View File

@ -298,29 +298,23 @@ nsXULTreeGridAccessible::GetSelectedRowIndices(PRUint32 *arowCount,
return NS_OK;
}
NS_IMETHODIMP
nsXULTreeGridAccessible::GetCellAt(PRInt32 aRowIndex, PRInt32 aColumnIndex,
nsIAccessible **aCell)
{
NS_ENSURE_ARG_POINTER(aCell);
*aCell = nsnull;
if (IsDefunct())
return NS_ERROR_FAILURE;
nsAccessible *rowAccessible = GetTreeItemAccessible(aRowIndex);
if (!rowAccessible)
return NS_ERROR_INVALID_ARG;
nsAccessible*
nsXULTreeGridAccessible::CellAt(PRUint32 aRowIndex, PRUint32 aColumnIndex)
{
nsAccessible* row = GetTreeItemAccessible(aRowIndex);
if (!row)
return nsnull;
nsCOMPtr<nsITreeColumn> column =
nsCoreUtils::GetSensibleColumnAt(mTree, aColumnIndex);
nsCoreUtils::GetSensibleColumnAt(mTree, aColumnIndex);
if (!column)
return NS_ERROR_INVALID_ARG;
return nsnull;
nsRefPtr<nsXULTreeItemAccessibleBase> rowAcc = do_QueryObject(rowAccessible);
nsRefPtr<nsXULTreeItemAccessibleBase> rowAcc = do_QueryObject(row);
if (!rowAcc)
return nsnull;
NS_IF_ADDREF(*aCell = rowAcc->GetCellAccessible(column));
return NS_OK;
return rowAcc->GetCellAccessible(column);
}
NS_IMETHODIMP

View File

@ -30,6 +30,7 @@ public:
// TableAccessible
virtual PRUint32 ColCount();
virtual PRUint32 RowCount();
virtual nsAccessible* CellAt(PRUint32 aRowIndex, PRUint32 aColumnIndex);
virtual void UnselectRow(PRUint32 aRowIdx);
// nsAccessNode