tor-browser

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

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 }