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/. */
6 #include "SimpleChannel.h"
8 #include "nsBaseChannel.h"
9 #include "nsIChannel.h"
10 #include "nsIChildChannel.h"
11 #include "nsICancelable.h"
12 #include "nsIInputStream.h"
13 #include "nsIRequest.h"
14 #include "nsISupportsImpl.h"
15 #include "nsNetUtil.h"
17 #include "mozilla/Unused.h"
18 #include "mozilla/dom/ContentChild.h"
19 #include "mozilla/net/NeckoChild.h"
20 #include "mozilla/net/PSimpleChannelChild.h"
25 SimpleChannel::SimpleChannel(UniquePtr
<SimpleChannelCallbacks
>&& aCallbacks
)
26 : mCallbacks(std::move(aCallbacks
)) {
27 EnableSynthesizedProgressEvents(true);
30 nsresult
SimpleChannel::OpenContentStream(bool async
,
31 nsIInputStream
** streamOut
,
32 nsIChannel
** channel
) {
33 NS_ENSURE_TRUE(mCallbacks
, NS_ERROR_UNEXPECTED
);
35 nsCOMPtr
<nsIInputStream
> stream
;
36 MOZ_TRY_VAR(stream
, mCallbacks
->OpenContentStream(async
, this));
42 stream
.forget(streamOut
);
46 nsresult
SimpleChannel::BeginAsyncRead(nsIStreamListener
* listener
,
48 nsICancelable
** cancelableRequest
) {
49 NS_ENSURE_TRUE(mCallbacks
, NS_ERROR_UNEXPECTED
);
51 RequestOrReason res
= mCallbacks
->StartAsyncRead(listener
, this);
54 return res
.propagateErr();
59 RequestOrCancelable value
= res
.unwrap();
61 if (value
.is
<NotNullRequest
>()) {
62 nsCOMPtr
<nsIRequest
> req
= value
.as
<NotNullRequest
>().get();
64 } else if (value
.is
<NotNullCancelable
>()) {
65 nsCOMPtr
<nsICancelable
> cancelable
= value
.as
<NotNullCancelable
>().get();
66 cancelable
.forget(cancelableRequest
);
68 MOZ_ASSERT_UNREACHABLE(
69 "StartAsyncRead didn't return a NotNull nsIRequest or nsICancelable.");
70 return NS_ERROR_UNEXPECTED
;
76 NS_IMPL_ISUPPORTS_INHERITED(SimpleChannelChild
, SimpleChannel
, nsIChildChannel
)
78 SimpleChannelChild::SimpleChannelChild(
79 UniquePtr
<SimpleChannelCallbacks
>&& aCallbacks
)
80 : SimpleChannel(std::move(aCallbacks
)) {}
83 SimpleChannelChild::ConnectParent(uint32_t aId
) {
84 MOZ_ASSERT(NS_IsMainThread());
85 mozilla::dom::ContentChild
* cc
=
86 static_cast<mozilla::dom::ContentChild
*>(gNeckoChild
->Manager());
87 if (cc
->IsShuttingDown()) {
88 return NS_ERROR_FAILURE
;
91 // Reference freed in DeallocPSimpleChannelChild.
92 if (!gNeckoChild
->SendPSimpleChannelConstructor(do_AddRef(this).take(),
94 return NS_ERROR_FAILURE
;
101 SimpleChannelChild::CompleteRedirectSetup(nsIStreamListener
* aListener
) {
103 MOZ_ASSERT(NS_IsMainThread());
107 rv
= AsyncOpen(aListener
);
108 if (NS_WARN_IF(NS_FAILED(rv
))) {
113 Unused
<< Send__delete__(this);
118 already_AddRefed
<nsIChannel
> NS_NewSimpleChannelInternal(
119 nsIURI
* aURI
, nsILoadInfo
* aLoadInfo
,
120 UniquePtr
<SimpleChannelCallbacks
>&& aCallbacks
) {
121 RefPtr
<SimpleChannel
> chan
;
122 if (IsNeckoChild()) {
123 chan
= new SimpleChannelChild(std::move(aCallbacks
));
125 chan
= new SimpleChannel(std::move(aCallbacks
));
130 MOZ_ALWAYS_SUCCEEDS(chan
->SetLoadInfo(aLoadInfo
));
132 return chan
.forget();
136 } // namespace mozilla