changeset 4:fd988ee76408

Added chromeless browsing feed.
author Atul Varma <varmaa@toolness.com>
date Fri, 27 Mar 2009 13:16:11 -0700
parents 7ac908bdb3d3
children 96bb8d08e94a
files chromeless-browsing/chromeless.js chromeless-browsing/index.html
diffstat 2 files changed, 152 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chromeless-browsing/chromeless.js	Fri Mar 27 13:16:11 2009 -0700
@@ -0,0 +1,140 @@
+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);
+  },
+  suggestions: [],
+  _onSearchComplete: function(controller) {
+    var suggs = [];
+    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 = "";
+      suggs.push(CmdUtils.makeSugg(result.title, undefined, result));
+    }
+    noun_type_url.suggestions = suggs;
+  },
+  suggest: function(fragment) {
+    this._getHistoryLinks(fragment, this._onSearchComplete);
+    var regexp = /(ftp|http|https):\/\/(\w+:{01}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
+    // Magic words "page" or "url" result in the URL of the current page
+    if (fragment == "page" || fragment == "url") {
+      var url = Application.activeWindow.activeTab.document.URL;
+      this.suggestions.push(CmdUtils.makeSugg(url));
+    }
+    // If it's a valid URL, suggest it back
+    if (regexp.test(fragment)) {
+      this.suggestions.push(CmdUtils.makeSugg(fragment));
+    } else if (regexp.test("http://" + fragment)) {
+      this.suggestions.push(CmdUtils.makeSugg("http://" + fragment));
+    }
+    return this.suggestions;
+  }
+};
+
+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) {
+     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";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chromeless-browsing/index.html	Fri Mar 27 13:16:11 2009 -0700
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+  <link rel="commands" href="chromeless.js"/>
+  <title>Atul's Chromeless Browsing Commands</title>
+</head>
+<body>
+This feed contains commands relevant to chromeless browsing.
+</body>
+</html>