Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "EnumVariant.h"
9 using namespace mozilla;
10 using namespace mozilla::a11y;
12 ////////////////////////////////////////////////////////////////////////////////
13 // ChildrenEnumVariant
14 ////////////////////////////////////////////////////////////////////////////////
16 IMPL_IUNKNOWN_QUERY_HEAD(ChildrenEnumVariant)
17 IMPL_IUNKNOWN_QUERY_IFACE(IEnumVARIANT);
18 IMPL_IUNKNOWN_QUERY_IFACE(IUnknown);
19 IMPL_IUNKNOWN_QUERY_AGGR_COND(mAnchorAcc, !mAnchorAcc->IsDefunct());
20 IMPL_IUNKNOWN_QUERY_TAIL
22 STDMETHODIMP
23 ChildrenEnumVariant::Next(ULONG aCount, VARIANT FAR* aItems,
24 ULONG FAR* aCountFetched)
25 {
26 A11Y_TRYBLOCK_BEGIN
28 if (!aItems || !aCountFetched)
29 return E_INVALIDARG;
31 *aCountFetched = 0;
33 if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc)
34 return CO_E_OBJNOTCONNECTED;
36 ULONG countFetched = 0;
37 for (; mCurAcc && countFetched < aCount; countFetched++) {
38 VariantInit(aItems + countFetched);
39 aItems[countFetched].pdispVal = AccessibleWrap::NativeAccessible(mCurAcc);
40 aItems[countFetched].vt = VT_DISPATCH;
42 mCurIndex++;
43 mCurAcc = mAnchorAcc->GetChildAt(mCurIndex);
44 }
46 (*aCountFetched) = countFetched;
48 return countFetched < aCount ? S_FALSE : S_OK;
50 A11Y_TRYBLOCK_END
51 }
53 STDMETHODIMP
54 ChildrenEnumVariant::Skip(ULONG aCount)
55 {
56 A11Y_TRYBLOCK_BEGIN
58 if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc)
59 return CO_E_OBJNOTCONNECTED;
61 mCurIndex += aCount;
62 mCurAcc = mAnchorAcc->GetChildAt(mCurIndex);
64 return mCurAcc ? S_OK : S_FALSE;
66 A11Y_TRYBLOCK_END
67 }
69 STDMETHODIMP
70 ChildrenEnumVariant::Reset()
71 {
72 A11Y_TRYBLOCK_BEGIN
74 if (mAnchorAcc->IsDefunct())
75 return CO_E_OBJNOTCONNECTED;
77 mCurIndex = 0;
78 mCurAcc = mAnchorAcc->GetChildAt(0);
80 return S_OK;
82 A11Y_TRYBLOCK_END
83 }
85 STDMETHODIMP
86 ChildrenEnumVariant::Clone(IEnumVARIANT** aEnumVariant)
87 {
88 A11Y_TRYBLOCK_BEGIN
90 if (!aEnumVariant)
91 return E_INVALIDARG;
93 *aEnumVariant = new ChildrenEnumVariant(*this);
94 (*aEnumVariant)->AddRef();
96 return S_OK;
98 A11Y_TRYBLOCK_END
99 }