Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/editor/txmgr/TransactionStack.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* This Source Code Form is subject to the terms of the Mozilla Public
3
 * License, v. 2.0. If a copy of the MPL was not distributed with this
4
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5
6
#include "mozilla/TransactionStack.h"
7
8
#include "nsCOMPtr.h"
9
#include "nsCycleCollectionParticipant.h"
10
#include "nsISupportsUtils.h"
11
#include "nscore.h"
12
#include "TransactionItem.h"
13
14
namespace mozilla {
15
16
class TransactionStackDeallocator final : public nsDequeFunctor
17
{
18
  virtual void operator()(void* aObject) override
19
0
  {
20
0
    RefPtr<TransactionItem> releaseMe =
21
0
      dont_AddRef(static_cast<TransactionItem*>(aObject));
22
0
  }
23
};
24
25
TransactionStack::TransactionStack(Type aType)
26
  : nsDeque(new TransactionStackDeallocator())
27
  , mType(aType)
28
0
{
29
0
}
30
31
TransactionStack::~TransactionStack()
32
0
{
33
0
  Clear();
34
0
}
35
36
void
37
TransactionStack::Push(TransactionItem* aTransactionItem)
38
0
{
39
0
  if (!aTransactionItem) {
40
0
    return;
41
0
  }
42
0
43
0
  RefPtr<TransactionItem> item(aTransactionItem);
44
0
  Push(item.forget());
45
0
}
46
47
void
48
TransactionStack::Push(already_AddRefed<TransactionItem> aTransactionItem)
49
0
{
50
0
  RefPtr<TransactionItem> item(aTransactionItem);
51
0
  if (!item) {
52
0
    return;
53
0
  }
54
0
55
0
  nsDeque::Push(item.forget().take());
56
0
}
57
58
already_AddRefed<TransactionItem>
59
TransactionStack::Pop()
60
0
{
61
0
  RefPtr<TransactionItem> item =
62
0
    dont_AddRef(static_cast<TransactionItem*>(nsDeque::Pop()));
63
0
  return item.forget();
64
0
}
65
66
already_AddRefed<TransactionItem>
67
TransactionStack::PopBottom()
68
0
{
69
0
  RefPtr<TransactionItem> item =
70
0
    dont_AddRef(static_cast<TransactionItem*>(nsDeque::PopFront()));
71
0
  return item.forget();
72
0
}
73
74
already_AddRefed<TransactionItem>
75
TransactionStack::Peek()
76
0
{
77
0
  RefPtr<TransactionItem> item =
78
0
    static_cast<TransactionItem*>(nsDeque::Peek());
79
0
  return item.forget();
80
0
}
81
82
already_AddRefed<TransactionItem>
83
TransactionStack::GetItem(int32_t aIndex)
84
0
{
85
0
  if (aIndex < 0 || aIndex >= static_cast<int32_t>(nsDeque::GetSize())) {
86
0
    return nullptr;
87
0
  }
88
0
  RefPtr<TransactionItem> item =
89
0
    static_cast<TransactionItem*>(nsDeque::ObjectAt(aIndex));
90
0
  return item.forget();
91
0
}
92
93
void
94
TransactionStack::Clear()
95
0
{
96
0
  while (GetSize() != 0) {
97
0
    RefPtr<TransactionItem> item =
98
0
      mType == FOR_UNDO ? Pop() : PopBottom();
99
0
  }
100
0
}
101
102
void
103
TransactionStack::DoTraverse(nsCycleCollectionTraversalCallback &cb)
104
0
{
105
0
  size_t size = GetSize();
106
0
  for (size_t i = 0; i < size; ++i) {
107
0
    TransactionItem* item = static_cast<TransactionItem*>(nsDeque::ObjectAt(i));
108
0
    if (item) {
109
0
      NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(cb, "transaction stack mDeque[i]");
110
0
      cb.NoteNativeChild(item,
111
0
                         NS_CYCLE_COLLECTION_PARTICIPANT(TransactionItem));
112
0
    }
113
0
  }
114
0
}
115
116
} // namespace mozilla