177 lines
4.6 KiB
JavaScript
177 lines
4.6 KiB
JavaScript
/* 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/. */
|
|
|
|
/**
|
|
* Provide unit converter.
|
|
*/
|
|
|
|
import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
|
|
|
|
import { UnitConverterSimple } from "resource:///modules/UnitConverterSimple.sys.mjs";
|
|
import { UnitConverterTemperature } from "resource:///modules/UnitConverterTemperature.sys.mjs";
|
|
import { UnitConverterTimezone } from "resource:///modules/UnitConverterTimezone.sys.mjs";
|
|
import {
|
|
UrlbarProvider,
|
|
UrlbarUtils,
|
|
} from "resource:///modules/UrlbarUtils.sys.mjs";
|
|
|
|
const lazy = {};
|
|
|
|
ChromeUtils.defineESModuleGetters(lazy, {
|
|
UrlbarPrefs: "resource:///modules/UrlbarPrefs.sys.mjs",
|
|
UrlbarResult: "resource:///modules/UrlbarResult.sys.mjs",
|
|
UrlbarView: "resource:///modules/UrlbarView.sys.mjs",
|
|
});
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(
|
|
lazy,
|
|
"ClipboardHelper",
|
|
"@mozilla.org/widget/clipboardhelper;1",
|
|
"nsIClipboardHelper"
|
|
);
|
|
|
|
const CONVERTERS = [
|
|
new UnitConverterSimple(),
|
|
new UnitConverterTemperature(),
|
|
new UnitConverterTimezone(),
|
|
];
|
|
|
|
const DYNAMIC_RESULT_TYPE = "unitConversion";
|
|
const VIEW_TEMPLATE = {
|
|
attributes: {
|
|
selectable: true,
|
|
},
|
|
children: [
|
|
{
|
|
name: "content",
|
|
tag: "span",
|
|
classList: ["urlbarView-no-wrap"],
|
|
children: [
|
|
{
|
|
name: "icon",
|
|
tag: "img",
|
|
classList: ["urlbarView-favicon"],
|
|
attributes: {
|
|
src: "chrome://global/skin/icons/edit-copy.svg",
|
|
},
|
|
},
|
|
{
|
|
name: "output",
|
|
tag: "strong",
|
|
},
|
|
{
|
|
name: "action",
|
|
tag: "span",
|
|
},
|
|
],
|
|
},
|
|
],
|
|
};
|
|
|
|
/**
|
|
* Provide a feature that converts given units.
|
|
*/
|
|
class ProviderUnitConversion extends UrlbarProvider {
|
|
constructor() {
|
|
super();
|
|
lazy.UrlbarResult.addDynamicResultType(DYNAMIC_RESULT_TYPE);
|
|
lazy.UrlbarView.addDynamicViewTemplate(DYNAMIC_RESULT_TYPE, VIEW_TEMPLATE);
|
|
}
|
|
|
|
/**
|
|
* Returns the name of this provider.
|
|
*
|
|
* @returns {string} the name of this provider.
|
|
*/
|
|
get name() {
|
|
return "UnitConversion";
|
|
}
|
|
|
|
/**
|
|
* @returns {Values<typeof UrlbarUtils.PROVIDER_TYPE>}
|
|
*/
|
|
get type() {
|
|
return UrlbarUtils.PROVIDER_TYPE.PROFILE;
|
|
}
|
|
|
|
/**
|
|
* Whether the provider should be invoked for the given context. If this
|
|
* method returns false, the providers manager won't start a query with this
|
|
* provider, to save on resources.
|
|
*
|
|
* @param {UrlbarQueryContext} queryContext
|
|
* The query context object.
|
|
*/
|
|
async isActive({ searchString }) {
|
|
if (!lazy.UrlbarPrefs.get("unitConversion.enabled")) {
|
|
return false;
|
|
}
|
|
|
|
for (const converter of CONVERTERS) {
|
|
const result = converter.convert(searchString);
|
|
if (result) {
|
|
this._activeResult = result;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
this._activeResult = null;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* This is called only for dynamic result types, when the urlbar view updates
|
|
* the view of one of the results of the provider. It should return an object
|
|
* describing the view update.
|
|
*
|
|
* @param {UrlbarResult} result The result whose view will be updated.
|
|
* @returns {object} An object describing the view update.
|
|
*/
|
|
getViewUpdate(result) {
|
|
return {
|
|
output: {
|
|
textContent: result.payload.output,
|
|
},
|
|
action: {
|
|
l10n: { id: "urlbar-result-action-copy-to-clipboard" },
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* This method is called by the providers manager when a query starts to fetch
|
|
* each extension provider's results. It fires the resultsRequested event.
|
|
*
|
|
* @param {UrlbarQueryContext} queryContext
|
|
* The query context object.
|
|
* @param {Function} addCallback
|
|
* The callback invoked by this method to add each result.
|
|
*/
|
|
startQuery(queryContext, addCallback) {
|
|
const result = new lazy.UrlbarResult(
|
|
UrlbarUtils.RESULT_TYPE.DYNAMIC,
|
|
UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
|
|
{
|
|
dynamicType: DYNAMIC_RESULT_TYPE,
|
|
output: this._activeResult,
|
|
input: queryContext.searchString,
|
|
}
|
|
);
|
|
result.suggestedIndex = lazy.UrlbarPrefs.get(
|
|
"unitConversion.suggestedIndex"
|
|
);
|
|
|
|
addCallback(this, result);
|
|
}
|
|
|
|
onEngagement(queryContext, controller, details) {
|
|
let { element } = details;
|
|
const { textContent } = element.querySelector(
|
|
".urlbarView-dynamic-unitConversion-output"
|
|
);
|
|
lazy.ClipboardHelper.copyString(textContent);
|
|
}
|
|
}
|
|
|
|
export const UrlbarProviderUnitConversion = new ProviderUnitConversion();
|