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:
Alexander Surkov 2013-04-30 12:23:48 +09:00
parent b03d980fb0
commit e55603cbe7
10 changed files with 161 additions and 137 deletions

View File

@ -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)
{

View File

@ -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 {

View File

@ -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() { }

View File

@ -11,6 +11,7 @@
#include "HyperTextAccessible.h"
#include "ia2AccessibleEditableText.h"
#include "ia2AccessibleHypertext.h"
#include "IUnknownImpl.h"
namespace mozilla {
template<class T> class StaticAutoPtr;

View 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

View File

@ -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

View File

@ -7,6 +7,7 @@
MODULE = 'accessibility'
EXPORTS += [
'IUnknownImpl.h',
'nsAccessNodeWrap.h',
]

View File

@ -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();
}

View File

@ -9,6 +9,7 @@
#include "ISimpleDOMNode.h"
#include "AccessibleWrap.h"
#include "IUnknownImpl.h"
#include "mozilla/Attributes.h"

View File

@ -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