# -*- Mode: HTML -*- # 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/. null null false null null null null null let utils = {}; Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm", utils); utils.PrivateBrowsingUtils 14 false false = 1) this.mController.handleTab(); break; case KeyEvent.DOM_VK_UP: case KeyEvent.DOM_VK_DOWN: case KeyEvent.DOM_VK_PAGE_UP: case KeyEvent.DOM_VK_PAGE_DOWN: cancel = this.mController.handleKeyNavigation(aEvent.keyCode); break; } } // Handle keys we know aren't part of a shortcut, even with Alt or // Ctrl. switch (aEvent.keyCode) { case KeyEvent.DOM_VK_ESCAPE: cancel = this.mController.handleEscape(); break; case KeyEvent.DOM_VK_RETURN: #ifdef XP_MACOSX // Prevent the default action, since it will beep on Mac if (aEvent.metaKey) aEvent.preventDefault(); #endif this.mEnterEvent = aEvent; cancel = this.mController.handleEnter(false); break; case KeyEvent.DOM_VK_DELETE: #ifdef XP_MACOSX case KeyEvent.DOM_VK_BACK_SPACE: if (aEvent.shiftKey) #endif cancel = this.mController.handleDelete(); break; case KeyEvent.DOM_VK_DOWN: case KeyEvent.DOM_VK_UP: if (aEvent.altKey) this.toggleHistoryPopup(); break; #ifndef XP_MACOSX case KeyEvent.DOM_VK_F4: this.toggleHistoryPopup(); break; #endif } if (cancel) { aEvent.stopPropagation(); aEvent.preventDefault(); } return true; ]]> false false false 0) this.tree.treeBoxObject.ensureRowIsVisible(val < 0 ? 0 : val); // Fire select event on xul:tree so that accessibility API // support layer can fire appropriate accessibility events. var event = document.createEvent('Events'); event.initEvent("select", true, true); this.tree.dispatchEvent(event); return val; ]]> 100 ? width : 100); // Adjust the direction of the autocomplete popup list based on the textbox direction, bug 649840 var popupDirection = aElement.ownerDocument.defaultView.getComputedStyle(aElement).direction; this.style.direction = popupDirection; this.openPopup(aElement, "after_start", 0, 0, false, false); } ]]> document.getAnonymousElementByAttribute(this, "anonid", "tree"); document.getAnonymousElementByAttribute(this, "anonid", "treecols"); null false 6 -1 aMaxRow && aIndex != aMaxRow) newIdx = aMaxRow; else if (!aReverse && aIndex == -1 || newIdx < 0 && aIndex != 0) newIdx = 0; if (newIdx < 0 && aIndex == 0 || newIdx > aMaxRow && aIndex == aMaxRow) aIndex = -1; else aIndex = newIdx; return aIndex; ]]> 0 0 100 ? width : 100); // invalidate() depends on the width attribute this._invalidate(); this.openPopup(aElement, "after_start", 0, 0, false, false); } ]]> = matchCount) break; var item; // trim the leading/trailing whitespace var trimmedSearchString = controller.searchString.replace(/^\s+/, "").replace(/\s+$/, ""); // Unescape the URI spec for showing as an entry in the popup let url = Components.classes["@mozilla.org/intl/texttosuburi;1"]. getService(Components.interfaces.nsITextToSubURI). unEscapeURIForUI("UTF-8", controller.getValueAt(this._currentIndex)); if (this._currentIndex < existingItemsCount) { // re-use the existing item item = this.richlistbox.childNodes[this._currentIndex]; // Completely re-use the existing richlistitem if it's the same if (item.getAttribute("text") == trimmedSearchString && item.getAttribute("url") == url) { item.collapsed = false; this._currentIndex++; continue; } } else { // need to create a new item item = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "richlistitem"); } // set these attributes before we set the class // so that we can use them from the constructor let iconURI = this._getImageURLForResolution(window, controller.getImageAt(this._currentIndex), 16, 16); item.setAttribute("image", iconURI); item.setAttribute("url", url); item.setAttribute("title", controller.getCommentAt(this._currentIndex)); item.setAttribute("type", controller.getStyleAt(this._currentIndex)); item.setAttribute("text", trimmedSearchString); if (this._currentIndex < existingItemsCount) { // re-use the existing item item._adjustAcItem(); item.collapsed = false; } else { // set the class at the end so we can use the attributes // in the xbl constructor item.className = "autocomplete-richlistitem"; this.richlistbox.appendChild(item); } this._currentIndex++; } if (typeof this.onResultsAdded == "function") this.onResultsAdded(); if (this._currentIndex < matchCount) { // yield after each batch of items so that typing the url bar is // responsive setTimeout(function (self) { self._appendCurrentResult(); }, 0, this); } ]]> document.getAnonymousElementByAttribute(this, "anonid", "richlistbox"); v != "action"); return panel.createResultLabel(title, url, type); } // aType (ex: "ac-result-type-") is related to the class of the image, // and is not "visible" text so don't use it for the label (for accessibility). return title + " " + url; ]]> null = 0) { // Start the next search from where this one finished startIndex = matchIndex + searchLen; regions.push([matchIndex, startIndex]); } } // Sort the regions by start position then end position regions = regions.sort((a, b) => { let start = a[0] - b[0]; return (start == 0) ? a[1] - b[1] : start; }); // Generate the boundary indices from each region let start = 0; let end = 0; let boundaries = []; let len = regions.length; for (let i = 0; i < len; i++) { // We have a new boundary if the start of the next is past the end let region = regions[i]; if (region[0] > end) { // First index is the beginning of match boundaries.push(start); // Second index is the beginning of non-match boundaries.push(end); // Track the new region now that we've stored the previous one start = region[0]; } // Push back the end index for the current or new region end = Math.max(end, region[1]); } // Add the last region boundaries.push(start); boundaries.push(end); // Put on the end boundary if necessary if (end < aText.length) boundaries.push(aText.length); // Skip the first item because it's always 0 return boundaries.slice(1); ]]> = 0 && index < aReplacements.length) { let replacement = aReplacements[index]; pairs.push([...replacement]); } } else { pairs.push([part, false]); } } return pairs; ]]> 0) { // Subtract a little less to account for subpixel rounding widthDiff -= childWidth - .5; // Add to the tooltip if it's not hidden and has text let childText = children[i].textContent; if (childText) tooltip.push(childText); } } // If the children take up more space than the parent.. overflow! if (widthDiff < 0) { // Re-show the ellipsis now that we know it's needed aEllipsis.style.visibility = "visible"; // Separate text components with a ndash -- aParentBox.tooltipText = tooltip.join(" \u2013 "); } ]]> Date.now() 30) { var item = event.target; while (item && item.localName != "richlistitem") item = item.parentNode; if (!item) return; var rc = this.getIndexOfItem(item); if (rc != this.selectedIndex) this.selectedIndex = rc; this.mLastMoveTime = Date.now(); } ]]> Date.now() 30) { var rc = this.parentNode.treeBoxObject.getRowAt(event.clientX, event.clientY); if (rc != this.parentNode.currentIndex) this.parentNode.view.selection.select(rc); this.mLastMoveTime = Date.now(); } ]]>