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 "nsIInputStream.h"
12 #include "nsIRequest.h"
13 #include "nsISupportsImpl.h"
14 #include "nsNetUtil.h"
16 #include "mozilla/Unused.h"
17 #include "mozilla/dom/ContentChild.h"
18 #include "mozilla/net/NeckoChild.h"
19 #include "mozilla/net/PSimpleChannelChild.h"
24 SimpleChannel::SimpleChannel(UniquePtr
<SimpleChannelCallbacks
>&& aCallbacks
)
25 : mCallbacks(std::move(aCallbacks
)) {
26 EnableSynthesizedProgressEvents(true);
29 nsresult
SimpleChannel::OpenContentStream(bool async
,
30 nsIInputStream
** streamOut
,
31 nsIChannel
** channel
) {
32 NS_ENSURE_TRUE(mCallbacks
, NS_ERROR_UNEXPECTED
);
34 nsCOMPtr
<nsIInputStream
> stream
;
35 MOZ_TRY_VAR(stream
, mCallbacks
->OpenContentStream(async
, this));
41 stream
.forget(streamOut
);
45 nsresult
SimpleChannel::BeginAsyncRead(nsIStreamListener
* listener
,
47 nsICancelable
** cancelableRequest
) {
48 NS_ENSURE_TRUE(mCallbacks
, NS_ERROR_UNEXPECTED
);
50 RequestOrReason res
= mCallbacks
->StartAsyncRead(listener
, this);
53 return res
.propagateErr();
58 RequestOrCancelable value
= res
.unwrap();
60 if (value
.is
<NotNullRequest
>()) {
61 nsCOMPtr
<nsIRequest
> req
= value
.as
<NotNullRequest
>().get();
63 } else if (value
.is
<NotNullCancelable
>()) {
64 nsCOMPtr
<nsICancelable
> cancelable
= value
.as
<NotNullCancelable
>().get();
65 cancelable
.forget(cancelableRequest
);
67 MOZ_ASSERT_UNREACHABLE(
68 "StartAsyncRead didn't return a NotNull nsIRequest or nsICancelable.");
69 return NS_ERROR_UNEXPECTED
;
75 NS_IMPL_ISUPPORTS_INHERITED(SimpleChannelChild
, SimpleChannel
, nsIChildChannel
)
77 SimpleChannelChild::SimpleChannelChild(
78 UniquePtr
<SimpleChannelCallbacks
>&& aCallbacks
)
79 : SimpleChannel(std::move(aCallbacks
)) {}
82 SimpleChannelChild::ConnectParent(uint32_t aId
) {
83 MOZ_ASSERT(NS_IsMainThread());
84 mozilla::dom::ContentChild
* cc
=
85 static_cast<mozilla::dom::ContentChild
*>(gNeckoChild
->Manager());
86 if (cc
->IsShuttingDown()) {
87 return NS_ERROR_FAILURE
;
90 // Reference freed in DeallocPSimpleChannelChild.
91 if (!gNeckoChild
->SendPSimpleChannelConstructor(do_AddRef(this).take(),
93 return NS_ERROR_FAILURE
;
100 SimpleChannelChild::CompleteRedirectSetup(nsIStreamListener
* aListener
) {
102 MOZ_ASSERT(NS_IsMainThread());
106 rv
= AsyncOpen(aListener
);
107 if (NS_WARN_IF(NS_FAILED(rv
))) {
112 Unused
<< Send__delete__(this);
117 already_AddRefed
<nsIChannel
> NS_NewSimpleChannelInternal(
118 nsIURI
* aURI
, nsILoadInfo
* aLoadInfo
,
119 UniquePtr
<SimpleChannelCallbacks
>&& aCallbacks
) {
120 RefPtr
<SimpleChannel
> chan
;
121 if (IsNeckoChild()) {
122 chan
= new SimpleChannelChild(std::move(aCallbacks
));
124 chan
= new SimpleChannel(std::move(aCallbacks
));
129 MOZ_ALWAYS_SUCCEEDS(chan
->SetLoadInfo(aLoadInfo
));
131 return chan
.forget();
135 } // namespace mozilla