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_XULElementAccessibles_h__
7 #define mozilla_a11y_XULElementAccessibles_h__
8 
9 #include "HyperTextAccessibleWrap.h"
10 #include "TextLeafAccessibleWrap.h"
11 
12 namespace mozilla {
13 namespace a11y {
14 
15 class XULLabelTextLeafAccessible;
16 
17 /**
18  * Used for XUL description and label elements.
19  */
20 class XULLabelAccessible : public HyperTextAccessibleWrap {
21  public:
22   XULLabelAccessible(nsIContent* aContent, DocAccessible* aDoc);
23 
24   // LocalAccessible
25   virtual void Shutdown() override;
26   virtual a11y::role NativeRole() const override;
27   virtual uint64_t NativeState() const override;
28   virtual Relation RelationByType(RelationType aType) const override;
29 
30   void UpdateLabelValue(const nsString& aValue);
31 
32  protected:
33   // LocalAccessible
34   virtual ENameValueFlag NativeName(nsString& aName) const override;
35   virtual void DispatchClickEvent(nsIContent* aContent,
36                                   uint32_t aActionIndex) const override;
37 
38  private:
39   RefPtr<XULLabelTextLeafAccessible> mValueTextLeaf;
40 };
41 
AsXULLabel()42 inline XULLabelAccessible* LocalAccessible::AsXULLabel() {
43   return IsXULLabel() ? static_cast<XULLabelAccessible*>(this) : nullptr;
44 }
45 
46 /**
47  * Used to implement text interface on XUL label accessible in case when text
48  * is provided by @value attribute (no underlying text frame).
49  */
50 class XULLabelTextLeafAccessible final : public TextLeafAccessibleWrap {
51  public:
XULLabelTextLeafAccessible(nsIContent * aContent,DocAccessible * aDoc)52   XULLabelTextLeafAccessible(nsIContent* aContent, DocAccessible* aDoc)
53       : TextLeafAccessibleWrap(aContent, aDoc) {
54     mStateFlags |= eSharedNode;
55   }
56 
~XULLabelTextLeafAccessible()57   virtual ~XULLabelTextLeafAccessible() {}
58 
59   // LocalAccessible
60   virtual a11y::role NativeRole() const override;
61   virtual uint64_t NativeState() const override;
62 };
63 
64 /**
65  * Used for XUL tooltip element.
66  */
67 class XULTooltipAccessible : public LeafAccessible {
68  public:
69   XULTooltipAccessible(nsIContent* aContent, DocAccessible* aDoc);
70 
71   // LocalAccessible
72   virtual a11y::role NativeRole() const override;
73   virtual uint64_t NativeState() const override;
74 };
75 
76 class XULLinkAccessible : public XULLabelAccessible {
77  public:
78   XULLinkAccessible(nsIContent* aContent, DocAccessible* aDoc);
79 
80   // LocalAccessible
81   virtual void Value(nsString& aValue) const override;
82   virtual a11y::role NativeRole() const override;
83   virtual uint64_t NativeLinkState() const override;
84 
85   // ActionAccessible
86   virtual uint8_t ActionCount() const override;
87   virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
88   virtual bool DoAction(uint8_t aIndex) const override;
89 
90   // HyperLinkAccessible
91   virtual bool IsLink() const override;
92   virtual uint32_t StartOffset() override;
93   virtual uint32_t EndOffset() override;
94   virtual already_AddRefed<nsIURI> AnchorURIAt(
95       uint32_t aAnchorIndex) const override;
96 
97  protected:
98   virtual ~XULLinkAccessible();
99 
100   // LocalAccessible
101   virtual ENameValueFlag NativeName(nsString& aName) const override;
102 
103   enum { eAction_Jump = 0 };
104 };
105 
106 }  // namespace a11y
107 }  // namespace mozilla
108 
109 #endif
110