tor-browser

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

ia2AccessibleValue.cpp (2773B)


      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 "ia2AccessibleValue.h"
      9 
     10 #include "AccessibleValue_i.c"
     11 
     12 #include "AccessibleWrap.h"
     13 #include "LocalAccessible-inl.h"
     14 #include "IUnknownImpl.h"
     15 #include "MsaaAccessible.h"
     16 
     17 using namespace mozilla::a11y;
     18 
     19 AccessibleWrap* ia2AccessibleValue::LocalAcc() {
     20  return static_cast<MsaaAccessible*>(this)->LocalAcc();
     21 }
     22 
     23 Accessible* ia2AccessibleValue::Acc() {
     24  return static_cast<MsaaAccessible*>(this)->Acc();
     25 }
     26 
     27 // IUnknown
     28 
     29 STDMETHODIMP
     30 ia2AccessibleValue::QueryInterface(REFIID iid, void** ppv) {
     31  if (!ppv) return E_INVALIDARG;
     32 
     33  *ppv = nullptr;
     34 
     35  if (IID_IAccessibleValue == iid) {
     36    Accessible* valueAcc = Acc();
     37    if (valueAcc && valueAcc->HasNumericValue()) {
     38      RefPtr<IAccessibleValue> result = this;
     39      result.forget(ppv);
     40      return S_OK;
     41    }
     42 
     43    return E_NOINTERFACE;
     44  }
     45 
     46  return E_NOINTERFACE;
     47 }
     48 
     49 // IAccessibleValue
     50 
     51 STDMETHODIMP
     52 ia2AccessibleValue::get_currentValue(VARIANT* aCurrentValue) {
     53  if (!aCurrentValue) return E_INVALIDARG;
     54 
     55  VariantInit(aCurrentValue);
     56 
     57  Accessible* valueAcc = Acc();
     58  if (!valueAcc) {
     59    return CO_E_OBJNOTCONNECTED;
     60  }
     61  double currentValue;
     62 
     63  currentValue = valueAcc->CurValue();
     64 
     65  if (std::isnan(currentValue)) return S_FALSE;
     66 
     67  aCurrentValue->vt = VT_R8;
     68  aCurrentValue->dblVal = currentValue;
     69  return S_OK;
     70 }
     71 
     72 STDMETHODIMP
     73 ia2AccessibleValue::setCurrentValue(VARIANT aValue) {
     74  if (aValue.vt != VT_R8) return E_INVALIDARG;
     75 
     76  Accessible* valueAcc = Acc();
     77  if (!valueAcc) {
     78    return CO_E_OBJNOTCONNECTED;
     79  }
     80 
     81  return valueAcc->SetCurValue(aValue.dblVal) ? S_OK : E_FAIL;
     82 }
     83 
     84 STDMETHODIMP
     85 ia2AccessibleValue::get_maximumValue(VARIANT* aMaximumValue) {
     86  if (!aMaximumValue) return E_INVALIDARG;
     87 
     88  VariantInit(aMaximumValue);
     89 
     90  Accessible* valueAcc = Acc();
     91  if (!valueAcc) {
     92    return CO_E_OBJNOTCONNECTED;
     93  }
     94  double maximumValue;
     95 
     96  maximumValue = valueAcc->MaxValue();
     97 
     98  if (std::isnan(maximumValue)) return S_FALSE;
     99 
    100  aMaximumValue->vt = VT_R8;
    101  aMaximumValue->dblVal = maximumValue;
    102  return S_OK;
    103 }
    104 
    105 STDMETHODIMP
    106 ia2AccessibleValue::get_minimumValue(VARIANT* aMinimumValue) {
    107  if (!aMinimumValue) return E_INVALIDARG;
    108 
    109  VariantInit(aMinimumValue);
    110 
    111  Accessible* valueAcc = Acc();
    112  if (!valueAcc) {
    113    return CO_E_OBJNOTCONNECTED;
    114  }
    115  double minimumValue;
    116 
    117  minimumValue = valueAcc->MinValue();
    118 
    119  if (std::isnan(minimumValue)) return S_FALSE;
    120 
    121  aMinimumValue->vt = VT_R8;
    122  aMinimumValue->dblVal = minimumValue;
    123  return S_OK;
    124 }