1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef mozilla_a11y_HTMLTableAccessible_h__ 7 #define mozilla_a11y_HTMLTableAccessible_h__ 8 9 #include "HyperTextAccessibleWrap.h" 10 #include "TableAccessible.h" 11 #include "TableCellAccessible.h" 12 13 class nsITableCellLayout; 14 class nsTableCellFrame; 15 class nsTableWrapperFrame; 16 17 namespace mozilla { 18 19 enum class TableSelectionMode : uint32_t; 20 21 namespace a11y { 22 23 /** 24 * HTML table cell accessible (html:td). 25 */ 26 class HTMLTableCellAccessible : public HyperTextAccessibleWrap, 27 public TableCellAccessible { 28 public: 29 HTMLTableCellAccessible(nsIContent* aContent, DocAccessible* aDoc); 30 31 // nsISupports NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTableCellAccessible,HyperTextAccessibleWrap)32 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTableCellAccessible, 33 HyperTextAccessibleWrap) 34 35 // Accessible 36 virtual TableCellAccessible* AsTableCell() override { return this; } 37 virtual a11y::role NativeRole() const override; 38 virtual uint64_t NativeState() const override; 39 virtual uint64_t NativeInteractiveState() const override; 40 virtual already_AddRefed<nsIPersistentProperties> NativeAttributes() override; 41 virtual mozilla::a11y::GroupPos GroupPosition() override; 42 43 // TableCellAccessible 44 virtual TableAccessible* Table() const override; 45 virtual uint32_t ColIdx() const override; 46 virtual uint32_t RowIdx() const override; 47 virtual uint32_t ColExtent() const override; 48 virtual uint32_t RowExtent() const override; 49 virtual void ColHeaderCells(nsTArray<Accessible*>* aCells) override; 50 virtual void RowHeaderCells(nsTArray<Accessible*>* aCells) override; 51 virtual bool Selected() override; 52 53 protected: ~HTMLTableCellAccessible()54 virtual ~HTMLTableCellAccessible() {} 55 56 /** 57 * Return nsITableCellLayout of the table cell frame. 58 */ 59 nsITableCellLayout* GetCellLayout() const; 60 61 /** 62 * Return the table cell frame. 63 */ 64 nsTableCellFrame* GetCellFrame() const; 65 66 /** 67 * Return row and column indices of the cell. 68 */ 69 nsresult GetCellIndexes(int32_t& aRowIdx, int32_t& aColIdx) const; 70 }; 71 72 /** 73 * HTML table row/column header accessible (html:th or html:td@scope). 74 */ 75 class HTMLTableHeaderCellAccessible : public HTMLTableCellAccessible { 76 public: 77 HTMLTableHeaderCellAccessible(nsIContent* aContent, DocAccessible* aDoc); 78 79 // Accessible 80 virtual a11y::role NativeRole() const override; 81 }; 82 83 /** 84 * HTML table row accessible (html:tr). 85 */ 86 class HTMLTableRowAccessible : public HyperTextAccessibleWrap { 87 public: HTMLTableRowAccessible(nsIContent * aContent,DocAccessible * aDoc)88 HTMLTableRowAccessible(nsIContent* aContent, DocAccessible* aDoc) 89 : HyperTextAccessibleWrap(aContent, aDoc) { 90 mType = eHTMLTableRowType; 91 mGenericTypes |= eTableRow; 92 } 93 94 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTableRowAccessible, 95 HyperTextAccessibleWrap) 96 97 // Accessible 98 virtual a11y::role NativeRole() const override; 99 virtual mozilla::a11y::GroupPos GroupPosition() override; 100 101 protected: ~HTMLTableRowAccessible()102 virtual ~HTMLTableRowAccessible() {} 103 104 // Accessible 105 virtual ENameValueFlag NativeName(nsString& aName) const override; 106 }; 107 108 /** 109 * HTML table accessible (html:table). 110 */ 111 112 // To turn on table debugging descriptions define SHOW_LAYOUT_HEURISTIC 113 // This allow release trunk builds to be used by testers to refine the 114 // data vs. layout heuristic 115 // #define SHOW_LAYOUT_HEURISTIC 116 117 class HTMLTableAccessible : public HyperTextAccessibleWrap, 118 public TableAccessible { 119 public: HTMLTableAccessible(nsIContent * aContent,DocAccessible * aDoc)120 HTMLTableAccessible(nsIContent* aContent, DocAccessible* aDoc) 121 : HyperTextAccessibleWrap(aContent, aDoc) { 122 mType = eHTMLTableType; 123 mGenericTypes |= eTable; 124 } 125 126 NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLTableAccessible, 127 HyperTextAccessibleWrap) 128 129 // TableAccessible 130 virtual Accessible* Caption() const override; 131 virtual void Summary(nsString& aSummary) override; 132 virtual uint32_t ColCount() const override; 133 virtual uint32_t RowCount() override; 134 virtual Accessible* CellAt(uint32_t aRowIndex, 135 uint32_t aColumnIndex) override; 136 virtual int32_t CellIndexAt(uint32_t aRowIdx, uint32_t aColIdx) override; 137 virtual int32_t ColIndexAt(uint32_t aCellIdx) override; 138 virtual int32_t RowIndexAt(uint32_t aCellIdx) override; 139 virtual void RowAndColIndicesAt(uint32_t aCellIdx, int32_t* aRowIdx, 140 int32_t* aColIdx) override; 141 virtual uint32_t ColExtentAt(uint32_t aRowIdx, uint32_t aColIdx) override; 142 virtual uint32_t RowExtentAt(uint32_t aRowIdx, uint32_t aColIdx) override; 143 virtual bool IsColSelected(uint32_t aColIdx) override; 144 virtual bool IsRowSelected(uint32_t aRowIdx) override; 145 virtual bool IsCellSelected(uint32_t aRowIdx, uint32_t aColIdx) override; 146 virtual uint32_t SelectedCellCount() override; 147 virtual uint32_t SelectedColCount() override; 148 virtual uint32_t SelectedRowCount() override; 149 virtual void SelectedCells(nsTArray<Accessible*>* aCells) override; 150 virtual void SelectedCellIndices(nsTArray<uint32_t>* aCells) override; 151 virtual void SelectedColIndices(nsTArray<uint32_t>* aCols) override; 152 virtual void SelectedRowIndices(nsTArray<uint32_t>* aRows) override; 153 virtual void SelectCol(uint32_t aColIdx) override; 154 virtual void SelectRow(uint32_t aRowIdx) override; 155 virtual void UnselectCol(uint32_t aColIdx) override; 156 virtual void UnselectRow(uint32_t aRowIdx) override; AsAccessible()157 virtual Accessible* AsAccessible() override { return this; } 158 159 // Accessible AsTable()160 virtual TableAccessible* AsTable() override { return this; } 161 virtual void Description(nsString& aDescription) override; 162 virtual a11y::role NativeRole() const override; 163 virtual uint64_t NativeState() const override; 164 virtual already_AddRefed<nsIPersistentProperties> NativeAttributes() override; 165 virtual Relation RelationByType(RelationType aRelationType) const override; 166 167 virtual bool InsertChildAt(uint32_t aIndex, Accessible* aChild) override; 168 169 protected: ~HTMLTableAccessible()170 virtual ~HTMLTableAccessible() {} 171 172 // Accessible 173 virtual ENameValueFlag NativeName(nsString& aName) const override; 174 175 // HTMLTableAccessible 176 177 /** 178 * Add row or column to selection. 179 * 180 * @param aIndex [in] index of row or column to be selected 181 * @param aTarget [in] indicates what should be selected, either row or 182 * column (see nsFrameSelection) 183 */ 184 nsresult AddRowOrColumnToSelection(int32_t aIndex, 185 TableSelectionMode aTarget); 186 187 /** 188 * Removes rows or columns at the given index or outside it from selection. 189 * 190 * @param aIndex [in] row or column index 191 * @param aTarget [in] indicates whether row or column should unselected 192 * @param aIsOuter [in] indicates whether all rows or column excepting 193 * the given one should be unselected or the given one 194 * should be unselected only 195 */ 196 nsresult RemoveRowsOrColumnsFromSelection(int32_t aIndex, 197 TableSelectionMode aTarget, 198 bool aIsOuter); 199 200 #ifdef SHOW_LAYOUT_HEURISTIC 201 nsString mLayoutHeuristic; 202 #endif 203 204 private: 205 /** 206 * Get table wrapper frame, or return null if there is no inner table. 207 */ 208 nsTableWrapperFrame* GetTableWrapperFrame() const; 209 }; 210 211 /** 212 * HTML caption accessible (html:caption). 213 */ 214 class HTMLCaptionAccessible : public HyperTextAccessibleWrap { 215 public: HTMLCaptionAccessible(nsIContent * aContent,DocAccessible * aDoc)216 HTMLCaptionAccessible(nsIContent* aContent, DocAccessible* aDoc) 217 : HyperTextAccessibleWrap(aContent, aDoc) { 218 mType = eHTMLCaptionType; 219 } 220 221 // Accessible 222 virtual a11y::role NativeRole() const override; 223 virtual Relation RelationByType(RelationType aRelationType) const override; 224 225 protected: ~HTMLCaptionAccessible()226 virtual ~HTMLCaptionAccessible() {} 227 }; 228 229 } // namespace a11y 230 } // namespace mozilla 231 232 #endif 233