summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/parent/ext-omnibox.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/parent/ext-omnibox.js')
-rw-r--r--browser/components/extensions/parent/ext-omnibox.js177
1 files changed, 177 insertions, 0 deletions
diff --git a/browser/components/extensions/parent/ext-omnibox.js b/browser/components/extensions/parent/ext-omnibox.js
new file mode 100644
index 0000000000..363db67325
--- /dev/null
+++ b/browser/components/extensions/parent/ext-omnibox.js
@@ -0,0 +1,177 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+/* 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/. */
+
+"use strict";
+
+ChromeUtils.defineESModuleGetters(this, {
+ ExtensionSearchHandler:
+ "resource://gre/modules/ExtensionSearchHandler.sys.mjs",
+});
+
+this.omnibox = class extends ExtensionAPIPersistent {
+ PERSISTENT_EVENTS = {
+ onInputStarted({ fire }) {
+ let { extension } = this;
+ let listener = eventName => {
+ fire.sync();
+ };
+ extension.on(ExtensionSearchHandler.MSG_INPUT_STARTED, listener);
+ return {
+ unregister() {
+ extension.off(ExtensionSearchHandler.MSG_INPUT_STARTED, listener);
+ },
+ convert(_fire) {
+ fire = _fire;
+ },
+ };
+ },
+ onInputCancelled({ fire }) {
+ let { extension } = this;
+ let listener = eventName => {
+ fire.sync();
+ };
+ extension.on(ExtensionSearchHandler.MSG_INPUT_CANCELLED, listener);
+ return {
+ unregister() {
+ extension.off(ExtensionSearchHandler.MSG_INPUT_CANCELLED, listener);
+ },
+ convert(_fire) {
+ fire = _fire;
+ },
+ };
+ },
+ onInputEntered({ fire }) {
+ let { extension } = this;
+ let listener = (eventName, text, disposition) => {
+ fire.sync(text, disposition);
+ };
+ extension.on(ExtensionSearchHandler.MSG_INPUT_ENTERED, listener);
+ return {
+ unregister() {
+ extension.off(ExtensionSearchHandler.MSG_INPUT_ENTERED, listener);
+ },
+ convert(_fire) {
+ fire = _fire;
+ },
+ };
+ },
+ onInputChanged({ fire }) {
+ let { extension } = this;
+ let listener = (eventName, text, id) => {
+ fire.sync(text, id);
+ };
+ extension.on(ExtensionSearchHandler.MSG_INPUT_CHANGED, listener);
+ return {
+ unregister() {
+ extension.off(ExtensionSearchHandler.MSG_INPUT_CHANGED, listener);
+ },
+ convert(_fire) {
+ fire = _fire;
+ },
+ };
+ },
+ onDeleteSuggestion({ fire }) {
+ let { extension } = this;
+ let listener = (eventName, text) => {
+ fire.sync(text);
+ };
+ extension.on(ExtensionSearchHandler.MSG_INPUT_DELETED, listener);
+ return {
+ unregister() {
+ extension.off(ExtensionSearchHandler.MSG_INPUT_DELETED, listener);
+ },
+ convert(_fire) {
+ fire = _fire;
+ },
+ };
+ },
+ };
+
+ onManifestEntry(entryName) {
+ let { extension } = this;
+ let { manifest } = extension;
+
+ let keyword = manifest.omnibox.keyword;
+ try {
+ // This will throw if the keyword is already registered.
+ ExtensionSearchHandler.registerKeyword(keyword, extension);
+ this.keyword = keyword;
+ } catch (e) {
+ extension.manifestError(e.message);
+ }
+ }
+
+ onShutdown() {
+ ExtensionSearchHandler.unregisterKeyword(this.keyword);
+ }
+
+ getAPI(context) {
+ return {
+ omnibox: {
+ setDefaultSuggestion: suggestion => {
+ try {
+ // This will throw if the keyword failed to register.
+ ExtensionSearchHandler.setDefaultSuggestion(
+ this.keyword,
+ suggestion
+ );
+ } catch (e) {
+ return Promise.reject(e.message);
+ }
+ },
+
+ onInputStarted: new EventManager({
+ context,
+ module: "omnibox",
+ event: "onInputStarted",
+ extensionApi: this,
+ }).api(),
+
+ onInputCancelled: new EventManager({
+ context,
+ module: "omnibox",
+ event: "onInputCancelled",
+ extensionApi: this,
+ }).api(),
+
+ onInputEntered: new EventManager({
+ context,
+ module: "omnibox",
+ event: "onInputEntered",
+ extensionApi: this,
+ }).api(),
+
+ onInputChanged: new EventManager({
+ context,
+ module: "omnibox",
+ event: "onInputChanged",
+ extensionApi: this,
+ }).api(),
+
+ onDeleteSuggestion: new EventManager({
+ context,
+ module: "omnibox",
+ event: "onDeleteSuggestion",
+ extensionApi: this,
+ }).api(),
+
+ // Internal APIs.
+ addSuggestions: (id, suggestions) => {
+ try {
+ ExtensionSearchHandler.addSuggestions(
+ this.keyword,
+ id,
+ suggestions
+ );
+ } catch (e) {
+ // Silently fail because the extension developer can not know for sure if the user
+ // has already invalidated the callback when asynchronously providing suggestions.
+ }
+ },
+ },
+ };
+ }
+};