Bug 1954418 part 1: Remove ISimpleDOM code that only works for LocalAccessible. r=morgan

We have a lot of ISimpleDOM code which only works for LocalAccessible.
Because all web content uses RemoteAccessible now, practically, the only usable ISimpleDOM functionality is that which works for RemoteAccessible.
Therefore, remove all code that only works for LocalAccessible.

Differential Revision: https://phabricator.services.mozilla.com/D241805
This commit is contained in:
James Teh
2025-03-18 07:10:39 +00:00
parent a676799496
commit 4a4509a537
15 changed files with 28 additions and 820 deletions

View File

@@ -13,7 +13,6 @@
#include "DocAccessibleChild.h" #include "DocAccessibleChild.h"
#include "nsWinUtils.h" #include "nsWinUtils.h"
#include "RootAccessible.h" #include "RootAccessible.h"
#include "sdnDocAccessible.h"
#include "Statistics.h" #include "Statistics.h"
using namespace mozilla; using namespace mozilla;

View File

@@ -24,7 +24,6 @@
#include "nsWinUtils.h" #include "nsWinUtils.h"
#include "Relation.h" #include "Relation.h"
#include "sdnAccessible.h" #include "sdnAccessible.h"
#include "sdnTextAccessible.h"
#include "HyperTextAccessible-inl.h" #include "HyperTextAccessible-inl.h"
#include "ServiceProvider.h" #include "ServiceProvider.h"
#include "ARIAMap.h" #include "ARIAMap.h"
@@ -136,16 +135,6 @@ int32_t MsaaAccessible::GetChildIDFor(Accessible* aAccessible) {
return *id; return *id;
} }
/* static */
void MsaaAccessible::AssignChildIDTo(NotNull<sdnAccessible*> aSdnAcc) {
aSdnAcc->SetUniqueID(sIDGen.GetID());
}
/* static */
void MsaaAccessible::ReleaseChildID(NotNull<sdnAccessible*> aSdnAcc) {
sIDGen.ReleaseID(aSdnAcc);
}
HWND MsaaAccessible::GetHWNDFor(Accessible* aAccessible) { HWND MsaaAccessible::GetHWNDFor(Accessible* aAccessible) {
if (!aAccessible) { if (!aAccessible) {
return nullptr; return nullptr;
@@ -562,10 +551,6 @@ MsaaAccessible::QueryInterface(REFIID iid, void** ppv) {
} }
*ppv = static_cast<ISimpleDOMNode*>(new sdnAccessible(WrapNotNull(this))); *ppv = static_cast<ISimpleDOMNode*>(new sdnAccessible(WrapNotNull(this)));
} else if (iid == IID_ISimpleDOMText && localAcc && localAcc->IsTextLeaf()) {
*ppv = static_cast<ISimpleDOMText*>(new sdnTextAccessible(this));
static_cast<IUnknown*>(*ppv)->AddRef();
return S_OK;
} }
if (!*ppv && localAcc) { if (!*ppv && localAcc) {

View File

@@ -21,7 +21,6 @@ namespace a11y {
class Accessible; class Accessible;
class AccessibleWrap; class AccessibleWrap;
class LocalAccessible; class LocalAccessible;
class sdnAccessible;
class MsaaAccessible : public ia2Accessible, class MsaaAccessible : public ia2Accessible,
public ia2AccessibleComponent, public ia2AccessibleComponent,
@@ -38,8 +37,6 @@ class MsaaAccessible : public ia2Accessible,
static const uint32_t kNoID = 0; static const uint32_t kNoID = 0;
static int32_t GetChildIDFor(Accessible* aAccessible); static int32_t GetChildIDFor(Accessible* aAccessible);
static void AssignChildIDTo(NotNull<sdnAccessible*> aSdnAcc);
static void ReleaseChildID(NotNull<sdnAccessible*> aSdnAcc);
static HWND GetHWNDFor(Accessible* aAccessible); static HWND GetHWNDFor(Accessible* aAccessible);
static void FireWinEvent(Accessible* aTarget, uint32_t aEventType); static void FireWinEvent(Accessible* aTarget, uint32_t aEventType);

View File

@@ -12,7 +12,6 @@
#include "nsAccessibilityService.h" #include "nsAccessibilityService.h"
#include "nsAccUtils.h" #include "nsAccUtils.h"
#include "nsWinUtils.h" #include "nsWinUtils.h"
#include "sdnDocAccessible.h"
#include "mozilla/a11y/Role.h" #include "mozilla/a11y/Role.h"
#include "ISimpleDOM.h" #include "ISimpleDOM.h"
@@ -52,11 +51,6 @@ MsaaDocAccessible* MsaaDocAccessible::GetFromOwned(Accessible* aAcc) {
// IUnknown // IUnknown
IMPL_IUNKNOWN_QUERY_HEAD(MsaaDocAccessible) IMPL_IUNKNOWN_QUERY_HEAD(MsaaDocAccessible)
if (aIID == IID_ISimpleDOMDocument && LocalAcc()) {
*aInstancePtr = static_cast<ISimpleDOMDocument*>(new sdnDocAccessible(this));
static_cast<IUnknown*>(*aInstancePtr)->AddRef();
return S_OK;
}
IMPL_IUNKNOWN_QUERY_TAIL_INHERITED(ia2AccessibleHypertext) IMPL_IUNKNOWN_QUERY_TAIL_INHERITED(ia2AccessibleHypertext)
STDMETHODIMP STDMETHODIMP

View File

@@ -12,7 +12,6 @@
#include "mozilla/Unused.h" #include "mozilla/Unused.h"
#include "MsaaAccessible.h" #include "MsaaAccessible.h"
#include "nsAccessibilityService.h" #include "nsAccessibilityService.h"
#include "sdnAccessible.h"
namespace mozilla { namespace mozilla {
namespace a11y { namespace a11y {
@@ -75,13 +74,5 @@ void MsaaIdGenerator::ReleaseID(NotNull<MsaaAccessible*> aMsaaAcc) {
ReleaseID(aMsaaAcc->GetExistingID()); ReleaseID(aMsaaAcc->GetExistingID());
} }
void MsaaIdGenerator::ReleaseID(NotNull<sdnAccessible*> aSdnAcc) {
Maybe<uint32_t> id = aSdnAcc->ReleaseUniqueID();
if (id.isSome()) {
DebugOnly<bool> released = ReleaseID(id.value());
MOZ_ASSERT(released);
}
}
} // namespace a11y } // namespace a11y
} // namespace mozilla } // namespace mozilla

View File

@@ -16,7 +16,6 @@ namespace mozilla {
namespace a11y { namespace a11y {
class MsaaAccessible; class MsaaAccessible;
class sdnAccessible;
/** /**
* This class is responsible for generating child IDs used by our MSAA * This class is responsible for generating child IDs used by our MSAA
@@ -26,7 +25,6 @@ class MsaaIdGenerator {
public: public:
uint32_t GetID(); uint32_t GetID();
void ReleaseID(NotNull<MsaaAccessible*> aMsaaAcc); void ReleaseID(NotNull<MsaaAccessible*> aMsaaAcc);
void ReleaseID(NotNull<sdnAccessible*> aSdnAcc);
private: private:
bool ReleaseID(uint32_t aID); bool ReleaseID(uint32_t aID);

View File

@@ -16,7 +16,6 @@
#include "mozilla/a11y/DocAccessibleParent.h" #include "mozilla/a11y/DocAccessibleParent.h"
#include "mozilla/Preferences.h" #include "mozilla/Preferences.h"
#include "nsArrayUtils.h" #include "nsArrayUtils.h"
#include "nsICSSDeclaration.h"
#include "mozilla/dom/Document.h" #include "mozilla/dom/Document.h"
#include "mozilla/dom/Element.h" #include "mozilla/dom/Element.h"
#include "nsXULAppAPI.h" #include "nsXULAppAPI.h"
@@ -37,23 +36,6 @@ static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam,
bool nsWinUtils::sWindowEmulationStarted = false; bool nsWinUtils::sWindowEmulationStarted = false;
already_AddRefed<nsICSSDeclaration> nsWinUtils::GetComputedStyleDeclaration(
nsIContent* aContent) {
nsIContent* elm = nsCoreUtils::GetDOMElementFor(aContent);
if (!elm) return nullptr;
// Returns number of items in style declaration
nsCOMPtr<nsPIDOMWindowInner> window = elm->OwnerDoc()->GetInnerWindow();
if (!window) return nullptr;
ErrorResult dummy;
nsCOMPtr<Element> domElement(do_QueryInterface(elm));
nsCOMPtr<nsICSSDeclaration> cssDecl =
window->GetComputedStyle(*domElement, u""_ns, dummy);
dummy.SuppressException();
return cssDecl.forget();
}
bool nsWinUtils::MaybeStartWindowEmulation() { bool nsWinUtils::MaybeStartWindowEmulation() {
// Register window class that'll be used for document accessibles associated // Register window class that'll be used for document accessibles associated
// with tabs. // with tabs.

View File

@@ -28,15 +28,6 @@ const LPCWSTR kPropNameDocAccParent = L"MozDocAccessibleParent";
class nsWinUtils { class nsWinUtils {
public: public:
/**
* Return computed styles declaration for the given node.
*
* @note Please use it carefully since it can shutdown the accessible tree
* you operate on.
*/
static already_AddRefed<nsICSSDeclaration> GetComputedStyleDeclaration(
nsIContent* aContent);
/** /**
* Start window emulation if presence of specific AT is detected. * Start window emulation if presence of specific AT is detected.
*/ */

View File

@@ -6,8 +6,6 @@
UNIFIED_SOURCES += [ UNIFIED_SOURCES += [
"sdnAccessible.cpp", "sdnAccessible.cpp",
"sdnDocAccessible.cpp",
"sdnTextAccessible.cpp",
] ]
LOCAL_INCLUDES += [ LOCAL_INCLUDES += [

View File

@@ -7,31 +7,12 @@
#include "sdnAccessible-inl.h" #include "sdnAccessible-inl.h"
#include "ISimpleDOM_i.c" #include "ISimpleDOM_i.c"
#include "DocAccessibleWrap.h"
#include "nsAttrName.h"
#include "nsCoreUtils.h"
#include "nsIAccessibleTypes.h"
#include "nsICSSDeclaration.h"
#include "nsNameSpaceManager.h"
#include "nsServiceManagerUtils.h"
#include "nsWinUtils.h"
#include "nsRange.h"
#include "mozilla/dom/BorrowedAttrInfo.h"
#include "mozilla/dom/Document.h"
#include "mozilla/dom/Element.h" #include "mozilla/dom/Element.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/PresShell.h"
using namespace mozilla; using namespace mozilla;
using namespace mozilla::a11y; using namespace mozilla::a11y;
sdnAccessible::~sdnAccessible() { sdnAccessible::~sdnAccessible() = default;
if (mUniqueId.isSome()) {
MsaaAccessible::ReleaseChildID(WrapNotNull(this));
}
}
STDMETHODIMP STDMETHODIMP
sdnAccessible::QueryInterface(REFIID aREFIID, void** aInstancePtr) { sdnAccessible::QueryInterface(REFIID aREFIID, void** aInstancePtr) {
@@ -90,52 +71,20 @@ sdnAccessible::get_nodeInfo(BSTR __RPC_FAR* aNodeName,
// application can compare this to the childID we return for events such as // application can compare this to the childID we return for events such as
// focus events, to correlate back to data nodes in their internal object // focus events, to correlate back to data nodes in their internal object
// model. // model.
MsaaAccessible* accessible = GetMsaa(); Accessible* acc = GetMsaa()->Acc();
if (accessible) { *aUniqueID = MsaaAccessible::GetChildIDFor(acc);
*aUniqueID = MsaaAccessible::GetChildIDFor(accessible->Acc()); if (acc->IsText()) {
*aNodeType = nsINode::TEXT_NODE;
} else if (acc->IsDoc()) {
*aNodeType = nsINode::DOCUMENT_NODE;
} else { } else {
if (mUniqueId.isNothing()) { *aNodeType = nsINode::ELEMENT_NODE;
MsaaAccessible::AssignChildIDTo(WrapNotNull(this));
}
MOZ_ASSERT(mUniqueId.isSome());
*aUniqueID = mUniqueId.value();
} }
if (nsAtom* tag = acc->TagName()) {
if (!mNode) { nsAutoString nodeName;
RemoteAccessible* remoteAcc = accessible->Acc()->AsRemote(); tag->ToString(nodeName);
MOZ_ASSERT(remoteAcc); *aNodeName = ::SysAllocString(nodeName.get());
if (remoteAcc->IsText()) {
*aNodeType = nsINode::TEXT_NODE;
} else if (remoteAcc->IsDoc()) {
*aNodeType = nsINode::DOCUMENT_NODE;
} else {
*aNodeType = nsINode::ELEMENT_NODE;
}
if (nsAtom* tag = remoteAcc->TagName()) {
nsAutoString nodeName;
tag->ToString(nodeName);
*aNodeName = ::SysAllocString(nodeName.get());
}
return S_OK;
} }
uint16_t nodeType = mNode->NodeType();
*aNodeType = static_cast<unsigned short>(nodeType);
if (*aNodeType != NODETYPE_TEXT) {
*aNodeName = ::SysAllocString(mNode->NodeName().get());
}
nsAutoString nodeValue;
mNode->GetNodeValue(nodeValue);
*aNodeValue = ::SysAllocString(nodeValue.get());
*aNameSpaceID = mNode->IsContent()
? static_cast<short>(mNode->AsContent()->GetNameSpaceID())
: 0;
*aNumChildren = mNode->GetChildCount();
return S_OK; return S_OK;
} }
@@ -145,40 +94,7 @@ sdnAccessible::get_attributes(unsigned short aMaxAttribs,
short __RPC_FAR* aNameSpaceIDs, short __RPC_FAR* aNameSpaceIDs,
BSTR __RPC_FAR* aAttribValues, BSTR __RPC_FAR* aAttribValues,
unsigned short __RPC_FAR* aNumAttribs) { unsigned short __RPC_FAR* aNumAttribs) {
if (!aAttribNames || !aNameSpaceIDs || !aAttribValues || !aNumAttribs) return E_NOTIMPL;
return E_INVALIDARG;
*aNumAttribs = 0;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
if (!mNode->IsElement()) return S_FALSE;
dom::Element* elm = mNode->AsElement();
uint32_t numAttribs = elm->GetAttrCount();
if (numAttribs > aMaxAttribs) numAttribs = aMaxAttribs;
*aNumAttribs = static_cast<unsigned short>(numAttribs);
for (uint32_t index = 0; index < numAttribs; index++) {
aNameSpaceIDs[index] = 0;
aAttribValues[index] = aAttribNames[index] = nullptr;
nsAutoString attributeValue;
dom::BorrowedAttrInfo attr = elm->GetAttrInfoAt(index);
attr.mValue->ToString(attributeValue);
aNameSpaceIDs[index] = static_cast<short>(attr.mName->NamespaceID());
aAttribNames[index] =
::SysAllocString(attr.mName->LocalName()->GetUTF16String());
aAttribValues[index] = ::SysAllocString(attributeValue.get());
}
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
@@ -189,40 +105,10 @@ sdnAccessible::get_attributesForNames(unsigned short aMaxAttribs,
if (!aAttribNames || !aNameSpaceID || !aAttribValues) return E_INVALIDARG; if (!aAttribNames || !aNameSpaceID || !aAttribValues) return E_INVALIDARG;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED; if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) { // NVDA expects this to succeed for MathML and won't call innerHTML if this
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote()); // fails. Therefore, return S_FALSE here instead of E_NOTIMPL, indicating
// NVDA expects this to succeed for MathML and won't call innerHTML if this // that the attributes aren't present.
// fails. Therefore, return S_FALSE here instead of E_NOTIMPL, indicating return S_FALSE;
// that the attributes aren't present.
return S_FALSE;
}
if (!mNode->IsElement()) return S_FALSE;
dom::Element* domElement = mNode->AsElement();
nsNameSpaceManager* nameSpaceManager = nsNameSpaceManager::GetInstance();
int32_t index = 0;
for (index = 0; index < aMaxAttribs; index++) {
aAttribValues[index] = nullptr;
if (aAttribNames[index]) {
nsAutoString attributeValue, nameSpaceURI;
nsAutoString attributeName(
nsDependentString(static_cast<const wchar_t*>(aAttribNames[index])));
if (aNameSpaceID[index] > 0 &&
NS_SUCCEEDED(nameSpaceManager->GetNameSpaceURI(aNameSpaceID[index],
nameSpaceURI))) {
domElement->GetAttributeNS(nameSpaceURI, attributeName, attributeValue);
} else {
domElement->GetAttribute(attributeName, attributeValue);
}
aAttribValues[index] = ::SysAllocString(attributeValue.get());
}
}
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
@@ -230,225 +116,51 @@ sdnAccessible::get_computedStyle(
unsigned short aMaxStyleProperties, boolean aUseAlternateView, unsigned short aMaxStyleProperties, boolean aUseAlternateView,
BSTR __RPC_FAR* aStyleProperties, BSTR __RPC_FAR* aStyleValues, BSTR __RPC_FAR* aStyleProperties, BSTR __RPC_FAR* aStyleValues,
unsigned short __RPC_FAR* aNumStyleProperties) { unsigned short __RPC_FAR* aNumStyleProperties) {
if (!aStyleProperties || aStyleValues || !aNumStyleProperties) return E_NOTIMPL;
return E_INVALIDARG;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
*aNumStyleProperties = 0;
if (mNode->IsDocument()) return S_FALSE;
nsCOMPtr<nsICSSDeclaration> cssDecl =
nsWinUtils::GetComputedStyleDeclaration(mNode->AsContent());
NS_ENSURE_TRUE(cssDecl, E_FAIL);
uint32_t length = cssDecl->Length();
uint32_t index = 0, realIndex = 0;
for (index = realIndex = 0; index < length && realIndex < aMaxStyleProperties;
index++) {
nsAutoCString property;
nsAutoCString value;
// Ignore -moz-* properties.
cssDecl->Item(index, property);
if (property.CharAt(0) != '-')
cssDecl->GetPropertyValue(property, value); // Get property value
if (!value.IsEmpty()) {
aStyleProperties[realIndex] =
::SysAllocString(NS_ConvertUTF8toUTF16(property).get());
aStyleValues[realIndex] =
::SysAllocString(NS_ConvertUTF8toUTF16(value).get());
++realIndex;
}
}
*aNumStyleProperties = static_cast<unsigned short>(realIndex);
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
sdnAccessible::get_computedStyleForProperties( sdnAccessible::get_computedStyleForProperties(
unsigned short aNumStyleProperties, boolean aUseAlternateView, unsigned short aNumStyleProperties, boolean aUseAlternateView,
BSTR __RPC_FAR* aStyleProperties, BSTR __RPC_FAR* aStyleValues) { BSTR __RPC_FAR* aStyleProperties, BSTR __RPC_FAR* aStyleValues) {
if (!aStyleProperties || !aStyleValues) return E_INVALIDARG; return E_NOTIMPL;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
if (mNode->IsDocument()) return S_FALSE;
nsCOMPtr<nsICSSDeclaration> cssDecl =
nsWinUtils::GetComputedStyleDeclaration(mNode->AsContent());
NS_ENSURE_TRUE(cssDecl, E_FAIL);
uint32_t index = 0;
for (index = 0; index < aNumStyleProperties; index++) {
nsAutoCString value;
if (aStyleProperties[index])
cssDecl->GetPropertyValue(
NS_ConvertUTF16toUTF8(nsDependentString(aStyleProperties[index])),
value); // Get property value
aStyleValues[index] = ::SysAllocString(NS_ConvertUTF8toUTF16(value).get());
}
return S_OK;
} }
// XXX Use MOZ_CAN_RUN_SCRIPT_BOUNDARY for now due to bug 1543294. // XXX Use MOZ_CAN_RUN_SCRIPT_BOUNDARY for now due to bug 1543294.
MOZ_CAN_RUN_SCRIPT_BOUNDARY STDMETHODIMP MOZ_CAN_RUN_SCRIPT_BOUNDARY STDMETHODIMP
sdnAccessible::scrollTo(boolean aScrollTopLeft) { sdnAccessible::scrollTo(boolean aScrollTopLeft) {
if (IsDefunct()) { return E_NOTIMPL;
return CO_E_OBJNOTCONNECTED;
}
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
DocAccessible* document = GetDocument();
MOZ_ASSERT(document);
if (!mNode->IsContent()) return S_FALSE;
uint32_t scrollType = aScrollTopLeft
? nsIAccessibleScrollType::SCROLL_TYPE_TOP_LEFT
: nsIAccessibleScrollType::SCROLL_TYPE_BOTTOM_RIGHT;
RefPtr<PresShell> presShell = document->PresShellPtr();
nsCOMPtr<nsIContent> content = mNode->AsContent();
nsCoreUtils::ScrollTo(presShell, content, scrollType);
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
sdnAccessible::get_parentNode(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) { sdnAccessible::get_parentNode(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) {
if (!aNode) return E_INVALIDARG; return E_NOTIMPL;
*aNode = nullptr;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
nsINode* resultNode = mNode->GetParentNode();
if (resultNode) {
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
(*aNode)->AddRef();
}
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
sdnAccessible::get_firstChild(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) { sdnAccessible::get_firstChild(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) {
if (!aNode) return E_INVALIDARG; return E_NOTIMPL;
*aNode = nullptr;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
nsINode* resultNode = mNode->GetFirstChild();
if (resultNode) {
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
(*aNode)->AddRef();
}
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
sdnAccessible::get_lastChild(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) { sdnAccessible::get_lastChild(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) {
if (!aNode) return E_INVALIDARG; return E_NOTIMPL;
*aNode = nullptr;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
nsINode* resultNode = mNode->GetLastChild();
if (resultNode) {
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
(*aNode)->AddRef();
}
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
sdnAccessible::get_previousSibling(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) { sdnAccessible::get_previousSibling(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) {
if (!aNode) return E_INVALIDARG; return E_NOTIMPL;
*aNode = nullptr;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
nsINode* resultNode = mNode->GetPreviousSibling();
if (resultNode) {
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
(*aNode)->AddRef();
}
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
sdnAccessible::get_nextSibling(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) { sdnAccessible::get_nextSibling(ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) {
if (!aNode) return E_INVALIDARG; return E_NOTIMPL;
*aNode = nullptr;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
nsINode* resultNode = mNode->GetNextSibling();
if (resultNode) {
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
(*aNode)->AddRef();
}
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
sdnAccessible::get_childAt(unsigned aChildIndex, sdnAccessible::get_childAt(unsigned aChildIndex,
ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) { ISimpleDOMNode __RPC_FAR* __RPC_FAR* aNode) {
if (!aNode) return E_INVALIDARG; return E_NOTIMPL;
*aNode = nullptr;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
nsINode* resultNode = mNode->GetChildAt_Deprecated(aChildIndex);
if (resultNode) {
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
(*aNode)->AddRef();
}
return S_OK;
} }
STDMETHODIMP STDMETHODIMP
@@ -498,28 +210,4 @@ sdnAccessible::get_localInterface(void __RPC_FAR* __RPC_FAR* aLocalInterface) {
} }
STDMETHODIMP STDMETHODIMP
sdnAccessible::get_language(BSTR __RPC_FAR* aLanguage) { sdnAccessible::get_language(BSTR __RPC_FAR* aLanguage) { return E_NOTIMPL; }
if (!aLanguage) return E_INVALIDARG;
*aLanguage = nullptr;
if (IsDefunct()) return CO_E_OBJNOTCONNECTED;
if (!mNode) {
MOZ_ASSERT(mMsaa && mMsaa->Acc()->IsRemote());
return E_NOTIMPL;
}
nsAutoString language;
if (mNode->IsContent())
nsCoreUtils::GetLanguageFor(mNode->AsContent(), nullptr, language);
if (language.IsEmpty()) { // Nothing found, so use document's language
mNode->OwnerDoc()->GetHeaderData(nsGkAtoms::headerContentLanguage,
language);
}
if (language.IsEmpty()) return S_FALSE;
*aLanguage = ::SysAllocStringLen(language.get(), language.Length());
if (!*aLanguage) return E_OUTOFMEMORY;
return S_OK;
}

View File

@@ -13,7 +13,6 @@
#include "MsaaAccessible.h" #include "MsaaAccessible.h"
#include "mozilla/Attributes.h" #include "mozilla/Attributes.h"
#include "mozilla/Maybe.h"
#include "mozilla/NotNull.h" #include "mozilla/NotNull.h"
namespace mozilla { namespace mozilla {
@@ -59,14 +58,6 @@ class sdnAccessible final : public ISimpleDOMNode {
*/ */
MsaaAccessible* GetMsaa(); MsaaAccessible* GetMsaa();
void SetUniqueID(uint32_t aNewUniqueId) { mUniqueId = Some(aNewUniqueId); }
Maybe<uint32_t> ReleaseUniqueID() {
Maybe<uint32_t> result = mUniqueId;
mUniqueId = Nothing();
return result;
}
// IUnknown // IUnknown
DECL_IUNKNOWN DECL_IUNKNOWN
@@ -136,11 +127,9 @@ class sdnAccessible final : public ISimpleDOMNode {
/* [out][retval] */ BSTR __RPC_FAR* aLanguage); /* [out][retval] */ BSTR __RPC_FAR* aLanguage);
private: private:
// mNode will be null for a RemoteAccessible. In that case, we only partially // mNode will be null for a RemoteAccessible.
// implement this interface using data from the RemoteAccessible cache.
nsCOMPtr<nsINode> mNode; nsCOMPtr<nsINode> mNode;
RefPtr<MsaaAccessible> mMsaa; RefPtr<MsaaAccessible> mMsaa;
Maybe<uint32_t> mUniqueId;
}; };
} // namespace a11y } // namespace a11y

View File

@@ -1,117 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "sdnDocAccessible.h"
#include "LocalAccessible-inl.h"
#include "ISimpleDOM.h"
#include "nsNameSpaceManager.h"
using namespace mozilla;
using namespace mozilla::a11y;
////////////////////////////////////////////////////////////////////////////////
// sdnDocAccessible
////////////////////////////////////////////////////////////////////////////////
IMPL_IUNKNOWN_QUERY_HEAD(sdnDocAccessible)
IMPL_IUNKNOWN_QUERY_IFACE(ISimpleDOMDocument)
IMPL_IUNKNOWN_QUERY_TAIL_AGGREGATED(mMsaa)
STDMETHODIMP
sdnDocAccessible::get_URL(BSTR __RPC_FAR* aURL) {
if (!aURL) return E_INVALIDARG;
*aURL = nullptr;
DocAccessible* acc = mMsaa->DocAcc();
if (!acc) return CO_E_OBJNOTCONNECTED;
nsAutoString URL;
acc->URL(URL);
if (URL.IsEmpty()) return S_FALSE;
*aURL = ::SysAllocStringLen(URL.get(), URL.Length());
return *aURL ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP
sdnDocAccessible::get_title(BSTR __RPC_FAR* aTitle) {
if (!aTitle) return E_INVALIDARG;
*aTitle = nullptr;
DocAccessible* acc = mMsaa->DocAcc();
if (!acc) return CO_E_OBJNOTCONNECTED;
nsAutoString title;
acc->Title(title);
*aTitle = ::SysAllocStringLen(title.get(), title.Length());
return *aTitle ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP
sdnDocAccessible::get_mimeType(BSTR __RPC_FAR* aMimeType) {
if (!aMimeType) return E_INVALIDARG;
*aMimeType = nullptr;
DocAccessible* acc = mMsaa->DocAcc();
if (!acc) return CO_E_OBJNOTCONNECTED;
nsAutoString mimeType;
acc->MimeType(mimeType);
if (mimeType.IsEmpty()) return S_FALSE;
*aMimeType = ::SysAllocStringLen(mimeType.get(), mimeType.Length());
return *aMimeType ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP
sdnDocAccessible::get_docType(BSTR __RPC_FAR* aDocType) {
if (!aDocType) return E_INVALIDARG;
*aDocType = nullptr;
DocAccessible* acc = mMsaa->DocAcc();
if (!acc) return CO_E_OBJNOTCONNECTED;
nsAutoString docType;
acc->DocType(docType);
if (docType.IsEmpty()) return S_FALSE;
*aDocType = ::SysAllocStringLen(docType.get(), docType.Length());
return *aDocType ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP
sdnDocAccessible::get_nameSpaceURIForID(short aNameSpaceID,
BSTR __RPC_FAR* aNameSpaceURI) {
if (!aNameSpaceURI) return E_INVALIDARG;
*aNameSpaceURI = nullptr;
if (!mMsaa->DocAcc()) return CO_E_OBJNOTCONNECTED;
if (aNameSpaceID < 0) return E_INVALIDARG; // -1 is kNameSpaceID_Unknown
nsAutoString nameSpaceURI;
nsNameSpaceManager* nameSpaceManager = nsNameSpaceManager::GetInstance();
if (nameSpaceManager)
nameSpaceManager->GetNameSpaceURI(aNameSpaceID, nameSpaceURI);
if (nameSpaceURI.IsEmpty()) return S_FALSE;
*aNameSpaceURI =
::SysAllocStringLen(nameSpaceURI.get(), nameSpaceURI.Length());
return *aNameSpaceURI ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP
sdnDocAccessible::put_alternateViewMediaTypes(
BSTR __RPC_FAR* aCommaSeparatedMediaTypes) {
if (!aCommaSeparatedMediaTypes) return E_INVALIDARG;
*aCommaSeparatedMediaTypes = nullptr;
return !mMsaa->DocAcc() ? CO_E_OBJNOTCONNECTED : E_NOTIMPL;
}

View File

@@ -1,52 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_a11y_sdnDocAccessible_h_
#define mozilla_a11y_sdnDocAccessible_h_
#include "ISimpleDOM.h"
#include "IUnknownImpl.h"
#include "MsaaDocAccessible.h"
namespace mozilla {
namespace a11y {
class sdnDocAccessible final : public ISimpleDOMDocument {
public:
explicit sdnDocAccessible(MsaaDocAccessible* aMsaa) : mMsaa(aMsaa) {};
~sdnDocAccessible() {};
DECL_IUNKNOWN
// ISimpleDOMDocument
virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_URL(
/* [out] */ BSTR __RPC_FAR* url);
virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_title(
/* [out] */ BSTR __RPC_FAR* title);
virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_mimeType(
/* [out] */ BSTR __RPC_FAR* mimeType);
virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_docType(
/* [out] */ BSTR __RPC_FAR* docType);
virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_nameSpaceURIForID(
/* [in] */ short nameSpaceID,
/* [out] */ BSTR __RPC_FAR* nameSpaceURI);
virtual /* [id] */ HRESULT STDMETHODCALLTYPE put_alternateViewMediaTypes(
/* [in] */ BSTR __RPC_FAR* commaSeparatedMediaTypes);
protected:
RefPtr<MsaaDocAccessible> mMsaa;
};
} // namespace a11y
} // namespace mozilla
#endif

View File

@@ -1,166 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "sdnTextAccessible.h"
#include "ISimpleDOM.h"
#include "nsCoreUtils.h"
#include "DocAccessible.h"
#include "nsIFrame.h"
#include "nsFontMetrics.h"
#include "nsPresContext.h"
#include "nsLayoutUtils.h"
#include "nsRange.h"
#include "gfxTextRun.h"
#include "nsIAccessibleTypes.h"
#include "mozilla/gfx/2D.h"
using namespace mozilla::a11y;
////////////////////////////////////////////////////////////////////////////////
// sdnTextAccessible
////////////////////////////////////////////////////////////////////////////////
IMPL_IUNKNOWN_QUERY_HEAD(sdnTextAccessible)
IMPL_IUNKNOWN_QUERY_IFACE(ISimpleDOMText)
IMPL_IUNKNOWN_QUERY_TAIL_AGGREGATED(mMsaa)
STDMETHODIMP
sdnTextAccessible::get_domText(BSTR __RPC_FAR* aText) {
if (!aText) return E_INVALIDARG;
*aText = nullptr;
AccessibleWrap* acc = mMsaa->LocalAcc();
if (!acc) return CO_E_OBJNOTCONNECTED;
nsAutoString nodeValue;
acc->GetContent()->GetNodeValue(nodeValue);
if (nodeValue.IsEmpty()) return S_FALSE;
*aText = ::SysAllocStringLen(nodeValue.get(), nodeValue.Length());
return *aText ? S_OK : E_OUTOFMEMORY;
}
STDMETHODIMP
sdnTextAccessible::get_clippedSubstringBounds(
unsigned int aStartIndex, unsigned int aEndIndex, int __RPC_FAR* aX,
int __RPC_FAR* aY, int __RPC_FAR* aWidth, int __RPC_FAR* aHeight) {
nscoord x = 0, y = 0, width = 0, height = 0;
HRESULT rv = get_unclippedSubstringBounds(aStartIndex, aEndIndex, &x, &y,
&width, &height);
if (FAILED(rv)) return rv;
DocAccessible* document = mMsaa->LocalAcc()->Document();
NS_ASSERTION(
document,
"There must always be a doc accessible, but there isn't. Crash!");
LayoutDeviceIntRect docRect = document->Bounds();
LayoutDeviceIntRect unclippedRect(x, y, width, height);
LayoutDeviceIntRect clippedRect;
clippedRect.IntersectRect(unclippedRect, docRect);
*aX = clippedRect.X();
*aY = clippedRect.Y();
*aWidth = clippedRect.Width();
*aHeight = clippedRect.Height();
return S_OK;
}
STDMETHODIMP
sdnTextAccessible::get_unclippedSubstringBounds(
unsigned int aStartIndex, unsigned int aEndIndex, int __RPC_FAR* aX,
int __RPC_FAR* aY, int __RPC_FAR* aWidth, int __RPC_FAR* aHeight) {
if (!aX || !aY || !aWidth || !aHeight) return E_INVALIDARG;
*aX = *aY = *aWidth = *aHeight = 0;
AccessibleWrap* acc = mMsaa->LocalAcc();
if (!acc) return CO_E_OBJNOTCONNECTED;
nsIFrame* frame = acc->GetFrame();
NS_ENSURE_TRUE(frame, E_FAIL);
nsPoint startPoint, endPoint;
nsIFrame* startFrame =
GetPointFromOffset(frame, aStartIndex, true, startPoint);
nsIFrame* endFrame = GetPointFromOffset(frame, aEndIndex, false, endPoint);
if (!startFrame || !endFrame) return E_FAIL;
nsRect sum;
nsIFrame* iter = startFrame;
nsIFrame* stopLoopFrame = endFrame->GetNextContinuation();
for (; iter != stopLoopFrame; iter = iter->GetNextContinuation()) {
nsRect rect = iter->GetScreenRectInAppUnits();
nscoord start = (iter == startFrame) ? startPoint.x : 0;
nscoord end = (iter == endFrame) ? endPoint.x : rect.Width();
rect.MoveByX(start);
rect.SetWidth(end - start);
sum.UnionRect(sum, rect);
}
nsPresContext* presContext = acc->Document()->PresContext();
*aX = presContext->AppUnitsToDevPixels(sum.X());
*aY = presContext->AppUnitsToDevPixels(sum.Y());
*aWidth = presContext->AppUnitsToDevPixels(sum.Width());
*aHeight = presContext->AppUnitsToDevPixels(sum.Height());
return S_OK;
}
STDMETHODIMP
sdnTextAccessible::scrollToSubstring(unsigned int aStartIndex,
unsigned int aEndIndex) {
AccessibleWrap* acc = mMsaa->LocalAcc();
if (!acc) return CO_E_OBJNOTCONNECTED;
RefPtr<nsRange> range = nsRange::Create(acc->GetContent());
if (NS_FAILED(range->SetStart(acc->GetContent(), aStartIndex))) return E_FAIL;
if (NS_FAILED(range->SetEnd(acc->GetContent(), aEndIndex))) return E_FAIL;
nsresult rv = nsCoreUtils::ScrollSubstringTo(
acc->GetFrame(), range, nsIAccessibleScrollType::SCROLL_TYPE_ANYWHERE);
return GetHRESULT(rv);
}
STDMETHODIMP
sdnTextAccessible::get_fontFamily(BSTR __RPC_FAR* aFontFamily) {
if (!aFontFamily) return E_INVALIDARG;
*aFontFamily = nullptr;
AccessibleWrap* acc = mMsaa->LocalAcc();
if (!acc) return CO_E_OBJNOTCONNECTED;
nsIFrame* frame = acc->GetFrame();
if (!frame) return E_FAIL;
RefPtr<nsFontMetrics> fm = nsLayoutUtils::GetFontMetricsForFrame(frame, 1.0f);
RefPtr<gfxFont> font = fm->GetThebesFontGroup()->GetFirstValidFont();
const nsCString& name = font->GetName();
if (name.IsEmpty()) return S_FALSE;
NS_ConvertUTF8toUTF16 str(name);
*aFontFamily = ::SysAllocStringLen(str.get(), str.Length());
return *aFontFamily ? S_OK : E_OUTOFMEMORY;
}
nsIFrame* sdnTextAccessible::GetPointFromOffset(nsIFrame* aContainingFrame,
int32_t aOffset,
bool aPreferNext,
nsPoint& aOutPoint) {
nsIFrame* textFrame = nullptr;
int32_t outOffset;
aContainingFrame->GetChildFrameContainingOffset(aOffset, aPreferNext,
&outOffset, &textFrame);
if (textFrame) textFrame->GetPointFromOffset(aOffset, &aOutPoint);
return textFrame;
}

View File

@@ -1,69 +0,0 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_a11y_sdnTextAccessible_h_
#define mozilla_a11y_sdnTextAccessible_h_
#include "ISimpleDOM.h"
#include "IUnknownImpl.h"
#include "MsaaAccessible.h"
class nsIFrame;
struct nsPoint;
namespace mozilla {
namespace a11y {
class sdnTextAccessible final : public ISimpleDOMText {
public:
explicit sdnTextAccessible(MsaaAccessible* aMsaa) : mMsaa(aMsaa) {};
~sdnTextAccessible() {}
DECL_IUNKNOWN
// ISimpleDOMText
virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_domText(
/* [retval][out] */ BSTR __RPC_FAR* aText);
virtual HRESULT STDMETHODCALLTYPE get_clippedSubstringBounds(
/* [in] */ unsigned int startIndex,
/* [in] */ unsigned int endIndex,
/* [out] */ int __RPC_FAR* aX,
/* [out] */ int __RPC_FAR* aY,
/* [out] */ int __RPC_FAR* aWidth,
/* [out] */ int __RPC_FAR* aHeight);
virtual HRESULT STDMETHODCALLTYPE get_unclippedSubstringBounds(
/* [in] */ unsigned int aStartIndex,
/* [in] */ unsigned int aEndIndex,
/* [out] */ int __RPC_FAR* aX,
/* [out] */ int __RPC_FAR* aY,
/* [out] */ int __RPC_FAR* aWidth,
/* [out] */ int __RPC_FAR* aHeight);
virtual HRESULT STDMETHODCALLTYPE scrollToSubstring(
/* [in] */ unsigned int aStartIndex,
/* [in] */ unsigned int aEndIndex);
virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_fontFamily(
/* [retval][out] */ BSTR __RPC_FAR* aFontFamily);
private:
/**
* Return child frame containing offset on success.
*/
nsIFrame* GetPointFromOffset(nsIFrame* aContainingFrame, int32_t aOffset,
bool aPreferNext, nsPoint& aOutPoint);
RefPtr<MsaaAccessible> mMsaa;
};
} // namespace a11y
} // namespace mozilla
#endif