mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-10 03:45:46 +00:00
Bug 755621 - Add downcasting for nsXULTreeItemAccessibleBase. r=nlapre
Differential Revision: https://phabricator.services.mozilla.com/D170051
This commit is contained in:
parent
0730720a67
commit
a334f46de8
@ -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
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user