Bug 755621 - Add downcasting for nsXULTreeItemAccessibleBase. r=nlapre

Differential Revision: https://phabricator.services.mozilla.com/D170051
This commit is contained in:
Razvan Cojocaru 2023-02-20 06:37:16 +00:00
parent 0730720a67
commit a334f46de8
4 changed files with 31 additions and 48 deletions

View File

@ -177,13 +177,12 @@ LocalAccessible* XULTreeAccessible::LocalChildAtPoint(
return AccessibleWrap::LocalChildAtPoint(aX, aY, aWhichChild);
}
LocalAccessible* child = GetTreeItemAccessible(cellInfo.mRow);
XULTreeItemAccessibleBase* child = GetTreeItemAccessible(cellInfo.mRow);
if (aWhichChild == EWhichChildAtPoint::DeepestChild && child) {
// Look for accessible cell for the found item accessible.
RefPtr<XULTreeItemAccessibleBase> treeitem = do_QueryObject(child);
LocalAccessible* cell = treeitem->GetCellAccessible(cellInfo.mCol);
if (cell) child = cell;
LocalAccessible* cell = child->GetCellAccessible(cellInfo.mCol);
if (cell) {
return cell;
}
}
return child;
@ -412,7 +411,8 @@ LocalAccessible* XULTreeAccessible::ContainerWidget() const { return nullptr; }
////////////////////////////////////////////////////////////////////////////////
// XULTreeAccessible: public implementation
LocalAccessible* XULTreeAccessible::GetTreeItemAccessible(int32_t aRow) const {
XULTreeItemAccessibleBase* XULTreeAccessible::GetTreeItemAccessible(
int32_t aRow) const {
if (aRow < 0 || IsDefunct() || !mTreeView) return nullptr;
int32_t rowCount = 0;
@ -421,12 +421,13 @@ LocalAccessible* XULTreeAccessible::GetTreeItemAccessible(int32_t aRow) const {
void* key = reinterpret_cast<void*>(intptr_t(aRow));
return mAccessibleCache.WithEntryHandle(
key, [&](auto&& entry) -> LocalAccessible* {
key, [&](auto&& entry) -> XULTreeItemAccessibleBase* {
if (entry) {
return entry->get();
}
RefPtr<LocalAccessible> treeItem = CreateTreeItemAccessible(aRow);
RefPtr<XULTreeItemAccessibleBase> treeItem =
CreateTreeItemAccessible(aRow);
if (treeItem) {
entry.Insert(RefPtr{treeItem});
Document()->BindToDocument(treeItem, nullptr);
@ -453,7 +454,7 @@ void XULTreeAccessible::InvalidateCache(int32_t aRow, int32_t aCount) {
// Fire destroy event for removed tree items and delete them from caches.
for (int32_t rowIdx = aRow; rowIdx < aRow - aCount; rowIdx++) {
void* key = reinterpret_cast<void*>(intptr_t(rowIdx));
LocalAccessible* treeItem = mAccessibleCache.GetWeak(key);
XULTreeItemAccessibleBase* treeItem = mAccessibleCache.GetWeak(key);
if (treeItem) {
RefPtr<AccEvent> event =
@ -477,7 +478,7 @@ void XULTreeAccessible::InvalidateCache(int32_t aRow, int32_t aCount) {
for (int32_t rowIdx = newRowCount; rowIdx < oldRowCount; ++rowIdx) {
void* key = reinterpret_cast<void*>(intptr_t(rowIdx));
LocalAccessible* treeItem = mAccessibleCache.GetWeak(key);
XULTreeItemAccessibleBase* treeItem = mAccessibleCache.GetWeak(key);
if (treeItem) {
// Unbind from document, shutdown and remove from tree cache.
@ -521,13 +522,9 @@ void XULTreeAccessible::TreeViewInvalidated(int32_t aStartRow, int32_t aEndRow,
for (int32_t rowIdx = aStartRow; rowIdx <= endRow; ++rowIdx) {
void* key = reinterpret_cast<void*>(intptr_t(rowIdx));
LocalAccessible* accessible = mAccessibleCache.GetWeak(key);
if (accessible) {
RefPtr<XULTreeItemAccessibleBase> treeitemAcc =
do_QueryObject(accessible);
NS_ASSERTION(treeitemAcc, "Wrong accessible at the given key!");
XULTreeItemAccessibleBase* treeitemAcc = mAccessibleCache.GetWeak(key);
if (treeitemAcc) {
treeitemAcc->RowInvalidated(aStartCol, endCol);
}
}
@ -555,9 +552,9 @@ void XULTreeAccessible::TreeViewChanged(nsITreeView* aView) {
////////////////////////////////////////////////////////////////////////////////
// XULTreeAccessible: protected implementation
already_AddRefed<LocalAccessible> XULTreeAccessible::CreateTreeItemAccessible(
int32_t aRow) const {
RefPtr<LocalAccessible> accessible = new XULTreeItemAccessible(
already_AddRefed<XULTreeItemAccessibleBase>
XULTreeAccessible::CreateTreeItemAccessible(int32_t aRow) const {
RefPtr<XULTreeItemAccessibleBase> accessible = new XULTreeItemAccessible(
mContent, mDoc, const_cast<XULTreeAccessible*>(this), mTree, mTreeView,
aRow);
@ -587,9 +584,8 @@ XULTreeItemAccessibleBase::~XULTreeItemAccessibleBase() {}
NS_IMPL_CYCLE_COLLECTION_INHERITED(XULTreeItemAccessibleBase, LocalAccessible,
mTree)
NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED(XULTreeItemAccessibleBase,
LocalAccessible,
XULTreeItemAccessibleBase)
NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(XULTreeItemAccessibleBase,
LocalAccessible)
////////////////////////////////////////////////////////////////////////////////
// XULTreeItemAccessibleBase: LocalAccessible

View File

@ -17,6 +17,7 @@ namespace mozilla {
namespace a11y {
class XULTreeGridCellAccessible;
class XULTreeItemAccessibleBase;
/*
* A class the represents the XUL Tree widget.
@ -76,7 +77,7 @@ class XULTreeAccessible : public AccessibleWrap {
*
* @param aRow [in] the given row index
*/
LocalAccessible* GetTreeItemAccessible(int32_t aRow) const;
XULTreeItemAccessibleBase* GetTreeItemAccessible(int32_t aRow) const;
/**
* Invalidates the number of cached treeitem accessibles.
@ -111,25 +112,19 @@ class XULTreeAccessible : public AccessibleWrap {
/**
* Creates tree item accessible for the given row index.
*/
virtual already_AddRefed<LocalAccessible> CreateTreeItemAccessible(
virtual already_AddRefed<XULTreeItemAccessibleBase> CreateTreeItemAccessible(
int32_t aRow) const;
RefPtr<dom::XULTreeElement> mTree;
nsITreeView* mTreeView;
mutable AccessibleHashtable mAccessibleCache;
mutable nsRefPtrHashtable<nsPtrHashKey<const void>, XULTreeItemAccessibleBase>
mAccessibleCache;
};
/**
* Base class for tree item accessibles.
*/
#define XULTREEITEMBASEACCESSIBLE_IMPL_CID \
{ /* 1ab79ae7-766a-443c-940b-b1e6b0831dfc */ \
0x1ab79ae7, 0x766a, 0x443c, { \
0x94, 0x0b, 0xb1, 0xe6, 0xb0, 0x83, 0x1d, 0xfc \
} \
}
class XULTreeItemAccessibleBase : public AccessibleWrap {
public:
XULTreeItemAccessibleBase(nsIContent* aContent, DocAccessible* aDoc,
@ -165,9 +160,6 @@ class XULTreeItemAccessibleBase : public AccessibleWrap {
// Widgets
virtual LocalAccessible* ContainerWidget() const override;
// XULTreeItemAccessibleBase
NS_DECLARE_STATIC_IID_ACCESSOR(XULTREEITEMBASEACCESSIBLE_IMPL_CID)
/**
* Return row index associated with the accessible.
*/
@ -216,9 +208,6 @@ class XULTreeItemAccessibleBase : public AccessibleWrap {
int32_t mRow;
};
NS_DEFINE_STATIC_IID_ACCESSOR(XULTreeItemAccessibleBase,
XULTREEITEMBASEACCESSIBLE_IMPL_CID)
/**
* LocalAccessible class for items for XUL tree.
*/

View File

@ -106,16 +106,13 @@ void XULTreeGridAccessible::SelectedRowIndices(nsTArray<uint32_t>* aRows) {
LocalAccessible* XULTreeGridAccessible::CellAt(uint32_t aRowIndex,
uint32_t aColumnIndex) {
LocalAccessible* row = GetTreeItemAccessible(aRowIndex);
if (!row) return nullptr;
XULTreeItemAccessibleBase* rowAcc = GetTreeItemAccessible(aRowIndex);
if (!rowAcc) return nullptr;
RefPtr<nsTreeColumn> column =
nsCoreUtils::GetSensibleColumnAt(mTree, aColumnIndex);
if (!column) return nullptr;
RefPtr<XULTreeItemAccessibleBase> rowAcc = do_QueryObject(row);
if (!rowAcc) return nullptr;
return rowAcc->GetCellAccessible(column);
}
@ -189,9 +186,9 @@ role XULTreeGridAccessible::NativeRole() const {
////////////////////////////////////////////////////////////////////////////////
// XULTreeGridAccessible: XULTreeAccessible implementation
already_AddRefed<LocalAccessible>
already_AddRefed<XULTreeItemAccessibleBase>
XULTreeGridAccessible::CreateTreeItemAccessible(int32_t aRow) const {
RefPtr<LocalAccessible> accessible = new XULTreeGridRowAccessible(
RefPtr<XULTreeItemAccessibleBase> accessible = new XULTreeGridRowAccessible(
mContent, mDoc, const_cast<XULTreeGridAccessible*>(this), mTree,
mTreeView, aRow);
@ -618,7 +615,8 @@ LocalAccessible* XULTreeGridCellAccessible::GetSiblingAtOffset(
if (!columnAtOffset) return nullptr;
RefPtr<XULTreeItemAccessibleBase> rowAcc = do_QueryObject(LocalParent());
XULTreeItemAccessibleBase* rowAcc =
static_cast<XULTreeItemAccessibleBase*>(LocalParent());
return rowAcc->GetCellAccessible(columnAtOffset);
}

View File

@ -56,7 +56,7 @@ class XULTreeGridAccessible : public XULTreeAccessible, public TableAccessible {
virtual ~XULTreeGridAccessible();
// XULTreeAccessible
virtual already_AddRefed<LocalAccessible> CreateTreeItemAccessible(
virtual already_AddRefed<XULTreeItemAccessibleBase> CreateTreeItemAccessible(
int32_t aRow) const override;
};