Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/cache/StreamList.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=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
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#include "mozilla/dom/cache/StreamList.h"
8
9
#include "mozilla/dom/cache/CacheStreamControlParent.h"
10
#include "mozilla/dom/cache/Context.h"
11
#include "mozilla/dom/cache/Manager.h"
12
#include "nsIInputStream.h"
13
14
namespace mozilla {
15
namespace dom {
16
namespace cache {
17
18
StreamList::StreamList(Manager* aManager, Context* aContext)
19
  : mManager(aManager)
20
  , mContext(aContext)
21
  , mCacheId(INVALID_CACHE_ID)
22
  , mStreamControl(nullptr)
23
  , mActivated(false)
24
0
{
25
0
  MOZ_DIAGNOSTIC_ASSERT(mManager);
26
0
  mContext->AddActivity(this);
27
0
}
28
29
Manager*
30
StreamList::GetManager() const
31
0
{
32
0
  MOZ_DIAGNOSTIC_ASSERT(mManager);
33
0
  return mManager;
34
0
}
35
36
bool
37
StreamList::ShouldOpenStreamFor(const nsID& aId) const
38
0
{
39
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
40
0
41
0
  for (auto entry : mList) {
42
0
    if (entry.mId == aId) {
43
0
      return true;
44
0
    }
45
0
  }
46
0
47
0
  return false;
48
0
}
49
50
void
51
StreamList::SetStreamControl(CacheStreamControlParent* aStreamControl)
52
0
{
53
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
54
0
  MOZ_DIAGNOSTIC_ASSERT(aStreamControl);
55
0
56
0
  // For cases where multiple streams are serialized for a single list
57
0
  // then the control will get passed multiple times.  This is ok, but
58
0
  // it should be the same control each time.
59
0
  if (mStreamControl) {
60
0
    MOZ_DIAGNOSTIC_ASSERT(aStreamControl == mStreamControl);
61
0
    return;
62
0
  }
63
0
64
0
  mStreamControl = aStreamControl;
65
0
  mStreamControl->SetStreamList(this);
66
0
}
67
68
void
69
StreamList::RemoveStreamControl(CacheStreamControlParent* aStreamControl)
70
0
{
71
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
72
0
  MOZ_DIAGNOSTIC_ASSERT(mStreamControl);
73
0
  MOZ_DIAGNOSTIC_ASSERT(mStreamControl == aStreamControl);
74
0
  mStreamControl = nullptr;
75
0
}
76
77
void
78
StreamList::Activate(CacheId aCacheId)
79
0
{
80
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
81
0
  MOZ_DIAGNOSTIC_ASSERT(!mActivated);
82
0
  MOZ_DIAGNOSTIC_ASSERT(mCacheId == INVALID_CACHE_ID);
83
0
  mActivated = true;
84
0
  mCacheId = aCacheId;
85
0
  mManager->AddRefCacheId(mCacheId);
86
0
  mManager->AddStreamList(this);
87
0
88
0
  for (uint32_t i = 0; i < mList.Length(); ++i) {
89
0
    mManager->AddRefBodyId(mList[i].mId);
90
0
  }
91
0
}
92
93
void
94
StreamList::Add(const nsID& aId, nsCOMPtr<nsIInputStream>&& aStream)
95
0
{
96
0
  // All streams should be added on IO thread before we set the stream
97
0
  // control on the owning IPC thread.
98
0
  MOZ_DIAGNOSTIC_ASSERT(!mStreamControl);
99
0
  mList.AppendElement(Entry(aId, std::move(aStream)));
100
0
}
101
102
already_AddRefed<nsIInputStream>
103
StreamList::Extract(const nsID& aId)
104
0
{
105
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
106
0
  for (uint32_t i = 0; i < mList.Length(); ++i) {
107
0
    if (mList[i].mId == aId) {
108
0
      return mList[i].mStream.forget();
109
0
    }
110
0
  }
111
0
  return nullptr;
112
0
}
113
114
void
115
StreamList::NoteClosed(const nsID& aId)
116
0
{
117
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
118
0
  for (uint32_t i = 0; i < mList.Length(); ++i) {
119
0
    if (mList[i].mId == aId) {
120
0
      mList.RemoveElementAt(i);
121
0
      mManager->ReleaseBodyId(aId);
122
0
      break;
123
0
    }
124
0
  }
125
0
126
0
  if (mList.IsEmpty() && mStreamControl) {
127
0
    mStreamControl->Shutdown();
128
0
  }
129
0
}
130
131
void
132
StreamList::NoteClosedAll()
133
0
{
134
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
135
0
  for (uint32_t i = 0; i < mList.Length(); ++i) {
136
0
    mManager->ReleaseBodyId(mList[i].mId);
137
0
  }
138
0
  mList.Clear();
139
0
140
0
  if (mStreamControl) {
141
0
    mStreamControl->Shutdown();
142
0
  }
143
0
}
144
145
void
146
StreamList::Close(const nsID& aId)
147
0
{
148
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
149
0
  if (mStreamControl) {
150
0
    mStreamControl->Close(aId);
151
0
  }
152
0
}
153
154
void
155
StreamList::CloseAll()
156
0
{
157
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
158
0
  if (mStreamControl) {
159
0
    mStreamControl->CloseAll();
160
0
  }
161
0
}
162
163
void
164
StreamList::Cancel()
165
0
{
166
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
167
0
  CloseAll();
168
0
}
169
170
bool
171
StreamList::MatchesCacheId(CacheId aCacheId) const
172
0
{
173
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
174
0
  return aCacheId == mCacheId;
175
0
}
176
177
StreamList::~StreamList()
178
0
{
179
0
  NS_ASSERT_OWNINGTHREAD(StreamList);
180
0
  MOZ_DIAGNOSTIC_ASSERT(!mStreamControl);
181
0
  if (mActivated) {
182
0
    mManager->RemoveStreamList(this);
183
0
    for (uint32_t i = 0; i < mList.Length(); ++i) {
184
0
      mManager->ReleaseBodyId(mList[i].mId);
185
0
    }
186
0
    mManager->ReleaseCacheId(mCacheId);
187
0
  }
188
0
  mContext->RemoveActivity(this);
189
0
}
190
191
} // namespace cache
192
} // namespace dom
193
} // namespace mozilla