/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* 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 "TransactionStack.h" #include "nsCycleCollectionParticipant.h" #include "nsDebug.h" #include "nsISupportsUtils.h" #include "nscore.h" #include "TransactionItem.h" namespace mozilla { TransactionStack::TransactionStack(Type aType) : nsRefPtrDeque(), mType(aType) {} TransactionStack::~TransactionStack() { Clear(); } void TransactionStack::Push(TransactionItem* aTransactionItem) { if (NS_WARN_IF(!aTransactionItem)) { return; } nsRefPtrDeque::Push(aTransactionItem); } void TransactionStack::Push( already_AddRefed aTransactionItem) { TransactionItem* transactionItem = aTransactionItem.take(); if (NS_WARN_IF(!transactionItem)) { return; } nsRefPtrDeque::Push(dont_AddRef(transactionItem)); } already_AddRefed TransactionStack::Pop() { return nsRefPtrDeque::Pop(); } already_AddRefed TransactionStack::PopBottom() { return nsRefPtrDeque::PopFront(); } already_AddRefed TransactionStack::Peek() const { RefPtr item = nsRefPtrDeque::Peek(); return item.forget(); } already_AddRefed TransactionStack::GetItemAt( size_t aIndex) const { RefPtr item = nsRefPtrDeque::ObjectAt(aIndex); return item.forget(); } void TransactionStack::Clear() { while (GetSize()) { RefPtr item = mType == FOR_UNDO ? Pop() : PopBottom(); } } void TransactionStack::DoTraverse(nsCycleCollectionTraversalCallback& cb) { size_t size = GetSize(); for (size_t i = 0; i < size; ++i) { auto* item = nsRefPtrDeque::ObjectAt(i); if (item) { NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "transaction stack mDeque[i]"); cb.NoteNativeChild(item, NS_CYCLE_COLLECTION_PARTICIPANT(TransactionItem)); } } } } // namespace mozilla