forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			177 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* -*- 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.
 | 
						|
          }
 | 
						|
        },
 | 
						|
      },
 | 
						|
    };
 | 
						|
  }
 | 
						|
};
 |