# -*- 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
") 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(function(a, b) let (start = a[0] - b[0])
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 [,action, param] = url.match(/^moz-action:([^,]+),(.*)$/);
this.setAttribute("actiontype", action);
url = param;
let desc = this._stringBundle.GetStringFromName("switchToTab");
this._setUpDescription(this._action, desc, true);
// Remove the "action" substring so that the correct style, if any,
// is applied below.
types.splice(actionIndex, 1);
type = types.join(" ");
}
// Check if we have a search engine name
let searchEngine = "";
let searchIndex = types.indexOf("search");
if (searchIndex >= 0) {
const TITLE_SEARCH_ENGINE_SEPARATOR = " \u00B7\u2013\u00B7 ";
[title, searchEngine] = title.split(TITLE_SEARCH_ENGINE_SEPARATOR);
// Remove the "search" substring so that the correct style, if any,
// is applied below.
types.splice(searchIndex, 1);
type = types.join(" ");
}
// If we have a tag match, show the tags and icon
if (type == "tag") {
// Configure the extra box for tags display
this._extraBox.hidden = false;
this._extraBox.childNodes[0].hidden = false;
this._extraBox.childNodes[1].hidden = true;
this._extraBox.pack = "end";
this._titleBox.flex = 1;
// The title is separated from the tags by an endash
let tags;
[, title, tags] = title.match(/^(.+) \u2013 (.+)$/);
// Each tag is split by a comma in an undefined order, so sort it
let sortedTags = tags.split(",").sort().join(", ");
// Emphasize the matching text in the tags
this._setUpDescription(this._extra, sortedTags);
// Treat tagged matches as bookmarks for the star
type = "bookmark";
} else if (type == "keyword") {
// Configure the extra box for keyword display
this._extraBox.hidden = false;
this._extraBox.childNodes[0].hidden = true;
this._extraBox.childNodes[1].hidden = false;
this._extraBox.pack = "start";
this._titleBox.flex = 0;
// Hide the ellipsis so it doesn't take up space.
this._titleOverflowEllipsis.hidden = true;
// Put the parameters next to the title if we have any
let search = this.getAttribute("text");
let params = "";
let paramsIndex = search.indexOf(' ');
if (paramsIndex != -1)
params = search.substr(paramsIndex + 1);
// Emphasize the keyword parameters
this._setUpDescription(this._extra, params);
// Don't emphasize keyword searches in the title or url
this.setAttribute("text", "");
} else {
// Hide the title's extra box if we don't need extra stuff
this._extraBox.hidden = true;
this._titleBox.flex = 1;
}
// Give the image the icon style and a special one for the type
this._typeImage.className = "ac-type-icon" +
(type ? " ac-result-type-" + type : "");
// Show the url as the title if we don't have a title
if (title == "")
title = url;
// Emphasize the matching search terms for the description
this._setUpDescription(this._title, title);
if (!searchEngine) {
this._setUpDescription(this._url, url);
} else {
let desc = this._stringBundle.formatStringFromName("searchWithEngine", [searchEngine], 1);
// The search engine name, when present, is not emphasized.
this._setUpDescription(this._url, desc, true);
}
// Set up overflow on a timeout because the contents of the box
// might not have a width yet even though we just changed them
setTimeout(this._setUpOverflow, 0, this._titleBox, this._titleOverflowEllipsis);
setTimeout(this._setUpOverflow, 0, this._urlBox, this._urlOverflowEllipsis);
]]>
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();
}
]]>