Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/cache/CacheStreamControlParent.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/CacheStreamControlParent.h"
8
9
#include "mozilla/UniquePtr.h"
10
#include "mozilla/Unused.h"
11
#include "mozilla/dom/cache/CacheTypes.h"
12
#include "mozilla/dom/cache/ReadStream.h"
13
#include "mozilla/dom/cache/StreamList.h"
14
#include "mozilla/ipc/FileDescriptorSetParent.h"
15
#include "mozilla/ipc/IPCStreamUtils.h"
16
#include "mozilla/ipc/PBackgroundParent.h"
17
#include "mozilla/ipc/PFileDescriptorSetParent.h"
18
#include "nsISupportsImpl.h"
19
#include "nsTArray.h"
20
21
namespace mozilla {
22
namespace dom {
23
namespace cache {
24
25
using mozilla::dom::OptionalFileDescriptorSet;
26
using mozilla::ipc::AutoIPCStream;
27
using mozilla::ipc::FileDescriptor;
28
using mozilla::ipc::FileDescriptorSetParent;
29
using mozilla::ipc::PFileDescriptorSetParent;
30
31
// declared in ActorUtils.h
32
void
33
DeallocPCacheStreamControlParent(PCacheStreamControlParent* aActor)
34
0
{
35
0
  delete aActor;
36
0
}
37
38
CacheStreamControlParent::CacheStreamControlParent()
39
0
{
40
0
  MOZ_COUNT_CTOR(cache::CacheStreamControlParent);
41
0
}
42
43
CacheStreamControlParent::~CacheStreamControlParent()
44
0
{
45
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
46
0
  MOZ_DIAGNOSTIC_ASSERT(!mStreamList);
47
0
  MOZ_COUNT_DTOR(cache::CacheStreamControlParent);
48
0
}
49
50
void
51
CacheStreamControlParent::SerializeControl(CacheReadStream* aReadStreamOut)
52
0
{
53
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
54
0
  MOZ_DIAGNOSTIC_ASSERT(aReadStreamOut);
55
0
  aReadStreamOut->controlChild() = nullptr;
56
0
  aReadStreamOut->controlParent() = this;
57
0
}
58
59
void
60
CacheStreamControlParent::SerializeStream(CacheReadStream* aReadStreamOut,
61
                                          nsIInputStream* aStream,
62
                                          nsTArray<UniquePtr<AutoIPCStream>>& aStreamCleanupList)
63
0
{
64
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
65
0
  MOZ_DIAGNOSTIC_ASSERT(aReadStreamOut);
66
0
67
0
  UniquePtr<AutoIPCStream> autoStream(new AutoIPCStream(aReadStreamOut->stream()));
68
0
  DebugOnly<bool> ok = autoStream->Serialize(aStream, Manager());
69
0
  MOZ_ASSERT(ok);
70
0
71
0
  aStreamCleanupList.AppendElement(std::move(autoStream));
72
0
}
73
74
void
75
CacheStreamControlParent::OpenStream(const nsID& aId,
76
                                     InputStreamResolver&& aResolver)
77
0
{
78
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
79
0
  MOZ_DIAGNOSTIC_ASSERT(aResolver);
80
0
81
0
  if (!mStreamList || !mStreamList->ShouldOpenStreamFor(aId)) {
82
0
    aResolver(nullptr);
83
0
    return;
84
0
  }
85
0
86
0
  // Make sure to add ourself as a Listener even thought we are using
87
0
  // a separate resolver function to signal the completion of the
88
0
  // operation.  The Manager uses the existence of the Listener to ensure
89
0
  // that its safe to complete the operation.
90
0
  mStreamList->GetManager()->ExecuteOpenStream(this, std::move(aResolver), aId);
91
0
}
92
93
void
94
CacheStreamControlParent::NoteClosedAfterForget(const nsID& aId)
95
0
{
96
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
97
0
  RecvNoteClosed(aId);
98
0
}
99
100
#ifdef DEBUG
101
void
102
CacheStreamControlParent::AssertOwningThread()
103
{
104
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
105
}
106
#endif
107
108
void
109
CacheStreamControlParent::ActorDestroy(ActorDestroyReason aReason)
110
0
{
111
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
112
0
  CloseAllReadStreamsWithoutReporting();
113
0
  // If the initial SendPStreamControlConstructor() fails we will
114
0
  // be called before mStreamList is set.
115
0
  if (!mStreamList) {
116
0
    return;
117
0
  }
118
0
  mStreamList->GetManager()->RemoveListener(this);
119
0
  mStreamList->RemoveStreamControl(this);
120
0
  mStreamList->NoteClosedAll();
121
0
  mStreamList = nullptr;
122
0
}
123
124
mozilla::ipc::IPCResult
125
CacheStreamControlParent::RecvOpenStream(const nsID& aStreamId,
126
                                         OpenStreamResolver&& aResolver)
127
0
{
128
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
129
0
130
0
  OpenStream(aStreamId, [aResolver](nsCOMPtr<nsIInputStream>&& aStream) {
131
0
      aResolver(aStream);
132
0
    });
133
0
134
0
  return IPC_OK();
135
0
}
136
137
mozilla::ipc::IPCResult
138
CacheStreamControlParent::RecvNoteClosed(const nsID& aId)
139
0
{
140
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
141
0
  MOZ_DIAGNOSTIC_ASSERT(mStreamList);
142
0
  mStreamList->NoteClosed(aId);
143
0
  return IPC_OK();
144
0
}
145
146
void
147
CacheStreamControlParent::SetStreamList(StreamList* aStreamList)
148
0
{
149
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
150
0
  MOZ_DIAGNOSTIC_ASSERT(!mStreamList);
151
0
  mStreamList = aStreamList;
152
0
}
153
154
void
155
CacheStreamControlParent::Close(const nsID& aId)
156
0
{
157
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
158
0
  NotifyClose(aId);
159
0
  Unused << SendClose(aId);
160
0
}
161
162
void
163
CacheStreamControlParent::CloseAll()
164
0
{
165
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
166
0
  NotifyCloseAll();
167
0
  Unused << SendCloseAll();
168
0
}
169
170
void
171
CacheStreamControlParent::Shutdown()
172
0
{
173
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
174
0
  if (!Send__delete__(this)) {
175
0
    // child process is gone, allow actor to be destroyed normally
176
0
    NS_WARNING("Cache failed to delete stream actor.");
177
0
    return;
178
0
  }
179
0
}
180
181
void
182
CacheStreamControlParent::NotifyClose(const nsID& aId)
183
0
{
184
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
185
0
  CloseReadStreams(aId);
186
0
}
187
188
void
189
CacheStreamControlParent::NotifyCloseAll()
190
0
{
191
0
  NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
192
0
  CloseAllReadStreams();
193
0
}
194
195
} // namespace cache
196
} // namespace dom
197
} // namespace mozilla