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"
14 NS_IMPL_ADDREF(nsPrintProgress)
15 NS_IMPL_RELEASE(nsPrintProgress)
17 NS_INTERFACE_MAP_BEGIN(nsPrintProgress)
18 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIPrintStatusFeedback)
19 NS_INTERFACE_MAP_ENTRY(nsIPrintProgress)
20 NS_INTERFACE_MAP_ENTRY(nsIPrintStatusFeedback)
21 NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener)
22 NS_INTERFACE_MAP_END_THREADSAFE
25 nsPrintProgress::nsPrintProgress()
26 {
27 m_closeProgress = false;
28 m_processCanceled = false;
29 m_pendingStateFlags = -1;
30 m_pendingStateValue = NS_OK;
31 }
33 nsPrintProgress::~nsPrintProgress()
34 {
35 (void)ReleaseListeners();
36 }
38 /* void openProgressDialog (in nsIDOMWindow parent, in string dialogURL, in nsISupports parameters); */
39 NS_IMETHODIMP nsPrintProgress::OpenProgressDialog(nsIDOMWindow *parent,
40 const char *dialogURL,
41 nsISupports *parameters,
42 nsIObserver *openDialogObserver,
43 bool *notifyOnOpen)
44 {
45 m_observer = openDialogObserver;
47 nsresult rv = NS_ERROR_FAILURE;
49 if (m_dialog)
50 return NS_ERROR_ALREADY_INITIALIZED;
52 if (!dialogURL || !*dialogURL)
53 return NS_ERROR_INVALID_ARG;
55 if (parent)
56 {
57 // Set up window.arguments[0]...
58 nsCOMPtr<nsISupportsArray> array;
59 rv = NS_NewISupportsArray(getter_AddRefs(array));
60 NS_ENSURE_SUCCESS(rv, rv);
62 nsCOMPtr<nsISupportsInterfacePointer> ifptr =
63 do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv);
64 NS_ENSURE_SUCCESS(rv, rv);
66 ifptr->SetData(static_cast<nsIPrintProgress*>(this));
67 ifptr->SetDataIID(&NS_GET_IID(nsIPrintProgress));
69 array->AppendElement(ifptr);
71 array->AppendElement(parameters);
73 // Open the dialog.
74 nsCOMPtr<nsIDOMWindow> newWindow;
75 rv = parent->OpenDialog(NS_ConvertASCIItoUTF16(dialogURL),
76 NS_LITERAL_STRING("_blank"),
77 NS_LITERAL_STRING("chrome,titlebar,dependent,centerscreen"),
78 array, getter_AddRefs(newWindow));
79 if (NS_SUCCEEDED(rv)) {
80 *notifyOnOpen = true;
81 }
82 }
84 return rv;
85 }
87 /* void closeProgressDialog (in boolean forceClose); */
88 NS_IMETHODIMP nsPrintProgress::CloseProgressDialog(bool forceClose)
89 {
90 m_closeProgress = true;
91 // XXX Casting bool to nsresult
92 return OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP,
93 static_cast<nsresult>(forceClose));
94 }
96 /* nsIPrompt GetPrompter (); */
97 NS_IMETHODIMP nsPrintProgress::GetPrompter(nsIPrompt **_retval)
98 {
99 NS_ENSURE_ARG_POINTER(_retval);
100 *_retval = nullptr;
102 if (! m_closeProgress && m_dialog)
103 return m_dialog->GetPrompter(_retval);
105 return NS_ERROR_FAILURE;
106 }
108 /* attribute boolean processCanceledByUser; */
109 NS_IMETHODIMP nsPrintProgress::GetProcessCanceledByUser(bool *aProcessCanceledByUser)
110 {
111 NS_ENSURE_ARG_POINTER(aProcessCanceledByUser);
112 *aProcessCanceledByUser = m_processCanceled;
113 return NS_OK;
114 }
115 NS_IMETHODIMP nsPrintProgress::SetProcessCanceledByUser(bool aProcessCanceledByUser)
116 {
117 m_processCanceled = aProcessCanceledByUser;
118 OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP, NS_OK);
119 return NS_OK;
120 }
122 /* void RegisterListener (in nsIWebProgressListener listener); */
123 NS_IMETHODIMP nsPrintProgress::RegisterListener(nsIWebProgressListener * listener)
124 {
125 if (!listener) //Nothing to do with a null listener!
126 return NS_OK;
128 m_listenerList.AppendObject(listener);
129 if (m_closeProgress || m_processCanceled)
130 listener->OnStateChange(nullptr, nullptr,
131 nsIWebProgressListener::STATE_STOP, NS_OK);
132 else
133 {
134 listener->OnStatusChange(nullptr, nullptr, NS_OK, m_pendingStatus.get());
135 if (m_pendingStateFlags != -1)
136 listener->OnStateChange(nullptr, nullptr, m_pendingStateFlags, m_pendingStateValue);
137 }
139 return NS_OK;
140 }
142 /* void UnregisterListener (in nsIWebProgressListener listener); */
143 NS_IMETHODIMP nsPrintProgress::UnregisterListener(nsIWebProgressListener *listener)
144 {
145 if (listener)
146 m_listenerList.RemoveObject(listener);
148 return NS_OK;
149 }
151 /* void doneIniting (); */
152 NS_IMETHODIMP nsPrintProgress::DoneIniting()
153 {
154 if (m_observer) {
155 m_observer->Observe(nullptr, nullptr, nullptr);
156 }
157 return NS_OK;
158 }
160 /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */
161 NS_IMETHODIMP nsPrintProgress::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t aStateFlags, nsresult aStatus)
162 {
163 m_pendingStateFlags = aStateFlags;
164 m_pendingStateValue = aStatus;
166 uint32_t count = m_listenerList.Count();
167 for (uint32_t i = count - 1; i < count; i --)
168 {
169 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
170 if (progressListener)
171 progressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
172 }
174 return NS_OK;
175 }
177 /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
178 NS_IMETHODIMP nsPrintProgress::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, int32_t aCurSelfProgress, int32_t aMaxSelfProgress, int32_t aCurTotalProgress, int32_t aMaxTotalProgress)
179 {
180 uint32_t count = m_listenerList.Count();
181 for (uint32_t i = count - 1; i < count; i --)
182 {
183 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
184 if (progressListener)
185 progressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress);
186 }
188 return NS_OK;
189 }
191 /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */
192 NS_IMETHODIMP nsPrintProgress::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, uint32_t aFlags)
193 {
194 return NS_OK;
195 }
197 /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
198 NS_IMETHODIMP nsPrintProgress::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const char16_t *aMessage)
199 {
200 if (aMessage && *aMessage)
201 m_pendingStatus = aMessage;
203 uint32_t count = m_listenerList.Count();
204 for (uint32_t i = count - 1; i < count; i --)
205 {
206 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
207 if (progressListener)
208 progressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage);
209 }
211 return NS_OK;
212 }
214 /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
215 NS_IMETHODIMP nsPrintProgress::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t state)
216 {
217 return NS_OK;
218 }
220 nsresult nsPrintProgress::ReleaseListeners()
221 {
222 m_listenerList.Clear();
223 return NS_OK;
224 }
226 NS_IMETHODIMP nsPrintProgress::ShowStatusString(const char16_t *status)
227 {
228 return OnStatusChange(nullptr, nullptr, NS_OK, status);
229 }
231 /* void startMeteors (); */
232 NS_IMETHODIMP nsPrintProgress::StartMeteors()
233 {
234 return NS_ERROR_NOT_IMPLEMENTED;
235 }
237 /* void stopMeteors (); */
238 NS_IMETHODIMP nsPrintProgress::StopMeteors()
239 {
240 return NS_ERROR_NOT_IMPLEMENTED;
241 }
243 /* void showProgress (in long percent); */
244 NS_IMETHODIMP nsPrintProgress::ShowProgress(int32_t percent)
245 {
246 return NS_ERROR_NOT_IMPLEMENTED;
247 }
249 /* [noscript] void setDocShell (in nsIDocShell shell, in nsIDOMWindow window); */
250 NS_IMETHODIMP nsPrintProgress::SetDocShell(nsIDocShell *shell, nsIDOMWindow *window)
251 {
252 return NS_ERROR_NOT_IMPLEMENTED;
253 }
255 /* void closeWindow (); */
256 NS_IMETHODIMP nsPrintProgress::CloseWindow()
257 {
258 return NS_ERROR_NOT_IMPLEMENTED;
259 }