ApplicationAccessible.cpp (4479B)
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 "LocalAccessible-inl.h" 11 #include "nsAccessibilityService.h" 12 #include "Relation.h" 13 #include "mozilla/a11y/Role.h" 14 #include "States.h" 15 16 #include "nsServiceManagerUtils.h" 17 #include "mozilla/dom/Document.h" 18 #include "mozilla/Components.h" 19 #include "nsGlobalWindowOuter.h" 20 #include "nsIStringBundle.h" 21 22 using namespace mozilla::a11y; 23 24 ApplicationAccessible::ApplicationAccessible() 25 : AccessibleWrap(nullptr, nullptr) { 26 mType = eApplicationType; 27 mAppInfo = do_GetService("@mozilla.org/xre/app-info;1"); 28 MOZ_ASSERT(mAppInfo, "no application info"); 29 } 30 31 //////////////////////////////////////////////////////////////////////////////// 32 // nsIAccessible 33 34 ENameValueFlag ApplicationAccessible::DirectName(nsString& aName) const { 35 aName.Truncate(); 36 37 nsCOMPtr<nsIStringBundleService> bundleService = 38 mozilla::components::StringBundle::Service(); 39 40 NS_ASSERTION(bundleService, "String bundle service must be present!"); 41 if (!bundleService) return eNameOK; 42 43 nsCOMPtr<nsIStringBundle> bundle; 44 nsresult rv = bundleService->CreateBundle( 45 "chrome://branding/locale/brand.properties", getter_AddRefs(bundle)); 46 if (NS_FAILED(rv)) return eNameOK; 47 48 nsAutoString appName; 49 rv = bundle->GetStringFromName("brandShortName", appName); 50 if (NS_FAILED(rv) || appName.IsEmpty()) { 51 NS_WARNING("brandShortName not found, using default app name"); 52 appName.AssignLiteral("Gecko based application"); 53 } 54 55 aName.Assign(appName); 56 return eNameOK; 57 } 58 59 EDescriptionValueFlag ApplicationAccessible::Description( 60 nsString& aDescription) const { 61 aDescription.Truncate(); 62 return eDescriptionOK; 63 } 64 65 void ApplicationAccessible::Value(nsString& aValue) const { aValue.Truncate(); } 66 67 uint64_t ApplicationAccessible::State() { 68 return IsDefunct() ? states::DEFUNCT : 0; 69 } 70 71 already_AddRefed<AccAttributes> ApplicationAccessible::NativeAttributes() { 72 RefPtr<AccAttributes> attributes = new AccAttributes(); 73 return attributes.forget(); 74 } 75 76 GroupPos ApplicationAccessible::GroupPosition() { return GroupPos(); } 77 78 LocalAccessible* ApplicationAccessible::LocalChildAtPoint( 79 int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild) { 80 return nullptr; 81 } 82 83 Accessible* ApplicationAccessible::FocusedChild() { 84 LocalAccessible* focus = FocusMgr()->FocusedLocalAccessible(); 85 if (focus && focus->LocalParent() == this) { 86 return focus; 87 } 88 89 return nullptr; 90 } 91 92 Relation ApplicationAccessible::RelationByType( 93 RelationType aRelationType) const { 94 return Relation(); 95 } 96 97 mozilla::LayoutDeviceIntRect ApplicationAccessible::Bounds() const { 98 return mozilla::LayoutDeviceIntRect(); 99 } 100 101 nsRect ApplicationAccessible::BoundsInAppUnits() const { return nsRect(); } 102 103 //////////////////////////////////////////////////////////////////////////////// 104 // LocalAccessible public methods 105 106 void ApplicationAccessible::Shutdown() { mAppInfo = nullptr; } 107 108 void ApplicationAccessible::ApplyARIAState(uint64_t* aState) const {} 109 110 role ApplicationAccessible::NativeRole() const { return roles::APP_ROOT; } 111 112 uint64_t ApplicationAccessible::NativeState() const { return 0; } 113 114 KeyBinding ApplicationAccessible::AccessKey() const { return KeyBinding(); } 115 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 121 // array. 122 123 nsGlobalWindowOuter::OuterWindowByIdTable* windowsById = 124 nsGlobalWindowOuter::GetWindowsTable(); 125 126 if (!windowsById) { 127 return; 128 } 129 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 134 } 135 } 136 } 137 } 138 139 LocalAccessible* ApplicationAccessible::GetSiblingAtOffset( 140 int32_t aOffset, nsresult* aError) const { 141 if (aError) *aError = NS_OK; // fail peacefully 142 143 return nullptr; 144 }