tor-browser

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

xpcAccessibleDocument.h (4404B)


      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 #ifndef mozilla_a11y_xpcAccessibleDocument_h_
      8 #define mozilla_a11y_xpcAccessibleDocument_h_
      9 
     10 #include "nsIAccessibleDocument.h"
     11 
     12 #include "DocAccessible.h"
     13 #include "nsAccessibilityService.h"
     14 #include "xpcAccessibleApplication.h"
     15 #include "xpcAccessibleHyperText.h"
     16 
     17 namespace mozilla {
     18 namespace a11y {
     19 
     20 /**
     21 * XPCOM wrapper around DocAccessible class.
     22 */
     23 class xpcAccessibleDocument : public xpcAccessibleHyperText,
     24                              public nsIAccessibleDocument {
     25 public:
     26  explicit xpcAccessibleDocument(Accessible* aIntl)
     27      : xpcAccessibleHyperText(aIntl),
     28        mCache(kDefaultCacheLength),
     29        mRemote(aIntl->IsRemote()) {
     30    // XXX: Once there is a base doc class that both remote and local
     31    // accessibles inherit, we can add the type to the prototype and remove this
     32    // assert.
     33    MOZ_ASSERT(aIntl->IsDoc());
     34  }
     35 
     36  NS_DECL_ISUPPORTS_INHERITED
     37 
     38  // nsIAccessibleDocument
     39  NS_IMETHOD GetURL(nsAString& aURL) final;
     40  NS_IMETHOD GetTitle(nsAString& aTitle) final;
     41  NS_IMETHOD GetMimeType(nsAString& aType) final;
     42  NS_IMETHOD GetDocType(nsAString& aType) final;
     43  NS_IMETHOD GetDOMDocument(dom::Document** aDOMDocument) final;
     44  NS_IMETHOD GetWindow(mozIDOMWindowProxy** aDOMWindow) final;
     45  NS_IMETHOD GetParentDocument(nsIAccessibleDocument** aDocument) final;
     46  NS_IMETHOD GetChildDocumentCount(uint32_t* aCount) final;
     47  NS_IMETHOD GetChildDocumentAt(uint32_t aIndex,
     48                                nsIAccessibleDocument** aDocument) final;
     49  NS_IMETHOD GetBrowsingContext(dom::BrowsingContext** aBrowsingContext) final;
     50 
     51  /**
     52   * Return XPCOM wrapper for the internal accessible.
     53   */
     54  xpcAccessibleGeneric* GetAccessible(Accessible* aAccessible);
     55 
     56  virtual void Shutdown() override;
     57 
     58 protected:
     59  virtual ~xpcAccessibleDocument() {}
     60 
     61 private:
     62  DocAccessible* Intl() {
     63    if (LocalAccessible* acc = mIntl->AsLocal()) {
     64      return acc->AsDoc();
     65    }
     66 
     67    return nullptr;
     68  }
     69 
     70  void NotifyOfShutdown(Accessible* aAccessible) {
     71    xpcAccessibleGeneric* xpcAcc = mCache.Get(aAccessible);
     72    if (xpcAcc) {
     73      xpcAcc->Shutdown();
     74    }
     75 
     76    mCache.Remove(aAccessible);
     77    if (mCache.Count() == 0 && mRefCnt == 1) {
     78      if (mIntl->IsLocal()) {
     79        GetAccService()->RemoveFromXPCDocumentCache(mIntl->AsLocal()->AsDoc());
     80      } else {
     81        GetAccService()->RemoveFromRemoteXPCDocumentCache(
     82            mIntl->AsRemote()->AsDoc());
     83      }
     84    }
     85  }
     86 
     87  friend class DocManager;
     88  friend class DocAccessible;
     89  friend class RemoteAccessible;
     90  friend class xpcAccessibleGeneric;
     91 
     92  xpcAccessibleDocument(const xpcAccessibleDocument&) = delete;
     93  xpcAccessibleDocument& operator=(const xpcAccessibleDocument&) = delete;
     94 
     95  nsTHashMap<nsPtrHashKey<const void>, xpcAccessibleGeneric*> mCache;
     96  bool mRemote;
     97 };
     98 
     99 inline xpcAccessibleGeneric* ToXPC(Accessible* aAccessible) {
    100  if (!aAccessible) return nullptr;
    101 
    102  if (aAccessible->IsApplication()) return XPCApplicationAcc();
    103 
    104  xpcAccessibleDocument* xpcDoc =
    105      aAccessible->IsLocal()
    106          ? GetAccService()->GetXPCDocument(aAccessible->AsLocal()->Document())
    107          : GetAccService()->GetXPCDocument(
    108                aAccessible->AsRemote()->Document());
    109  return xpcDoc ? xpcDoc->GetAccessible(aAccessible) : nullptr;
    110 }
    111 
    112 inline xpcAccessibleHyperText* ToXPCText(Accessible* aAccessible) {
    113  if (!aAccessible || !aAccessible->IsHyperText()) {
    114    return nullptr;
    115  }
    116 
    117  xpcAccessibleDocument* xpcDoc =
    118      aAccessible->IsLocal()
    119          ? GetAccService()->GetXPCDocument(aAccessible->AsLocal()->Document())
    120          : nsAccessibilityService::GetXPCDocument(
    121                aAccessible->AsRemote()->Document());
    122  return static_cast<xpcAccessibleHyperText*>(
    123      xpcDoc ? xpcDoc->GetAccessible(aAccessible) : nullptr);
    124 }
    125 
    126 inline xpcAccessibleDocument* ToXPCDocument(DocAccessible* aAccessible) {
    127  return GetAccService()->GetXPCDocument(aAccessible);
    128 }
    129 
    130 inline xpcAccessibleDocument* ToXPCDocument(DocAccessibleParent* aAccessible) {
    131  return GetAccService()->GetXPCDocument(aAccessible);
    132 }
    133 
    134 }  // namespace a11y
    135 }  // namespace mozilla
    136 
    137 #endif