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(nsIPrintSettings* aPrintSettings)
26 {
27 m_closeProgress = false;
28 m_processCanceled = false;
29 m_pendingStateFlags = -1;
30 m_pendingStateValue = NS_OK;
31 m_PrintSetting = aPrintSettings;
32 }
34 nsPrintProgress::~nsPrintProgress()
35 {
36 (void)ReleaseListeners();
37 }
39 /* void openProgressDialog (in nsIDOMWindow parent, in string dialogURL, in nsISupports parameters); */
40 NS_IMETHODIMP nsPrintProgress::OpenProgressDialog(nsIDOMWindow *parent,
41 const char *dialogURL,
42 nsISupports *parameters,
43 nsIObserver *openDialogObserver,
44 bool *notifyOnOpen)
45 {
46 *notifyOnOpen = true;
47 m_observer = openDialogObserver;
48 nsresult rv = NS_ERROR_FAILURE;
50 if (m_dialog)
51 return NS_ERROR_ALREADY_INITIALIZED;
53 if (!dialogURL || !*dialogURL)
54 return NS_ERROR_INVALID_ARG;
56 if (parent)
57 {
58 // Set up window.arguments[0]...
59 nsCOMPtr<nsISupportsArray> array;
60 rv = NS_NewISupportsArray(getter_AddRefs(array));
61 NS_ENSURE_SUCCESS(rv, rv);
63 nsCOMPtr<nsISupportsInterfacePointer> ifptr =
64 do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv);
65 NS_ENSURE_SUCCESS(rv, rv);
67 ifptr->SetData(static_cast<nsIPrintProgress*>(this));
68 ifptr->SetDataIID(&NS_GET_IID(nsIPrintProgress));
70 array->AppendElement(ifptr);
72 array->AppendElement(parameters);
74 // Open the dialog.
75 nsCOMPtr<nsIDOMWindow> newWindow;
76 rv = parent->OpenDialog(NS_ConvertASCIItoUTF16(dialogURL),
77 NS_LITERAL_STRING("_blank"),
78 NS_LITERAL_STRING("chrome,titlebar,dependent,centerscreen"),
79 array, getter_AddRefs(newWindow));
80 }
82 return rv;
83 }
85 /* void closeProgressDialog (in boolean forceClose); */
86 NS_IMETHODIMP nsPrintProgress::CloseProgressDialog(bool forceClose)
87 {
88 m_closeProgress = true;
89 // XXX Invalid cast of bool to nsresult (bug 778106)
90 return OnStateChange(nullptr, nullptr, nsIWebProgressListener::STATE_STOP,
91 (nsresult)forceClose);
92 }
94 /* nsIPrompt GetPrompter (); */
95 NS_IMETHODIMP nsPrintProgress::GetPrompter(nsIPrompt **_retval)
96 {
97 NS_ENSURE_ARG_POINTER(_retval);
98 *_retval = nullptr;
100 if (! m_closeProgress && m_dialog)
101 return m_dialog->GetPrompter(_retval);
103 return NS_ERROR_FAILURE;
104 }
106 /* attribute boolean processCanceledByUser; */
107 NS_IMETHODIMP nsPrintProgress::GetProcessCanceledByUser(bool *aProcessCanceledByUser)
108 {
109 NS_ENSURE_ARG_POINTER(aProcessCanceledByUser);
110 *aProcessCanceledByUser = m_processCanceled;
111 return NS_OK;
112 }
113 NS_IMETHODIMP nsPrintProgress::SetProcessCanceledByUser(bool aProcessCanceledByUser)
114 {
115 if(m_PrintSetting)
116 m_PrintSetting->SetIsCancelled(true);
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, nsIWebProgressListener::STATE_STOP, NS_OK);
131 else
132 {
133 listener->OnStatusChange(nullptr, nullptr, NS_OK, m_pendingStatus.get());
134 if (m_pendingStateFlags != -1)
135 listener->OnStateChange(nullptr, nullptr, m_pendingStateFlags, m_pendingStateValue);
136 }
138 return NS_OK;
139 }
141 /* void UnregisterListener (in nsIWebProgressListener listener); */
142 NS_IMETHODIMP nsPrintProgress::UnregisterListener(nsIWebProgressListener *listener)
143 {
144 if (listener)
145 m_listenerList.RemoveObject(listener);
147 return NS_OK;
148 }
150 /* void doneIniting (); */
151 NS_IMETHODIMP nsPrintProgress::DoneIniting()
152 {
153 if (m_observer) {
154 m_observer->Observe(nullptr, nullptr, nullptr);
155 }
156 return NS_OK;
157 }
159 /* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */
160 NS_IMETHODIMP nsPrintProgress::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t aStateFlags, nsresult aStatus)
161 {
162 m_pendingStateFlags = aStateFlags;
163 m_pendingStateValue = aStatus;
165 uint32_t count = m_listenerList.Count();
166 for (uint32_t i = count - 1; i < count; i --)
167 {
168 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
169 if (progressListener)
170 progressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus);
171 }
173 return NS_OK;
174 }
176 /* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
177 NS_IMETHODIMP nsPrintProgress::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, int32_t aCurSelfProgress, int32_t aMaxSelfProgress, int32_t aCurTotalProgress, int32_t aMaxTotalProgress)
178 {
179 uint32_t count = m_listenerList.Count();
180 for (uint32_t i = count - 1; i < count; i --)
181 {
182 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
183 if (progressListener)
184 progressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress);
185 }
187 return NS_OK;
188 }
190 /* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */
191 NS_IMETHODIMP nsPrintProgress::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, uint32_t aFlags)
192 {
193 return NS_ERROR_NOT_IMPLEMENTED;
194 }
196 /* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
197 NS_IMETHODIMP nsPrintProgress::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const char16_t *aMessage)
198 {
199 if (aMessage && *aMessage)
200 m_pendingStatus = aMessage;
202 uint32_t count = m_listenerList.Count();
203 for (uint32_t i = count - 1; i < count; i --)
204 {
205 nsCOMPtr<nsIWebProgressListener> progressListener = m_listenerList.SafeObjectAt(i);
206 if (progressListener)
207 progressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage);
208 }
210 return NS_OK;
211 }
213 /* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
214 NS_IMETHODIMP nsPrintProgress::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t state)
215 {
216 return NS_OK;
217 }
219 nsresult nsPrintProgress::ReleaseListeners()
220 {
221 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 }