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 "xpcAccessibleTextRange.h"
9 #include "HyperTextAccessible.h"
10 #include "TextRange.h"
11 #include "nsIMutableArray.h"
12 #include "nsComponentManagerUtils.h"
14 using namespace mozilla
;
15 using namespace mozilla::a11y
;
17 // nsISupports and cycle collection
19 NS_IMPL_CYCLE_COLLECTION(xpcAccessibleTextRange
,
21 mRange
.mStartContainer
,
24 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(xpcAccessibleTextRange
)
25 NS_INTERFACE_MAP_ENTRY(nsIAccessibleTextRange
)
26 NS_INTERFACE_MAP_ENTRY(xpcAccessibleTextRange
)
27 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports
, nsIAccessibleTextRange
)
30 NS_IMPL_CYCLE_COLLECTING_ADDREF(xpcAccessibleTextRange
)
31 NS_IMPL_CYCLE_COLLECTING_RELEASE(xpcAccessibleTextRange
)
33 // nsIAccessibleTextRange
36 xpcAccessibleTextRange::GetStartContainer(nsIAccessibleText
** aAnchor
)
38 NS_ENSURE_ARG_POINTER(aAnchor
);
39 NS_IF_ADDREF(*aAnchor
= static_cast<nsIAccessibleText
*>(mRange
.StartContainer()));
44 xpcAccessibleTextRange::GetStartOffset(int32_t* aOffset
)
46 NS_ENSURE_ARG_POINTER(aOffset
);
47 *aOffset
= mRange
.StartOffset();
52 xpcAccessibleTextRange::GetEndContainer(nsIAccessibleText
** aAnchor
)
54 NS_ENSURE_ARG_POINTER(aAnchor
);
55 NS_IF_ADDREF(*aAnchor
= static_cast<nsIAccessibleText
*>(mRange
.EndContainer()));
60 xpcAccessibleTextRange::GetEndOffset(int32_t* aOffset
)
62 NS_ENSURE_ARG_POINTER(aOffset
);
63 *aOffset
= mRange
.EndOffset();
68 xpcAccessibleTextRange::GetContainer(nsIAccessible
** aContainer
)
70 NS_ENSURE_ARG_POINTER(aContainer
);
71 NS_IF_ADDREF(*aContainer
= static_cast<nsIAccessible
*>(mRange
.Container()));
76 xpcAccessibleTextRange::GetEmbeddedChildren(nsIArray
** aList
)
79 nsCOMPtr
<nsIMutableArray
> xpcList
=
80 do_CreateInstance(NS_ARRAY_CONTRACTID
, &rv
);
81 NS_ENSURE_SUCCESS(rv
, rv
);
83 nsTArray
<Accessible
*> objects
;
84 mRange
.EmbeddedChildren(&objects
);
86 uint32_t len
= objects
.Length();
87 for (uint32_t idx
= 0; idx
< len
; idx
++)
88 xpcList
->AppendElement(static_cast<nsIAccessible
*>(objects
[idx
]), false);
90 xpcList
.forget(aList
);
96 xpcAccessibleTextRange::Compare(nsIAccessibleTextRange
* aOtherRange
,
100 nsRefPtr
<xpcAccessibleTextRange
> xpcRange(do_QueryObject(aOtherRange
));
101 if (!xpcRange
|| !aResult
)
102 return NS_ERROR_INVALID_ARG
;
104 *aResult
= (mRange
== xpcRange
->mRange
);
109 xpcAccessibleTextRange::CompareEndPoints(uint32_t aEndPoint
,
110 nsIAccessibleTextRange
* aOtherRange
,
111 uint32_t aOtherRangeEndPoint
,
114 nsRefPtr
<xpcAccessibleTextRange
> xpcRange(do_QueryObject(aOtherRange
));
115 if (!xpcRange
|| !aResult
)
116 return NS_ERROR_INVALID_ARG
;
118 TextPoint p
= (aEndPoint
== EndPoint_Start
) ?
119 mRange
.StartPoint() : mRange
.EndPoint();
120 TextPoint otherPoint
= (aOtherRangeEndPoint
== EndPoint_Start
) ?
121 xpcRange
->mRange
.StartPoint() : xpcRange
->mRange
.EndPoint();
126 *aResult
= p
< otherPoint
? -1 : 1;
132 xpcAccessibleTextRange::GetText(nsAString
& aText
)
142 xpcAccessibleTextRange::GetBounds(nsIArray
** aRectList
)
148 xpcAccessibleTextRange::Move(uint32_t aUnit
, int32_t aCount
)
154 xpcAccessibleTextRange::MoveStart(uint32_t aUnit
, int32_t aCount
)
160 xpcAccessibleTextRange::MoveEnd(uint32_t aUnit
, int32_t aCount
)
166 xpcAccessibleTextRange::Normalize(uint32_t aUnit
)
172 xpcAccessibleTextRange::FindText(const nsAString
& aText
, bool aIsBackward
,
174 nsIAccessibleTextRange
** aRange
)
180 xpcAccessibleTextRange::FindAttr(uint32_t aAttr
, nsIVariant
* aVal
,
182 nsIAccessibleTextRange
** aRange
)
188 xpcAccessibleTextRange::AddToSelection()
194 xpcAccessibleTextRange::RemoveFromSelection()
200 xpcAccessibleTextRange::Select()
206 xpcAccessibleTextRange::ScrollIntoView(uint32_t aHow
)