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