Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim:expandtab:shiftwidth=2:tabstop=2:
3 : */
4 : /* This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 :
8 : #include "ApplicationAccessible.h"
9 :
10 : #include "nsAccessibilityService.h"
11 : #include "nsAccUtils.h"
12 : #include "Relation.h"
13 : #include "Role.h"
14 : #include "States.h"
15 :
16 : #include "nsIComponentManager.h"
17 : #include "nsIDOMDocument.h"
18 : #include "nsIWindowMediator.h"
19 : #include "nsServiceManagerUtils.h"
20 : #include "mozilla/Services.h"
21 : #include "nsIStringBundle.h"
22 :
23 : using namespace mozilla::a11y;
24 :
25 0 : ApplicationAccessible::ApplicationAccessible() :
26 0 : AccessibleWrap(nullptr, nullptr)
27 : {
28 0 : mType = eApplicationType;
29 0 : mAppInfo = do_GetService("@mozilla.org/xre/app-info;1");
30 0 : MOZ_ASSERT(mAppInfo, "no application info");
31 0 : }
32 :
33 0 : NS_IMPL_ISUPPORTS_INHERITED0(ApplicationAccessible, Accessible)
34 :
35 : ////////////////////////////////////////////////////////////////////////////////
36 : // nsIAccessible
37 :
38 : ENameValueFlag
39 0 : ApplicationAccessible::Name(nsString& aName)
40 : {
41 0 : aName.Truncate();
42 :
43 : nsCOMPtr<nsIStringBundleService> bundleService =
44 0 : mozilla::services::GetStringBundleService();
45 :
46 0 : NS_ASSERTION(bundleService, "String bundle service must be present!");
47 0 : if (!bundleService)
48 0 : return eNameOK;
49 :
50 0 : nsCOMPtr<nsIStringBundle> bundle;
51 0 : nsresult rv = bundleService->CreateBundle("chrome://branding/locale/brand.properties",
52 0 : getter_AddRefs(bundle));
53 0 : if (NS_FAILED(rv))
54 0 : return eNameOK;
55 :
56 0 : nsXPIDLString appName;
57 0 : rv = bundle->GetStringFromName(u"brandShortName",
58 0 : getter_Copies(appName));
59 0 : if (NS_FAILED(rv) || appName.IsEmpty()) {
60 0 : NS_WARNING("brandShortName not found, using default app name");
61 0 : appName.AssignLiteral("Gecko based application");
62 : }
63 :
64 0 : aName.Assign(appName);
65 0 : return eNameOK;
66 : }
67 :
68 : void
69 0 : ApplicationAccessible::Description(nsString& aDescription)
70 : {
71 0 : aDescription.Truncate();
72 0 : }
73 :
74 : void
75 0 : ApplicationAccessible::Value(nsString& aValue)
76 : {
77 0 : aValue.Truncate();
78 0 : }
79 :
80 : uint64_t
81 0 : ApplicationAccessible::State()
82 : {
83 0 : return IsDefunct() ? states::DEFUNCT : 0;
84 : }
85 :
86 : already_AddRefed<nsIPersistentProperties>
87 0 : ApplicationAccessible::NativeAttributes()
88 : {
89 0 : return nullptr;
90 : }
91 :
92 : GroupPos
93 0 : ApplicationAccessible::GroupPosition()
94 : {
95 0 : return GroupPos();
96 : }
97 :
98 : Accessible*
99 0 : ApplicationAccessible::ChildAtPoint(int32_t aX, int32_t aY,
100 : EWhichChildAtPoint aWhichChild)
101 : {
102 0 : return nullptr;
103 : }
104 :
105 : Accessible*
106 0 : ApplicationAccessible::FocusedChild()
107 : {
108 0 : Accessible* focus = FocusMgr()->FocusedAccessible();
109 0 : if (focus && focus->Parent() == this)
110 0 : return focus;
111 :
112 0 : return nullptr;
113 : }
114 :
115 : Relation
116 0 : ApplicationAccessible::RelationByType(RelationType aRelationType)
117 : {
118 0 : return Relation();
119 : }
120 :
121 : nsIntRect
122 0 : ApplicationAccessible::Bounds() const
123 : {
124 0 : return nsIntRect();
125 : }
126 :
127 : ////////////////////////////////////////////////////////////////////////////////
128 : // Accessible public methods
129 :
130 : void
131 0 : ApplicationAccessible::Shutdown()
132 : {
133 0 : mAppInfo = nullptr;
134 0 : }
135 :
136 : void
137 0 : ApplicationAccessible::ApplyARIAState(uint64_t* aState) const
138 : {
139 0 : }
140 :
141 : role
142 0 : ApplicationAccessible::NativeRole()
143 : {
144 0 : return roles::APP_ROOT;
145 : }
146 :
147 : uint64_t
148 0 : ApplicationAccessible::NativeState()
149 : {
150 0 : return 0;
151 : }
152 :
153 : KeyBinding
154 0 : ApplicationAccessible::AccessKey() const
155 : {
156 0 : return KeyBinding();
157 : }
158 :
159 : void
160 0 : ApplicationAccessible::Init()
161 : {
162 : // Basically children are kept updated by Append/RemoveChild method calls.
163 : // However if there are open windows before accessibility was started
164 : // then we need to make sure root accessibles for open windows are created so
165 : // that all root accessibles are stored in application accessible children
166 : // array.
167 :
168 : nsCOMPtr<nsIWindowMediator> windowMediator =
169 0 : do_GetService(NS_WINDOWMEDIATOR_CONTRACTID);
170 :
171 0 : nsCOMPtr<nsISimpleEnumerator> windowEnumerator;
172 0 : nsresult rv = windowMediator->GetEnumerator(nullptr,
173 0 : getter_AddRefs(windowEnumerator));
174 0 : if (NS_FAILED(rv))
175 0 : return;
176 :
177 0 : bool hasMore = false;
178 0 : windowEnumerator->HasMoreElements(&hasMore);
179 0 : while (hasMore) {
180 0 : nsCOMPtr<nsISupports> window;
181 0 : windowEnumerator->GetNext(getter_AddRefs(window));
182 0 : nsCOMPtr<nsPIDOMWindowOuter> DOMWindow = do_QueryInterface(window);
183 0 : if (DOMWindow) {
184 0 : nsCOMPtr<nsIDocument> docNode = DOMWindow->GetDoc();
185 0 : if (docNode) {
186 0 : GetAccService()->GetDocAccessible(docNode); // ensure creation
187 : }
188 : }
189 0 : windowEnumerator->HasMoreElements(&hasMore);
190 : }
191 : }
192 :
193 : Accessible*
194 0 : ApplicationAccessible::GetSiblingAtOffset(int32_t aOffset,
195 : nsresult* aError) const
196 : {
197 0 : if (aError)
198 0 : *aError = NS_OK; // fail peacefully
199 :
200 0 : return nullptr;
201 : }
|