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_XULFormControlAccessible_H_
7 #define MOZILLA_A11Y_XULFormControlAccessible_H_
8 
9 // NOTE: alphabetically ordered
10 #include "AccessibleWrap.h"
11 #include "FormControlAccessible.h"
12 #include "HyperTextAccessibleWrap.h"
13 #include "XULSelectControlAccessible.h"
14 
15 namespace mozilla {
16 namespace a11y {
17 
18 /**
19  * Used for XUL button.
20  *
21  * @note  Don't inherit from LeafAccessible - it doesn't allow children
22  *         and a button can have a dropmarker child.
23  */
24 class XULButtonAccessible : public AccessibleWrap {
25  public:
26   enum { eAction_Click = 0 };
27   XULButtonAccessible(nsIContent* aContent, DocAccessible* aDoc);
28 
29   // nsISupports
30   NS_INLINE_DECL_REFCOUNTING_INHERITED(XULButtonAccessible, AccessibleWrap)
31 
32   // LocalAccessible
33   virtual mozilla::a11y::role NativeRole() const override;
34   virtual uint64_t NativeState() const override;
35 
36   // ActionAccessible
37   virtual uint8_t ActionCount() const override;
38   virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
39   virtual bool DoAction(uint8_t aIndex) const override;
40 
41   // Widgets
42   virtual bool IsWidget() const override;
43   virtual bool IsActiveWidget() const override;
44   virtual bool AreItemsOperable() const override;
45   virtual LocalAccessible* ContainerWidget() const override;
46 
47   virtual bool IsAcceptableChild(nsIContent* aEl) const override;
48 
49  protected:
50   virtual ~XULButtonAccessible();
51 
52   // XULButtonAccessible
53   bool ContainsMenu() const;
54 };
55 
56 /**
57  * Used for XUL dropmarker element.
58  */
59 class XULDropmarkerAccessible : public LeafAccessible {
60  public:
61   enum { eAction_Click = 0 };
62   XULDropmarkerAccessible(nsIContent* aContent, DocAccessible* aDoc);
63 
64   // LocalAccessible
65   virtual mozilla::a11y::role NativeRole() const override;
66   virtual uint64_t NativeState() const override;
67 
68   // ActionAccessible
69   virtual uint8_t ActionCount() const override;
70   virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
71   virtual bool DoAction(uint8_t aIndex) const override;
72 
73  private:
74   bool DropmarkerOpen(bool aToggleOpen) const;
75 };
76 
77 /**
78  * Used for XUL groupbox element.
79  */
80 class XULGroupboxAccessible final : public AccessibleWrap {
81  public:
82   XULGroupboxAccessible(nsIContent* aContent, DocAccessible* aDoc);
83 
84   // LocalAccessible
85   virtual mozilla::a11y::role NativeRole() const override;
86   virtual Relation RelationByType(RelationType aType) const override;
87 
88  protected:
89   // LocalAccessible
90   virtual ENameValueFlag NativeName(nsString& aName) const override;
91 };
92 
93 /**
94  * Used for XUL radio element (radio button).
95  */
96 class XULRadioButtonAccessible : public RadioButtonAccessible {
97  public:
98   XULRadioButtonAccessible(nsIContent* aContent, DocAccessible* aDoc);
99 
100   // LocalAccessible
101   virtual uint64_t NativeState() const override;
102   virtual uint64_t NativeInteractiveState() const override;
103 
104   // Widgets
105   virtual LocalAccessible* ContainerWidget() const override;
106 };
107 
108 /**
109  * Used for XUL radiogroup element.
110  */
111 class XULRadioGroupAccessible : public XULSelectControlAccessible {
112  public:
113   XULRadioGroupAccessible(nsIContent* aContent, DocAccessible* aDoc);
114 
115   // LocalAccessible
116   virtual mozilla::a11y::role NativeRole() const override;
117   virtual uint64_t NativeInteractiveState() const override;
118 
119   // Widgets
120   virtual bool IsWidget() const override;
121   virtual bool IsActiveWidget() const override;
122   virtual bool AreItemsOperable() const override;
123   virtual LocalAccessible* CurrentItem() const override;
124   virtual void SetCurrentItem(const LocalAccessible* aItem) override;
125 };
126 
127 /**
128  * Used for XUL statusbar element.
129  */
130 class XULStatusBarAccessible : public AccessibleWrap {
131  public:
132   XULStatusBarAccessible(nsIContent* aContent, DocAccessible* aDoc);
133 
134   // LocalAccessible
135   virtual mozilla::a11y::role NativeRole() const override;
136 };
137 
138 /**
139  * Used for XUL toolbarbutton element.
140  */
141 class XULToolbarButtonAccessible : public XULButtonAccessible {
142  public:
143   XULToolbarButtonAccessible(nsIContent* aContent, DocAccessible* aDoc);
144 
145   // LocalAccessible
146   virtual void GetPositionAndSizeInternal(int32_t* aPosInSet,
147                                           int32_t* aSetSize) override;
148 
149   // nsXULToolbarButtonAccessible
150   static bool IsSeparator(LocalAccessible* aAccessible);
151 
152   // Widgets
153   virtual bool IsAcceptableChild(nsIContent* aEl) const override;
154 };
155 
156 /**
157  * Used for XUL toolbar element.
158  */
159 class XULToolbarAccessible : public AccessibleWrap {
160  public:
161   XULToolbarAccessible(nsIContent* aContent, DocAccessible* aDoc);
162 
163   // LocalAccessible
164   virtual mozilla::a11y::role NativeRole() const override;
165 
166  protected:
167   // LocalAccessible
168   virtual ENameValueFlag NativeName(nsString& aName) const override;
169 };
170 
171 /**
172  * Used for XUL toolbarseparator element.
173  */
174 class XULToolbarSeparatorAccessible : public LeafAccessible {
175  public:
176   XULToolbarSeparatorAccessible(nsIContent* aContent, DocAccessible* aDoc);
177 
178   // LocalAccessible
179   virtual mozilla::a11y::role NativeRole() const override;
180   virtual uint64_t NativeState() const override;
181 };
182 
183 }  // namespace a11y
184 }  // namespace mozilla
185 
186 #endif
187