tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

xpcAccessibleTextRange.cpp (3868B)


      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/. */
      6 
      7 #include "xpcAccessibleTextRange.h"
      8 
      9 #include "TextRange-inl.h"
     10 
     11 #include "nsQueryObject.h"
     12 #include "xpcAccessibleDocument.h"
     13 
     14 using namespace mozilla;
     15 using namespace mozilla::a11y;
     16 
     17 // nsISupports and cycle collection
     18 
     19 NS_INTERFACE_MAP_BEGIN(xpcAccessibleTextRange)
     20  NS_INTERFACE_MAP_ENTRY(nsIAccessibleTextRange)
     21  NS_INTERFACE_MAP_ENTRY(xpcAccessibleTextRange)
     22  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIAccessibleTextRange)
     23 NS_INTERFACE_MAP_END
     24 
     25 NS_IMPL_ADDREF(xpcAccessibleTextRange)
     26 NS_IMPL_RELEASE(xpcAccessibleTextRange)
     27 
     28 a11y::TextRange xpcAccessibleTextRange::Range() {
     29  return a11y::TextRange(mRoot->ToInternalGeneric(),
     30                         mStartContainer->ToInternalGeneric(), mStartOffset,
     31                         mEndContainer->ToInternalGeneric(), mEndOffset);
     32 }
     33 
     34 void xpcAccessibleTextRange::SetRange(TextRange& aRange) {
     35  mRoot = ToXPCText(aRange.Root());
     36  mStartContainer = ToXPCText(aRange.StartContainer());
     37  mStartOffset = aRange.StartOffset();
     38  mEndContainer = ToXPCText(aRange.EndContainer());
     39  mEndOffset = aRange.EndOffset();
     40 }
     41 
     42 // nsIAccessibleTextRange
     43 
     44 NS_IMETHODIMP
     45 xpcAccessibleTextRange::GetStartContainer(nsIAccessibleText** aAnchor) {
     46  NS_ENSURE_ARG_POINTER(aAnchor);
     47  NS_IF_ADDREF(*aAnchor = mStartContainer);
     48  return NS_OK;
     49 }
     50 
     51 NS_IMETHODIMP
     52 xpcAccessibleTextRange::GetStartOffset(int32_t* aOffset) {
     53  NS_ENSURE_ARG_POINTER(aOffset);
     54  *aOffset = mStartOffset;
     55  return NS_OK;
     56 }
     57 
     58 NS_IMETHODIMP
     59 xpcAccessibleTextRange::GetEndContainer(nsIAccessibleText** aAnchor) {
     60  NS_ENSURE_ARG_POINTER(aAnchor);
     61  NS_IF_ADDREF(*aAnchor = mEndContainer);
     62  return NS_OK;
     63 }
     64 
     65 NS_IMETHODIMP
     66 xpcAccessibleTextRange::GetEndOffset(int32_t* aOffset) {
     67  NS_ENSURE_ARG_POINTER(aOffset);
     68  *aOffset = mEndOffset;
     69  return NS_OK;
     70 }
     71 
     72 NS_IMETHODIMP
     73 xpcAccessibleTextRange::GetContainer(nsIAccessible** aContainer) {
     74  NS_ENSURE_ARG_POINTER(aContainer);
     75  NS_IF_ADDREF(*aContainer = ToXPC(Range().Container()));
     76  return NS_OK;
     77 }
     78 
     79 NS_IMETHODIMP
     80 xpcAccessibleTextRange::Compare(nsIAccessibleTextRange* aOtherRange,
     81                                bool* aResult) {
     82  RefPtr<xpcAccessibleTextRange> xpcRange(do_QueryObject(aOtherRange));
     83  if (!xpcRange || !aResult) return NS_ERROR_INVALID_ARG;
     84 
     85  *aResult = (Range() == xpcRange->Range());
     86  return NS_OK;
     87 }
     88 
     89 NS_IMETHODIMP
     90 xpcAccessibleTextRange::CompareEndPoints(uint32_t aEndPoint,
     91                                         nsIAccessibleTextRange* aOtherRange,
     92                                         uint32_t aOtherRangeEndPoint,
     93                                         int32_t* aResult) {
     94  RefPtr<xpcAccessibleTextRange> xpcRange(do_QueryObject(aOtherRange));
     95  if (!xpcRange || !aResult) return NS_ERROR_INVALID_ARG;
     96 
     97  TextRange thisRange = Range();
     98  TextRange otherRange = xpcRange->Range();
     99  TextPoint p = (aEndPoint == EndPoint_Start) ? thisRange.StartPoint()
    100                                              : thisRange.EndPoint();
    101  TextPoint otherPoint = (aOtherRangeEndPoint == EndPoint_Start)
    102                             ? otherRange.StartPoint()
    103                             : otherRange.EndPoint();
    104 
    105  if (p == otherPoint) {
    106    *aResult = 0;
    107  } else {
    108    *aResult = p < otherPoint ? -1 : 1;
    109  }
    110 
    111  return NS_OK;
    112 }
    113 
    114 NS_IMETHODIMP
    115 xpcAccessibleTextRange::Crop(nsIAccessible* aContainer, bool* aSuccess) {
    116  Accessible* container = aContainer->ToInternalGeneric();
    117  NS_ENSURE_TRUE(container, NS_ERROR_INVALID_ARG);
    118 
    119  TextRange range = Range();
    120  *aSuccess = range.Crop(container);
    121  if (*aSuccess) {
    122    SetRange(range);
    123  }
    124  return NS_OK;
    125 }