Bug 1804798 - Explicitly set auto page name (and corresponding debug flag) when inser...
[gecko.git] / netwerk / base / SimpleChannel.cpp
blobadbd78e18f334ce766f0b8c4b27af400ccc8256d
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"
21 namespace mozilla {
22 namespace net {
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));
36 MOZ_ASSERT(stream);
38 mCallbacks = nullptr;
40 *channel = nullptr;
41 stream.forget(streamOut);
42 return NS_OK;
45 nsresult SimpleChannel::BeginAsyncRead(nsIStreamListener* listener,
46 nsIRequest** request,
47 nsICancelable** cancelableRequest) {
48 NS_ENSURE_TRUE(mCallbacks, NS_ERROR_UNEXPECTED);
50 RequestOrReason res = mCallbacks->StartAsyncRead(listener, this);
52 if (res.isErr()) {
53 return res.propagateErr();
56 mCallbacks = nullptr;
58 RequestOrCancelable value = res.unwrap();
60 if (value.is<NotNullRequest>()) {
61 nsCOMPtr<nsIRequest> req = value.as<NotNullRequest>().get();
62 req.forget(request);
63 } else if (value.is<NotNullCancelable>()) {
64 nsCOMPtr<nsICancelable> cancelable = value.as<NotNullCancelable>().get();
65 cancelable.forget(cancelableRequest);
66 } else {
67 MOZ_ASSERT_UNREACHABLE(
68 "StartAsyncRead didn't return a NotNull nsIRequest or nsICancelable.");
69 return NS_ERROR_UNEXPECTED;
72 return NS_OK;
75 NS_IMPL_ISUPPORTS_INHERITED(SimpleChannelChild, SimpleChannel, nsIChildChannel)
77 SimpleChannelChild::SimpleChannelChild(
78 UniquePtr<SimpleChannelCallbacks>&& aCallbacks)
79 : SimpleChannel(std::move(aCallbacks)) {}
81 NS_IMETHODIMP
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(),
92 aId)) {
93 return NS_ERROR_FAILURE;
96 return NS_OK;
99 NS_IMETHODIMP
100 SimpleChannelChild::CompleteRedirectSetup(nsIStreamListener* aListener) {
101 if (CanSend()) {
102 MOZ_ASSERT(NS_IsMainThread());
105 nsresult rv;
106 rv = AsyncOpen(aListener);
107 if (NS_WARN_IF(NS_FAILED(rv))) {
108 return rv;
111 if (CanSend()) {
112 Unused << Send__delete__(this);
114 return NS_OK;
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));
123 } else {
124 chan = new SimpleChannel(std::move(aCallbacks));
127 chan->SetURI(aURI);
129 MOZ_ALWAYS_SUCCEEDS(chan->SetLoadInfo(aLoadInfo));
131 return chan.forget();
134 } // namespace net
135 } // namespace mozilla