summaryrefslogtreecommitdiffstats
path: root/mobile/android/chrome/content/PrintHelper.js
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/chrome/content/PrintHelper.js')
-rw-r--r--mobile/android/chrome/content/PrintHelper.js73
1 files changed, 73 insertions, 0 deletions
diff --git a/mobile/android/chrome/content/PrintHelper.js b/mobile/android/chrome/content/PrintHelper.js
new file mode 100644
index 000000000..9b071ee92
--- /dev/null
+++ b/mobile/android/chrome/content/PrintHelper.js
@@ -0,0 +1,73 @@
+// -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; js2-basic-offset: 2; js2-skip-preprocessor-directives: t; -*-
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+XPCOMUtils.defineLazyModuleGetter(this, "Snackbars", "resource://gre/modules/Snackbars.jsm");
+
+var PrintHelper = {
+ init: function() {
+ Services.obs.addObserver(this, "Print:PDF", false);
+ },
+
+ observe: function (aSubject, aTopic, aData) {
+ let browser = BrowserApp.selectedBrowser;
+
+ switch (aTopic) {
+ case "Print:PDF":
+ Messaging.handleRequest(aTopic, aData, (data) => {
+ return this.generatePDF(browser);
+ });
+ break;
+ }
+ },
+
+ generatePDF: function(aBrowser) {
+ // Create the final destination file location
+ let fileName = ContentAreaUtils.getDefaultFileName(aBrowser.contentTitle, aBrowser.currentURI, null, null);
+ fileName = fileName.trim() + ".pdf";
+
+ let file = Services.dirsvc.get("TmpD", Ci.nsIFile);
+ file.append(fileName);
+ file.createUnique(file.NORMAL_FILE_TYPE, parseInt("666", 8));
+
+ let printSettings = Cc["@mozilla.org/gfx/printsettings-service;1"].getService(Ci.nsIPrintSettingsService).newPrintSettings;
+ printSettings.printSilent = true;
+ printSettings.showPrintProgress = false;
+ printSettings.printBGImages = false;
+ printSettings.printBGColors = false;
+ printSettings.printToFile = true;
+ printSettings.toFileName = file.path;
+ printSettings.printFrameType = Ci.nsIPrintSettings.kFramesAsIs;
+ printSettings.outputFormat = Ci.nsIPrintSettings.kOutputFormatPDF;
+
+ let webBrowserPrint = aBrowser.contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebBrowserPrint);
+
+ return new Promise((resolve, reject) => {
+ webBrowserPrint.print(printSettings, {
+ onStateChange: function(webProgress, request, stateFlags, status) {
+ // We get two STATE_START calls, one for STATE_IS_DOCUMENT and one for STATE_IS_NETWORK
+ if (stateFlags & Ci.nsIWebProgressListener.STATE_START && stateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK) {
+ // Let the user know something is happening. Generating the PDF can take some time.
+ Snackbars.show(Strings.browser.GetStringFromName("alertPrintjobToast"), Snackbars.LENGTH_LONG);
+ }
+
+ // We get two STATE_STOP calls, one for STATE_IS_DOCUMENT and one for STATE_IS_NETWORK
+ if (stateFlags & Ci.nsIWebProgressListener.STATE_STOP && stateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK) {
+ if (Components.isSuccessCode(status)) {
+ // Send the details to Java
+ resolve({ file: file.path, title: fileName });
+ } else {
+ reject();
+ }
+ }
+ },
+ onProgressChange: function () {},
+ onLocationChange: function () {},
+ onStatusChange: function () {},
+ onSecurityChange: function () {},
+ });
+ });
+ }
+};