mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-05 05:30:29 +00:00
Bug 865240 - fix IUnknown implementation, r=tbsaunde
--HG-- rename : accessible/src/windows/msaa/AccessibleWrap.h => accessible/src/windows/msaa/IUnknownImpl.h
This commit is contained in:
parent
b03d980fb0
commit
e55603cbe7
@ -96,7 +96,7 @@ AccessibleWrap::QueryInterface(REFIID iid, void** ppv)
|
||||
if (IsDefunct() || (!HasOwnContent() && !IsDoc()))
|
||||
return E_NOINTERFACE;
|
||||
|
||||
*ppv = new sdnAccessible(GetNode());
|
||||
*ppv = static_cast<ISimpleDOMNode*>(new sdnAccessible(GetNode()));
|
||||
}
|
||||
|
||||
if (nullptr == *ppv) {
|
||||
@ -564,9 +564,7 @@ public:
|
||||
~AccessibleEnumerator() { }
|
||||
|
||||
// IUnknown
|
||||
STDMETHODIMP QueryInterface(REFIID iid, void ** ppvObject);
|
||||
STDMETHODIMP_(ULONG) AddRef(void);
|
||||
STDMETHODIMP_(ULONG) Release(void);
|
||||
DECL_IUNKNOWN
|
||||
|
||||
// IEnumVARIANT
|
||||
STDMETHODIMP Next(unsigned long celt, VARIANT FAR* rgvar, unsigned long FAR* pceltFetched);
|
||||
@ -581,10 +579,9 @@ public:
|
||||
private:
|
||||
nsCOMPtr<nsIArray> mArray;
|
||||
uint32_t mCurIndex;
|
||||
nsAutoRefCnt mRefCnt;
|
||||
};
|
||||
|
||||
HRESULT
|
||||
STDMETHODIMP
|
||||
AccessibleEnumerator::QueryInterface(REFIID iid, void ** ppvObject)
|
||||
{
|
||||
A11Y_TRYBLOCK_BEGIN
|
||||
@ -606,21 +603,6 @@ AccessibleEnumerator::QueryInterface(REFIID iid, void ** ppvObject)
|
||||
A11Y_TRYBLOCK_END
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG)
|
||||
AccessibleEnumerator::AddRef(void)
|
||||
{
|
||||
return ++mRefCnt;
|
||||
}
|
||||
|
||||
STDMETHODIMP_(ULONG)
|
||||
AccessibleEnumerator::Release(void)
|
||||
{
|
||||
ULONG r = --mRefCnt;
|
||||
if (r == 0)
|
||||
delete this;
|
||||
return r;
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
AccessibleEnumerator::Next(unsigned long celt, VARIANT FAR* rgvar, unsigned long FAR* pceltFetched)
|
||||
{
|
||||
|
@ -1,14 +1,11 @@
|
||||
/* -*- 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/. */
|
||||
|
||||
/* For documentation of the accessibility architecture,
|
||||
* see http://lxr.mozilla.org/seamonkey/source/accessible/accessible-docs.html
|
||||
*/
|
||||
|
||||
#ifndef _AccessibleWrap_H_
|
||||
#define _AccessibleWrap_H_
|
||||
#ifndef mozilla_a11y_AccessibleWrap_h_
|
||||
#define mozilla_a11y_AccessibleWrap_h_
|
||||
|
||||
#include "nsCOMPtr.h"
|
||||
#include "Accessible.h"
|
||||
@ -17,104 +14,6 @@
|
||||
#include "ia2AccessibleHyperlink.h"
|
||||
#include "ia2AccessibleValue.h"
|
||||
|
||||
#define DECL_IUNKNOWN \
|
||||
public: \
|
||||
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void**); \
|
||||
virtual ULONG STDMETHODCALLTYPE AddRef() MOZ_FINAL \
|
||||
{ return ++mRefCnt; } \
|
||||
virtual ULONG STDMETHODCALLTYPE Release() MOZ_FINAL \
|
||||
{ \
|
||||
mRefCnt--; \
|
||||
if (mRefCnt) \
|
||||
return mRefCnt; \
|
||||
\
|
||||
delete this; \
|
||||
return 0; \
|
||||
} \
|
||||
private: \
|
||||
ULONG mRefCnt; \
|
||||
public:
|
||||
|
||||
#define DECL_IUNKNOWN_INHERITED \
|
||||
public: \
|
||||
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void**); \
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
STDMETHODIMP \
|
||||
Class::QueryInterface(REFIID aIID, void** aInstancePtr) \
|
||||
{ \
|
||||
A11Y_TRYBLOCK_BEGIN \
|
||||
if (!aInstancePtr) \
|
||||
return E_INVALIDARG; \
|
||||
*aInstancePtr = nullptr; \
|
||||
\
|
||||
HRESULT hr = E_NOINTERFACE;
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_TAIL \
|
||||
return hr; \
|
||||
A11Y_TRYBLOCK_END \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_IFACE(Iface) \
|
||||
if (aIID == IID_##Iface) { \
|
||||
*aInstancePtr = static_cast<Iface*>(this); \
|
||||
AddRef(); \
|
||||
return S_OK; \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_IFACE_AMBIGIOUS(Iface, aResolveIface) \
|
||||
if (aIID == IID_##Iface) { \
|
||||
*aInstancePtr = static_cast<Iface*>(static_cast<aResolveIface*>(this)); \
|
||||
AddRef(); \
|
||||
return S_OK; \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_CLASS(Class) \
|
||||
hr = Class::QueryInterface(aIID, aInstancePtr); \
|
||||
if (SUCCEEDED(hr)) \
|
||||
return hr;
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_CLASS_COND(Class, Cond) \
|
||||
if (Cond) { \
|
||||
hr = Class::QueryInterface(aIID, aInstancePtr); \
|
||||
if (SUCCEEDED(hr)) \
|
||||
return hr; \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_AGGR_COND(Member, Cond) \
|
||||
if (Cond) { \
|
||||
hr = Member->QueryInterface(aIID, aInstancePtr); \
|
||||
if (SUCCEEDED(hr)) \
|
||||
return hr; \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN1(Class, I1) \
|
||||
IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE(I1); \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE(IUnknown); \
|
||||
IMPL_IUNKNOWN_QUERY_TAIL \
|
||||
|
||||
#define IMPL_IUNKNOWN2(Class, I1, I2) \
|
||||
IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE(I1); \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE(I2); \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE_AMBIGIOUS(IUnknown, I1); \
|
||||
IMPL_IUNKNOWN_QUERY_TAIL \
|
||||
|
||||
#define IMPL_IUNKNOWN_INHERITED1(Class, Super0, Super1) \
|
||||
IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super1); \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super0) \
|
||||
IMPL_IUNKNOWN_QUERY_TAIL \
|
||||
|
||||
#define IMPL_IUNKNOWN_INHERITED2(Class, Super0, Super1, Super2) \
|
||||
IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super1); \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super2); \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super0) \
|
||||
IMPL_IUNKNOWN_QUERY_TAIL
|
||||
|
||||
|
||||
namespace mozilla {
|
||||
namespace a11y {
|
||||
|
||||
|
@ -8,6 +8,7 @@
|
||||
#define mozilla_a11y_EnumVariant_h__
|
||||
|
||||
#include "AccessibleWrap.h"
|
||||
#include "IUnknownImpl.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace a11y {
|
||||
@ -18,7 +19,7 @@ namespace a11y {
|
||||
class ChildrenEnumVariant MOZ_FINAL : public IEnumVARIANT
|
||||
{
|
||||
public:
|
||||
ChildrenEnumVariant(AccessibleWrap* aAnchor) : mRefCnt(0), mAnchorAcc(aAnchor),
|
||||
ChildrenEnumVariant(AccessibleWrap* aAnchor) : mAnchorAcc(aAnchor),
|
||||
mCurAcc(mAnchorAcc->GetChildAt(0)), mCurIndex(0) { }
|
||||
|
||||
// IUnknown
|
||||
@ -43,7 +44,7 @@ private:
|
||||
ChildrenEnumVariant& operator =(const ChildrenEnumVariant&) MOZ_DELETE;
|
||||
|
||||
ChildrenEnumVariant(const ChildrenEnumVariant& aEnumVariant) :
|
||||
mRefCnt(0), mAnchorAcc(aEnumVariant.mAnchorAcc), mCurAcc(aEnumVariant.mCurAcc),
|
||||
mAnchorAcc(aEnumVariant.mAnchorAcc), mCurAcc(aEnumVariant.mCurAcc),
|
||||
mCurIndex(aEnumVariant.mCurIndex) { }
|
||||
virtual ~ChildrenEnumVariant() { }
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "HyperTextAccessible.h"
|
||||
#include "ia2AccessibleEditableText.h"
|
||||
#include "ia2AccessibleHypertext.h"
|
||||
#include "IUnknownImpl.h"
|
||||
|
||||
namespace mozilla {
|
||||
template<class T> class StaticAutoPtr;
|
||||
|
137
accessible/src/windows/msaa/IUnknownImpl.h
Normal file
137
accessible/src/windows/msaa/IUnknownImpl.h
Normal file
@ -0,0 +1,137 @@
|
||||
/* -*- 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_IUnknownImpl_h_
|
||||
#define mozilla_a11y_IUnknownImpl_h_
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
namespace mozilla {
|
||||
namespace a11y {
|
||||
|
||||
class AutoRefCnt
|
||||
{
|
||||
public:
|
||||
AutoRefCnt() : mValue(0) {}
|
||||
|
||||
ULONG operator++() { return ++mValue; }
|
||||
ULONG operator--() { return --mValue; }
|
||||
ULONG operator++(int) { return ++mValue; }
|
||||
ULONG operator--(int) { return --mValue; }
|
||||
|
||||
operator ULONG() const { return mValue; }
|
||||
|
||||
private:
|
||||
ULONG mValue;
|
||||
};
|
||||
|
||||
} // namespace a11y
|
||||
} // namespace mozilla
|
||||
|
||||
#define DECL_IUNKNOWN \
|
||||
public: \
|
||||
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void**); \
|
||||
virtual ULONG STDMETHODCALLTYPE AddRef() MOZ_FINAL \
|
||||
{ \
|
||||
MOZ_ASSERT(int32_t(mRefCnt) >= 0, "illegal refcnt"); \
|
||||
++mRefCnt; \
|
||||
return mRefCnt; \
|
||||
} \
|
||||
virtual ULONG STDMETHODCALLTYPE Release() MOZ_FINAL \
|
||||
{ \
|
||||
MOZ_ASSERT(int32_t(mRefCnt) > 0, "dup release"); \
|
||||
--mRefCnt; \
|
||||
if (mRefCnt) \
|
||||
return mRefCnt; \
|
||||
\
|
||||
delete this; \
|
||||
return 0; \
|
||||
} \
|
||||
private: \
|
||||
mozilla::a11y::AutoRefCnt mRefCnt; \
|
||||
public:
|
||||
|
||||
#define DECL_IUNKNOWN_INHERITED \
|
||||
public: \
|
||||
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, void**); \
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
STDMETHODIMP \
|
||||
Class::QueryInterface(REFIID aIID, void** aInstancePtr) \
|
||||
{ \
|
||||
A11Y_TRYBLOCK_BEGIN \
|
||||
if (!aInstancePtr) \
|
||||
return E_INVALIDARG; \
|
||||
*aInstancePtr = nullptr; \
|
||||
\
|
||||
HRESULT hr = E_NOINTERFACE;
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_TAIL \
|
||||
return hr; \
|
||||
A11Y_TRYBLOCK_END \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_IFACE(Iface) \
|
||||
if (aIID == IID_##Iface) { \
|
||||
*aInstancePtr = static_cast<Iface*>(this); \
|
||||
AddRef(); \
|
||||
return S_OK; \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_IFACE_AMBIGIOUS(Iface, aResolveIface) \
|
||||
if (aIID == IID_##Iface) { \
|
||||
*aInstancePtr = static_cast<Iface*>(static_cast<aResolveIface*>(this)); \
|
||||
AddRef(); \
|
||||
return S_OK; \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_CLASS(Class) \
|
||||
hr = Class::QueryInterface(aIID, aInstancePtr); \
|
||||
if (SUCCEEDED(hr)) \
|
||||
return hr;
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_CLASS_COND(Class, Cond) \
|
||||
if (Cond) { \
|
||||
hr = Class::QueryInterface(aIID, aInstancePtr); \
|
||||
if (SUCCEEDED(hr)) \
|
||||
return hr; \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN_QUERY_AGGR_COND(Member, Cond) \
|
||||
if (Cond) { \
|
||||
hr = Member->QueryInterface(aIID, aInstancePtr); \
|
||||
if (SUCCEEDED(hr)) \
|
||||
return hr; \
|
||||
}
|
||||
|
||||
#define IMPL_IUNKNOWN1(Class, I1) \
|
||||
IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE(I1); \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE(IUnknown); \
|
||||
IMPL_IUNKNOWN_QUERY_TAIL \
|
||||
|
||||
#define IMPL_IUNKNOWN2(Class, I1, I2) \
|
||||
IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE(I1); \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE(I2); \
|
||||
IMPL_IUNKNOWN_QUERY_IFACE_AMBIGIOUS(IUnknown, I1); \
|
||||
IMPL_IUNKNOWN_QUERY_TAIL \
|
||||
|
||||
#define IMPL_IUNKNOWN_INHERITED1(Class, Super0, Super1) \
|
||||
IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super1); \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super0) \
|
||||
IMPL_IUNKNOWN_QUERY_TAIL \
|
||||
|
||||
#define IMPL_IUNKNOWN_INHERITED2(Class, Super0, Super1, Super2) \
|
||||
IMPL_IUNKNOWN_QUERY_HEAD(Class) \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super1); \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super2); \
|
||||
IMPL_IUNKNOWN_QUERY_CLASS(Super0) \
|
||||
IMPL_IUNKNOWN_QUERY_TAIL
|
||||
|
||||
#endif
|
@ -10,6 +10,7 @@
|
||||
#include <servprov.h>
|
||||
|
||||
#include "AccessibleWrap.h"
|
||||
#include "IUnknownImpl.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace a11y {
|
||||
@ -17,7 +18,7 @@ namespace a11y {
|
||||
class ServiceProvider MOZ_FINAL : public IServiceProvider
|
||||
{
|
||||
public:
|
||||
ServiceProvider(AccessibleWrap* aAcc) : mRefCnt(0), mAccessible(aAcc) {}
|
||||
ServiceProvider(AccessibleWrap* aAcc) : mAccessible(aAcc) {}
|
||||
~ServiceProvider() {}
|
||||
|
||||
DECL_IUNKNOWN
|
||||
|
@ -7,6 +7,7 @@
|
||||
MODULE = 'accessibility'
|
||||
|
||||
EXPORTS += [
|
||||
'IUnknownImpl.h',
|
||||
'nsAccessNodeWrap.h',
|
||||
]
|
||||
|
||||
|
@ -34,7 +34,7 @@ sdnAccessible::QueryInterface(REFIID aREFIID, void** aInstancePtr)
|
||||
*aInstancePtr = nullptr;
|
||||
|
||||
if (aREFIID == IID_ISimpleDOMNode) {
|
||||
*aInstancePtr = this;
|
||||
*aInstancePtr = static_cast<ISimpleDOMNode*>(this);
|
||||
AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
@ -46,7 +46,7 @@ sdnAccessible::QueryInterface(REFIID aREFIID, void** aInstancePtr)
|
||||
// IUnknown* is the canonical one if and only if this accessible doesn't have
|
||||
// an accessible.
|
||||
if (aREFIID == IID_IUnknown) {
|
||||
*aInstancePtr = this;
|
||||
*aInstancePtr = static_cast<ISimpleDOMNode*>(this);
|
||||
AddRef();
|
||||
return S_OK;
|
||||
}
|
||||
@ -328,7 +328,7 @@ sdnAccessible::get_parentNode(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
|
||||
|
||||
nsINode* resultNode = mNode->GetParentNode();
|
||||
if (resultNode) {
|
||||
*aNode = new sdnAccessible(resultNode);
|
||||
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
|
||||
(*aNode)->AddRef();
|
||||
}
|
||||
|
||||
@ -351,7 +351,7 @@ sdnAccessible::get_firstChild(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
|
||||
|
||||
nsINode* resultNode = mNode->GetFirstChild();
|
||||
if (resultNode) {
|
||||
*aNode = new sdnAccessible(resultNode);
|
||||
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
|
||||
(*aNode)->AddRef();
|
||||
}
|
||||
|
||||
@ -374,7 +374,7 @@ sdnAccessible::get_lastChild(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
|
||||
|
||||
nsINode* resultNode = mNode->GetLastChild();
|
||||
if (resultNode) {
|
||||
*aNode = new sdnAccessible(resultNode);
|
||||
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
|
||||
(*aNode)->AddRef();
|
||||
}
|
||||
|
||||
@ -397,7 +397,7 @@ sdnAccessible::get_previousSibling(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
|
||||
|
||||
nsINode* resultNode = mNode->GetPreviousSibling();
|
||||
if (resultNode) {
|
||||
*aNode = new sdnAccessible(resultNode);
|
||||
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
|
||||
(*aNode)->AddRef();
|
||||
}
|
||||
|
||||
@ -420,7 +420,7 @@ sdnAccessible::get_nextSibling(ISimpleDOMNode __RPC_FAR *__RPC_FAR* aNode)
|
||||
|
||||
nsINode* resultNode = mNode->GetNextSibling();
|
||||
if (resultNode) {
|
||||
*aNode = new sdnAccessible(resultNode);
|
||||
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
|
||||
(*aNode)->AddRef();
|
||||
}
|
||||
|
||||
@ -444,7 +444,7 @@ sdnAccessible::get_childAt(unsigned aChildIndex,
|
||||
|
||||
nsINode* resultNode = mNode->GetChildAt(aChildIndex);
|
||||
if (resultNode) {
|
||||
*aNode = new sdnAccessible(resultNode);
|
||||
*aNode = static_cast<ISimpleDOMNode*>(new sdnAccessible(resultNode));
|
||||
(*aNode)->AddRef();
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "ISimpleDOMNode.h"
|
||||
#include "AccessibleWrap.h"
|
||||
#include "IUnknownImpl.h"
|
||||
|
||||
#include "mozilla/Attributes.h"
|
||||
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "objbase.h"
|
||||
#include "AccessibleWrap.h"
|
||||
#include "IUnknownImpl.h"
|
||||
#include "uiautomation.h"
|
||||
|
||||
namespace mozilla {
|
||||
@ -23,7 +24,7 @@ class uiaRawElmProvider MOZ_FINAL : public IAccessibleEx,
|
||||
public IRawElementProviderSimple
|
||||
{
|
||||
public:
|
||||
uiaRawElmProvider(AccessibleWrap* aAcc) : mRefCnt(0), mAcc(aAcc) { }
|
||||
uiaRawElmProvider(AccessibleWrap* aAcc) : mAcc(aAcc) { }
|
||||
|
||||
// IUnknown
|
||||
DECL_IUNKNOWN
|
||||
|
Loading…
x
Reference in New Issue
Block a user