michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "xpcAccessibleHyperText.h" michael@0: michael@0: #include "HyperTextAccessible-inl.h" michael@0: #include "TextRange.h" michael@0: #include "xpcAccessibleTextRange.h" michael@0: michael@0: #include "nsIPersistentProperties2.h" michael@0: #include "nsIMutableArray.h" michael@0: michael@0: using namespace mozilla::a11y; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // nsISupports michael@0: michael@0: nsresult michael@0: xpcAccessibleHyperText::QueryInterface(REFNSIID aIID, void** aInstancePtr) michael@0: { michael@0: *aInstancePtr = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (!text->IsTextRole()) michael@0: return NS_ERROR_NO_INTERFACE; michael@0: michael@0: if (aIID.Equals(NS_GET_IID(nsIAccessibleText))) michael@0: *aInstancePtr = static_cast(text); michael@0: else if (aIID.Equals(NS_GET_IID(nsIAccessibleEditableText))) michael@0: *aInstancePtr = static_cast(text); michael@0: else if (aIID.Equals(NS_GET_IID(nsIAccessibleHyperText))) michael@0: *aInstancePtr = static_cast(text); michael@0: else michael@0: return NS_ERROR_NO_INTERFACE; michael@0: michael@0: NS_ADDREF(text); michael@0: return NS_OK; michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // nsIAccessibleText michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetCharacterCount(int32_t* aCharacterCount) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aCharacterCount); michael@0: *aCharacterCount = 0; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: *aCharacterCount = text->CharacterCount(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetText(int32_t aStartOffset, int32_t aEndOffset, michael@0: nsAString& aText) michael@0: { michael@0: aText.Truncate(); michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->TextSubstring(aStartOffset, aEndOffset, aText); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetTextBeforeOffset(int32_t aOffset, michael@0: AccessibleTextBoundary aBoundaryType, michael@0: int32_t* aStartOffset, michael@0: int32_t* aEndOffset, michael@0: nsAString& aText) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aStartOffset); michael@0: NS_ENSURE_ARG_POINTER(aEndOffset); michael@0: *aStartOffset = *aEndOffset = 0; michael@0: aText.Truncate(); michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->TextBeforeOffset(aOffset, aBoundaryType, aStartOffset, aEndOffset, aText); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetTextAtOffset(int32_t aOffset, michael@0: AccessibleTextBoundary aBoundaryType, michael@0: int32_t* aStartOffset, michael@0: int32_t* aEndOffset, nsAString& aText) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aStartOffset); michael@0: NS_ENSURE_ARG_POINTER(aEndOffset); michael@0: *aStartOffset = *aEndOffset = 0; michael@0: aText.Truncate(); michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->TextAtOffset(aOffset, aBoundaryType, aStartOffset, aEndOffset, aText); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetTextAfterOffset(int32_t aOffset, michael@0: AccessibleTextBoundary aBoundaryType, michael@0: int32_t* aStartOffset, michael@0: int32_t* aEndOffset, nsAString& aText) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aStartOffset); michael@0: NS_ENSURE_ARG_POINTER(aEndOffset); michael@0: *aStartOffset = *aEndOffset = 0; michael@0: aText.Truncate(); michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->TextAfterOffset(aOffset, aBoundaryType, aStartOffset, aEndOffset, aText); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetCharacterAtOffset(int32_t aOffset, michael@0: char16_t* aCharacter) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aCharacter); michael@0: *aCharacter = L'\0'; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: *aCharacter = text->CharAt(aOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetTextAttributes(bool aIncludeDefAttrs, michael@0: int32_t aOffset, michael@0: int32_t* aStartOffset, michael@0: int32_t* aEndOffset, michael@0: nsIPersistentProperties** aAttributes) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aStartOffset); michael@0: NS_ENSURE_ARG_POINTER(aEndOffset); michael@0: NS_ENSURE_ARG_POINTER(aAttributes); michael@0: *aStartOffset = *aEndOffset = 0; michael@0: *aAttributes = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsCOMPtr attrs = michael@0: text->TextAttributes(aIncludeDefAttrs, aOffset, aStartOffset, aEndOffset); michael@0: attrs.swap(*aAttributes); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetDefaultTextAttributes(nsIPersistentProperties** aAttributes) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aAttributes); michael@0: *aAttributes = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsCOMPtr attrs = text->DefaultTextAttributes(); michael@0: attrs.swap(*aAttributes); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetCharacterExtents(int32_t aOffset, michael@0: int32_t* aX, int32_t* aY, michael@0: int32_t* aWidth, int32_t* aHeight, michael@0: uint32_t aCoordType) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aX); michael@0: NS_ENSURE_ARG_POINTER(aY); michael@0: NS_ENSURE_ARG_POINTER(aWidth); michael@0: NS_ENSURE_ARG_POINTER(aHeight); michael@0: *aX = *aY = *aWidth = *aHeight; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsIntRect rect = text->CharBounds(aOffset, aCoordType); michael@0: *aX = rect.x; *aY = rect.y; michael@0: *aWidth = rect.width; *aHeight = rect.height; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetRangeExtents(int32_t aStartOffset, int32_t aEndOffset, michael@0: int32_t* aX, int32_t* aY, michael@0: int32_t* aWidth, int32_t* aHeight, michael@0: uint32_t aCoordType) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aX); michael@0: NS_ENSURE_ARG_POINTER(aY); michael@0: NS_ENSURE_ARG_POINTER(aWidth); michael@0: NS_ENSURE_ARG_POINTER(aHeight); michael@0: *aX = *aY = *aWidth = *aHeight = 0; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsIntRect rect = text->TextBounds(aStartOffset, aEndOffset, aCoordType); michael@0: *aX = rect.x; *aY = rect.y; michael@0: *aWidth = rect.width; *aHeight = rect.height; michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetOffsetAtPoint(int32_t aX, int32_t aY, michael@0: uint32_t aCoordType, int32_t* aOffset) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aOffset); michael@0: *aOffset = -1; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: *aOffset = text->OffsetAtPoint(aX, aY, aCoordType); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetScriptableCaretOffset(int32_t* aCaretOffset) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aCaretOffset); michael@0: *aCaretOffset = -1; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: *aCaretOffset = text->CaretOffset(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::SetScriptableCaretOffset(int32_t aCaretOffset) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->SetCaretOffset(aCaretOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetSelectionCount(int32_t* aSelectionCount) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aSelectionCount); michael@0: *aSelectionCount = 0; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: *aSelectionCount = text->SelectionCount(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetSelectionBounds(int32_t aSelectionNum, michael@0: int32_t* aStartOffset, michael@0: int32_t* aEndOffset) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aStartOffset); michael@0: NS_ENSURE_ARG_POINTER(aEndOffset); michael@0: *aStartOffset = *aEndOffset = 0; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: if (aSelectionNum < 0 || aSelectionNum >= text->SelectionCount()) michael@0: return NS_ERROR_INVALID_ARG; michael@0: michael@0: text->SelectionBoundsAt(aSelectionNum, aStartOffset, aEndOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::SetSelectionBounds(int32_t aSelectionNum, michael@0: int32_t aStartOffset, michael@0: int32_t aEndOffset) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: if (aSelectionNum < 0 || michael@0: !text->SetSelectionBoundsAt(aSelectionNum, aStartOffset, aEndOffset)) michael@0: return NS_ERROR_INVALID_ARG; michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::AddSelection(int32_t aStartOffset, int32_t aEndOffset) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->AddToSelection(aStartOffset, aEndOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::RemoveSelection(int32_t aSelectionNum) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->RemoveFromSelection(aSelectionNum); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::ScriptableScrollSubstringTo(int32_t aStartOffset, michael@0: int32_t aEndOffset, michael@0: uint32_t aScrollType) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->ScrollSubstringTo(aStartOffset, aEndOffset, aScrollType); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::ScriptableScrollSubstringToPoint(int32_t aStartOffset, michael@0: int32_t aEndOffset, michael@0: uint32_t aCoordinateType, michael@0: int32_t aX, int32_t aY) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->ScrollSubstringToPoint(aStartOffset, aEndOffset, aCoordinateType, aX, aY); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetEnclosingRange(nsIAccessibleTextRange** aRange) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aRange); michael@0: *aRange = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsRefPtr range = new xpcAccessibleTextRange; michael@0: text->EnclosingRange(range->mRange); michael@0: NS_ASSERTION(range->mRange.IsValid(), michael@0: "Should always have an enclosing range!"); michael@0: michael@0: range.forget(aRange); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetSelectionRanges(nsIArray** aRanges) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aRanges); michael@0: *aRanges = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsresult rv = NS_OK; michael@0: nsCOMPtr xpcRanges = michael@0: do_CreateInstance(NS_ARRAY_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsAutoTArray ranges; michael@0: text->SelectionRanges(&ranges); michael@0: uint32_t len = ranges.Length(); michael@0: for (uint32_t idx = 0; idx < len; idx++) michael@0: xpcRanges->AppendElement(new xpcAccessibleTextRange(Move(ranges[idx])), michael@0: false); michael@0: michael@0: xpcRanges.forget(aRanges); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetVisibleRanges(nsIArray** aRanges) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aRanges); michael@0: *aRanges = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsresult rv = NS_OK; michael@0: nsCOMPtr xpcRanges = michael@0: do_CreateInstance(NS_ARRAY_CONTRACTID, &rv); michael@0: NS_ENSURE_SUCCESS(rv, rv); michael@0: michael@0: nsTArray ranges; michael@0: text->VisibleRanges(&ranges); michael@0: uint32_t len = ranges.Length(); michael@0: for (uint32_t idx = 0; idx < len; idx++) michael@0: xpcRanges->AppendElement(new xpcAccessibleTextRange(Move(ranges[idx])), michael@0: false); michael@0: michael@0: xpcRanges.forget(aRanges); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetRangeByChild(nsIAccessible* aChild, michael@0: nsIAccessibleTextRange** aRange) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aRange); michael@0: *aRange = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsRefPtr child = do_QueryObject(aChild); michael@0: if (child) { michael@0: nsRefPtr range = new xpcAccessibleTextRange; michael@0: text->RangeByChild(child, range->mRange); michael@0: if (range->mRange.IsValid()) michael@0: range.forget(aRange); michael@0: } michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetRangeAtPoint(int32_t aX, int32_t aY, michael@0: nsIAccessibleTextRange** aRange) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aRange); michael@0: *aRange = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsRefPtr range = new xpcAccessibleTextRange; michael@0: text->RangeAtPoint(aX, aY, range->mRange); michael@0: if (range->mRange.IsValid()) michael@0: range.forget(aRange); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // nsIAccessibleEditableText michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::SetTextContents(const nsAString& aText) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->ReplaceText(aText); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::ScriptableInsertText(const nsAString& aText, michael@0: int32_t aOffset) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->InsertText(aText, aOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::ScriptableCopyText(int32_t aStartOffset, michael@0: int32_t aEndOffset) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->CopyText(aStartOffset, aEndOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::ScriptableCutText(int32_t aStartOffset, michael@0: int32_t aEndOffset) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->CutText(aStartOffset, aEndOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::ScriptableDeleteText(int32_t aStartOffset, michael@0: int32_t aEndOffset) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->DeleteText(aStartOffset, aEndOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::ScriptablePasteText(int32_t aOffset) michael@0: { michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: text->PasteText(aOffset); michael@0: return NS_OK; michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // nsIAccessibleHyperText michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetLinkCount(int32_t* aLinkCount) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aLinkCount); michael@0: *aLinkCount = 0; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: *aLinkCount = text->LinkCount(); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetLinkAt(int32_t aIndex, nsIAccessibleHyperLink** aLink) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aLink); michael@0: *aLink = nullptr; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsCOMPtr link = text->LinkAt(aIndex); michael@0: link.forget(aLink); michael@0: michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetLinkIndex(nsIAccessibleHyperLink* aLink, michael@0: int32_t* aIndex) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aLink); michael@0: NS_ENSURE_ARG_POINTER(aIndex); michael@0: *aIndex = -1; michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: nsRefPtr link(do_QueryObject(aLink)); michael@0: *aIndex = text->LinkIndexOf(link); michael@0: return NS_OK; michael@0: } michael@0: michael@0: NS_IMETHODIMP michael@0: xpcAccessibleHyperText::GetLinkIndexAtOffset(int32_t aOffset, michael@0: int32_t* aLinkIndex) michael@0: { michael@0: NS_ENSURE_ARG_POINTER(aLinkIndex); michael@0: *aLinkIndex = -1; // API says this magic value means 'not found' michael@0: michael@0: HyperTextAccessible* text = static_cast(this); michael@0: if (text->IsDefunct()) michael@0: return NS_ERROR_FAILURE; michael@0: michael@0: *aLinkIndex = text->LinkIndexAtOffset(aOffset); michael@0: return NS_OK; michael@0: }