зеркало из https://github.com/mozilla/gecko-dev.git
Bug 501659 - HTML table's isRowSelected/isColumnSelected shouldn't fail if row or column has cell holes, r=davidb
This commit is contained in:
Родитель
2f26d35176
Коммит
09226e46a1
|
@ -924,20 +924,12 @@ NS_IMETHODIMP
|
|||
nsHTMLTableAccessible::GetCellAt(PRInt32 aRow, PRInt32 aColumn,
|
||||
nsIAccessible **aTableCellAccessible)
|
||||
{
|
||||
NS_ENSURE_TRUE(IsValidRow(aRow) && IsValidColumn(aColumn), NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
nsCOMPtr<nsIDOMElement> cellElement;
|
||||
rv = GetCellAt(aRow, aColumn, *getter_AddRefs(cellElement));
|
||||
nsresult rv = GetCellAt(aRow, aColumn, *getter_AddRefs(cellElement));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIAccessibilityService>
|
||||
accService(do_GetService("@mozilla.org/accessibilityService;1"));
|
||||
NS_ENSURE_TRUE(accService, NS_ERROR_FAILURE);
|
||||
|
||||
return accService->GetAccessibleInWeakShell(cellElement, mWeakShell,
|
||||
aTableCellAccessible);
|
||||
return GetAccService()->GetAccessibleInWeakShell(cellElement, mWeakShell,
|
||||
aTableCellAccessible);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -946,8 +938,6 @@ nsHTMLTableAccessible::GetCellIndexAt(PRInt32 aRow, PRInt32 aColumn,
|
|||
{
|
||||
NS_ENSURE_ARG_POINTER(aIndex);
|
||||
|
||||
NS_ENSURE_TRUE(IsValidRow(aRow) && IsValidColumn(aColumn), NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsITableLayout *tableLayout = GetTableLayout();
|
||||
NS_ENSURE_STATE(tableLayout);
|
||||
|
||||
|
@ -970,7 +960,10 @@ nsHTMLTableAccessible::GetColumnIndexAt(PRInt32 aIndex, PRInt32 *aColumn)
|
|||
NS_ENSURE_STATE(tableLayout);
|
||||
|
||||
PRInt32 row;
|
||||
return tableLayout->GetRowAndColumnByIndex(aIndex, &row, aColumn);
|
||||
nsresult rv = tableLayout->GetRowAndColumnByIndex(aIndex, &row, aColumn);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return (row == -1 || *aColumn == -1) ? NS_ERROR_INVALID_ARG : NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -985,7 +978,10 @@ nsHTMLTableAccessible::GetRowIndexAt(PRInt32 aIndex, PRInt32 *aRow)
|
|||
NS_ENSURE_STATE(tableLayout);
|
||||
|
||||
PRInt32 column;
|
||||
return tableLayout->GetRowAndColumnByIndex(aIndex, aRow, &column);
|
||||
nsresult rv = tableLayout->GetRowAndColumnByIndex(aIndex, aRow, &column);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return (*aRow == -1 || column == -1) ? NS_ERROR_INVALID_ARG : NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -993,9 +989,6 @@ nsHTMLTableAccessible::GetColumnExtentAt(PRInt32 aRowIndex,
|
|||
PRInt32 aColumnIndex,
|
||||
PRInt32 *aExtentCount)
|
||||
{
|
||||
NS_ENSURE_TRUE(IsValidRow(aRowIndex) && IsValidColumn(aColumnIndex),
|
||||
NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsITableLayout *tableLayout = GetTableLayout();
|
||||
NS_ENSURE_STATE(tableLayout);
|
||||
|
||||
|
@ -1003,19 +996,18 @@ nsHTMLTableAccessible::GetColumnExtentAt(PRInt32 aRowIndex,
|
|||
PRInt32 startRowIndex, startColIndex, rowSpan, colSpan, actualRowSpan;
|
||||
PRBool isSelected;
|
||||
|
||||
return tableLayout->
|
||||
nsresult rv = tableLayout->
|
||||
GetCellDataAt(aRowIndex, aColumnIndex, *getter_AddRefs(domElement),
|
||||
startRowIndex, startColIndex, rowSpan, colSpan,
|
||||
actualRowSpan, *aExtentCount, isSelected);
|
||||
|
||||
return (rv == NS_TABLELAYOUT_CELL_NOT_FOUND) ? NS_ERROR_INVALID_ARG : NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLTableAccessible::GetRowExtentAt(PRInt32 aRowIndex, PRInt32 aColumnIndex,
|
||||
PRInt32 *aExtentCount)
|
||||
{
|
||||
NS_ENSURE_TRUE(IsValidRow(aRowIndex) && IsValidColumn(aColumnIndex),
|
||||
NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsITableLayout *tableLayout = GetTableLayout();
|
||||
NS_ENSURE_STATE(tableLayout);
|
||||
|
||||
|
@ -1023,10 +1015,12 @@ nsHTMLTableAccessible::GetRowExtentAt(PRInt32 aRowIndex, PRInt32 aColumnIndex,
|
|||
PRInt32 startRowIndex, startColIndex, rowSpan, colSpan, actualColSpan;
|
||||
PRBool isSelected;
|
||||
|
||||
return tableLayout->
|
||||
nsresult rv = tableLayout->
|
||||
GetCellDataAt(aRowIndex, aColumnIndex, *getter_AddRefs(domElement),
|
||||
startRowIndex, startColIndex, rowSpan, colSpan,
|
||||
*aExtentCount, actualColSpan, isSelected);
|
||||
|
||||
return (rv == NS_TABLELAYOUT_CELL_NOT_FOUND) ? NS_ERROR_INVALID_ARG : NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -1042,51 +1036,63 @@ nsHTMLTableAccessible::GetRowDescription(PRInt32 aRow, nsAString &_retval)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLTableAccessible::IsColumnSelected(PRInt32 aColumn, PRBool *_retval)
|
||||
nsHTMLTableAccessible::IsColumnSelected(PRInt32 aColumn, PRBool *aIsSelected)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(_retval);
|
||||
NS_ENSURE_ARG_POINTER(aIsSelected);
|
||||
*aIsSelected = PR_FALSE;
|
||||
|
||||
NS_ENSURE_TRUE(IsValidColumn(aColumn), NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
PRInt32 rows;
|
||||
rv = GetRowCount(&rows);
|
||||
PRInt32 colCount = 0;
|
||||
nsresult rv = GetColumnCount(&colCount);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
for (PRInt32 index = 0; index < rows; index++) {
|
||||
rv = IsCellSelected(index, aColumn, _retval);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (!*_retval) {
|
||||
break;
|
||||
if (aColumn < 0 || aColumn >= colCount)
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
PRInt32 rowCount = 0;
|
||||
rv = GetRowCount(&rowCount);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
for (PRInt32 rowIdx = 0; rowIdx < rowCount; rowIdx++) {
|
||||
PRBool isSelected = PR_FALSE;
|
||||
rv = IsCellSelected(rowIdx, aColumn, &isSelected);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
*aIsSelected = isSelected;
|
||||
if (!isSelected)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLTableAccessible::IsRowSelected(PRInt32 aRow, PRBool *_retval)
|
||||
nsHTMLTableAccessible::IsRowSelected(PRInt32 aRow, PRBool *aIsSelected)
|
||||
{
|
||||
NS_ENSURE_ARG_POINTER(_retval);
|
||||
NS_ENSURE_ARG_POINTER(aIsSelected);
|
||||
*aIsSelected = PR_FALSE;
|
||||
|
||||
NS_ENSURE_TRUE(IsValidRow(aRow), NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
PRInt32 columns;
|
||||
rv = GetColumnCount(&columns);
|
||||
PRInt32 rowCount = 0;
|
||||
nsresult rv = GetRowCount(&rowCount);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
for (PRInt32 index = 0; index < columns; index++) {
|
||||
rv = IsCellSelected(aRow, index, _retval);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (!*_retval) {
|
||||
break;
|
||||
if (aRow < 0 || aRow >= rowCount)
|
||||
return NS_ERROR_INVALID_ARG;
|
||||
|
||||
PRInt32 colCount = 0;
|
||||
rv = GetColumnCount(&colCount);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
for (PRInt32 colIdx = 0; colIdx < colCount; colIdx++) {
|
||||
PRBool isSelected = PR_FALSE;
|
||||
rv = IsCellSelected(aRow, colIdx, &isSelected);
|
||||
if (NS_SUCCEEDED(rv)) {
|
||||
*aIsSelected = isSelected;
|
||||
if (!isSelected)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return rv;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
@ -1096,9 +1102,6 @@ nsHTMLTableAccessible::IsCellSelected(PRInt32 aRow, PRInt32 aColumn,
|
|||
NS_ENSURE_ARG_POINTER(aIsSelected);
|
||||
*aIsSelected = PR_FALSE;
|
||||
|
||||
NS_ENSURE_TRUE(IsValidRow(aRow) && IsValidColumn(aColumn),
|
||||
NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsITableLayout *tableLayout = GetTableLayout();
|
||||
NS_ENSURE_STATE(tableLayout);
|
||||
|
||||
|
@ -1116,22 +1119,6 @@ nsHTMLTableAccessible::IsCellSelected(PRInt32 aRow, PRInt32 aColumn,
|
|||
return rv;
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsHTMLTableAccessible::IsValidColumn(PRInt32 aColumn)
|
||||
{
|
||||
PRInt32 colCount = 0;
|
||||
nsresult rv = GetColumnCount(&colCount);
|
||||
return NS_SUCCEEDED(rv) && (aColumn >= 0) && (aColumn < colCount);
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsHTMLTableAccessible::IsValidRow(PRInt32 aRow)
|
||||
{
|
||||
PRInt32 rowCount = 0;
|
||||
nsresult rv = GetRowCount(&rowCount);
|
||||
return NS_SUCCEEDED(rv) && (aRow >= 0) && (aRow < rowCount);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLTableAccessible::SelectRow(PRInt32 aRow)
|
||||
{
|
||||
|
|
|
@ -143,20 +143,6 @@ public:
|
|||
|
||||
// nsHTMLTableAccessible
|
||||
|
||||
/**
|
||||
* Returns true if the column index is in the valid column range.
|
||||
*
|
||||
* @param aColumn The index to check for validity.
|
||||
*/
|
||||
PRBool IsValidColumn(PRInt32 aColumn);
|
||||
|
||||
/**
|
||||
* Returns true if the given index is in the valid row range.
|
||||
*
|
||||
* @param aRow The index to check for validity.
|
||||
*/
|
||||
PRBool IsValidRow(PRInt32 aRow);
|
||||
|
||||
/**
|
||||
* Retun cell element at the given row and column index.
|
||||
*/
|
||||
|
|
|
@ -22,6 +22,9 @@
|
|||
|
||||
function doTest()
|
||||
{
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// table
|
||||
|
||||
var cellsArray =
|
||||
[
|
||||
[false, false, false, kColSpanned, false, false, false, false],
|
||||
|
@ -53,6 +56,20 @@
|
|||
var accTable = getAccessible("table", [nsIAccessibleTable]);
|
||||
ok(!accTable.isProbablyForLayout(), "table is not for layout");
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// table instane
|
||||
|
||||
cellsArray =
|
||||
[
|
||||
[false, false, false, -1, -1],
|
||||
[false, false, false, -1, -1],
|
||||
[false, false, kColSpanned, kColSpanned, -1],
|
||||
[kRowSpanned, false, false, -1, -1],
|
||||
[kRowSpanned, false, kRowSpanned, false, false]
|
||||
];
|
||||
|
||||
testTableSelection("tableinsane", cellsArray);
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
|
@ -77,6 +94,11 @@
|
|||
title="nsIAccessiblTable selectRows does not unselect previously selected rows">
|
||||
Mozilla Bug 417929
|
||||
</a>
|
||||
<a target="_blank"
|
||||
href="https://bugzilla.mozilla.org/show_bug.cgi?id=501659"
|
||||
title="HTML table's isRowSelected/isColumnSelected shouldn't fail if row or column has cell holes">
|
||||
Mozilla Bug 501659
|
||||
</a>
|
||||
|
||||
<p id="display"></p>
|
||||
<div id="content" style="display: none"></div>
|
||||
|
@ -122,6 +144,37 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<table border="1" id="tableinsane">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>col1</th>
|
||||
<th>col2</th>
|
||||
<th>col3</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>2</td>
|
||||
<td>3</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="3">4</td>
|
||||
<td colspan="4">5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>6</td>
|
||||
<td rowspan="2">7</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>8</td>
|
||||
<td>9</td>
|
||||
<td>10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</center>
|
||||
</body>
|
||||
</html>
|
||||
|
|
Загрузка…
Ссылка в новой задаче