Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/accessible/xpcom/xpcAccessibleDocument.h
Line
Count
Source (jump to first uncovered line)
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
{
26
public:
27
  explicit xpcAccessibleDocument(DocAccessible* aIntl) :
28
0
    xpcAccessibleHyperText(aIntl), mCache(kDefaultCacheLength), mRemote(false) { }
29
30
  xpcAccessibleDocument(ProxyAccessible* aProxy, uint32_t aInterfaces) :
31
    xpcAccessibleHyperText(aProxy, aInterfaces), mCache(kDefaultCacheLength),
32
0
    mRemote(true) {}
33
34
  NS_DECL_ISUPPORTS_INHERITED
35
36
  // nsIAccessibleDocument
37
  NS_IMETHOD GetURL(nsAString& aURL) final;
38
  NS_IMETHOD GetTitle(nsAString& aTitle) final;
39
  NS_IMETHOD GetMimeType(nsAString& aType) final;
40
  NS_IMETHOD GetDocType(nsAString& aType) final;
41
  NS_IMETHOD GetDOMDocument(nsIDocument** aDOMDocument) final;
42
  NS_IMETHOD GetWindow(mozIDOMWindowProxy** aDOMWindow) final;
43
  NS_IMETHOD GetParentDocument(nsIAccessibleDocument** aDocument)
44
    final;
45
  NS_IMETHOD GetChildDocumentCount(uint32_t* aCount) final;
46
  NS_IMETHOD GetChildDocumentAt(uint32_t aIndex,
47
                                nsIAccessibleDocument** aDocument)
48
    final;
49
  NS_IMETHOD GetVirtualCursor(nsIAccessiblePivot** aVirtualCursor)
50
    final;
51
52
  /**
53
   * Return XPCOM wrapper for the internal accessible.
54
   */
55
  xpcAccessibleGeneric* GetAccessible(Accessible* aAccessible);
56
  xpcAccessibleGeneric* GetXPCAccessible(ProxyAccessible* aProxy);
57
58
  virtual void Shutdown() override;
59
60
protected:
61
0
  virtual ~xpcAccessibleDocument() {}
62
63
private:
64
  DocAccessible* Intl()
65
0
  {
66
0
    if (Accessible* acc = mIntl.AsAccessible()) {
67
0
      return acc->AsDoc();
68
0
    }
69
0
70
0
    return nullptr;
71
0
  }
72
73
  void NotifyOfShutdown(Accessible* aAccessible)
74
0
  {
75
0
    MOZ_ASSERT(!mRemote);
76
0
    xpcAccessibleGeneric* xpcAcc = mCache.Get(aAccessible);
77
0
    if (xpcAcc) {
78
0
      xpcAcc->Shutdown();
79
0
    }
80
0
81
0
    mCache.Remove(aAccessible);
82
0
    if (mCache.Count() == 0 && mRefCnt == 1) {
83
0
      GetAccService()->RemoveFromXPCDocumentCache(
84
0
        mIntl.AsAccessible()->AsDoc());
85
0
    }
86
0
  }
87
88
  void NotifyOfShutdown(ProxyAccessible* aProxy)
89
0
  {
90
0
    MOZ_ASSERT(mRemote);
91
0
    xpcAccessibleGeneric* xpcAcc = mCache.Get(aProxy);
92
0
    if (xpcAcc) {
93
0
      xpcAcc->Shutdown();
94
0
    }
95
0
96
0
    mCache.Remove(aProxy);
97
0
    if (mCache.Count() == 0 && mRefCnt == 1) {
98
0
      GetAccService()->RemoveFromRemoteXPCDocumentCache(
99
0
        mIntl.AsProxy()->AsDoc());
100
0
    }
101
0
  }
102
103
  friend class DocManager;
104
  friend class DocAccessible;
105
  friend class ProxyAccessible;
106
  friend class ProxyAccessibleBase<ProxyAccessible>;
107
  friend class xpcAccessibleGeneric;
108
109
  xpcAccessibleDocument(const xpcAccessibleDocument&) = delete;
110
  xpcAccessibleDocument& operator =(const xpcAccessibleDocument&) = delete;
111
112
  nsDataHashtable<nsPtrHashKey<const void>, xpcAccessibleGeneric*> mCache;
113
  bool mRemote;
114
};
115
116
inline xpcAccessibleGeneric*
117
ToXPC(Accessible* aAccessible)
118
0
{
119
0
  if (!aAccessible)
120
0
    return nullptr;
121
0
122
0
  if (aAccessible->IsApplication())
123
0
    return XPCApplicationAcc();
124
0
125
0
  xpcAccessibleDocument* xpcDoc =
126
0
    GetAccService()->GetXPCDocument(aAccessible->Document());
127
0
  return xpcDoc ? xpcDoc->GetAccessible(aAccessible) : nullptr;
128
0
}
129
130
xpcAccessibleGeneric* ToXPC(AccessibleOrProxy aAcc);
131
132
inline xpcAccessibleHyperText*
133
ToXPCText(HyperTextAccessible* aAccessible)
134
0
{
135
0
  if (!aAccessible)
136
0
    return nullptr;
137
0
138
0
  xpcAccessibleDocument* xpcDoc =
139
0
    GetAccService()->GetXPCDocument(aAccessible->Document());
140
0
  return static_cast<xpcAccessibleHyperText*>(xpcDoc->GetAccessible(aAccessible));
141
0
}
142
143
inline xpcAccessibleDocument*
144
ToXPCDocument(DocAccessible* aAccessible)
145
0
{
146
0
  return GetAccService()->GetXPCDocument(aAccessible);
147
0
}
148
149
inline xpcAccessibleDocument*
150
ToXPCDocument(DocAccessibleParent* aAccessible)
151
0
{
152
0
  return GetAccService()->GetXPCDocument(aAccessible);
153
0
}
154
155
} // namespace a11y
156
} // namespace mozilla
157
158
#endif