b2g/components/ContentRequestHelper.jsm
author Tyler Maklebust <maklebus@msu.edu>
Mon, 19 Dec 2016 21:10:54 -0500
changeset 325625 550922e8b2234ceb7bd8eb1e738c14ff8bff56ee
parent 187425 8a38d3372bf2c525802e46ccd368abb60f04dc2f
permissions -rw-r--r--
Bug 1309935 - Add ability to find within select dropdown when over 40 elements. r?jaws, mconley, enndeakin Search implemented for select dropdown options. List navigation takes keyboard input as before, until search field is focused. Pref added to enable search (dom.forms.selectSearch). Task added to test search functionality. MozReview-Commit-ID: BiKRvNbQnxx

/* 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";

this.EXPORTED_SYMBOLS = ["ContentRequestHelper"];

const { interfaces: Ci, utils: Cu } = Components;

Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Promise.jsm");

XPCOMUtils.defineLazyServiceGetter(this, "uuidgen",
                                   "@mozilla.org/uuid-generator;1",
                                   "nsIUUIDGenerator");

XPCOMUtils.defineLazyModuleGetter(this, "SystemAppProxy",
                                  "resource://gre/modules/SystemAppProxy.jsm");

function debug(msg) {
  // dump("ContentRequestHelper ** " + msg + "\n");
}

this.ContentRequestHelper = function() {
}

ContentRequestHelper.prototype = {

  contentRequest: function(aContentEventName, aChromeEventName,
                           aInternalEventName, aData) {
    let deferred = Promise.defer();

    let id = uuidgen.generateUUID().toString();

    SystemAppProxy.addEventListener(aContentEventName,
                                    function onContentEvent(result) {
      SystemAppProxy.removeEventListener(aContentEventName,
                                         onContentEvent);
      let msg = result.detail;
      if (!msg || !msg.id || msg.id != id) {
        deferred.reject("InternalErrorWrongContentEvent " +
                        JSON.stringify(msg));
        SystemAppProxy.removeEventListener(aContentEventName,
                                           onContentEvent);
        return;
      }

      debug("Got content event " + JSON.stringify(msg));

      if (msg.error) {
        deferred.reject(msg.error);
      } else {
        deferred.resolve(msg.result);
      }
    });

    let detail = {
       eventName: aInternalEventName,
       id: id,
       data: aData
    };
    debug("Send chrome event " + JSON.stringify(detail));
    SystemAppProxy._sendCustomEvent(aChromeEventName, detail);

    return deferred.promise;
  }
};