Backed out changeset 36e95068e103 (bug 1848160) for bc failures on browser_preference...
[gecko.git] / netwerk / base / SimpleChannel.cpp
blob07d54c5f4ec2fa0463af844c780e7625bf4904a3
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"
22 namespace mozilla {
23 namespace net {
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));
37 MOZ_ASSERT(stream);
39 mCallbacks = nullptr;
41 *channel = nullptr;
42 stream.forget(streamOut);
43 return NS_OK;
46 nsresult SimpleChannel::BeginAsyncRead(nsIStreamListener* listener,
47 nsIRequest** request,
48 nsICancelable** cancelableRequest) {
49 NS_ENSURE_TRUE(mCallbacks, NS_ERROR_UNEXPECTED);
51 RequestOrReason res = mCallbacks->StartAsyncRead(listener, this);
53 if (res.isErr()) {
54 return res.propagateErr();
57 mCallbacks = nullptr;
59 RequestOrCancelable value = res.unwrap();
61 if (value.is<NotNullRequest>()) {
62 nsCOMPtr<nsIRequest> req = value.as<NotNullRequest>().get();
63 req.forget(request);
64 } else if (value.is<NotNullCancelable>()) {
65 nsCOMPtr<nsICancelable> cancelable = value.as<NotNullCancelable>().get();
66 cancelable.forget(cancelableRequest);
67 } else {
68 MOZ_ASSERT_UNREACHABLE(
69 "StartAsyncRead didn't return a NotNull nsIRequest or nsICancelable.");
70 return NS_ERROR_UNEXPECTED;
73 return NS_OK;
76 NS_IMPL_ISUPPORTS_INHERITED(SimpleChannelChild, SimpleChannel, nsIChildChannel)
78 SimpleChannelChild::SimpleChannelChild(
79 UniquePtr<SimpleChannelCallbacks>&& aCallbacks)
80 : SimpleChannel(std::move(aCallbacks)) {}
82 NS_IMETHODIMP
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(),
93 aId)) {
94 return NS_ERROR_FAILURE;
97 return NS_OK;
100 NS_IMETHODIMP
101 SimpleChannelChild::CompleteRedirectSetup(nsIStreamListener* aListener) {
102 if (CanSend()) {
103 MOZ_ASSERT(NS_IsMainThread());
106 nsresult rv;
107 rv = AsyncOpen(aListener);
108 if (NS_WARN_IF(NS_FAILED(rv))) {
109 return rv;
112 if (CanSend()) {
113 Unused << Send__delete__(this);
115 return NS_OK;
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));
124 } else {
125 chan = new SimpleChannel(std::move(aCallbacks));
128 chan->SetURI(aURI);
130 MOZ_ALWAYS_SUCCEEDS(chan->SetLoadInfo(aLoadInfo));
132 return chan.forget();
135 } // namespace net
136 } // namespace mozilla