AtkAttributeSet *
    getDocumentAttributesCB(AtkDocument *aDocument)
    {
        AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aDocument));
        if (!accWrap || !accWrap->IsDoc())
            return nullptr;

        // according to atkobject.h, AtkAttributeSet is a GSList
        GSList* attributes = nullptr;
        DocAccessible* document = accWrap->AsDoc();
        nsAutoString aURL;
        nsresult rv = document->GetURL(aURL);
        if (NS_SUCCEEDED(rv))
            attributes = prependToList(attributes, kDocUrlName, aURL);

        nsAutoString aW3CDocType;
        rv = document->GetDocType(aW3CDocType);
        if (NS_SUCCEEDED(rv))
            attributes = prependToList(attributes, kDocTypeName, aW3CDocType);

        nsAutoString aMimeType;
        rv = document->GetMimeType(aMimeType);
        if (NS_SUCCEEDED(rv))
            attributes = prependToList(attributes, kMimeTypeName, aMimeType);

        return attributes;
    }
AtkAttributeSet *
getDocumentAttributesCB(AtkDocument *aDocument)
{
  nsAutoString url;
  nsAutoString w3cDocType;
  nsAutoString mimeType;
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aDocument));
  if (accWrap) {
    if (!accWrap->IsDoc()) {
      return nullptr;
    }

    DocAccessible* document = accWrap->AsDoc();
    document->URL(url);
    document->DocType(w3cDocType);
    document->MimeType(mimeType);
  } else if (ProxyAccessible* proxy = GetProxy(ATK_OBJECT(aDocument))) {
    proxy->URLDocTypeMimeType(url, w3cDocType, mimeType);
  } else {
    return nullptr;
  }

  // according to atkobject.h, AtkAttributeSet is a GSList
  GSList* attributes = nullptr;
  attributes = prependToList(attributes, kDocUrlName, url);
  attributes = prependToList(attributes, kDocTypeName, w3cDocType);
  attributes = prependToList(attributes, kMimeTypeName, mimeType);

  return attributes;
}
const gchar *
getDocumentAttributeValueCB(AtkDocument *aDocument,
                            const gchar *aAttrName)
{
  ProxyAccessible* proxy = nullptr;
  DocAccessible* document = nullptr;
  AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aDocument));
  if (accWrap) {
    if (!accWrap->IsDoc()) {
      return nullptr;
    }

    document = accWrap->AsDoc();
  } else {
    proxy = GetProxy(ATK_OBJECT(aDocument));
    if (!proxy) {
      return nullptr;
    }
  }

  nsAutoString attrValue;
  if (!strcasecmp(aAttrName, kDocTypeName)) {
    if (document) {
      document->DocType(attrValue);
    } else {
      proxy->DocType(attrValue);
    }
  } else if (!strcasecmp(aAttrName, kDocUrlName)) {
    if (document) {
      document->URL(attrValue);
    } else {
      proxy->URL(attrValue);
    }
  } else if (!strcasecmp(aAttrName, kMimeTypeName)) {
    if (document) {
      document->MimeType(attrValue);
    } else {
      proxy->MimeType(attrValue);
    }
  } else {
    return nullptr;
  }

  return attrValue.IsEmpty() ? nullptr : AccessibleWrap::ReturnString(attrValue);
}
Beispiel #4
0
void DocAccessibleWrap::CacheFocusPath(AccessibleWrap* aAccessible) {
  mFocusPath.Clear();
  if (IPCAccessibilityActive()) {
    DocAccessibleChild* ipcDoc = IPCDoc();
    nsTArray<BatchData> cacheData;
    for (AccessibleWrap* acc = aAccessible; acc && acc != this->Parent();
         acc = static_cast<AccessibleWrap*>(acc->Parent())) {
      auto uid = acc->IsDoc() && acc->AsDoc()->IPCDoc()
                     ? 0
                     : reinterpret_cast<uint64_t>(acc->UniqueID());
      nsAutoString name;
      acc->Name(name);
      nsAutoString textValue;
      acc->Value(textValue);
      nsAutoString nodeID;
      acc->WrapperDOMNodeID(nodeID);
      nsCOMPtr<nsIPersistentProperties> props = acc->Attributes();
      nsTArray<Attribute> attributes;
      nsAccUtils::PersistentPropertiesToArray(props, &attributes);
      cacheData.AppendElement(BatchData(
          acc->Document()->IPCDoc(), uid, acc->State(), acc->Bounds(),
          acc->ActionCount(), name, textValue, nodeID, acc->CurValue(),
          acc->MinValue(), acc->MaxValue(), acc->Step(), attributes));
      mFocusPath.Put(acc->UniqueID(), acc);
    }

    ipcDoc->SendBatch(eBatch_FocusPath, cacheData);
  } else if (SessionAccessibility* sessionAcc =
                 SessionAccessibility::GetInstanceFor(this)) {
    nsTArray<AccessibleWrap*> accessibles;
    for (AccessibleWrap* acc = aAccessible; acc && acc != this->Parent();
         acc = static_cast<AccessibleWrap*>(acc->Parent())) {
      accessibles.AppendElement(acc);
    }

    sessionAcc->ReplaceFocusPathCache(accessibles);
  }
}
    const gchar *
    getDocumentAttributeValueCB(AtkDocument *aDocument,
                                const gchar *aAttrName)
    {
        AccessibleWrap* accWrap = GetAccessibleWrap(ATK_OBJECT(aDocument));
        if (!accWrap || !accWrap->IsDoc())
            return nullptr;

        DocAccessible* document = accWrap->AsDoc();
        nsresult rv;
        nsAutoString attrValue;
        if (!strcasecmp(aAttrName, kDocTypeName))
            rv = document->GetDocType(attrValue);
        else if (!strcasecmp(aAttrName, kDocUrlName))
            rv = document->GetURL(attrValue);
        else if (!strcasecmp(aAttrName, kMimeTypeName))
            rv = document->GetMimeType(attrValue);
        else
            return nullptr;

        NS_ENSURE_SUCCESS(rv, nullptr);
        return attrValue.IsEmpty() ? nullptr : AccessibleWrap::ReturnString(attrValue);
    }