Bug 1861709 replace AudioCallbackDriver::ThreadRunning() assertions that mean to...
[gecko.git] / netwerk / base / nsRequestObserverProxy.cpp
blobfda235488a30a247b595a2b832f29c334665d01f
1 /* -*- Mode: C++; tab-width: 4; 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 "mozilla/DebugOnly.h"
8 #include "nscore.h"
9 #include "nsRequestObserverProxy.h"
10 #include "nsIRequest.h"
11 #include "mozilla/Logging.h"
12 #include "mozilla/IntegerPrintfMacros.h"
14 namespace mozilla {
15 namespace net {
17 static LazyLogModule gRequestObserverProxyLog("nsRequestObserverProxy");
19 #undef LOG
20 #define LOG(args) MOZ_LOG(gRequestObserverProxyLog, LogLevel::Debug, args)
22 //-----------------------------------------------------------------------------
23 // nsARequestObserverEvent internal class...
24 //-----------------------------------------------------------------------------
26 nsARequestObserverEvent::nsARequestObserverEvent(nsIRequest* request)
27 : Runnable("net::nsARequestObserverEvent"), mRequest(request) {
28 MOZ_ASSERT(mRequest, "null pointer");
31 //-----------------------------------------------------------------------------
32 // nsOnStartRequestEvent internal class...
33 //-----------------------------------------------------------------------------
35 class nsOnStartRequestEvent : public nsARequestObserverEvent {
36 RefPtr<nsRequestObserverProxy> mProxy;
38 public:
39 nsOnStartRequestEvent(nsRequestObserverProxy* proxy, nsIRequest* request)
40 : nsARequestObserverEvent(request), mProxy(proxy) {
41 MOZ_ASSERT(mProxy, "null pointer");
44 NS_IMETHOD Run() override {
45 LOG(("nsOnStartRequestEvent::HandleEvent [req=%p]\n", mRequest.get()));
47 if (!mProxy->mObserver) {
48 MOZ_ASSERT_UNREACHABLE(
49 "already handled onStopRequest event "
50 "(observer is null)");
51 return NS_OK;
54 LOG(("handle startevent=%p\n", this));
55 nsresult rv = mProxy->mObserver->OnStartRequest(mRequest);
56 if (NS_FAILED(rv)) {
57 LOG(("OnStartRequest failed [rv=%" PRIx32 "] canceling request!\n",
58 static_cast<uint32_t>(rv)));
59 rv = mRequest->Cancel(rv);
60 NS_ASSERTION(NS_SUCCEEDED(rv), "Cancel failed for request!");
63 return NS_OK;
66 private:
67 virtual ~nsOnStartRequestEvent() = default;
70 //-----------------------------------------------------------------------------
71 // nsOnStopRequestEvent internal class...
72 //-----------------------------------------------------------------------------
74 class nsOnStopRequestEvent : public nsARequestObserverEvent {
75 RefPtr<nsRequestObserverProxy> mProxy;
77 public:
78 nsOnStopRequestEvent(nsRequestObserverProxy* proxy, nsIRequest* request)
79 : nsARequestObserverEvent(request), mProxy(proxy) {
80 MOZ_ASSERT(mProxy, "null pointer");
83 NS_IMETHOD Run() override {
84 LOG(("nsOnStopRequestEvent::HandleEvent [req=%p]\n", mRequest.get()));
86 nsMainThreadPtrHandle<nsIRequestObserver> observer = mProxy->mObserver;
87 if (!observer) {
88 MOZ_ASSERT_UNREACHABLE(
89 "already handled onStopRequest event "
90 "(observer is null)");
91 return NS_OK;
93 // Do not allow any more events to be handled after OnStopRequest
94 mProxy->mObserver = nullptr;
96 nsresult status = NS_OK;
97 DebugOnly<nsresult> rv = mRequest->GetStatus(&status);
98 NS_ASSERTION(NS_SUCCEEDED(rv), "GetStatus failed for request!");
100 LOG(("handle stopevent=%p\n", this));
101 (void)observer->OnStopRequest(mRequest, status);
103 return NS_OK;
106 private:
107 virtual ~nsOnStopRequestEvent() = default;
110 //-----------------------------------------------------------------------------
111 // nsRequestObserverProxy::nsISupports implementation...
112 //-----------------------------------------------------------------------------
114 NS_IMPL_ISUPPORTS(nsRequestObserverProxy, nsIRequestObserver,
115 nsIRequestObserverProxy)
117 //-----------------------------------------------------------------------------
118 // nsRequestObserverProxy::nsIRequestObserver implementation...
119 //-----------------------------------------------------------------------------
121 NS_IMETHODIMP
122 nsRequestObserverProxy::OnStartRequest(nsIRequest* request) {
123 LOG(("nsRequestObserverProxy::OnStartRequest [this=%p req=%p]\n", this,
124 request));
126 RefPtr<nsOnStartRequestEvent> ev = new nsOnStartRequestEvent(this, request);
128 LOG(("post startevent=%p\n", ev.get()));
129 return FireEvent(ev);
132 NS_IMETHODIMP
133 nsRequestObserverProxy::OnStopRequest(nsIRequest* request, nsresult status) {
134 LOG(("nsRequestObserverProxy: OnStopRequest [this=%p req=%p status=%" PRIx32
135 "]\n",
136 this, request, static_cast<uint32_t>(status)));
138 // The status argument is ignored because, by the time the OnStopRequestEvent
139 // is actually processed, the status of the request may have changed :-(
140 // To make sure that an accurate status code is always used, GetStatus() is
141 // called when the OnStopRequestEvent is actually processed (see above).
143 RefPtr<nsOnStopRequestEvent> ev = new nsOnStopRequestEvent(this, request);
145 LOG(("post stopevent=%p\n", ev.get()));
146 return FireEvent(ev);
149 //-----------------------------------------------------------------------------
150 // nsRequestObserverProxy::nsIRequestObserverProxy implementation...
151 //-----------------------------------------------------------------------------
153 NS_IMETHODIMP
154 nsRequestObserverProxy::Init(nsIRequestObserver* observer,
155 nsISupports* context) {
156 NS_ENSURE_ARG_POINTER(observer);
157 mObserver = new nsMainThreadPtrHolder<nsIRequestObserver>(
158 "nsRequestObserverProxy::mObserver", observer);
159 mContext = new nsMainThreadPtrHolder<nsISupports>(
160 "nsRequestObserverProxy::mContext", context);
162 return NS_OK;
165 //-----------------------------------------------------------------------------
166 // nsRequestObserverProxy implementation...
167 //-----------------------------------------------------------------------------
169 nsresult nsRequestObserverProxy::FireEvent(nsARequestObserverEvent* event) {
170 nsCOMPtr<nsIEventTarget> mainThread(GetMainThreadSerialEventTarget());
171 return mainThread->Dispatch(event, NS_DISPATCH_NORMAL);
174 } // namespace net
175 } // namespace mozilla