mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
233e146e94
- spaces (1978675795)
- Bug 1176620 - Use absolute_import in mach; r=ahal (4cb6d9188f)
- Bug 1163112 - [mach core] Consolidate functionality between Main._run and Registrar.dispatch, r=gps (9f02ab04aa)
- Bug 1182677 - Support calling a function during mach command dispatch; r=smacleod (4a6511624e)
- put back some windows, crash and other details (9afa0117e0)
- Bug 1176698 - Use fallible allocator for attribute values in the HTML parser. r=wchen. (4da29e3a8a)
- Bug 1194023 - Part 1: Filter out warnings about sort operations on CREATE INDEX statements. r=mak (b221de9e96)
- Bug 1194023 - Part 2: Only check for sort operations if mozStorage logging is enabled. r=mak (be53dfc219)
- Bug 1205111 - return a transient error on 401 fetching info/collections using FxA. r=rnewman (1766c092b7)
- Bug 1188760 - Added a regex check to execute and executeCached of Sqlite.jsm. r=mak (ce509ec9a7)
- Bug 1199434 - Send printer error messages to the parent process to report to the user. r=Mossop (4e402ba484)
- bug 1207862 - Add DocManager::TopLevelRemoteDocs() r=davidb (6f919ad9db)
- bug 1201395 - call ProxyCreated with the correct interfaces when creating top level documents r=davidb (97713189cd)
- bug 1159722 - make atk expose more interfaces for proxied accessibles (529e246a13)
- bug 1162654 - allow proxies to implement the document interface r=davidb (33fd1a5ed2)
- Bug 1192023 - Use enum class instead of CheckpointMode_ prefix. r=khuey (5e922429ca)
- Bug 1203386 - Fix two implicit constructors in ActorsChild.h; r=baku (57cb7fafaf)
- Bug 1068975 - Remove FileInfo from File; r=baku (4b3ceb3bd8)
- Bug 1192023 - Make UpdateType an enum class. r=khuey (5a1908fa73)
- Bug 1184410: Track whether or not the transaction has been active on the connection thread. r=janv (44efc2f663)
- Bug 1184667 - Remove some unnecessary const_casts from ActorsParent.cpp. r=janv (1dcc45534b)
- Bug 1192023 - Use enum class instead of MaintenanceAction_ prefix. r=khuey (e2f6c8b0e5)
- Bug 1130775 followup: Add 'override' keyword to macro-provided AddRef/Release methods for QuotaClient::GetDirectoryLockListener. rs=ehsan (bf871fd57a)
- Bug 1185836: Replace several EnumerateRead calls with the new hashtable iterators. r=baku (dbfdaba7b8)
- Bug 1192023 - Flatten away AppId enum. r=khuey (78522f8547)
- missingbit of Bug 871846 (d8330545a0)
- try to fix some misspatch (29a6a9f63f)
- bug 1109891 - part 3 - remove mGeckoTextAccessible r=tbsaunde (147c7ace9d)
- Bug 1171995 - Part 6: Handle proxies in mozAccessible accessibilityHitTest and accessibilityFocusedUIElement r=tbsaunde (636508c113)
- Bug 1171995 - Part 7: Check for proxy in accessibilityIsIgnored for mozButtonAccessible and mozTextAccessible r=tbsaunde (ffb5d84e85)
- Bug 1187413 - Check for ProxyAccessible in mozAccessible childAt r=tbsaunde (fc06b79804)
- Bug 1187417 - (Part 1) Check for ProxyAccessible in mozAccessible position r=tbsaunde (2fc3c196aa)
- Bug 1187417 - (Part 2) Check for ProxyAccessible in mozAccessible size r=tbsaunde (7c7bcd9e10)
- Bug 1137748 - Expose correct roles, subroles, and roledescriptions for various WAI-ARIA roles on OS X, r=surkov (d522b4b7fc)
- Bug 1178018 - Add and adjust more roles, subroles, and role descriptions on OS X to match Webkit and Blink, r=surkov (d900416342)
- Bug 1187609 - Check for proxies in mozAccessible role, subrole r=tbsaunde (c29076091e)
- Bug 1187995 - Add proxy handling to mozTextAccessible r=tbsaunde (f6d1014aca)
- Bug 1187742 - Handle proxies in mozAccessible {isEnabled,title,value,help,isExpired} r=tbsaunde (c977aa1320)
- Bug 1187739 - (Part 1) Handle proxies in mozActionElements r=tbsaunde (b077cb6964)
- Bug 1187739 - (Part 2) Handle proxies in mozActionElements click, value r=tbsaunde (ac604e762c)
- Bug 1185836: Fix warnings r=me. (19a8596eea)
- Bug 1185836. Nuke warnings from orbit. r=me (70930b2239)
- bug 1191433 - add methods to downcast ProxyAccessible to DocAccessibleParent r=lsocks (9063e95d4a)
- bug 1191433 - add ProxyAccessible::Document r=lsock (88e4eb64c4)
- bug 1195471 - make getChildCountCB work with proxies r=davidb (86bfb6b5c4)
- Bug 1187740 - Handle proxies in mozHTMLAccessible r=tbsaunde (ee018fce11)
- misspatch (6e0ab73997)
- Bug 1199785 - Make atk methods in nsMaiInterfaceComponent.cpp to work with ipc proxies, r=tbsaunde (173a4460ef)
- Bug 1169701 - Add wrapper to get mozAccessibles from ProxyAccessibles r=tbsaunde (79e11612f1)
- Bug 1172946 - (part 1) Add mozilla a11y namespace to mozAccessible.h r=tbsaunde (ce796e8af9)
- Bug 1172946 - (part 2) Add handling for proxies in mozAccessible parent r=tbsaunde (a03158b8eb)
- Bug 1172946 - (part 3) Add handling for proxies in mozAccessible children r=tbsaunde (c72aefa608)
- Bug 1198291 - Remove exposure of the NSAccessibilityDescription attribute to guarantee we always expose AccName and AccDescription correctly, r=davidb, r=surkov (56daff1c4a)
- Bug 1179147 - merror and mstyle should be exposed as AXMathRow. r=MarcoZ (b107c9fba6)
- Bug 1187611 - (part 1) Handle ProxyAccessibles in mozAccessible focus r=tbsaunde (ba2524a2db)
- Bug 1187611 - (part 2) Handle ProxyAccessibles in mozAccessible window r=tbsaunde (05024ee697)
- Bug 1187611 - (part 3) Handle ProxyAccessibles in mozAccessible canBeFocused r=tbsaunde (93cb5e4dbb)
553 lines
17 KiB
JavaScript
553 lines
17 KiB
JavaScript
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* 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/. */
|
|
|
|
let Cc = Components.classes;
|
|
let Ci = Components.interfaces;
|
|
let Cu = Components.utils;
|
|
let Cr = Components.results;
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
var global = this;
|
|
|
|
let ClickEventHandler = {
|
|
init: function init() {
|
|
this._scrollable = null;
|
|
this._scrolldir = "";
|
|
this._startX = null;
|
|
this._startY = null;
|
|
this._screenX = null;
|
|
this._screenY = null;
|
|
this._lastFrame = null;
|
|
this.autoscrollLoop = this.autoscrollLoop.bind(this);
|
|
|
|
Services.els.addSystemEventListener(global, "mousedown", this, true);
|
|
|
|
addMessageListener("Autoscroll:Stop", this);
|
|
},
|
|
|
|
isAutoscrollBlocker: function(node) {
|
|
let mmPaste = Services.prefs.getBoolPref("middlemouse.paste");
|
|
let mmScrollbarPosition = Services.prefs.getBoolPref("middlemouse.scrollbarPosition");
|
|
|
|
while (node) {
|
|
if ((node instanceof content.HTMLAnchorElement || node instanceof content.HTMLAreaElement) &&
|
|
node.hasAttribute("href")) {
|
|
return true;
|
|
}
|
|
|
|
if (mmPaste && (node instanceof content.HTMLInputElement ||
|
|
node instanceof content.HTMLTextAreaElement)) {
|
|
return true;
|
|
}
|
|
|
|
if (node instanceof content.XULElement && mmScrollbarPosition
|
|
&& (node.localName == "scrollbar" || node.localName == "scrollcorner")) {
|
|
return true;
|
|
}
|
|
|
|
node = node.parentNode;
|
|
}
|
|
return false;
|
|
},
|
|
|
|
findNearestScrollableElement: function(aNode) {
|
|
// this is a list of overflow property values that allow scrolling
|
|
const scrollingAllowed = ['scroll', 'auto'];
|
|
|
|
// go upward in the DOM and find any parent element that has a overflow
|
|
// area and can therefore be scrolled
|
|
for (this._scrollable = aNode; this._scrollable;
|
|
this._scrollable = this._scrollable.parentNode) {
|
|
// do not use overflow based autoscroll for <html> and <body>
|
|
// Elements or non-html elements such as svg or Document nodes
|
|
// also make sure to skip select elements that are not multiline
|
|
if (!(this._scrollable instanceof content.HTMLElement) ||
|
|
((this._scrollable instanceof content.HTMLSelectElement) && !this._scrollable.multiple)) {
|
|
continue;
|
|
}
|
|
|
|
var overflowx = this._scrollable.ownerDocument.defaultView
|
|
.getComputedStyle(this._scrollable, '')
|
|
.getPropertyValue('overflow-x');
|
|
var overflowy = this._scrollable.ownerDocument.defaultView
|
|
.getComputedStyle(this._scrollable, '')
|
|
.getPropertyValue('overflow-y');
|
|
// we already discarded non-multiline selects so allow vertical
|
|
// scroll for multiline ones directly without checking for a
|
|
// overflow property
|
|
var scrollVert = this._scrollable.scrollTopMax &&
|
|
(this._scrollable instanceof content.HTMLSelectElement ||
|
|
scrollingAllowed.indexOf(overflowy) >= 0);
|
|
|
|
// do not allow horizontal scrolling for select elements, it leads
|
|
// to visual artifacts and is not the expected behavior anyway
|
|
if (!(this._scrollable instanceof content.HTMLSelectElement) &&
|
|
this._scrollable.scrollLeftMin != this._scrollable.scrollLeftMax &&
|
|
scrollingAllowed.indexOf(overflowx) >= 0) {
|
|
this._scrolldir = scrollVert ? "NSEW" : "EW";
|
|
break;
|
|
} else if (scrollVert) {
|
|
this._scrolldir = "NS";
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!this._scrollable) {
|
|
this._scrollable = aNode.ownerDocument.defaultView;
|
|
if (this._scrollable.scrollMaxX != this._scrollable.scrollMinX) {
|
|
this._scrolldir = this._scrollable.scrollMaxY !=
|
|
this._scrollable.scrollMinY ? "NSEW" : "EW";
|
|
} else if (this._scrollable.scrollMaxY != this._scrollable.scrollMinY) {
|
|
this._scrolldir = "NS";
|
|
} else if (this._scrollable.frameElement) {
|
|
this.findNearestScrollableElement(this._scrollable.frameElement);
|
|
} else {
|
|
this._scrollable = null; // abort scrolling
|
|
}
|
|
}
|
|
},
|
|
|
|
startScroll: function(event) {
|
|
|
|
this.findNearestScrollableElement(event.originalTarget);
|
|
|
|
if (!this._scrollable)
|
|
return;
|
|
|
|
let [enabled] = sendSyncMessage("Autoscroll:Start",
|
|
{scrolldir: this._scrolldir,
|
|
screenX: event.screenX,
|
|
screenY: event.screenY});
|
|
if (!enabled) {
|
|
this._scrollable = null;
|
|
return;
|
|
}
|
|
|
|
Services.els.addSystemEventListener(global, "mousemove", this, true);
|
|
addEventListener("pagehide", this, true);
|
|
|
|
this._ignoreMouseEvents = true;
|
|
this._startX = event.screenX;
|
|
this._startY = event.screenY;
|
|
this._screenX = event.screenX;
|
|
this._screenY = event.screenY;
|
|
this._scrollErrorX = 0;
|
|
this._scrollErrorY = 0;
|
|
this._lastFrame = content.performance.now();
|
|
|
|
content.requestAnimationFrame(this.autoscrollLoop);
|
|
},
|
|
|
|
stopScroll: function() {
|
|
if (this._scrollable) {
|
|
this._scrollable.mozScrollSnap();
|
|
this._scrollable = null;
|
|
|
|
Services.els.removeSystemEventListener(global, "mousemove", this, true);
|
|
removeEventListener("pagehide", this, true);
|
|
}
|
|
},
|
|
|
|
accelerate: function(curr, start) {
|
|
const speed = 12;
|
|
var val = (curr - start) / speed;
|
|
|
|
if (val > 1)
|
|
return val * Math.sqrt(val) - 1;
|
|
if (val < -1)
|
|
return val * Math.sqrt(-val) + 1;
|
|
return 0;
|
|
},
|
|
|
|
roundToZero: function(num) {
|
|
if (num > 0)
|
|
return Math.floor(num);
|
|
return Math.ceil(num);
|
|
},
|
|
|
|
autoscrollLoop: function(timestamp) {
|
|
if (!this._scrollable) {
|
|
// Scrolling has been canceled
|
|
return;
|
|
}
|
|
|
|
// avoid long jumps when the browser hangs for more than
|
|
// |maxTimeDelta| ms
|
|
const maxTimeDelta = 100;
|
|
var timeDelta = Math.min(maxTimeDelta, timestamp - this._lastFrame);
|
|
// we used to scroll |accelerate()| pixels every 20ms (50fps)
|
|
var timeCompensation = timeDelta / 20;
|
|
this._lastFrame = timestamp;
|
|
|
|
var actualScrollX = 0;
|
|
var actualScrollY = 0;
|
|
// don't bother scrolling vertically when the scrolldir is only horizontal
|
|
// and the other way around
|
|
if (this._scrolldir != 'EW') {
|
|
var y = this.accelerate(this._screenY, this._startY) * timeCompensation;
|
|
var desiredScrollY = this._scrollErrorY + y;
|
|
actualScrollY = this.roundToZero(desiredScrollY);
|
|
this._scrollErrorY = (desiredScrollY - actualScrollY);
|
|
}
|
|
if (this._scrolldir != 'NS') {
|
|
var x = this.accelerate(this._screenX, this._startX) * timeCompensation;
|
|
var desiredScrollX = this._scrollErrorX + x;
|
|
actualScrollX = this.roundToZero(desiredScrollX);
|
|
this._scrollErrorX = (desiredScrollX - actualScrollX);
|
|
}
|
|
|
|
if (this._scrollable instanceof content.Window) {
|
|
this._scrollable.scrollBy(actualScrollX, actualScrollY);
|
|
} else { // an element with overflow
|
|
this._scrollable.scrollLeft += actualScrollX;
|
|
this._scrollable.scrollTop += actualScrollY;
|
|
}
|
|
content.requestAnimationFrame(this.autoscrollLoop);
|
|
},
|
|
|
|
handleEvent: function(event) {
|
|
if (event.type == "mousemove") {
|
|
this._screenX = event.screenX;
|
|
this._screenY = event.screenY;
|
|
} else if (event.type == "mousedown") {
|
|
if (event.isTrusted &
|
|
!event.defaultPrevented &&
|
|
event.button == 1 &&
|
|
!this._scrollable &&
|
|
!this.isAutoscrollBlocker(event.originalTarget)) {
|
|
this.startScroll(event);
|
|
}
|
|
} else if (event.type == "pagehide") {
|
|
if (this._scrollable) {
|
|
var doc =
|
|
this._scrollable.ownerDocument || this._scrollable.document;
|
|
if (doc == event.target) {
|
|
sendAsyncMessage("Autoscroll:Cancel");
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
receiveMessage: function(msg) {
|
|
switch (msg.name) {
|
|
case "Autoscroll:Stop": {
|
|
this.stopScroll();
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
};
|
|
ClickEventHandler.init();
|
|
|
|
let PopupBlocking = {
|
|
popupData: null,
|
|
popupDataInternal: null,
|
|
|
|
init: function() {
|
|
addEventListener("DOMPopupBlocked", this, true);
|
|
addEventListener("pageshow", this, true);
|
|
addEventListener("pagehide", this, true);
|
|
|
|
addMessageListener("PopupBlocking:UnblockPopup", this);
|
|
},
|
|
|
|
receiveMessage: function(msg) {
|
|
switch (msg.name) {
|
|
case "PopupBlocking:UnblockPopup": {
|
|
let i = msg.data.index;
|
|
if (this.popupData && this.popupData[i]) {
|
|
let data = this.popupData[i];
|
|
let internals = this.popupDataInternal[i];
|
|
let dwi = internals.requestingWindow;
|
|
|
|
// If we have a requesting window and the requesting document is
|
|
// still the current document, open the popup.
|
|
if (dwi && dwi.document == internals.requestingDocument) {
|
|
dwi.open(data.popupWindowURI, data.popupWindowName, data.popupWindowFeatures);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
|
|
handleEvent: function(ev) {
|
|
switch (ev.type) {
|
|
case "DOMPopupBlocked":
|
|
return this.onPopupBlocked(ev);
|
|
case "pageshow":
|
|
return this.onPageShow(ev);
|
|
case "pagehide":
|
|
return this.onPageHide(ev);
|
|
}
|
|
},
|
|
|
|
onPopupBlocked: function(ev) {
|
|
if (!this.popupData) {
|
|
this.popupData = new Array();
|
|
this.popupDataInternal = new Array();
|
|
}
|
|
|
|
let obj = {
|
|
popupWindowURI: ev.popupWindowURI.spec,
|
|
popupWindowFeatures: ev.popupWindowFeatures,
|
|
popupWindowName: ev.popupWindowName
|
|
};
|
|
|
|
let internals = {
|
|
requestingWindow: ev.requestingWindow,
|
|
requestingDocument: ev.requestingWindow.document,
|
|
};
|
|
|
|
this.popupData.push(obj);
|
|
this.popupDataInternal.push(internals);
|
|
this.updateBlockedPopups(true);
|
|
},
|
|
|
|
onPageShow: function(ev) {
|
|
if (this.popupData) {
|
|
let i = 0;
|
|
while (i < this.popupData.length) {
|
|
// Filter out irrelevant reports.
|
|
if (this.popupDataInternal[i].requestingWindow &&
|
|
(this.popupDataInternal[i].requestingWindow.document ==
|
|
this.popupDataInternal[i].requestingDocument)) {
|
|
i++;
|
|
} else {
|
|
this.popupData.splice(i, 1);
|
|
this.popupDataInternal.splice(i, 1);
|
|
}
|
|
}
|
|
if (this.popupData.length == 0) {
|
|
this.popupData = null;
|
|
this.popupDataInternal = null;
|
|
}
|
|
this.updateBlockedPopups(false);
|
|
}
|
|
},
|
|
|
|
onPageHide: function(ev) {
|
|
if (this.popupData) {
|
|
this.popupData = null;
|
|
this.popupDataInternal = null;
|
|
this.updateBlockedPopups(false);
|
|
}
|
|
},
|
|
|
|
updateBlockedPopups: function(freshPopup) {
|
|
sendAsyncMessage("PopupBlocking:UpdateBlockedPopups",
|
|
{blockedPopups: this.popupData, freshPopup: freshPopup});
|
|
},
|
|
};
|
|
PopupBlocking.init();
|
|
|
|
// Set up console.* for frame scripts.
|
|
let Console = Components.utils.import("resource://gre/modules/devtools/Console.jsm", {});
|
|
this.console = new Console.ConsoleAPI();
|
|
|
|
let Printing = {
|
|
// Bug 1088061: nsPrintEngine's DoCommonPrint currently expects the
|
|
// progress listener passed to it to QI to an nsIPrintingPromptService
|
|
// in order to know that a printing progress dialog has been shown. That's
|
|
// really all the interface is used for, hence the fact that I don't actually
|
|
// implement the interface here. Bug 1088061 has been filed to remove
|
|
// this hackery.
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
|
|
Ci.nsIPrintingPromptService]),
|
|
|
|
MESSAGES: [
|
|
"Printing:Preview:Enter",
|
|
"Printing:Preview:Exit",
|
|
"Printing:Preview:Navigate",
|
|
"Printing:Preview:UpdatePageCount",
|
|
"Printing:Print",
|
|
],
|
|
|
|
init() {
|
|
this.MESSAGES.forEach(msgName => addMessageListener(msgName, this));
|
|
addEventListener("PrintingError", this, true);
|
|
},
|
|
|
|
get shouldSavePrintSettings() {
|
|
return Services.prefs.getBoolPref("print.use_global_printsettings", false) &&
|
|
Services.prefs.getBoolPref("print.save_print_settings", false);
|
|
},
|
|
|
|
handleEvent(event) {
|
|
if (event.type == "PrintingError") {
|
|
let win = event.target.defaultView;
|
|
let wbp = win.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIWebBrowserPrint);
|
|
let nsresult = event.detail;
|
|
sendAsyncMessage("Printing:Error", {
|
|
isPrinting: wbp.doingPrint,
|
|
nsresult: nsresult,
|
|
});
|
|
}
|
|
},
|
|
|
|
receiveMessage(message) {
|
|
let objects = message.objects;
|
|
let data = message.data;
|
|
switch(message.name) {
|
|
case "Printing:Preview:Enter": {
|
|
this.enterPrintPreview(objects.contentWindow);
|
|
break;
|
|
}
|
|
|
|
case "Printing:Preview:Exit": {
|
|
this.exitPrintPreview();
|
|
break;
|
|
}
|
|
|
|
case "Printing:Preview:Navigate": {
|
|
this.navigate(data.navType, data.pageNum);
|
|
break;
|
|
}
|
|
|
|
case "Printing:Preview:UpdatePageCount": {
|
|
this.updatePageCount();
|
|
break;
|
|
}
|
|
|
|
case "Printing:Print": {
|
|
this.print(objects.contentWindow);
|
|
break;
|
|
}
|
|
}
|
|
},
|
|
|
|
getPrintSettings() {
|
|
try {
|
|
let PSSVC = Cc["@mozilla.org/gfx/printsettings-service;1"]
|
|
.getService(Ci.nsIPrintSettingsService);
|
|
|
|
let printSettings = PSSVC.globalPrintSettings;
|
|
if (!printSettings.printerName) {
|
|
printSettings.printerName = PSSVC.defaultPrinterName;
|
|
}
|
|
// First get any defaults from the printer
|
|
PSSVC.initPrintSettingsFromPrinter(printSettings.printerName,
|
|
printSettings);
|
|
// now augment them with any values from last time
|
|
PSSVC.initPrintSettingsFromPrefs(printSettings, true,
|
|
printSettings.kInitSaveAll);
|
|
|
|
return printSettings;
|
|
} catch(e) {
|
|
Components.utils.reportError(e);
|
|
}
|
|
|
|
return null;
|
|
},
|
|
|
|
enterPrintPreview(contentWindow) {
|
|
// We'll call this whenever we've finished reflowing the document, or if
|
|
// we errored out while attempting to print preview (in which case, we'll
|
|
// notify the parent that we've failed).
|
|
let notifyEntered = (error) => {
|
|
removeEventListener("printPreviewUpdate", onPrintPreviewReady);
|
|
sendAsyncMessage("Printing:Preview:Entered", {
|
|
failed: !!error,
|
|
});
|
|
};
|
|
|
|
let onPrintPreviewReady = () => {
|
|
notifyEntered();
|
|
};
|
|
|
|
// We have to wait for the print engine to finish reflowing all of the
|
|
// documents and subdocuments before we can tell the parent to flip to
|
|
// the print preview UI - otherwise, the print preview UI might ask for
|
|
// information (like the number of pages in the document) before we have
|
|
// our PresShells set up.
|
|
addEventListener("printPreviewUpdate", onPrintPreviewReady);
|
|
|
|
try {
|
|
let printSettings = this.getPrintSettings();
|
|
docShell.printPreview.printPreview(printSettings, contentWindow, this);
|
|
} catch(error) {
|
|
// This might fail if we, for example, attempt to print a XUL document.
|
|
// In that case, we inform the parent to bail out of print preview.
|
|
Components.utils.reportError(error);
|
|
notifyEntered(error);
|
|
}
|
|
},
|
|
|
|
exitPrintPreview() {
|
|
docShell.printPreview.exitPrintPreview();
|
|
},
|
|
|
|
print(contentWindow) {
|
|
let printSettings = this.getPrintSettings();
|
|
let rv = Cr.NS_OK;
|
|
try {
|
|
let print = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIWebBrowserPrint);
|
|
print.print(printSettings, null);
|
|
} catch(e) {
|
|
// Pressing cancel is expressed as an NS_ERROR_ABORT return value,
|
|
// causing an exception to be thrown which we catch here.
|
|
if (e.result != Cr.NS_ERROR_ABORT) {
|
|
Cu.reportError(`In Printing:Print:Done handler, got unexpected rv
|
|
${e.result}.`);
|
|
sendAsyncMessage("Printing:Error", {
|
|
isPrinting: true,
|
|
nsresult: e.result,
|
|
});
|
|
}
|
|
}
|
|
|
|
if (this.shouldSavePrintSettings) {
|
|
let PSSVC = Cc["@mozilla.org/gfx/printsettings-service;1"]
|
|
.getService(Ci.nsIPrintSettingsService);
|
|
|
|
PSSVC.savePrintSettingsToPrefs(printSettings, true,
|
|
printSettings.kInitSaveAll);
|
|
PSSVC.savePrintSettingsToPrefs(printSettings, false,
|
|
printSettings.kInitSavePrinterName);
|
|
}
|
|
},
|
|
|
|
updatePageCount() {
|
|
let numPages = docShell.printPreview.printPreviewNumPages;
|
|
sendAsyncMessage("Printing:Preview:UpdatePageCount", {
|
|
numPages: numPages,
|
|
});
|
|
},
|
|
|
|
navigate(navType, pageNum) {
|
|
docShell.printPreview.printPreviewNavigate(navType, pageNum);
|
|
},
|
|
|
|
/* nsIWebProgressListener for print preview */
|
|
|
|
onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
|
|
sendAsyncMessage("Printing:Preview:StateChange", {
|
|
stateFlags: aStateFlags,
|
|
status: aStatus,
|
|
});
|
|
},
|
|
|
|
onProgressChange(aWebProgress, aRequest, aCurSelfProgress,
|
|
aMaxSelfProgress, aCurTotalProgress,
|
|
aMaxTotalProgress) {
|
|
sendAsyncMessage("Printing:Preview:ProgressChange", {
|
|
curSelfProgress: aCurSelfProgress,
|
|
maxSelfProgress: aMaxSelfProgress,
|
|
curTotalProgress: aCurTotalProgress,
|
|
maxTotalProgress: aMaxTotalProgress,
|
|
});
|
|
},
|
|
|
|
onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {},
|
|
onStatusChange(aWebProgress, aRequest, aStatus, aMessage) {},
|
|
onSecurityChange(aWebProgress, aRequest, aState) {},
|
|
}
|
|
Printing.init();
|
|
|