= this._matchCount) return; var existingItemsCount = this.richlistbox.childNodes.length; var item; // trim the leading/trailing whitespace var trimmedSearchString = controller.searchString.trim(); // 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)); // Unlike our superclass, we create nodes every time because we have // heterogeneous results and we cannot rely on the XBL bindings to // to change fast enough. item = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "richlistitem"); var glodaCompleter = Components. classes["@mozilla.org/autocomplete/search;1?name=gloda"]. getService(). //Components.interfaces.nsIAutoCompleteSearch) wrappedJSObject; var result = glodaCompleter.curResult; // set these attributes before we set the class // so that we can use them from the contructor var row = result.getObjectAt(this._currentIndex); var obj = row.item; item.setAttribute("text", trimmedSearchString); item.setAttribute("type", result.getStyleAt(this._currentIndex)); item.row = row; // 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++; } // yield after each batch of items so that typing the url bar is responsive setTimeout(() => this._appendCurrentResult(), 0); ]]> this.adjustHeight(), 0); // remove all child nodes because we never want to reuse them. while (this.richlistbox.hasChildNodes()) this.richlistbox.lastChild.remove(); this._currentIndex = 0; this._appendCurrentResult(); ]]> 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(function(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; ) { let charCode = aText.charCodeAt(i); // Arabic, Syriac, Indic languages are likely to have ligatures // that are broken when using the main emphasis styling if (0x0600 <= charCode && charCode <= 0x109F) return true; } return false; ]]> 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.hidden = false; // Separate text components with a ndash -- aParentBox.tooltipText = tooltip.join(" \u2013 "); } ]]> var node = document.createElementNS( "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "richlistitem"); node.obj = aObj; node.setAttribute("type", "gloda-" + this.row.nounDef.name + "-chunk"); this._identityHolder.appendChild(node);