1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/embedding/components/printingui/src/win/nsPrintingPromptService.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,357 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- 1.5 + * 1.6 + * This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "nsCOMPtr.h" 1.11 + 1.12 +#include "nsPrintingPromptService.h" 1.13 +#include "nsIPrintingPromptService.h" 1.14 +#include "nsIFactory.h" 1.15 +#include "nsPIDOMWindow.h" 1.16 +#include "nsReadableUtils.h" 1.17 +#include "nsIEmbeddingSiteWindow.h" 1.18 +#include "nsIServiceManager.h" 1.19 +#include "nsIWebBrowserChrome.h" 1.20 +#include "nsIWindowWatcher.h" 1.21 +#include "nsPrintDialogUtil.h" 1.22 + 1.23 +// Printing Progress Includes 1.24 +#include "nsPrintProgress.h" 1.25 +#include "nsPrintProgressParams.h" 1.26 +#include "nsIWebProgressListener.h" 1.27 + 1.28 +// XP Dialog includes 1.29 +#include "nsIDialogParamBlock.h" 1.30 +#include "nsISupportsUtils.h" 1.31 +#include "nsISupportsArray.h" 1.32 + 1.33 +// Includes need to locate the native Window 1.34 +#include "nsIWidget.h" 1.35 +#include "nsIBaseWindow.h" 1.36 +#include "nsIWebBrowserChrome.h" 1.37 +#include "nsIDocShellTreeOwner.h" 1.38 +#include "nsIDocShellTreeItem.h" 1.39 +#include "nsIDocShell.h" 1.40 +#include "nsIInterfaceRequestorUtils.h" 1.41 + 1.42 + 1.43 +static const char *kPrintProgressDialogURL = "chrome://global/content/printProgress.xul"; 1.44 +static const char *kPrtPrvProgressDialogURL = "chrome://global/content/printPreviewProgress.xul"; 1.45 +static const char *kPageSetupDialogURL = "chrome://global/content/printPageSetup.xul"; 1.46 + 1.47 +/**************************************************************** 1.48 + ************************* ParamBlock *************************** 1.49 + ****************************************************************/ 1.50 + 1.51 +class ParamBlock { 1.52 + 1.53 +public: 1.54 + ParamBlock() 1.55 + { 1.56 + mBlock = 0; 1.57 + } 1.58 + ~ParamBlock() 1.59 + { 1.60 + NS_IF_RELEASE(mBlock); 1.61 + } 1.62 + nsresult Init() { 1.63 + return CallCreateInstance(NS_DIALOGPARAMBLOCK_CONTRACTID, &mBlock); 1.64 + } 1.65 + nsIDialogParamBlock * operator->() const { return mBlock; } 1.66 + operator nsIDialogParamBlock * const () { return mBlock; } 1.67 + 1.68 +private: 1.69 + nsIDialogParamBlock *mBlock; 1.70 +}; 1.71 + 1.72 +//***************************************************************************** 1.73 + 1.74 +NS_IMPL_ISUPPORTS(nsPrintingPromptService, nsIPrintingPromptService, nsIWebProgressListener) 1.75 + 1.76 +nsPrintingPromptService::nsPrintingPromptService() 1.77 +{ 1.78 +} 1.79 + 1.80 +//----------------------------------------------------------- 1.81 +nsPrintingPromptService::~nsPrintingPromptService() 1.82 +{ 1.83 +} 1.84 + 1.85 +//----------------------------------------------------------- 1.86 +nsresult 1.87 +nsPrintingPromptService::Init() 1.88 +{ 1.89 + nsresult rv; 1.90 + mWatcher = do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv); 1.91 + return rv; 1.92 +} 1.93 + 1.94 +//----------------------------------------------------------- 1.95 +HWND 1.96 +nsPrintingPromptService::GetHWNDForDOMWindow(nsIDOMWindow *aWindow) 1.97 +{ 1.98 + nsCOMPtr<nsIWebBrowserChrome> chrome; 1.99 + 1.100 + // We might be embedded so check this path first 1.101 + if (mWatcher) { 1.102 + nsCOMPtr<nsIDOMWindow> fosterParent; 1.103 + if (!aWindow) 1.104 + { // it will be a dependent window. try to find a foster parent. 1.105 + mWatcher->GetActiveWindow(getter_AddRefs(fosterParent)); 1.106 + aWindow = fosterParent; 1.107 + } 1.108 + mWatcher->GetChromeForWindow(aWindow, getter_AddRefs(chrome)); 1.109 + } 1.110 + 1.111 + if (chrome) { 1.112 + nsCOMPtr<nsIEmbeddingSiteWindow> site(do_QueryInterface(chrome)); 1.113 + if (site) 1.114 + { 1.115 + HWND w; 1.116 + site->GetSiteWindow(reinterpret_cast<void **>(&w)); 1.117 + return w; 1.118 + } 1.119 + } 1.120 + 1.121 + // Now we might be the Browser so check this path 1.122 + nsCOMPtr<nsPIDOMWindow> window(do_QueryInterface(aWindow)); 1.123 + 1.124 + nsCOMPtr<nsIDocShellTreeItem> treeItem = 1.125 + do_QueryInterface(window->GetDocShell()); 1.126 + if (!treeItem) return nullptr; 1.127 + 1.128 + nsCOMPtr<nsIDocShellTreeOwner> treeOwner; 1.129 + treeItem->GetTreeOwner(getter_AddRefs(treeOwner)); 1.130 + if (!treeOwner) return nullptr; 1.131 + 1.132 + nsCOMPtr<nsIWebBrowserChrome> webBrowserChrome(do_GetInterface(treeOwner)); 1.133 + if (!webBrowserChrome) return nullptr; 1.134 + 1.135 + nsCOMPtr<nsIBaseWindow> baseWin(do_QueryInterface(webBrowserChrome)); 1.136 + if (!baseWin) return nullptr; 1.137 + 1.138 + nsCOMPtr<nsIWidget> widget; 1.139 + baseWin->GetMainWidget(getter_AddRefs(widget)); 1.140 + if (!widget) return nullptr; 1.141 + 1.142 + return (HWND)widget->GetNativeData(NS_NATIVE_TMP_WINDOW); 1.143 + 1.144 +} 1.145 + 1.146 + 1.147 +/////////////////////////////////////////////////////////////////////////////// 1.148 +// nsIPrintingPrompt 1.149 + 1.150 +//----------------------------------------------------------- 1.151 +NS_IMETHODIMP 1.152 +nsPrintingPromptService::ShowPrintDialog(nsIDOMWindow *parent, nsIWebBrowserPrint *webBrowserPrint, nsIPrintSettings *printSettings) 1.153 +{ 1.154 + NS_ENSURE_ARG(parent); 1.155 + 1.156 + HWND hWnd = GetHWNDForDOMWindow(parent); 1.157 + NS_ASSERTION(hWnd, "Couldn't get native window for PRint Dialog!"); 1.158 + 1.159 + return NativeShowPrintDialog(hWnd, webBrowserPrint, printSettings); 1.160 +} 1.161 + 1.162 + 1.163 +/* void showProgress (in nsIDOMWindow parent, in nsIWebBrowserPrint webBrowserPrint, in nsIPrintSettings printSettings, in nsIObserver openDialogObserver, in boolean isForPrinting, out nsIWebProgressListener webProgressListener, out nsIPrintProgressParams printProgressParams, out boolean notifyOnOpen); */ 1.164 +NS_IMETHODIMP 1.165 +nsPrintingPromptService::ShowProgress(nsIDOMWindow* parent, 1.166 + nsIWebBrowserPrint* webBrowserPrint, // ok to be null 1.167 + nsIPrintSettings* printSettings, // ok to be null 1.168 + nsIObserver* openDialogObserver, // ok to be null 1.169 + bool isForPrinting, 1.170 + nsIWebProgressListener** webProgressListener, 1.171 + nsIPrintProgressParams** printProgressParams, 1.172 + bool* notifyOnOpen) 1.173 +{ 1.174 + NS_ENSURE_ARG(webProgressListener); 1.175 + NS_ENSURE_ARG(printProgressParams); 1.176 + NS_ENSURE_ARG(notifyOnOpen); 1.177 + 1.178 + *notifyOnOpen = false; 1.179 + if (mPrintProgress) { 1.180 + *webProgressListener = nullptr; 1.181 + *printProgressParams = nullptr; 1.182 + return NS_ERROR_FAILURE; 1.183 + } 1.184 + 1.185 + nsPrintProgress* prtProgress = new nsPrintProgress(); 1.186 + mPrintProgress = prtProgress; 1.187 + mWebProgressListener = prtProgress; 1.188 + 1.189 + nsCOMPtr<nsIPrintProgressParams> prtProgressParams = new nsPrintProgressParams(); 1.190 + 1.191 + nsCOMPtr<nsIDOMWindow> parentWindow = parent; 1.192 + 1.193 + if (mWatcher && !parentWindow) { 1.194 + mWatcher->GetActiveWindow(getter_AddRefs(parentWindow)); 1.195 + } 1.196 + 1.197 + if (parentWindow) { 1.198 + mPrintProgress->OpenProgressDialog(parentWindow, 1.199 + isForPrinting ? kPrintProgressDialogURL : kPrtPrvProgressDialogURL, 1.200 + prtProgressParams, openDialogObserver, notifyOnOpen); 1.201 + } 1.202 + 1.203 + prtProgressParams.forget(printProgressParams); 1.204 + NS_ADDREF(*webProgressListener = this); 1.205 + 1.206 + return NS_OK; 1.207 +} 1.208 + 1.209 +/* void showPageSetup (in nsIDOMWindow parent, in nsIPrintSettings printSettings); */ 1.210 +NS_IMETHODIMP 1.211 +nsPrintingPromptService::ShowPageSetup(nsIDOMWindow *parent, nsIPrintSettings *printSettings, nsIObserver *aObs) 1.212 +{ 1.213 + NS_ENSURE_ARG(printSettings); 1.214 + 1.215 + ParamBlock block; 1.216 + nsresult rv = block.Init(); 1.217 + if (NS_FAILED(rv)) 1.218 + return rv; 1.219 + 1.220 + block->SetInt(0, 0); 1.221 + rv = DoDialog(parent, block, printSettings, kPageSetupDialogURL); 1.222 + 1.223 + // if aWebBrowserPrint is not null then we are printing 1.224 + // so we want to pass back NS_ERROR_ABORT on cancel 1.225 + if (NS_SUCCEEDED(rv)) 1.226 + { 1.227 + int32_t status; 1.228 + block->GetInt(0, &status); 1.229 + return status == 0?NS_ERROR_ABORT:NS_OK; 1.230 + } 1.231 + 1.232 + return rv; 1.233 +} 1.234 + 1.235 +/* void showPrinterProperties (in nsIDOMWindow parent, in wstring printerName, in nsIPrintSettings printSettings); */ 1.236 +NS_IMETHODIMP 1.237 +nsPrintingPromptService::ShowPrinterProperties(nsIDOMWindow *parent, const char16_t *printerName, nsIPrintSettings *printSettings) 1.238 +{ 1.239 + return NS_ERROR_NOT_IMPLEMENTED; 1.240 +} 1.241 + 1.242 +//----------------------------------------------------------- 1.243 +// Helper to Fly XP Dialog 1.244 +nsresult 1.245 +nsPrintingPromptService::DoDialog(nsIDOMWindow *aParent, 1.246 + nsIDialogParamBlock *aParamBlock, 1.247 + nsIPrintSettings* aPS, 1.248 + const char *aChromeURL) 1.249 +{ 1.250 + NS_ENSURE_ARG(aParamBlock); 1.251 + NS_ENSURE_ARG(aPS); 1.252 + NS_ENSURE_ARG(aChromeURL); 1.253 + 1.254 + if (!mWatcher) 1.255 + return NS_ERROR_FAILURE; 1.256 + 1.257 + nsresult rv = NS_OK; 1.258 + 1.259 + // get a parent, if at all possible 1.260 + // (though we'd rather this didn't fail, it's OK if it does. so there's 1.261 + // no failure or null check.) 1.262 + nsCOMPtr<nsIDOMWindow> activeParent; // retain ownership for method lifetime 1.263 + if (!aParent) 1.264 + { 1.265 + mWatcher->GetActiveWindow(getter_AddRefs(activeParent)); 1.266 + aParent = activeParent; 1.267 + } 1.268 + 1.269 + // create a nsISupportsArray of the parameters 1.270 + // being passed to the window 1.271 + nsCOMPtr<nsISupportsArray> array; 1.272 + NS_NewISupportsArray(getter_AddRefs(array)); 1.273 + if (!array) return NS_ERROR_FAILURE; 1.274 + 1.275 + nsCOMPtr<nsISupports> psSupports(do_QueryInterface(aPS)); 1.276 + NS_ASSERTION(psSupports, "PrintSettings must be a supports"); 1.277 + array->AppendElement(psSupports); 1.278 + 1.279 + nsCOMPtr<nsISupports> blkSupps(do_QueryInterface(aParamBlock)); 1.280 + NS_ASSERTION(blkSupps, "IOBlk must be a supports"); 1.281 + array->AppendElement(blkSupps); 1.282 + 1.283 + nsCOMPtr<nsISupports> arguments(do_QueryInterface(array)); 1.284 + NS_ASSERTION(array, "array must be a supports"); 1.285 + 1.286 + 1.287 + nsCOMPtr<nsIDOMWindow> dialog; 1.288 + rv = mWatcher->OpenWindow(aParent, aChromeURL, "_blank", 1.289 + "centerscreen,chrome,modal,titlebar", arguments, 1.290 + getter_AddRefs(dialog)); 1.291 + 1.292 + return rv; 1.293 +} 1.294 + 1.295 +////////////////////////////////////////////////////////////////////// 1.296 +// nsIWebProgressListener 1.297 +////////////////////////////////////////////////////////////////////// 1.298 + 1.299 +/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aStateFlags, in nsresult aStatus); */ 1.300 +NS_IMETHODIMP 1.301 +nsPrintingPromptService::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t aStateFlags, nsresult aStatus) 1.302 +{ 1.303 + if ((aStateFlags & STATE_STOP) && mWebProgressListener) 1.304 + { 1.305 + mWebProgressListener->OnStateChange(aWebProgress, aRequest, aStateFlags, aStatus); 1.306 + if (mPrintProgress) 1.307 + { 1.308 + mPrintProgress->CloseProgressDialog(true); 1.309 + } 1.310 + mPrintProgress = nullptr; 1.311 + mWebProgressListener = nullptr; 1.312 + } 1.313 + return NS_OK; 1.314 +} 1.315 + 1.316 +/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */ 1.317 +NS_IMETHODIMP 1.318 +nsPrintingPromptService::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, int32_t aCurSelfProgress, int32_t aMaxSelfProgress, int32_t aCurTotalProgress, int32_t aMaxTotalProgress) 1.319 +{ 1.320 + if (mWebProgressListener) 1.321 + { 1.322 + return mWebProgressListener->OnProgressChange(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress); 1.323 + } 1.324 + return NS_ERROR_FAILURE; 1.325 +} 1.326 + 1.327 +/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location, in unsigned long aFlags); */ 1.328 +NS_IMETHODIMP 1.329 +nsPrintingPromptService::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location, uint32_t aFlags) 1.330 +{ 1.331 + if (mWebProgressListener) 1.332 + { 1.333 + return mWebProgressListener->OnLocationChange(aWebProgress, aRequest, location, aFlags); 1.334 + } 1.335 + return NS_ERROR_FAILURE; 1.336 +} 1.337 + 1.338 +/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */ 1.339 +NS_IMETHODIMP 1.340 +nsPrintingPromptService::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const char16_t *aMessage) 1.341 +{ 1.342 + if (mWebProgressListener) 1.343 + { 1.344 + return mWebProgressListener->OnStatusChange(aWebProgress, aRequest, aStatus, aMessage); 1.345 + } 1.346 + return NS_ERROR_FAILURE; 1.347 +} 1.348 + 1.349 +/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */ 1.350 +NS_IMETHODIMP 1.351 +nsPrintingPromptService::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, uint32_t state) 1.352 +{ 1.353 + if (mWebProgressListener) 1.354 + { 1.355 + return mWebProgressListener->OnSecurityChange(aWebProgress, aRequest, state); 1.356 + } 1.357 + return NS_ERROR_FAILURE; 1.358 +} 1.359 + 1.360 +