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: 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 "nsPrintProgress.h"
8 #include "nsIBaseWindow.h"
9 #include "nsISupportsArray.h"
10 #include "nsXPCOM.h"
11 #include "nsISupportsPrimitives.h"
12 #include "nsIComponentManager.h"
13 #include "nsIServiceManager.h"
15 #if 0
16 NS_IMPL_ADDREF(nsPrintProgress)
17 NS_IMPL_RELEASE(nsPrintProgress)
18 #else
19 NS_IMETHODIMP_(MozExternalRefCountType) nsPrintProgress::AddRef(void)
20 {
21 NS_PRECONDITION(int32_t(mRefCnt) >= 0, "illegal refcnt");
22 nsrefcnt count;
23 count = ++mRefCnt;
24 //NS_LOG_ADDREF(this, count, "nsPrintProgress", sizeof(*this));
25 return count;
26 }
28 NS_IMETHODIMP_(MozExternalRefCountType) nsPrintProgress::Release(void)
29 {
30 nsrefcnt count;
31 NS_PRECONDITION(0 != mRefCnt, "dup release");
32 count = --mRefCnt;
33 //NS_LOG_RELEASE(this, count, "nsPrintProgress");
34 if (0 == count) {
35 mRefCnt = 1; /* stabilize */
36 /* enable this to find non-threadsafe destructors: */
37 /* NS_ASSERT_OWNINGTHREAD(nsPrintProgress); */
38 delete this;
39 return 0;
40 }
41 return count;
42 }
44 #endif
46 NS_INTERFACE_MAP_BEGIN(nsPrintProgress)
47 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrintStatusFeedback)
48 NS_INTERFACE_MAP_ENTRY(nsIPrintProgress)
49 NS_INTERFACE_MAP_ENTRY(nsIPrintStatusFeedback)
50 NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
51 NS_INTERFACE_MAP_END_THREADSAFE
54 nsPrintProgress::nsPrintProgress()
55 {
56 m_closeProgress = false;
57 m_processCanceled = false;
58 m_pendingStateFlags = -1;
59 m_pendingStateValue = NS_OK;
60 }
62 nsPrintProgress::~nsPrintProgress()
63 {
64 (void)ReleaseListeners();
65 }
67 /* void openProgressDialog (in nsIDOMWindow parent, in string dialogURL, in nsISupports parameters); */
68 NS_IMETHODIMP nsPrintProgress::OpenProgressDialog(nsIDOMWindow *parent,
69 const char *dialogURL,
70 nsISupports *parameters,
71 nsIObserver *openDialogObserver,
72 bool *notifyOnOpen)
73 {
74 *notifyOnOpen = true;
75 m_observer = openDialogObserver;
77 nsresult rv = NS_ERROR_FAILURE;
79 if (m_dialog)
80 return NS_ERROR_ALREADY_INITIALIZED;
82 if (!dialogURL || !*dialogURL)
83 return NS_ERROR_INVALID_ARG;
85 if (parent)
86 {
87 // Set up window.arguments[0]...
88 nsCOMPtr<nsISupportsArray> array;
89 rv = NS_NewISupportsArray(getter_AddRefs(array));
90 NS_ENSURE_SUCCESS(rv, rv);
92 nsCOMPtr<nsISupportsInterfacePointer> ifptr =
93 do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv);
94 NS_ENSURE_SUCCESS(rv, rv);
96 ifptr->SetData(static_cast<nsIPrintProgress*>(this));
97 ifptr->SetDataIID(&NS_GET_IID(nsIPrintProgress));
99 array->AppendElement(ifptr);
101 array->AppendElement(parameters);
103 // Open the dialog.
104 nsCOMPtr<nsIDOMWindow> newWindow;
105 rv = parent->OpenDialog(NS_ConvertASCIItoUTF16(dialogURL),
106 NS_LITERAL_STRING("_blank"),
107 NS_LITERAL_STRING("chrome,titlebar,dependent,centerscreen"),
108 array, getter_AddRefs(newWindow));
109 }
111 return rv;
112 }
114 /* void closeProgressDialog (in boolean forceClose); */
115 NS_IMETHODIMP nsPrintProgress::CloseProgressDialog(bool forceClose)
116 {
117 m_closeProgress = true;
118 // XXX Casting from bool to nsresult
119 return OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP,
120 static_cast<nsresult>(forceClose));
121 }
123 /* nsIPrompt GetPrompter (); */
124 NS_IMETHODIMP nsPrintProgress::GetPrompter(nsIPrompt **_retval)
125 {
126 NS_ENSURE_ARG_POINTER(_retval);
127 *_retval = nullptr;
129 if (! m_closeProgress && m_dialog)
130 return m_dialog->GetPrompter(_retval);
132 return NS_ERROR_FAILURE;
133 }
135 /* attribute boolean processCanceledByUser; */
136 NS_IMETHODIMP nsPrintProgress::GetProcessCanceledByUser(bool *aProcessCanceledByUser)
137 {
138 NS_ENSURE_ARG_POINTER(aProcessCanceledByUser);
139 *aProcessCanceledByUser = m_processCanceled;
140 return NS_OK;
141 }
142 NS_IMETHODIMP nsPrintProgress::SetProcessCanceledByUser(bool aProcessCanceledByUser)
143 {
144 m_processCanceled = aProcessCanceledByUser;
145 OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP, NS_OK);
146 return NS_OK;
147 }
149 /* void RegisterListener (in nsIWebProgressListener listener); */
150 NS_IMETHODIMP nsPrintProgress::RegisterListener(nsIWebProgressListener * listener)
151 {
152 if (!listener) //Nothing to do with a null listener!
153 return NS_OK;
155 m_listenerList.AppendObject(listener);
156 if (m_closeProgress || m_processCanceled)
157 listener->OnStateChange(nullptr, nullptr,
158 nsIWebProgressListener::STATE_STOP, NS_OK);
159 else
160 {
161 listener->OnStatusChange(nullptr, nullptr, NS_OK, m_pendingStatus.get());
162 if (m_pendingStateFlags != -1)
163 listener->OnStateChange(nullptr, nullptr, m_pendingStateFlags, m_pendingStateValue);
164 }
166 return NS_OK;
167 }
169 /* void UnregisterListener (in nsIWebProgressListener listener); */
170 NS_IMETHODIMP nsPrintProgress::UnregisterListener(nsIWebProgressListener *listener)
171 {
172 if (listener)
173 m_listenerList.RemoveObject(listener);
175 return NS_OK;
176 }
178 /* void doneIniting (); */
179 NS_IMETHODIMP nsPrintProgress::DoneIniting()
180 {
181 if (m_observer) {
182 m_observer->Observe(nullptr, nullptr, nullptr);
183 }
184 return NS_OK;
185 }
187 /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */
188 NS_IMETHODIMP nsPrintProgress::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t aStateFlags, nsresult aStatus)
189 {
190 m_pendingStateFlags = aStateFlags;
191 m_pendingStateValue = aStatus;
193 uint32_t count = m_listenerList.Count();
194 for (uint32_t i = count - 1; i < count; i --)
195 {
196 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
197 if (progressListener)
198 progressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
199 }
201 return NS_OK;
202 }
204 /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
205 NS_IMETHODIMP nsPrintProgress::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, int32_t aCurSelfProgress, int32_t aMaxSelfProgress, int32_t aCurTotalProgress, int32_t aMaxTotalProgress)
206 {
207 uint32_t count = m_listenerList.Count();
208 for (uint32_t i = count - 1; i < count; i --)
209 {
210 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
211 if (progressListener)
212 progressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress);
213 }
215 return NS_OK;
216 }
218 /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */
219 NS_IMETHODIMP nsPrintProgress::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, uint32_t aFlags)
220 {
221 return NS_OK;
222 }
224 /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
225 NS_IMETHODIMP nsPrintProgress::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const char16_t *aMessage)
226 {
227 if (aMessage && *aMessage)
228 m_pendingStatus = aMessage;
230 uint32_t count = m_listenerList.Count();
231 for (uint32_t i = count - 1; i < count; i --)
232 {
233 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
234 if (progressListener)
235 progressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage);
236 }
238 return NS_OK;
239 }
241 /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
242 NS_IMETHODIMP nsPrintProgress::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t state)
243 {
244 return NS_OK;
245 }
247 nsresult nsPrintProgress::ReleaseListeners()
248 {
249 m_listenerList.Clear();
250 return NS_OK;
251 }
253 NS_IMETHODIMP nsPrintProgress::ShowStatusString(const char16_t *status)
254 {
255 return OnStatusChange(nullptr, nullptr, NS_OK, status);
256 }
258 /* void startMeteors (); */
259 NS_IMETHODIMP nsPrintProgress::StartMeteors()
260 {
261 return NS_ERROR_NOT_IMPLEMENTED;
262 }
264 /* void stopMeteors (); */
265 NS_IMETHODIMP nsPrintProgress::StopMeteors()
266 {
267 return NS_ERROR_NOT_IMPLEMENTED;
268 }
270 /* void showProgress (in long percent); */
271 NS_IMETHODIMP nsPrintProgress::ShowProgress(int32_t percent)
272 {
273 return NS_ERROR_NOT_IMPLEMENTED;
274 }
276 /* [noscript] void setDocShell (in nsIDocShell shell, in nsIDOMWindow window); */
277 NS_IMETHODIMP nsPrintProgress::SetDocShell(nsIDocShell *shell, nsIDOMWindow *window)
278 {
279 return NS_ERROR_NOT_IMPLEMENTED;
280 }
282 /* void closeWindow (); */
283 NS_IMETHODIMP nsPrintProgress::CloseWindow()
284 {
285 return NS_ERROR_NOT_IMPLEMENTED;
286 }