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