Blame accessible/xpcom/xpcAccessibleDocument.cpp

Packit f0b94e
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
/* vim: set ts=2 et sw=2 tw=80: */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
Packit f0b94e
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#include "xpcAccessibleDocument.h"
Packit f0b94e
#include "xpcAccessibleImage.h"
Packit f0b94e
#include "xpcAccessibleTable.h"
Packit f0b94e
#include "xpcAccessibleTableCell.h"
Packit f0b94e
Packit f0b94e
#include "mozilla/a11y/DocAccessibleParent.h"
Packit f0b94e
#include "DocAccessible-inl.h"
Packit f0b94e
#include "nsIDOMDocument.h"
Packit f0b94e
Packit f0b94e
using namespace mozilla;
Packit f0b94e
using namespace mozilla::a11y;
Packit f0b94e
Packit f0b94e
////////////////////////////////////////////////////////////////////////////////
Packit f0b94e
// nsISupports
Packit f0b94e
Packit f0b94e
NS_IMPL_QUERY_INTERFACE_INHERITED(xpcAccessibleDocument, xpcAccessibleHyperText,
Packit f0b94e
                                  nsIAccessibleDocument)
Packit f0b94e
NS_IMPL_ADDREF_INHERITED(xpcAccessibleDocument, xpcAccessibleHyperText)
Packit f0b94e
NS_IMETHODIMP_(MozExternalRefCountType) xpcAccessibleDocument::Release(void) {
Packit f0b94e
  nsrefcnt r = xpcAccessibleHyperText::Release();
Packit f0b94e
  NS_LOG_RELEASE(this, r, "xpcAccessibleDocument");
Packit f0b94e
Packit f0b94e
  // The only reference to the xpcAccessibleDocument is in DocManager's cache.
Packit f0b94e
  if (r == 1 && !mIntl.IsNull() && mCache.Count() == 0) {
Packit f0b94e
    if (mIntl.IsAccessible()) {
Packit f0b94e
      GetAccService()->RemoveFromXPCDocumentCache(
Packit f0b94e
          mIntl.AsAccessible()->AsDoc());
Packit f0b94e
    } else {
Packit f0b94e
      GetAccService()->RemoveFromRemoteXPCDocumentCache(
Packit f0b94e
          mIntl.AsProxy()->AsDoc());
Packit f0b94e
    }
Packit f0b94e
  }
Packit f0b94e
  return r;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
////////////////////////////////////////////////////////////////////////////////
Packit f0b94e
// nsIAccessibleDocument
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetURL(nsAString& aURL) {
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  Intl()->URL(aURL);
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetTitle(nsAString& aTitle) {
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  nsAutoString title;
Packit f0b94e
  Intl()->Title(title);
Packit f0b94e
  aTitle = title;
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetMimeType(nsAString& aType) {
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  Intl()->MimeType(aType);
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetDocType(nsAString& aType) {
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  Intl()->DocType(aType);
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetDOMDocument(nsIDOMDocument** aDOMDocument) {
Packit f0b94e
  NS_ENSURE_ARG_POINTER(aDOMDocument);
Packit f0b94e
  *aDOMDocument = nullptr;
Packit f0b94e
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  if (Intl()->DocumentNode())
Packit f0b94e
    CallQueryInterface(Intl()->DocumentNode(), aDOMDocument);
Packit f0b94e
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetWindow(mozIDOMWindowProxy** aDOMWindow) {
Packit f0b94e
  NS_ENSURE_ARG_POINTER(aDOMWindow);
Packit f0b94e
  *aDOMWindow = nullptr;
Packit f0b94e
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  NS_IF_ADDREF(*aDOMWindow = Intl()->DocumentNode()->GetWindow());
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetParentDocument(nsIAccessibleDocument** aDocument) {
Packit f0b94e
  NS_ENSURE_ARG_POINTER(aDocument);
Packit f0b94e
  *aDocument = nullptr;
Packit f0b94e
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  NS_IF_ADDREF(*aDocument = ToXPCDocument(Intl()->ParentDocument()));
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetChildDocumentCount(uint32_t* aCount) {
Packit f0b94e
  NS_ENSURE_ARG_POINTER(aCount);
Packit f0b94e
  *aCount = 0;
Packit f0b94e
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  *aCount = Intl()->ChildDocumentCount();
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetChildDocumentAt(uint32_t aIndex,
Packit f0b94e
                                          nsIAccessibleDocument** aDocument) {
Packit f0b94e
  NS_ENSURE_ARG_POINTER(aDocument);
Packit f0b94e
  *aDocument = nullptr;
Packit f0b94e
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  NS_IF_ADDREF(*aDocument = ToXPCDocument(Intl()->GetChildDocumentAt(aIndex)));
Packit f0b94e
  return *aDocument ? NS_OK : NS_ERROR_INVALID_ARG;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
NS_IMETHODIMP
Packit f0b94e
xpcAccessibleDocument::GetVirtualCursor(nsIAccessiblePivot** aVirtualCursor) {
Packit f0b94e
  NS_ENSURE_ARG_POINTER(aVirtualCursor);
Packit f0b94e
  *aVirtualCursor = nullptr;
Packit f0b94e
Packit f0b94e
  if (!Intl()) return NS_ERROR_FAILURE;
Packit f0b94e
Packit f0b94e
  NS_ADDREF(*aVirtualCursor = Intl()->VirtualCursor());
Packit f0b94e
  return NS_OK;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
////////////////////////////////////////////////////////////////////////////////
Packit f0b94e
// xpcAccessibleDocument
Packit f0b94e
Packit f0b94e
xpcAccessibleGeneric* xpcAccessibleDocument::GetAccessible(
Packit f0b94e
    Accessible* aAccessible) {
Packit f0b94e
  MOZ_ASSERT(!mRemote);
Packit f0b94e
  if (ToXPCDocument(aAccessible->Document()) != this) {
Packit f0b94e
    NS_ERROR(
Packit f0b94e
        "This XPCOM document is not related with given internal accessible!");
Packit f0b94e
    return nullptr;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  if (aAccessible->IsDoc()) return this;
Packit f0b94e
Packit f0b94e
  xpcAccessibleGeneric* xpcAcc = mCache.Get(aAccessible);
Packit f0b94e
  if (xpcAcc) return xpcAcc;
Packit f0b94e
Packit f0b94e
  if (aAccessible->IsImage())
Packit f0b94e
    xpcAcc = new xpcAccessibleImage(aAccessible);
Packit f0b94e
  else if (aAccessible->IsTable())
Packit f0b94e
    xpcAcc = new xpcAccessibleTable(aAccessible);
Packit f0b94e
  else if (aAccessible->IsTableCell())
Packit f0b94e
    xpcAcc = new xpcAccessibleTableCell(aAccessible);
Packit f0b94e
  else if (aAccessible->IsHyperText())
Packit f0b94e
    xpcAcc = new xpcAccessibleHyperText(aAccessible);
Packit f0b94e
  else
Packit f0b94e
    xpcAcc = new xpcAccessibleGeneric(aAccessible);
Packit f0b94e
Packit f0b94e
  mCache.Put(aAccessible, xpcAcc);
Packit f0b94e
  return xpcAcc;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
xpcAccessibleGeneric* xpcAccessibleDocument::GetXPCAccessible(
Packit f0b94e
    ProxyAccessible* aProxy) {
Packit f0b94e
  MOZ_ASSERT(mRemote);
Packit f0b94e
  MOZ_ASSERT(aProxy->Document() == mIntl.AsProxy());
Packit f0b94e
  if (aProxy->IsDoc()) {
Packit f0b94e
    return this;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  xpcAccessibleGeneric* acc = mCache.Get(aProxy);
Packit f0b94e
  if (acc) {
Packit f0b94e
    return acc;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  // XXX support exposing optional interfaces.
Packit f0b94e
  uint8_t interfaces = 0;
Packit f0b94e
  if (aProxy->mHasValue) {
Packit f0b94e
    interfaces |= eValue;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  if (aProxy->mIsHyperLink) {
Packit f0b94e
    interfaces |= eHyperLink;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  if (aProxy->mIsHyperText) {
Packit f0b94e
    interfaces |= eText;
Packit f0b94e
    acc = new xpcAccessibleHyperText(aProxy, interfaces);
Packit f0b94e
    mCache.Put(aProxy, acc);
Packit f0b94e
Packit f0b94e
    return acc;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  acc = new xpcAccessibleGeneric(aProxy, interfaces);
Packit f0b94e
  mCache.Put(aProxy, acc);
Packit f0b94e
Packit f0b94e
  return acc;
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
void xpcAccessibleDocument::Shutdown() {
Packit f0b94e
  for (auto iter = mCache.Iter(); !iter.Done(); iter.Next()) {
Packit f0b94e
    iter.Data()->Shutdown();
Packit f0b94e
    iter.Remove();
Packit f0b94e
  }
Packit f0b94e
  xpcAccessibleGeneric::Shutdown();
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
xpcAccessibleGeneric* a11y::ToXPC(AccessibleOrProxy aAcc) {
Packit f0b94e
  if (aAcc.IsNull()) {
Packit f0b94e
    return nullptr;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  if (aAcc.IsAccessible()) {
Packit f0b94e
    return ToXPC(aAcc.AsAccessible());
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  xpcAccessibleDocument* doc = ToXPCDocument(aAcc.AsProxy()->Document());
Packit f0b94e
  return doc->GetXPCAccessible(aAcc.AsProxy());
Packit f0b94e
}