diff options
Diffstat (limited to 'accessible/xpcom/xpcAccessibleTextRange.cpp')
-rw-r--r-- | accessible/xpcom/xpcAccessibleTextRange.cpp | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/accessible/xpcom/xpcAccessibleTextRange.cpp b/accessible/xpcom/xpcAccessibleTextRange.cpp new file mode 100644 index 0000000000..761f3559b7 --- /dev/null +++ b/accessible/xpcom/xpcAccessibleTextRange.cpp @@ -0,0 +1,159 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "xpcAccessibleTextRange.h" + +#include "TextRange-inl.h" + +#include "nsIMutableArray.h" +#include "nsComponentManagerUtils.h" +#include "nsQueryObject.h" +#include "xpcAccessibleDocument.h" + +using namespace mozilla; +using namespace mozilla::a11y; + +// nsISupports and cycle collection + +NS_INTERFACE_MAP_BEGIN(xpcAccessibleTextRange) + NS_INTERFACE_MAP_ENTRY(nsIAccessibleTextRange) + NS_INTERFACE_MAP_ENTRY(xpcAccessibleTextRange) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIAccessibleTextRange) +NS_INTERFACE_MAP_END + +NS_IMPL_ADDREF(xpcAccessibleTextRange) +NS_IMPL_RELEASE(xpcAccessibleTextRange) + +a11y::TextRange xpcAccessibleTextRange::Range() { + return a11y::TextRange(mRoot->ToInternalGeneric(), + mStartContainer->ToInternalGeneric(), mStartOffset, + mEndContainer->ToInternalGeneric(), mEndOffset); +} + +void xpcAccessibleTextRange::SetRange(TextRange& aRange) { + mRoot = ToXPCText(aRange.Root()); + mStartContainer = ToXPCText(aRange.StartContainer()); + mStartOffset = aRange.StartOffset(); + mEndContainer = ToXPCText(aRange.EndContainer()); + mEndOffset = aRange.EndOffset(); +} + +// nsIAccessibleTextRange + +NS_IMETHODIMP +xpcAccessibleTextRange::GetStartContainer(nsIAccessibleText** aAnchor) { + NS_ENSURE_ARG_POINTER(aAnchor); + NS_IF_ADDREF(*aAnchor = mStartContainer); + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::GetStartOffset(int32_t* aOffset) { + NS_ENSURE_ARG_POINTER(aOffset); + *aOffset = mStartOffset; + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::GetEndContainer(nsIAccessibleText** aAnchor) { + NS_ENSURE_ARG_POINTER(aAnchor); + NS_IF_ADDREF(*aAnchor = mEndContainer); + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::GetEndOffset(int32_t* aOffset) { + NS_ENSURE_ARG_POINTER(aOffset); + *aOffset = mEndOffset; + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::GetContainer(nsIAccessible** aContainer) { + NS_ENSURE_ARG_POINTER(aContainer); + NS_IF_ADDREF(*aContainer = ToXPC(Range().Container())); + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::GetEmbeddedChildren(nsIArray** aList) { + nsresult rv = NS_OK; + nsCOMPtr<nsIMutableArray> xpcList = + do_CreateInstance(NS_ARRAY_CONTRACTID, &rv); + NS_ENSURE_SUCCESS(rv, rv); + + nsTArray<Accessible*> objects; + Range().EmbeddedChildren(&objects); + + uint32_t len = objects.Length(); + for (uint32_t idx = 0; idx < len; idx++) { + xpcList->AppendElement(static_cast<nsIAccessible*>(ToXPC(objects[idx]))); + } + + xpcList.forget(aList); + + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::Compare(nsIAccessibleTextRange* aOtherRange, + bool* aResult) { + RefPtr<xpcAccessibleTextRange> xpcRange(do_QueryObject(aOtherRange)); + if (!xpcRange || !aResult) return NS_ERROR_INVALID_ARG; + + *aResult = (Range() == xpcRange->Range()); + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::CompareEndPoints(uint32_t aEndPoint, + nsIAccessibleTextRange* aOtherRange, + uint32_t aOtherRangeEndPoint, + int32_t* aResult) { + RefPtr<xpcAccessibleTextRange> xpcRange(do_QueryObject(aOtherRange)); + if (!xpcRange || !aResult) return NS_ERROR_INVALID_ARG; + + TextRange thisRange = Range(); + TextRange otherRange = xpcRange->Range(); + TextPoint p = (aEndPoint == EndPoint_Start) ? thisRange.StartPoint() + : thisRange.EndPoint(); + TextPoint otherPoint = (aOtherRangeEndPoint == EndPoint_Start) + ? otherRange.StartPoint() + : otherRange.EndPoint(); + + if (p == otherPoint) { + *aResult = 0; + } else { + *aResult = p < otherPoint ? -1 : 1; + } + + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::GetText(nsAString& aText) { + nsAutoString text; + Range().Text(text); + aText.Assign(text); + + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::Crop(nsIAccessible* aContainer, bool* aSuccess) { + Accessible* container = aContainer->ToInternalGeneric(); + NS_ENSURE_TRUE(container, NS_ERROR_INVALID_ARG); + + TextRange range = Range(); + *aSuccess = range.Crop(container); + if (*aSuccess) { + SetRange(range); + } + return NS_OK; +} + +NS_IMETHODIMP +xpcAccessibleTextRange::ScrollIntoView(uint32_t aHow) { return NS_OK; } |