From e55603cbe79a0979cd06ec8afc83416601660f00 Mon Sep 17 00:00:00 2001 From: Alexander Surkov Date: Tue, 30 Apr 2013 12:23:48 +0900 Subject: [PATCH] Bug 865240 - fix IUnknown implementation, r=tbsaunde --HG-- rename : accessible/src/windows/msaa/AccessibleWrap.h => accessible/src/windows/msaa/IUnknownImpl.h --- .../src/windows/msaa/AccessibleWrap.cpp | 24 +-- accessible/src/windows/msaa/AccessibleWrap.h | 107 +------------- accessible/src/windows/msaa/EnumVariant.h | 5 +- .../windows/msaa/HyperTextAccessibleWrap.h | 1 + accessible/src/windows/msaa/IUnknownImpl.h | 137 ++++++++++++++++++ accessible/src/windows/msaa/ServiceProvider.h | 3 +- accessible/src/windows/msaa/moz.build | 1 + accessible/src/windows/sdn/sdnAccessible.cpp | 16 +- accessible/src/windows/sdn/sdnAccessible.h | 1 + .../src/windows/uia/uiaRawElmProvider.h | 3 +- 10 files changed, 161 insertions(+), 137 deletions(-) create mode 100644 accessible/src/windows/msaa/IUnknownImpl.h diff --git a/accessible/src/windows/msaa/AccessibleWrap.cpp b/accessible/src/windows/msaa/AccessibleWrap.cpp index b0722332bea3..6efde55b0b10 100644 --- a/accessible/src/windows/msaa/AccessibleWrap.cpp +++ b/accessible/src/windows/msaa/AccessibleWrap.cpp @@ -96,7 +96,7 @@ AccessibleWrap::QueryInterface(REFIID iid, void** ppv) if (IsDefunct() || (!HasOwnContent() && !IsDoc())) return E_NOINTERFACE; - *ppv = new sdnAccessible(GetNode()); + *ppv = static_cast(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 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) { diff --git a/accessible/src/windows/msaa/AccessibleWrap.h b/accessible/src/windows/msaa/AccessibleWrap.h index 46dcbfb2e33c..619bbce71393 100644 --- a/accessible/src/windows/msaa/AccessibleWrap.h +++ b/accessible/src/windows/msaa/AccessibleWrap.h @@ -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(this); \ - AddRef(); \ - return S_OK; \ - } - -#define IMPL_IUNKNOWN_QUERY_IFACE_AMBIGIOUS(Iface, aResolveIface) \ - if (aIID == IID_##Iface) { \ - *aInstancePtr = static_cast(static_cast(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 { diff --git a/accessible/src/windows/msaa/EnumVariant.h b/accessible/src/windows/msaa/EnumVariant.h index 248c42a1643d..8864a6a1d7b0 100644 --- a/accessible/src/windows/msaa/EnumVariant.h +++ b/accessible/src/windows/msaa/EnumVariant.h @@ -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() { } diff --git a/accessible/src/windows/msaa/HyperTextAccessibleWrap.h b/accessible/src/windows/msaa/HyperTextAccessibleWrap.h index 4f50a2a3315a..e13d98af3ee2 100644 --- a/accessible/src/windows/msaa/HyperTextAccessibleWrap.h +++ b/accessible/src/windows/msaa/HyperTextAccessibleWrap.h @@ -11,6 +11,7 @@ #include "HyperTextAccessible.h" #include "ia2AccessibleEditableText.h" #include "ia2AccessibleHypertext.h" +#include "IUnknownImpl.h" namespace mozilla { template class StaticAutoPtr; diff --git a/accessible/src/windows/msaa/IUnknownImpl.h b/accessible/src/windows/msaa/IUnknownImpl.h new file mode 100644 index 000000000000..af089e8dcb07 --- /dev/null +++ b/accessible/src/windows/msaa/IUnknownImpl.h @@ -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 + +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(this); \ + AddRef(); \ + return S_OK; \ + } + +#define IMPL_IUNKNOWN_QUERY_IFACE_AMBIGIOUS(Iface, aResolveIface) \ + if (aIID == IID_##Iface) { \ + *aInstancePtr = static_cast(static_cast(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 diff --git a/accessible/src/windows/msaa/ServiceProvider.h b/accessible/src/windows/msaa/ServiceProvider.h index 14a4e2f34409..3fb99be180d6 100644 --- a/accessible/src/windows/msaa/ServiceProvider.h +++ b/accessible/src/windows/msaa/ServiceProvider.h @@ -10,6 +10,7 @@ #include #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 diff --git a/accessible/src/windows/msaa/moz.build b/accessible/src/windows/msaa/moz.build index 8cd739529459..ab0c36310852 100644 --- a/accessible/src/windows/msaa/moz.build +++ b/accessible/src/windows/msaa/moz.build @@ -7,6 +7,7 @@ MODULE = 'accessibility' EXPORTS += [ + 'IUnknownImpl.h', 'nsAccessNodeWrap.h', ] diff --git a/accessible/src/windows/sdn/sdnAccessible.cpp b/accessible/src/windows/sdn/sdnAccessible.cpp index 4da1be441dd9..4dd2e230bcc2 100644 --- a/accessible/src/windows/sdn/sdnAccessible.cpp +++ b/accessible/src/windows/sdn/sdnAccessible.cpp @@ -34,7 +34,7 @@ sdnAccessible::QueryInterface(REFIID aREFIID, void** aInstancePtr) *aInstancePtr = nullptr; if (aREFIID == IID_ISimpleDOMNode) { - *aInstancePtr = this; + *aInstancePtr = static_cast(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(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(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(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(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(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(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(new sdnAccessible(resultNode)); (*aNode)->AddRef(); } diff --git a/accessible/src/windows/sdn/sdnAccessible.h b/accessible/src/windows/sdn/sdnAccessible.h index fa12888da923..7f2dbcf5d319 100644 --- a/accessible/src/windows/sdn/sdnAccessible.h +++ b/accessible/src/windows/sdn/sdnAccessible.h @@ -9,6 +9,7 @@ #include "ISimpleDOMNode.h" #include "AccessibleWrap.h" +#include "IUnknownImpl.h" #include "mozilla/Attributes.h" diff --git a/accessible/src/windows/uia/uiaRawElmProvider.h b/accessible/src/windows/uia/uiaRawElmProvider.h index fc282cf7771c..8b3bf484e28e 100644 --- a/accessible/src/windows/uia/uiaRawElmProvider.h +++ b/accessible/src/windows/uia/uiaRawElmProvider.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