diff options
Diffstat (limited to 'dom/svg/nsISVGPoint.cpp')
-rw-r--r-- | dom/svg/nsISVGPoint.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/dom/svg/nsISVGPoint.cpp b/dom/svg/nsISVGPoint.cpp new file mode 100644 index 000000000..1c1971004 --- /dev/null +++ b/dom/svg/nsISVGPoint.cpp @@ -0,0 +1,88 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=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 "nsISVGPoint.h" +#include "DOMSVGPointList.h" +#include "SVGPoint.h" +#include "nsSVGElement.h" +#include "nsError.h" +#include "mozilla/dom/SVGPointBinding.h" + +// See the architecture comment in DOMSVGPointList.h. + +using namespace mozilla; + +// We could use NS_IMPL_CYCLE_COLLECTION(, except that in Unlink() we need to +// clear our list's weak ref to us to be safe. (The other option would be to +// not unlink and rely on the breaking of the other edges in the cycle, as +// NS_SVG_VAL_IMPL_CYCLE_COLLECTION does.) +NS_IMPL_CYCLE_COLLECTION_CLASS(nsISVGPoint) + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsISVGPoint) + // We may not belong to a list, so we must null check tmp->mList. + if (tmp->mList) { + tmp->mList->mItems[tmp->mListIndex] = nullptr; + } +NS_IMPL_CYCLE_COLLECTION_UNLINK(mList) +NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsISVGPoint) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mList) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsISVGPoint) +NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER +NS_IMPL_CYCLE_COLLECTION_TRACE_END + +NS_IMPL_CYCLE_COLLECTING_ADDREF(nsISVGPoint) +NS_IMPL_CYCLE_COLLECTING_RELEASE(nsISVGPoint) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsISVGPoint) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISVGPoint) + NS_INTERFACE_MAP_ENTRY(nsISupports) +NS_INTERFACE_MAP_END + +void +nsISVGPoint::InsertingIntoList(DOMSVGPointList *aList, + uint32_t aListIndex, + bool aIsAnimValItem) +{ + MOZ_ASSERT(!HasOwner(), "Inserting item that already has an owner"); + + mList = aList; + mListIndex = aListIndex; + mIsReadonly = false; + mIsAnimValItem = aIsAnimValItem; + + MOZ_ASSERT(IndexIsValid(), "Bad index for DOMSVGPoint!"); +} + +void +nsISVGPoint::RemovingFromList() +{ + mPt = InternalItem(); + mList = nullptr; + MOZ_ASSERT(!mIsReadonly, "mIsReadonly set for list"); + mIsAnimValItem = false; +} + +SVGPoint& +nsISVGPoint::InternalItem() +{ + return mList->InternalList().mItems[mListIndex]; +} + +#ifdef DEBUG +bool +nsISVGPoint::IndexIsValid() +{ + return mListIndex < mList->InternalList().Length(); +} +#endif + |