forked from mirrors/gecko-dev
113 lines
4.4 KiB
JavaScript
113 lines
4.4 KiB
JavaScript
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* vim: set sts=2 sw=2 et tw=80: */
|
|
/* global tabTracker */
|
|
"use strict";
|
|
|
|
/**
|
|
* runFindOperation
|
|
* Utility for `find` and `highlightResults`.
|
|
*
|
|
* @param {object} params - params to pass to message sender.
|
|
* @param {string} message - identifying component of message name.
|
|
*
|
|
* @returns {Promise} a promise that will be resolved or rejected based on the
|
|
* data received by the message listener.
|
|
*/
|
|
function runFindOperation(params, message) {
|
|
let {tabId} = params;
|
|
let tab = tabId ? tabTracker.getTab(tabId) : tabTracker.activeTab;
|
|
let browser = tab.linkedBrowser;
|
|
let mm = browser.messageManager;
|
|
tabId = tabId || tabTracker.getId(tab);
|
|
|
|
// We disallow find in about: urls.
|
|
if (tab.linkedBrowser.contentPrincipal.isSystemPrincipal ||
|
|
(["about", "chrome", "resource"].includes(tab.linkedBrowser.currentURI.scheme) &&
|
|
tab.linkedBrowser.currentURI.spec != "about:blank")) {
|
|
return Promise.reject({message: `Unable to search: ${tabId}`});
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
mm.addMessageListener(`ext-Finder:${message}Finished`, function messageListener(message) {
|
|
mm.removeMessageListener(`ext-Finder:${message}Finished`, messageListener);
|
|
switch (message.data) {
|
|
case "Success":
|
|
resolve();
|
|
break;
|
|
case "OutOfRange":
|
|
reject({message: "index supplied was out of range"});
|
|
break;
|
|
case "NoResults":
|
|
reject({message: "no search results to highlight"});
|
|
break;
|
|
}
|
|
resolve(message.data);
|
|
});
|
|
mm.sendAsyncMessage(`ext-Finder:${message}`, params);
|
|
});
|
|
}
|
|
|
|
this.find = class extends ExtensionAPI {
|
|
getAPI(context) {
|
|
return {
|
|
find: {
|
|
/**
|
|
* browser.find.find
|
|
* Searches document and its frames for a given queryphrase and stores all found
|
|
* Range objects in an array accessible by other browser.find methods.
|
|
*
|
|
* @param {string} queryphrase - The string to search for.
|
|
* @param {object} params optional - may contain any of the following properties,
|
|
* all of which are optional:
|
|
* {number} tabId - Tab to query. Defaults to the active tab.
|
|
* {boolean} caseSensitive - Highlight only ranges with case sensitive match.
|
|
* {boolean} entireWord - Highlight only ranges that match entire word.
|
|
* {boolean} includeRangeData - Whether to return range data.
|
|
* {boolean} includeRectData - Whether to return rectangle data.
|
|
*
|
|
* @returns {object} data received by the message listener that includes:
|
|
* {number} count - number of results found.
|
|
* {array} rangeData (if opted) - serialized representation of ranges found.
|
|
* {array} rectData (if opted) - rect data of ranges found.
|
|
*/
|
|
find(queryphrase, params) {
|
|
params = params || {};
|
|
params.queryphrase = queryphrase;
|
|
return runFindOperation(params, "CollectResults");
|
|
},
|
|
|
|
/**
|
|
* browser.find.highlightResults
|
|
* Highlights range(s) found in previous browser.find.find.
|
|
*
|
|
* @param {object} params optional - may contain any of the following properties,
|
|
* all of which are optional:
|
|
* {number} rangeIndex - Found range to be highlighted. Default highlights all ranges.
|
|
* {number} tabId - Tab to highlight. Defaults to the active tab.
|
|
* {boolean} noScroll - Don't scroll to highlighted item.
|
|
*
|
|
* @returns {string} - data received by the message listener that may be:
|
|
* "Success" - Highlighting succeeded.
|
|
* "OutOfRange" - The index supplied was out of range.
|
|
* "NoResults" - There were no search results to highlight.
|
|
*/
|
|
highlightResults(params) {
|
|
params = params || {};
|
|
return runFindOperation(params, "HighlightResults");
|
|
},
|
|
|
|
/**
|
|
* browser.find.removeHighlighting
|
|
* Removes all hightlighting from previous search.
|
|
*
|
|
* @param {number} tabId optional
|
|
* Tab to clear highlighting in. Defaults to the active tab.
|
|
*/
|
|
removeHighlighting(tabId) {
|
|
let tab = tabId ? tabTracker.getTab(tabId) : tabTracker.activeTab;
|
|
tab.linkedBrowser.messageManager.sendAsyncMessage("ext-Finder:clearHighlighting");
|
|
},
|
|
},
|
|
};
|
|
}
|
|
};
|