Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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 "nsAutoPtr.h"
12 #include "prlog.h"
14 using namespace mozilla;
16 #if defined(PR_LOGGING)
17 static PRLogModuleInfo *gRequestObserverProxyLog;
18 #endif
20 #undef LOG
21 #define LOG(args) PR_LOG(gRequestObserverProxyLog, PR_LOG_DEBUG, args)
23 //-----------------------------------------------------------------------------
24 // nsARequestObserverEvent internal class...
25 //-----------------------------------------------------------------------------
27 nsARequestObserverEvent::nsARequestObserverEvent(nsIRequest *request)
28 : mRequest(request)
29 {
30 NS_PRECONDITION(mRequest, "null pointer");
31 }
33 //-----------------------------------------------------------------------------
34 // nsOnStartRequestEvent internal class...
35 //-----------------------------------------------------------------------------
37 class nsOnStartRequestEvent : public nsARequestObserverEvent
38 {
39 nsRefPtr<nsRequestObserverProxy> mProxy;
40 public:
41 nsOnStartRequestEvent(nsRequestObserverProxy *proxy,
42 nsIRequest *request)
43 : nsARequestObserverEvent(request)
44 , mProxy(proxy)
45 {
46 NS_PRECONDITION(mProxy, "null pointer");
47 }
49 virtual ~nsOnStartRequestEvent() {}
51 NS_IMETHOD Run()
52 {
53 LOG(("nsOnStartRequestEvent::HandleEvent [req=%x]\n", mRequest.get()));
55 if (!mProxy->mObserver) {
56 NS_NOTREACHED("already handled onStopRequest event (observer is null)");
57 return NS_OK;
58 }
60 LOG(("handle startevent=%p\n", this));
61 nsresult rv = mProxy->mObserver->OnStartRequest(mRequest, mProxy->mContext);
62 if (NS_FAILED(rv)) {
63 LOG(("OnStartRequest failed [rv=%x] canceling request!\n", rv));
64 rv = mRequest->Cancel(rv);
65 NS_ASSERTION(NS_SUCCEEDED(rv), "Cancel failed for request!");
66 }
68 return NS_OK;
69 }
70 };
72 //-----------------------------------------------------------------------------
73 // nsOnStopRequestEvent internal class...
74 //-----------------------------------------------------------------------------
76 class nsOnStopRequestEvent : public nsARequestObserverEvent
77 {
78 nsRefPtr<nsRequestObserverProxy> mProxy;
79 public:
80 nsOnStopRequestEvent(nsRequestObserverProxy *proxy,
81 nsIRequest *request)
82 : nsARequestObserverEvent(request)
83 , mProxy(proxy)
84 {
85 NS_PRECONDITION(mProxy, "null pointer");
86 }
88 virtual ~nsOnStopRequestEvent() {}
90 NS_IMETHOD Run()
91 {
92 LOG(("nsOnStopRequestEvent::HandleEvent [req=%x]\n", mRequest.get()));
94 nsMainThreadPtrHandle<nsIRequestObserver> observer = mProxy->mObserver;
95 if (!observer) {
96 NS_NOTREACHED("already handled onStopRequest event (observer is null)");
97 return NS_OK;
98 }
99 // Do not allow any more events to be handled after OnStopRequest
100 mProxy->mObserver = 0;
102 nsresult status = NS_OK;
103 DebugOnly<nsresult> rv = mRequest->GetStatus(&status);
104 NS_ASSERTION(NS_SUCCEEDED(rv), "GetStatus failed for request!");
106 LOG(("handle stopevent=%p\n", this));
107 (void) observer->OnStopRequest(mRequest, mProxy->mContext, status);
109 return NS_OK;
110 }
111 };
113 //-----------------------------------------------------------------------------
114 // nsRequestObserverProxy::nsISupports implementation...
115 //-----------------------------------------------------------------------------
117 NS_IMPL_ISUPPORTS(nsRequestObserverProxy,
118 nsIRequestObserver,
119 nsIRequestObserverProxy)
121 //-----------------------------------------------------------------------------
122 // nsRequestObserverProxy::nsIRequestObserver implementation...
123 //-----------------------------------------------------------------------------
125 NS_IMETHODIMP
126 nsRequestObserverProxy::OnStartRequest(nsIRequest *request,
127 nsISupports *context)
128 {
129 MOZ_ASSERT(!context || context == mContext);
130 LOG(("nsRequestObserverProxy::OnStartRequest [this=%p req=%x]\n", this, request));
132 nsOnStartRequestEvent *ev =
133 new nsOnStartRequestEvent(this, request);
134 if (!ev)
135 return NS_ERROR_OUT_OF_MEMORY;
137 LOG(("post startevent=%p\n", ev));
138 nsresult rv = FireEvent(ev);
139 if (NS_FAILED(rv))
140 delete ev;
141 return rv;
142 }
144 NS_IMETHODIMP
145 nsRequestObserverProxy::OnStopRequest(nsIRequest *request,
146 nsISupports *context,
147 nsresult status)
148 {
149 MOZ_ASSERT(!context || context == mContext);
150 LOG(("nsRequestObserverProxy: OnStopRequest [this=%p req=%x status=%x]\n",
151 this, request, status));
153 // The status argument is ignored because, by the time the OnStopRequestEvent
154 // is actually processed, the status of the request may have changed :-(
155 // To make sure that an accurate status code is always used, GetStatus() is
156 // called when the OnStopRequestEvent is actually processed (see above).
158 nsOnStopRequestEvent *ev =
159 new nsOnStopRequestEvent(this, request);
160 if (!ev)
161 return NS_ERROR_OUT_OF_MEMORY;
163 LOG(("post stopevent=%p\n", ev));
164 nsresult rv = FireEvent(ev);
165 if (NS_FAILED(rv))
166 delete ev;
167 return rv;
168 }
170 //-----------------------------------------------------------------------------
171 // nsRequestObserverProxy::nsIRequestObserverProxy implementation...
172 //-----------------------------------------------------------------------------
174 NS_IMETHODIMP
175 nsRequestObserverProxy::Init(nsIRequestObserver *observer, nsISupports *context)
176 {
177 NS_ENSURE_ARG_POINTER(observer);
179 #if defined(PR_LOGGING)
180 if (!gRequestObserverProxyLog)
181 gRequestObserverProxyLog = PR_NewLogModule("nsRequestObserverProxy");
182 #endif
184 mObserver = new nsMainThreadPtrHolder<nsIRequestObserver>(observer);
185 mContext = new nsMainThreadPtrHolder<nsISupports>(context);
187 return NS_OK;
188 }
190 //-----------------------------------------------------------------------------
191 // nsRequestObserverProxy implementation...
192 //-----------------------------------------------------------------------------
194 nsresult
195 nsRequestObserverProxy::FireEvent(nsARequestObserverEvent *event)
196 {
197 nsCOMPtr<nsIEventTarget> mainThread(do_GetMainThread());
198 return mainThread->Dispatch(event, NS_DISPATCH_NORMAL);
199 }