1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:expandtab:shiftwidth=2:tabstop=2:
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/. */
8 #include "ApplicationAccessible.h"
10 #include "AccAttributes.h"
11 #include "LocalAccessible-inl.h"
12 #include "nsAccessibilityService.h"
13 #include "nsAccUtils.h"
18 #include "nsServiceManagerUtils.h"
19 #include "mozilla/dom/Document.h"
20 #include "mozilla/Components.h"
21 #include "nsGlobalWindow.h"
22 #include "nsIStringBundle.h"
24 using namespace mozilla::a11y
;
26 ApplicationAccessible::ApplicationAccessible()
27 : AccessibleWrap(nullptr, nullptr) {
28 mType
= eApplicationType
;
29 mAppInfo
= do_GetService("@mozilla.org/xre/app-info;1");
30 MOZ_ASSERT(mAppInfo
, "no application info");
33 ////////////////////////////////////////////////////////////////////////////////
36 ENameValueFlag
ApplicationAccessible::Name(nsString
& aName
) const {
39 nsCOMPtr
<nsIStringBundleService
> bundleService
=
40 mozilla::components::StringBundle::Service();
42 NS_ASSERTION(bundleService
, "String bundle service must be present!");
43 if (!bundleService
) return eNameOK
;
45 nsCOMPtr
<nsIStringBundle
> bundle
;
46 nsresult rv
= bundleService
->CreateBundle(
47 "chrome://branding/locale/brand.properties", getter_AddRefs(bundle
));
48 if (NS_FAILED(rv
)) return eNameOK
;
51 rv
= bundle
->GetStringFromName("brandShortName", appName
);
52 if (NS_FAILED(rv
) || appName
.IsEmpty()) {
53 NS_WARNING("brandShortName not found, using default app name");
54 appName
.AssignLiteral("Gecko based application");
57 aName
.Assign(appName
);
61 void ApplicationAccessible::Description(nsString
& aDescription
) const {
62 aDescription
.Truncate();
65 void ApplicationAccessible::Value(nsString
& aValue
) const { aValue
.Truncate(); }
67 uint64_t ApplicationAccessible::State() {
68 return IsDefunct() ? states::DEFUNCT
: 0;
71 already_AddRefed
<AccAttributes
> ApplicationAccessible::NativeAttributes() {
72 RefPtr
<AccAttributes
> attributes
= new AccAttributes();
73 return attributes
.forget();
76 GroupPos
ApplicationAccessible::GroupPosition() { return GroupPos(); }
78 LocalAccessible
* ApplicationAccessible::LocalChildAtPoint(
79 int32_t aX
, int32_t aY
, EWhichChildAtPoint aWhichChild
) {
83 Accessible
* ApplicationAccessible::FocusedChild() {
84 LocalAccessible
* focus
= FocusMgr()->FocusedAccessible();
85 if (focus
&& focus
->LocalParent() == this) {
92 Relation
ApplicationAccessible::RelationByType(
93 RelationType aRelationType
) const {
97 mozilla::LayoutDeviceIntRect
ApplicationAccessible::Bounds() const {
98 return mozilla::LayoutDeviceIntRect();
101 nsRect
ApplicationAccessible::BoundsInAppUnits() const { return nsRect(); }
103 ////////////////////////////////////////////////////////////////////////////////
104 // LocalAccessible public methods
106 void ApplicationAccessible::Shutdown() { mAppInfo
= nullptr; }
108 void ApplicationAccessible::ApplyARIAState(uint64_t* aState
) const {}
110 role
ApplicationAccessible::NativeRole() const { return roles::APP_ROOT
; }
112 uint64_t ApplicationAccessible::NativeState() const { return 0; }
114 KeyBinding
ApplicationAccessible::AccessKey() const { return KeyBinding(); }
116 void ApplicationAccessible::Init() {
117 // Basically children are kept updated by Append/RemoveChild method calls.
118 // However if there are open windows before accessibility was started
119 // then we need to make sure root accessibles for open windows are created so
120 // that all root accessibles are stored in application accessible children
123 nsGlobalWindowOuter::OuterWindowByIdTable
* windowsById
=
124 nsGlobalWindowOuter::GetWindowsTable();
130 for (const auto& window
: windowsById
->Values()) {
131 if (window
->GetDocShell() && window
->IsRootOuterWindow()) {
132 if (RefPtr
<dom::Document
> docNode
= window
->GetExtantDoc()) {
133 GetAccService()->GetDocAccessible(docNode
); // ensure creation
139 LocalAccessible
* ApplicationAccessible::GetSiblingAtOffset(
140 int32_t aOffset
, nsresult
* aError
) const {
141 if (aError
) *aError
= NS_OK
; // fail peacefully