michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: return this.boxObject.QueryInterface(Components.interfaces.nsIPopupBoxObject); michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: width) michael@0: width = accel.boxObject.width; michael@0: } michael@0: } michael@0: } michael@0: for (var i = 0; i < array.length; i++) michael@0: array[i].width = width; michael@0: ]]> michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: 0 michael@0: true michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: null michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: 0) { michael@0: arrowbox.pack = "end"; michael@0: } else { michael@0: arrowbox.pack = "start"; michael@0: } michael@0: arrowbox.style.transform = "translate(0, " + -offset + "px)"; michael@0: michael@0: // The assigned side stays the same regardless of direction. michael@0: var isRTL = (window.getComputedStyle(this).direction == "rtl"); michael@0: michael@0: if (position.indexOf("start_") == 0) { michael@0: container.dir = "reverse"; michael@0: this.setAttribute("side", isRTL ? "left" : "right"); michael@0: } michael@0: else { michael@0: container.dir = ""; michael@0: this.setAttribute("side", isRTL ? "right" : "left"); michael@0: } michael@0: } michael@0: else if (position.indexOf("before_") == 0 || position.indexOf("after_") == 0) { michael@0: container.orient = ""; michael@0: arrowbox.orient = ""; michael@0: if (position.indexOf("_end") > 0) { michael@0: arrowbox.pack = "end"; michael@0: } else { michael@0: arrowbox.pack = "start"; michael@0: } michael@0: arrowbox.style.transform = "translate(" + -offset + "px, 0)"; michael@0: michael@0: if (position.indexOf("before_") == 0) { michael@0: container.dir = "reverse"; michael@0: this.setAttribute("side", "bottom"); michael@0: } michael@0: else { michael@0: container.dir = ""; michael@0: this.setAttribute("side", "top"); michael@0: } michael@0: } michael@0: michael@0: arrow.hidden = false; michael@0: ]]> michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: clearTimeout(this._fadeTimer); michael@0: this.style.removeProperty("opacity"); michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: this.setAttribute("panelopen", "true"); michael@0: michael@0: michael@0: this.removeAttribute("panelopen"); michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: 0 michael@0: false michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: without a title, we should show michael@0: // the current file selection. michael@0: if (!titleText && michael@0: tipElement instanceof HTMLInputElement && michael@0: tipElement.type == 'file' && michael@0: !tipElement.hasAttribute('title')) { michael@0: let files = tipElement.files; michael@0: michael@0: try { michael@0: var bundle = Components.classes['@mozilla.org/intl/stringbundle;1'] michael@0: .getService(Components.interfaces.nsIStringBundleService) michael@0: .createBundle("chrome://global/locale/layout/HtmlForm.properties"); michael@0: if (files.length == 0) { michael@0: if (tipElement.multiple) { michael@0: titleText = bundle.GetStringFromName("NoFilesSelected"); michael@0: } else { michael@0: titleText = bundle.GetStringFromName("NoFileSelected"); michael@0: } michael@0: } else { michael@0: titleText = files[0].name; michael@0: // For UX and performance (jank) reasons we cap the number of michael@0: // files that we list in the tooltip to 20 plus a "and xxx more" michael@0: // line, or to 21 if exactly 21 files were picked. michael@0: const TRUNCATED_FILE_COUNT = 20; michael@0: let count = Math.min(files.length, TRUNCATED_FILE_COUNT); michael@0: for (let i = 1; i < count; ++i) { michael@0: titleText += "\n" + files[i].name; michael@0: } michael@0: if (files.length == TRUNCATED_FILE_COUNT + 1) { michael@0: titleText += "\n" + files[TRUNCATED_FILE_COUNT].name; michael@0: } else if (files.length > TRUNCATED_FILE_COUNT + 1) { michael@0: let xmoreStr = bundle.GetStringFromName("AndNMoreFiles"); michael@0: let xmoreNum = files.length - TRUNCATED_FILE_COUNT; michael@0: let tmp = {}; michael@0: Components.utils.import("resource://gre/modules/PluralForm.jsm", tmp); michael@0: let andXMoreStr = tmp.PluralForm.get(xmoreNum, xmoreStr).replace("#1", xmoreNum); michael@0: titleText += "\n" + andXMoreStr; michael@0: } michael@0: } michael@0: } catch(e) {} michael@0: } michael@0: michael@0: // Check texts against null so that title="" can be used to undefine a michael@0: // title on a child element. michael@0: while (tipElement && michael@0: (titleText == null) && (XLinkTitleText == null) && michael@0: (SVGTitleText == null) && (XULtooltiptextText == null)) { michael@0: michael@0: if (tipElement.nodeType == Node.ELEMENT_NODE) { michael@0: if (tipElement.namespaceURI == XULNS) michael@0: XULtooltiptextText = tipElement.getAttribute("tooltiptext"); michael@0: else michael@0: titleText = tipElement.getAttribute("title"); michael@0: michael@0: if ((tipElement instanceof HTMLAnchorElement || michael@0: tipElement instanceof HTMLAreaElement || michael@0: tipElement instanceof HTMLLinkElement || michael@0: tipElement instanceof SVGAElement) && tipElement.href) { michael@0: XLinkTitleText = tipElement.getAttributeNS(XLinkNS, "title"); michael@0: } michael@0: if (lookingForSVGTitle && michael@0: (!(tipElement instanceof SVGElement) || michael@0: tipElement.parentNode.nodeType == Node.DOCUMENT_NODE)) { michael@0: lookingForSVGTitle = false; michael@0: } michael@0: if (lookingForSVGTitle) { michael@0: for (let childNode of tipElement.childNodes) { michael@0: if (childNode instanceof SVGTitleElement) { michael@0: SVGTitleText = childNode.textContent; michael@0: break; michael@0: } michael@0: } michael@0: } michael@0: michael@0: direction = defView.getComputedStyle(tipElement, "") michael@0: .getPropertyValue("direction"); michael@0: } michael@0: michael@0: tipElement = tipElement.parentNode; michael@0: } michael@0: michael@0: this.style.direction = direction; michael@0: michael@0: return [titleText, XLinkTitleText, SVGTitleText, XULtooltiptextText].some(function (t) { michael@0: if (t && /\S/.test(t)) { michael@0: // Make CRLF and CR render one line break each. michael@0: this.label = t.replace(/\r\n?/g, '\n'); michael@0: return true; michael@0: } michael@0: michael@0: return false; michael@0: }, this); michael@0: michael@0: return false; michael@0: ]]> michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: 1) michael@0: this.hidePopup(); michael@0: return; michael@0: } michael@0: michael@0: // find out if the node we are entering is one of our anonymous children michael@0: while (rel) { michael@0: if (rel == this) michael@0: break; michael@0: rel = rel.parentNode; michael@0: } michael@0: michael@0: // if the entered node is not a descendant of ours, hide the tooltip michael@0: if (rel != this && this._isMouseOver) { michael@0: this.hidePopup(); michael@0: } michael@0: ]]> michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: michael@0: