1 /* -*- Mode: c++; c-basic-offset: 2; tab-width: 20; indent-tabs-mode: nil; -*-
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 #include "RemoteAccessibleWrap.h"
7 #include "LocalAccessible-inl.h"
8 
9 #include "mozilla/a11y/DocAccessiblePlatformExtParent.h"
10 
11 using namespace mozilla::a11y;
12 
RemoteAccessibleWrap(RemoteAccessible * aProxy)13 RemoteAccessibleWrap::RemoteAccessibleWrap(RemoteAccessible* aProxy)
14     : AccessibleWrap(nullptr, nullptr) {
15   mType = eProxyType;
16   mBits.proxy = aProxy;
17 
18   if (aProxy->HasNumericValue()) {
19     mGenericTypes |= eNumericValue;
20   }
21 
22   if (aProxy->IsSelect()) {
23     mGenericTypes |= eSelect;
24   }
25 
26   if (aProxy->IsHyperText()) {
27     mGenericTypes |= eHyperText;
28   }
29 
30   auto doc = reinterpret_cast<DocRemoteAccessibleWrap*>(
31       Proxy()->Document()->GetWrapper());
32   if (doc) {
33     mID = AcquireID();
34     doc->AddID(mID, this);
35   }
36 }
37 
Shutdown()38 void RemoteAccessibleWrap::Shutdown() {
39   auto doc = reinterpret_cast<DocRemoteAccessibleWrap*>(
40       Proxy()->Document()->GetWrapper());
41   if (mID && doc) {
42     doc->RemoveID(mID);
43     ReleaseID(mID);
44     mID = 0;
45   }
46 
47   mBits.proxy = nullptr;
48   mStateFlags |= eIsDefunct;
49 }
50 
51 // LocalAccessible
52 
Attributes()53 already_AddRefed<AccAttributes> RemoteAccessibleWrap::Attributes() {
54   RefPtr<AccAttributes> attrs;
55   Proxy()->Attributes(&attrs);
56   return attrs.forget();
57 }
58 
ChildCount() const59 uint32_t RemoteAccessibleWrap::ChildCount() const {
60   return Proxy()->ChildCount();
61 }
62 
LocalChildAt(uint32_t aIndex) const63 LocalAccessible* RemoteAccessibleWrap::LocalChildAt(uint32_t aIndex) const {
64   RemoteAccessible* child = Proxy()->RemoteChildAt(aIndex);
65   return child ? WrapperFor(child) : nullptr;
66 }
67 
Name(nsString & aName) const68 ENameValueFlag RemoteAccessibleWrap::Name(nsString& aName) const {
69   Proxy()->Name(aName);
70   return eNameOK;
71 }
72 
Value(nsString & aValue) const73 void RemoteAccessibleWrap::Value(nsString& aValue) const {
74   Proxy()->Value(aValue);
75 }
76 
State()77 uint64_t RemoteAccessibleWrap::State() { return Proxy()->State(); }
78 
Bounds() const79 nsIntRect RemoteAccessibleWrap::Bounds() const { return Proxy()->Bounds(); }
80 
ScrollTo(uint32_t aHow) const81 void RemoteAccessibleWrap::ScrollTo(uint32_t aHow) const {
82   Proxy()->ScrollTo(aHow);
83 }
84 
ActionCount() const85 uint8_t RemoteAccessibleWrap::ActionCount() const {
86   return Proxy()->ActionCount();
87 }
88 
DoAction(uint8_t aIndex) const89 bool RemoteAccessibleWrap::DoAction(uint8_t aIndex) const {
90   return Proxy()->DoAction(aIndex);
91 }
92 
93 // Other
94 
SetTextContents(const nsAString & aText)95 void RemoteAccessibleWrap::SetTextContents(const nsAString& aText) {
96   Proxy()->ReplaceText(PromiseFlatString(aText));
97 }
98 
GetTextContents(nsAString & aText)99 void RemoteAccessibleWrap::GetTextContents(nsAString& aText) {
100   nsAutoString text;
101   Proxy()->TextSubstring(0, -1, text);
102   aText.Assign(text);
103 }
104 
GetSelectionBounds(int32_t * aStartOffset,int32_t * aEndOffset)105 bool RemoteAccessibleWrap::GetSelectionBounds(int32_t* aStartOffset,
106                                               int32_t* aEndOffset) {
107   nsAutoString unused;
108   return Proxy()->SelectionBoundsAt(0, unused, aStartOffset, aEndOffset);
109 }
110 
PivotTo(int32_t aGranularity,bool aForward,bool aInclusive)111 void RemoteAccessibleWrap::PivotTo(int32_t aGranularity, bool aForward,
112                                    bool aInclusive) {
113   Unused << Proxy()->Document()->GetPlatformExtension()->SendPivot(
114       Proxy()->ID(), aGranularity, aForward, aInclusive);
115 }
116 
ExploreByTouch(float aX,float aY)117 void RemoteAccessibleWrap::ExploreByTouch(float aX, float aY) {
118   Unused << Proxy()->Document()->GetPlatformExtension()->SendExploreByTouch(
119       Proxy()->ID(), aX, aY);
120 }
121 
NavigateText(int32_t aGranularity,int32_t aStartOffset,int32_t aEndOffset,bool aForward,bool aSelect)122 void RemoteAccessibleWrap::NavigateText(int32_t aGranularity,
123                                         int32_t aStartOffset,
124                                         int32_t aEndOffset, bool aForward,
125                                         bool aSelect) {
126   Unused << Proxy()->Document()->GetPlatformExtension()->SendNavigateText(
127       Proxy()->ID(), aGranularity, aStartOffset, aEndOffset, aForward, aSelect);
128 }
129 
SetSelection(int32_t aStart,int32_t aEnd)130 void RemoteAccessibleWrap::SetSelection(int32_t aStart, int32_t aEnd) {
131   Unused << Proxy()->Document()->GetPlatformExtension()->SendSetSelection(
132       Proxy()->ID(), aStart, aEnd);
133 }
134 
Cut()135 void RemoteAccessibleWrap::Cut() {
136   Unused << Proxy()->Document()->GetPlatformExtension()->SendCut(Proxy()->ID());
137 }
138 
Copy()139 void RemoteAccessibleWrap::Copy() {
140   Unused << Proxy()->Document()->GetPlatformExtension()->SendCopy(
141       Proxy()->ID());
142 }
143 
Paste()144 void RemoteAccessibleWrap::Paste() {
145   Unused << Proxy()->Document()->GetPlatformExtension()->SendPaste(
146       Proxy()->ID());
147 }
148 
WrapperRole()149 role RemoteAccessibleWrap::WrapperRole() { return Proxy()->Role(); }
150 
WrapperParent()151 AccessibleWrap* RemoteAccessibleWrap::WrapperParent() {
152   return Proxy()->RemoteParent() ? WrapperFor(Proxy()->RemoteParent())
153                                  : nullptr;
154 }
155 
WrapperRangeInfo(double * aCurVal,double * aMinVal,double * aMaxVal,double * aStep)156 bool RemoteAccessibleWrap::WrapperRangeInfo(double* aCurVal, double* aMinVal,
157                                             double* aMaxVal, double* aStep) {
158   if (HasNumericValue()) {
159     RemoteAccessible* proxy = Proxy();
160     *aCurVal = proxy->CurValue();
161     *aMinVal = proxy->MinValue();
162     *aMaxVal = proxy->MaxValue();
163     *aStep = proxy->Step();
164     return true;
165   }
166 
167   return false;
168 }
169 
WrapperDOMNodeID(nsString & aDOMNodeID)170 void RemoteAccessibleWrap::WrapperDOMNodeID(nsString& aDOMNodeID) {
171   Proxy()->DOMNodeID(aDOMNodeID);
172 }
173