1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "xpcAccessibleHyperText.h"
10 #include "AccAttributes.h"
11 #include "nsComponentManagerUtils.h"
12 #include "nsPersistentProperties.h"
13 #include "xpcAccessibleDocument.h"
14 #include "xpcAccessibleTextRange.h"
16 #include "nsIMutableArray.h"
18 using namespace mozilla::a11y
;
20 ////////////////////////////////////////////////////////////////////////////////
23 NS_INTERFACE_MAP_BEGIN(xpcAccessibleHyperText
)
24 NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIAccessibleText
,
25 mSupportedIfaces
& eText
)
26 NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIAccessibleEditableText
,
27 mSupportedIfaces
& eText
)
28 NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIAccessibleHyperText
,
29 mSupportedIfaces
& eText
)
30 NS_INTERFACE_MAP_END_INHERITING(xpcAccessibleGeneric
)
32 NS_IMPL_ADDREF_INHERITED(xpcAccessibleHyperText
, xpcAccessibleGeneric
)
33 NS_IMPL_RELEASE_INHERITED(xpcAccessibleHyperText
, xpcAccessibleGeneric
)
35 ////////////////////////////////////////////////////////////////////////////////
39 xpcAccessibleHyperText::GetCharacterCount(int32_t* aCharacterCount
) {
40 NS_ENSURE_ARG_POINTER(aCharacterCount
);
43 if (!mIntl
) return NS_ERROR_FAILURE
;
45 *aCharacterCount
= static_cast<int32_t>(Intl()->CharacterCount());
50 xpcAccessibleHyperText::GetText(int32_t aStartOffset
, int32_t aEndOffset
,
54 if (!mIntl
) return NS_ERROR_FAILURE
;
56 Intl()->TextSubstring(aStartOffset
, aEndOffset
, aText
);
61 xpcAccessibleHyperText::GetTextBeforeOffset(
62 int32_t aOffset
, AccessibleTextBoundary aBoundaryType
,
63 int32_t* aStartOffset
, int32_t* aEndOffset
, nsAString
& aText
) {
64 NS_ENSURE_ARG_POINTER(aStartOffset
);
65 NS_ENSURE_ARG_POINTER(aEndOffset
);
66 *aStartOffset
= *aEndOffset
= 0;
69 if (!mIntl
) return NS_ERROR_FAILURE
;
71 Intl()->TextBeforeOffset(aOffset
, aBoundaryType
, aStartOffset
, aEndOffset
,
77 xpcAccessibleHyperText::GetTextAtOffset(int32_t aOffset
,
78 AccessibleTextBoundary aBoundaryType
,
79 int32_t* aStartOffset
,
80 int32_t* aEndOffset
, nsAString
& aText
) {
81 NS_ENSURE_ARG_POINTER(aStartOffset
);
82 NS_ENSURE_ARG_POINTER(aEndOffset
);
83 *aStartOffset
= *aEndOffset
= 0;
86 if (!mIntl
) return NS_ERROR_FAILURE
;
88 Intl()->TextAtOffset(aOffset
, aBoundaryType
, aStartOffset
, aEndOffset
, aText
);
93 xpcAccessibleHyperText::GetTextAfterOffset(int32_t aOffset
,
94 AccessibleTextBoundary aBoundaryType
,
95 int32_t* aStartOffset
,
98 NS_ENSURE_ARG_POINTER(aStartOffset
);
99 NS_ENSURE_ARG_POINTER(aEndOffset
);
100 *aStartOffset
= *aEndOffset
= 0;
103 Intl()->TextAfterOffset(aOffset
, aBoundaryType
, aStartOffset
, aEndOffset
,
109 xpcAccessibleHyperText::GetCharacterAtOffset(int32_t aOffset
,
110 char16_t
* aCharacter
) {
111 NS_ENSURE_ARG_POINTER(aCharacter
);
114 if (!mIntl
) return NS_ERROR_FAILURE
;
116 *aCharacter
= Intl()->CharAt(aOffset
);
121 xpcAccessibleHyperText::GetTextAttributes(
122 bool aIncludeDefAttrs
, int32_t aOffset
, int32_t* aStartOffset
,
123 int32_t* aEndOffset
, nsIPersistentProperties
** aAttributes
) {
124 NS_ENSURE_ARG_POINTER(aStartOffset
);
125 NS_ENSURE_ARG_POINTER(aEndOffset
);
126 NS_ENSURE_ARG_POINTER(aAttributes
);
127 *aStartOffset
= *aEndOffset
= 0;
128 *aAttributes
= nullptr;
130 if (!mIntl
) return NS_ERROR_FAILURE
;
132 RefPtr
<AccAttributes
> attributes
= Intl()->TextAttributes(
133 aIncludeDefAttrs
, aOffset
, aStartOffset
, aEndOffset
);
134 RefPtr
<nsPersistentProperties
> props
= new nsPersistentProperties();
136 for (auto iter
: *attributes
) {
138 iter
.NameAsString(name
);
141 iter
.ValueAsString(value
);
143 props
->SetStringProperty(NS_ConvertUTF16toUTF8(name
), value
, unused
);
146 props
.forget(aAttributes
);
151 xpcAccessibleHyperText::GetDefaultTextAttributes(
152 nsIPersistentProperties
** aAttributes
) {
153 NS_ENSURE_ARG_POINTER(aAttributes
);
154 *aAttributes
= nullptr;
156 if (!mIntl
) return NS_ERROR_FAILURE
;
158 RefPtr
<AccAttributes
> attributes
= Intl()->DefaultTextAttributes();
159 RefPtr
<nsPersistentProperties
> props
= new nsPersistentProperties();
161 for (auto iter
: *attributes
) {
163 iter
.NameAsString(name
);
166 iter
.ValueAsString(value
);
168 props
->SetStringProperty(NS_ConvertUTF16toUTF8(name
), value
, unused
);
171 props
.forget(aAttributes
);
177 xpcAccessibleHyperText::GetCharacterExtents(int32_t aOffset
, int32_t* aX
,
178 int32_t* aY
, int32_t* aWidth
,
180 uint32_t aCoordType
) {
181 NS_ENSURE_ARG_POINTER(aX
);
182 NS_ENSURE_ARG_POINTER(aY
);
183 NS_ENSURE_ARG_POINTER(aWidth
);
184 NS_ENSURE_ARG_POINTER(aHeight
);
185 *aX
= *aY
= *aWidth
= *aHeight
;
187 if (!mIntl
) return NS_ERROR_FAILURE
;
189 LayoutDeviceIntRect rect
= Intl()->CharBounds(aOffset
, aCoordType
);
190 rect
.GetRect(aX
, aY
, aWidth
, aHeight
);
195 xpcAccessibleHyperText::GetRangeExtents(int32_t aStartOffset
,
196 int32_t aEndOffset
, int32_t* aX
,
197 int32_t* aY
, int32_t* aWidth
,
198 int32_t* aHeight
, uint32_t aCoordType
) {
199 NS_ENSURE_ARG_POINTER(aX
);
200 NS_ENSURE_ARG_POINTER(aY
);
201 NS_ENSURE_ARG_POINTER(aWidth
);
202 NS_ENSURE_ARG_POINTER(aHeight
);
203 *aX
= *aY
= *aWidth
= *aHeight
= 0;
205 if (!mIntl
) return NS_ERROR_FAILURE
;
207 LayoutDeviceIntRect rect
=
208 Intl()->TextBounds(aStartOffset
, aEndOffset
, aCoordType
);
209 rect
.GetRect(aX
, aY
, aWidth
, aHeight
);
214 xpcAccessibleHyperText::GetOffsetAtPoint(int32_t aX
, int32_t aY
,
217 NS_ENSURE_ARG_POINTER(aOffset
);
220 if (!mIntl
) return NS_ERROR_FAILURE
;
222 *aOffset
= Intl()->OffsetAtPoint(aX
, aY
, aCoordType
);
227 xpcAccessibleHyperText::GetCaretOffset(int32_t* aCaretOffset
) {
228 NS_ENSURE_ARG_POINTER(aCaretOffset
);
231 if (!mIntl
) return NS_ERROR_FAILURE
;
233 *aCaretOffset
= Intl()->CaretOffset();
238 xpcAccessibleHyperText::SetCaretOffset(int32_t aCaretOffset
) {
239 if (!mIntl
) return NS_ERROR_FAILURE
;
241 Intl()->SetCaretOffset(aCaretOffset
);
246 xpcAccessibleHyperText::GetCaretRect(int32_t* aX
, int32_t* aY
, int32_t* aWidth
,
248 NS_ENSURE_ARG_POINTER(aX
);
249 NS_ENSURE_ARG_POINTER(aY
);
250 NS_ENSURE_ARG_POINTER(aWidth
);
251 NS_ENSURE_ARG_POINTER(aHeight
);
252 *aX
= *aY
= *aWidth
= *aHeight
;
255 return NS_ERROR_FAILURE
;
257 if (mIntl
->IsRemote()) {
258 return NS_ERROR_NOT_IMPLEMENTED
;
262 LayoutDeviceIntRect rect
= IntlLocal()->GetCaretRect(&widget
);
263 rect
.GetRect(aX
, aY
, aWidth
, aHeight
);
268 xpcAccessibleHyperText::GetSelectionCount(int32_t* aSelectionCount
) {
269 NS_ENSURE_ARG_POINTER(aSelectionCount
);
270 *aSelectionCount
= 0;
272 if (!mIntl
) return NS_ERROR_FAILURE
;
274 *aSelectionCount
= Intl()->SelectionCount();
279 xpcAccessibleHyperText::GetSelectionBounds(int32_t aSelectionNum
,
280 int32_t* aStartOffset
,
281 int32_t* aEndOffset
) {
282 NS_ENSURE_ARG_POINTER(aStartOffset
);
283 NS_ENSURE_ARG_POINTER(aEndOffset
);
284 *aStartOffset
= *aEndOffset
= 0;
286 if (!mIntl
) return NS_ERROR_FAILURE
;
288 if (aSelectionNum
< 0) return NS_ERROR_INVALID_ARG
;
290 if (aSelectionNum
>= Intl()->SelectionCount()) {
291 return NS_ERROR_INVALID_ARG
;
294 Intl()->SelectionBoundsAt(aSelectionNum
, aStartOffset
, aEndOffset
);
299 xpcAccessibleHyperText::SetSelectionBounds(int32_t aSelectionNum
,
300 int32_t aStartOffset
,
301 int32_t aEndOffset
) {
302 if (!mIntl
) return NS_ERROR_FAILURE
;
304 if (aSelectionNum
< 0) return NS_ERROR_INVALID_ARG
;
306 Intl()->SetSelectionBoundsAt(aSelectionNum
, aStartOffset
, aEndOffset
);
311 xpcAccessibleHyperText::AddSelection(int32_t aStartOffset
, int32_t aEndOffset
) {
312 if (!mIntl
) return NS_ERROR_FAILURE
;
314 Intl()->AddToSelection(aStartOffset
, aEndOffset
);
319 xpcAccessibleHyperText::RemoveSelection(int32_t aSelectionNum
) {
320 if (!mIntl
) return NS_ERROR_FAILURE
;
322 Intl()->RemoveFromSelection(aSelectionNum
);
327 xpcAccessibleHyperText::ScrollSubstringTo(int32_t aStartOffset
,
329 uint32_t aScrollType
) {
330 if (!mIntl
) return NS_ERROR_FAILURE
;
332 Intl()->ScrollSubstringTo(aStartOffset
, aEndOffset
, aScrollType
);
337 xpcAccessibleHyperText::ScrollSubstringToPoint(int32_t aStartOffset
,
339 uint32_t aCoordinateType
,
340 int32_t aX
, int32_t aY
) {
341 if (!mIntl
) return NS_ERROR_FAILURE
;
343 Intl()->ScrollSubstringToPoint(aStartOffset
, aEndOffset
, aCoordinateType
, aX
,
349 xpcAccessibleHyperText::GetSelectionRanges(nsIArray
** aRanges
) {
350 NS_ENSURE_ARG_POINTER(aRanges
);
354 nsCOMPtr
<nsIMutableArray
> xpcRanges
=
355 do_CreateInstance(NS_ARRAY_CONTRACTID
, &rv
);
356 NS_ENSURE_SUCCESS(rv
, rv
);
358 AutoTArray
<TextRange
, 1> ranges
;
359 Intl()->SelectionRanges(&ranges
);
360 uint32_t len
= ranges
.Length();
361 for (uint32_t idx
= 0; idx
< len
; idx
++) {
362 xpcRanges
->AppendElement(new xpcAccessibleTextRange(ranges
[idx
]));
365 xpcRanges
.forget(aRanges
);
369 ////////////////////////////////////////////////////////////////////////////////
370 // nsIAccessibleEditableText
373 xpcAccessibleHyperText::SetTextContents(const nsAString
& aText
) {
374 if (!mIntl
) return NS_ERROR_FAILURE
;
376 Intl()->ReplaceText(aText
);
382 xpcAccessibleHyperText::InsertText(const nsAString
& aText
, int32_t aOffset
) {
383 if (!mIntl
) return NS_ERROR_FAILURE
;
385 Intl()->InsertText(aText
, aOffset
);
391 xpcAccessibleHyperText::CopyText(int32_t aStartOffset
, int32_t aEndOffset
) {
392 if (!mIntl
) return NS_ERROR_FAILURE
;
394 Intl()->CopyText(aStartOffset
, aEndOffset
);
400 xpcAccessibleHyperText::CutText(int32_t aStartOffset
, int32_t aEndOffset
) {
401 if (!mIntl
) return NS_ERROR_FAILURE
;
403 Intl()->CutText(aStartOffset
, aEndOffset
);
409 xpcAccessibleHyperText::DeleteText(int32_t aStartOffset
, int32_t aEndOffset
) {
410 if (!mIntl
) return NS_ERROR_FAILURE
;
412 Intl()->DeleteText(aStartOffset
, aEndOffset
);
418 xpcAccessibleHyperText::PasteText(int32_t aOffset
) {
419 if (!mIntl
) return NS_ERROR_FAILURE
;
421 Intl()->PasteText(aOffset
);
426 ////////////////////////////////////////////////////////////////////////////////
427 // nsIAccessibleHyperText
430 xpcAccessibleHyperText::GetLinkCount(int32_t* aLinkCount
) {
431 NS_ENSURE_ARG_POINTER(aLinkCount
);
434 if (!mIntl
) return NS_ERROR_FAILURE
;
436 *aLinkCount
= static_cast<int32_t>(Intl()->LinkCount());
441 xpcAccessibleHyperText::GetLinkAt(int32_t aIndex
,
442 nsIAccessibleHyperLink
** aLink
) {
443 NS_ENSURE_ARG_POINTER(aLink
);
446 if (!mIntl
) return NS_ERROR_FAILURE
;
448 NS_IF_ADDREF(*aLink
= ToXPC(Intl()->LinkAt(aIndex
)));
453 xpcAccessibleHyperText::GetLinkIndex(nsIAccessibleHyperLink
* aLink
,
455 NS_ENSURE_ARG_POINTER(aLink
);
456 NS_ENSURE_ARG_POINTER(aIndex
);
459 if (!mIntl
) return NS_ERROR_FAILURE
;
461 nsCOMPtr
<nsIAccessible
> xpcLink(do_QueryInterface(aLink
));
462 Accessible
* accLink
= xpcLink
->ToInternalGeneric();
463 *aIndex
= Intl()->LinkIndexOf(accLink
);
468 xpcAccessibleHyperText::GetLinkIndexAtOffset(int32_t aOffset
,
469 int32_t* aLinkIndex
) {
470 NS_ENSURE_ARG_POINTER(aLinkIndex
);
471 *aLinkIndex
= -1; // API says this magic value means 'not found'
473 if (!mIntl
) return NS_ERROR_FAILURE
;
475 *aLinkIndex
= Intl()->LinkIndexAtOffset(aOffset
);