view chromeless-browsing/chromeless.js @ 7:c89423660272

Fixed execute of 'go' cmd to work in all cases.
author Atul Varma <varmaa@toolness.com>
date Fri, 27 Mar 2009 16:43:18 -0700
parents 96bb8d08e94a
children abe54fcda16c
line wrap: on
line source

var noun_type_url = {
  _name: "url",
  _getHistoryLinks: function(partialSearch, onSearchComplete) {
    function AutoCompleteInput(aSearches) {
      this.searches = aSearches;
    }
    AutoCompleteInput.prototype = {
      constructor: AutoCompleteInput,
      searches: null,
      minResultsForPopup: 0,
      timeout: 10,
      searchParam: "",
      textValue: "",
      disableAutoComplete: false,
      completeDefaultIndex: false,
      get searchCount() {
        return this.searches.length;
      },
      getSearchAt: function(aIndex) {
        return this.searches[aIndex];
      },
      onSearchBegin: function() {},
      onSearchComplete: function() {},
      popupOpen: false,
      popup: {
        setSelectedIndex: function(aIndex) {},
        invalidate: function() {},
        // nsISupports implementation
        QueryInterface: function(iid) {
          if (iid.equals(Ci.nsISupports) ||
              iid.equals(Ci.nsIAutoCompletePopup))
            return this;
          throw Components.results.NS_ERROR_NO_INTERFACE;
        }
      },
      // nsISupports implementation
      QueryInterface: function(iid) {
        if (iid.equals(Ci.nsISupports) ||
            iid.equals(Ci.nsIAutoCompleteInput))
          return this;
        throw Components.results.NS_ERROR_NO_INTERFACE;
      }
    };

    var controller = Cc["@mozilla.org/autocomplete/controller;1"]
                     .getService(Ci.nsIAutoCompleteController);
    var input = new AutoCompleteInput(["history"]);
    controller.input = input;
    input.onSearchComplete = function() {
      onSearchComplete(controller);
    };

    controller.startSearch(partialSearch);
  },
  _onSearchComplete: function(controller, callback) {
    var max_suggs = 5;
    for (var i = 0; i < controller.matchCount && i <= max_suggs; i++) {
      var result = {
        title: controller.getCommentAt(i),
        url: controller.getValueAt(i),
        image: controller.getImageAt(i),
        style: controller.getStyleAt(i)
      };
      if (!result.title)
        result.title = result.url;
      if (result.image.indexOf("moz-anno:favicon:") == 0)
        result.image = result.image.slice("moz-anno:favicon:".length);
      else
        result.image = "";
      callback(CmdUtils.makeSugg(result.title, undefined, result));
    }
  },
  suggest: function(fragment, html, callback) {
    var self = this;
    this._getHistoryLinks(
      fragment,
      function(controller) {
        self._onSearchComplete(controller, callback);
      });
    return [CmdUtils.makeSugg(fragment)];
  }
};

CmdUtils.CreateCommand(
  {name: "go",
   takes: {
     "search terms": noun_type_url
   },
   preview: function(pblock, theWords) {
     if (theWords.text.length == 0) {
       pblock.innerHTML = "<b>Please enter a search term</b>";
       return;
     }
     var result = "";
     if (theWords.data) {
       if (theWords.data.image)
         result += ("<img src=\"" +
                    Utils.escapeHtml(theWords.data.image) +
                    "\"/> ");
       if (theWords.data.title != theWords.data.url)
         result += ("<i>" +
                    Utils.escapeHtml(theWords.data.title) +
                    "</i>");
       result += ("<p><tt>" +
                  Utils.escapeHtml(theWords.data.url) +
                  "</tt></p>");
     } else
       result = "Takes you to " + Utils.escapeHtml(theWords.text) + ".";
     pblock.innerHTML = result;
   },
   execute: function(theWords) {
     if (theWords.data)
       Utils.openUrlInBrowser(theWords.data.url);
     else
       Utils.openUrlInBrowser(theWords.text);
   }}
);

function cmd_show_tabs() {
  var content = context.chromeWindow.document.getElementById("appcontent");
  var browser = content.firstChild;
  var tabs = browser.tabContainer;
  tabs.style.height = "25px";
  tabs.style.marginTop = "0px";
}

function cmd_hide_tabs() {
  var content = context.chromeWindow.document.getElementById("appcontent");
  var browser = content.firstChild;
  var tabs = browser.tabContainer;
  tabs.style.height = "0px";
  tabs.style.marginTop = "-500px";
}