[or-cvs] r10467: ITS ALIVE!11 The Frankenpatching is a success. The patient l (in torbutton/trunk/src: . chrome/content components defaults/preferences)

mikeperry at seul.org mikeperry at seul.org
Sun Jun 3 05:42:21 UTC 2007


Author: mikeperry
Date: 2007-06-03 01:42:21 -0400 (Sun, 03 Jun 2007)
New Revision: 10467

Added:
   torbutton/trunk/src/components/
   torbutton/trunk/src/components/cookie-jar-selector.js
   torbutton/trunk/src/components/ignore-history.js
Modified:
   torbutton/trunk/src/chrome/content/torbutton.js
   torbutton/trunk/src/defaults/preferences/preferences.js
Log:
ITS ALIVE!11 The Frankenpatching is a success. The patient lives! Integrated
Collin Jackson's cookie jar and history wrappers. Also did some custom work to
tag tabs so that torbutton remembers if they were fetched via Tor or in the
clear, and disables javascript on those tabs that were fetched in an opposite
state to the current one, and renables it when state changes back. Pretty 
neat stuff.



Modified: torbutton/trunk/src/chrome/content/torbutton.js
===================================================================
--- torbutton/trunk/src/chrome/content/torbutton.js	2007-06-03 04:12:30 UTC (rev 10466)
+++ torbutton/trunk/src/chrome/content/torbutton.js	2007-06-03 05:42:21 UTC (rev 10467)
@@ -59,9 +59,6 @@
             case "network.proxy.type":
                 torbutton_set_status();
                 break;
-            case "extensions.torbutton.allow_plugins":
-                torbutton_set_plugin_status();
-                break;
         }
     }
 }
@@ -177,7 +174,6 @@
     torbutton_set_panel_view();
     torbutton_log(2, 'setting torbutton status from proxy prefs');
     torbutton_set_status();
-    torbutton_set_plugin_status();
     torbutton_log(2, 'init completed');
 }
 
@@ -401,18 +397,23 @@
     var sPrefix;
     var label;
     var tooltip;
+    
+    var torprefs = torbutton_get_prefbranch('extensions.torbutton.');
+    torprefs.setBoolPref('tor_enabled', mode);
 
     torbutton_log(2, 'called update_status('+mode+')');
     torbutton_update_toolbutton(mode);
     torbutton_update_statusbar(mode);
+    torbutton_update_plugin_status(!mode);
 
-    // XXX: hrmm..
-    var torprefs = torbutton_get_prefbranch('extensions.torbutton.');
     if (torprefs.getBoolPref('clear_history')) {
         ClearHistory();
     }
+
+    // XXX: Offer option of cookie jars vs clearing cookies
+    // Clearing cookies should be the default (Fuck cookies ;)
     if (torprefs.getBoolPref('clear_cookies')) {
-        ClearCookies();
+        ClearCookies(mode);
     }
 }
 
@@ -535,86 +536,93 @@
     hist.removeAllPages();    
 }
 
-function ClearCookies() {
+function ClearCookies(mode) {
     torbutton_log(2, 'called ClearCookies');
     var cm = Components.classes["@mozilla.org/cookiemanager;1"]
                     .getService(Components.interfaces.nsICookieManager);
-    cm.removeAll();
+    
+    // XXX: Check pref to fully clear or not
+    //cm.removeAll();
+
+    var selector =
+          Components.classes["@stanford.edu/cookie-jar-selector;1"]
+                    .getService(Components.interfaces.nsISupports)
+                    .wrappedJSObject;
+    if(mode) {
+        selector.saveCookies("nontor");
+        selector.clearCookies();
+    } else {
+        // Never save tor cookies
+        selector.clearCookies();
+        selector.loadCookies("nontor", false);
+    }
 }
 
 
-// -------------- PLUGIN HANDLING CODE ---------------------
+// -------------- JS/PLUGIN HANDLING CODE ---------------------
 
-function AllowWindowPlugins(win, onOff) {
-    torbutton_log(1, "AllowWindowPlugs "+onOff);
+function TagDocshellForJS(browser, allowed) {
+    if (typeof(browser.__tb_js_state) == 'undefined') {
+        //@JSD_BREAK
+        torbutton_log(5, "UNTAGGED WINDOW!!!!!!!!!");
+    }
+
+    if(browser.__tb_js_state == allowed) {
+        // States match, js ok 
+        browser.docShell.allowJavascript = 
+            m_prefs.getBoolPref("javascript.enabled");
+    } else {
+        // States differ or undefined, js not ok 
+        browser.docShell.allowJavascript = false;
+    }
+}
+
+function torbutton_allow_win_jsplugins(win, allowed) {
     var browser = win.getBrowser();
-   
-    browser.docShell.allowPlugins = onOff;
+
+    browser.docShell.allowPlugins = allowed;
+    TagDocshellForJS(browser, allowed);
+
     var browsers = browser.browsers;
 
     for (var i = 0; i < browsers.length; ++i) {
-        var b = browser.getBrowserAtIndex(i);
+        var b = browser.browsers[i];
         if (b) {
-            torbutton_log(1, " plugins1: " + b.docShell.allowPlugins);
-            b.docShell.allowPlugins = onOff;
-            torbutton_log(1, " plugins2: " + b.docShell.allowPlugins);
+            b.docShell.allowPlugins = allowed;
+            TagDocshellForJS(b, allowed);
         }
     }
 }
 
-function AllowPlugins(onOff) {
-    torbutton_log(1, "Plugins: "+onOff);
+// This is an ugly beast.. But unfortunately it has to be so..
+// Looping over all tabs twice is not somethign we wanna do..
+function torbutton_allow_jsplugins(allowed) {
+    torbutton_log(1, "Plugins: "+allowed);
     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                        .getService(Components.interfaces.nsIWindowMediator);
-    // XXX: Popupwindows? frames/iframes? Hidden iframes? bookmarklets?
+
     var enumerator = wm.getEnumerator("navigator:browser");
-    torbutton_log(1, "Plugins0: ");
     while(enumerator.hasMoreElements()) {
         var win = enumerator.getNext();
-        torbutton_log(1, "Plugins1");
-        AllowWindowPlugins(win, onOff);   
+        torbutton_allow_win_jsplugins(win, allowed);   
     }
 }
 
 function torbutton_init_pluginbutton() {
-    if(m_prefs.getBoolPref("extensions.torbutton.no_tor_plugins") 
-        && torbutton_check_status()) {
-        m_prefs.setBoolPref("extensions.torbutton.allow_plugins", false)
-    }
+    torbutton_update_plugin_status(!torbutton_check_status());
 }
 
-function torbutton_toggle_plugins() {
-    torbutton_log(1, 'called toggle_plugins()');
-    if (!m_wasinited) {
-        torbutton_init();
-    }
 
-    var tb = m_prefs.getBoolPref("extensions.torbutton.allow_plugins");
-    m_prefs.setBoolPref("extensions.torbutton.allow_plugins", !tb);
-}
-
-function torbutton_set_plugin_status() {
-    if (!m_wasinited) {
-        torbutton_init();
-    }
-
-    if (m_prefs.getBoolPref("extensions.torbutton.allow_plugins")) {
-        torbutton_log(1,'plugins are enabled');
-        torbutton_update_plugin_status(1);
-    } else {
-        torbutton_log(1,'plugins are disabled');
-        torbutton_update_plugin_status(0);
-    }
-}
-
 function torbutton_update_plugin_status(nMode) {
     torbutton_log(2, 'called update_plugin_status('+nMode+')');
     if (!window.statusbar.visible)
         return;
     torbutton_log(2, 'visible statusbar: ('+nMode+')');
     var o_stringbundle = torbutton_get_stringbundle();
+    var override = !m_prefs.getBoolPref("extensions.torbutton.no_tor_plugins");
+    var tooltip;
 
-    var tooltip;    
+    if(override) nMode = true;
 
     if(nMode) {
         tooltip = o_stringbundle.GetStringFromName("torbutton.panel.plugins.enabled");
@@ -622,14 +630,18 @@
         tooltip = o_stringbundle.GetStringFromName("torbutton.panel.plugins.disabled");
     }
   
-    // FIXME: hrmm.. consider changing this value
+    // FIXME: hrmm.. consider caching this value
     document.getElementById("plugins-status").setAttribute("status", nMode ?  "1" : "0");
     document.getElementById("plugins-status").setAttribute('tooltiptext', tooltip);
 
+    if(override) return;
+
+    // XXX: Don't set these to true if user had it off to begin with!
     m_prefs.setBoolPref("security.enable_java", nMode);
-    AllowPlugins(nMode);
+    m_prefs.setBoolPref("extensions.update.enabled", nMode);
     
-    torbutton_log(2, 'javascript toggled');
+    // FIXME: Allow option to kill all JS during tor usage. 
+    torbutton_allow_jsplugins(nMode);
 }
 
 // ---------------------- Event handlers -----------------
@@ -641,14 +653,16 @@
 
     // Fucking garbage.. event is delivered to the current tab, not the 
     // newly created one. Need to traverse the current window for it.
-    if(!m_prefs.getBoolPref("extensions.torbutton.allow_plugins")) {
+    if(m_prefs.getBoolPref("extensions.torbutton.tor_enabled") 
+            && m_prefs.getBoolPref("extensions.torbutton.no_tor_plugins")) {
         var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
-                   .getService(Components.interfaces.nsIWindowMediator);
+            .getService(Components.interfaces.nsIWindowMediator);
         var browserWindow = wm.getMostRecentWindow("navigator:browser");  
-        AllowWindowPlugins(browserWindow, false);
+        torbutton_allow_win_jsplugins(browserWindow, false);
     }
 }
 
+// XXX: Does this get the first window?
 function NewWindowEvent(event)
 {
     if (!m_wasinited) {
@@ -656,10 +670,16 @@
     }
     torbutton_log(1, "New window");
 
-    if(!m_prefs.getBoolPref("extensions.torbutton.allow_plugins")) {
-        getBrowser().docShell.allowPlugins = false;
+    if (torbutton_check_status()) {
+        if(m_prefs.getBoolPref("extensions.torbutton.no_tor_plugins")) {
+            getBrowser().docShell.allowPlugins = false;
+        }
+        TagDocshellForJS(getBrowser(), false, false);
+    } else {
+        TagDocshellForJS(getBrowser(), true, true);
     }
 
+
     getBrowser().addProgressListener(myListener,
       Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT|
       Components.interfaces.nsIWebProgress.NOTIFY_LOCATION);
@@ -698,14 +718,36 @@
     if (!m_wasinited) {
         torbutton_init();
     }
-    if(!m_prefs.getBoolPref('extensions.torbutton.kill_bad_js'))
-        return;
+
     if(typeof(win.__tb_did_hook) != 'undefined')
         return; // Ran already
+    
+    win.__tb_did_hook = true;
 
-    win.__tb_did_hook = true;
+    torbutton_log(1, "JS to be set to: " +m_prefs.getBoolPref("javascript.enabled"));
+    var browser = getBrowser();
+    var tor_tag = !m_prefs.getBoolPref("extensions.torbutton.tor_enabled");
+    var js_enabled = m_prefs.getBoolPref("javascript.enabled");
+
+    // Find proper browser for this document.. ugh.
+    for (var i = 0; i < browser.browsers.length; ++i) {
+        var b = browser.browsers[i];
+        if (b && b.contentDocument == doc) {
+            b.__tb_js_state = tor_tag;
+            b.docShell.allowJavascript = js_enabled;
+        }
+    }
+
+    torbutton_log(1, "JS set to: " 
+        + m_prefs.getBoolPref("javascript.enabled"));
+
+    // No need to hook js if tor is off, right?
+    if(!m_prefs.getBoolPref("extensions.torbutton.tor_enabled") 
+            || !m_prefs.getBoolPref('extensions.torbutton.kill_bad_js'))
+        return;
+
     var str = "<"+"script>";
-    str += m_jshooks; // XXX: dne
+    str += m_jshooks; 
 //    str +="alert(\"hi\");";
     str += "</"+"script>";
     var d = doc.createElement("div");
@@ -728,7 +770,7 @@
   },
 
   onStateChange: function(aProgress, aRequest, aFlag, aStatus)
-  { torbutton_log(1, 'State change()'); return 0; },
+  { /*torbutton_log(1, 'State change()'); */return 0; },
 
   onLocationChange: function(aProgress, aRequest, aURI)
   {
@@ -749,17 +791,16 @@
   },
 
   onProgressChange: function(webProgress, request, curSelfProgress, maxSelfProgress, curTotalProgress, maxTotalProgress) 
-  { torbutton_log(1, 'called progressChange'); return 0; },
+  { /* torbutton_log(1, 'called progressChange'); */ return 0; },
   
   onStatusChange: function() 
-  { torbutton_log(1, 'called statusChange'); return 0; },
+  { /*torbutton_log(1, 'called statusChange'); */ return 0; },
   
   onSecurityChange: function() {return 0;},
   
   onLinkIconAvailable: function() 
-  { torbutton_log(1, 'called linkIcon'); return 0; }
+  { /*torbutton_log(1, 'called linkIcon'); */ return 0; }
 }
 
 
-
 //vim:set ts=4

Added: torbutton/trunk/src/components/cookie-jar-selector.js
===================================================================
--- torbutton/trunk/src/components/cookie-jar-selector.js	                        (rev 0)
+++ torbutton/trunk/src/components/cookie-jar-selector.js	2007-06-03 05:42:21 UTC (rev 10467)
@@ -0,0 +1,175 @@
+/*************************************************************************
+ * Cookie Jar Selector (JavaScript XPCOM component)
+ * Enables selection of separate cookie jars for (more) anonymous browsing.
+ * Designed as a component of FoxTor, http://cups.cs.cmu.edu/foxtor/
+ * Copyright 2006, distributed under the same (open source) license as FoxTor
+ *   - XXX: ??? Which license is this? Unspecified on website/src! 
+ *
+ * Contributor(s):
+ *         Collin Jackson <mozilla at collinjackson.com>
+ *
+ *************************************************************************/
+
+// Module specific constants
+const kMODULE_NAME = "Cookie Jar Selector";
+const kMODULE_CONTRACTID = "@stanford.edu/cookie-jar-selector;1";
+const kMODULE_CID = Components.ID("e6204253-b690-4159-bfe8-d4eedab6b3be");
+
+function CookieJarSelector() {
+  var Cc = Components.classes;
+  var Ci = Components.interfaces;
+
+  var getProfileFile = function(filename) {
+    var loc = "ProfD";  // profile directory
+    var file = 
+      Cc["@mozilla.org/file/directory_service;1"]
+      .getService(Ci.nsIProperties)
+      .get(loc, Ci.nsILocalFile)
+      .clone();
+    file.append(filename); 
+    return file;
+  };
+
+  var copyProfileFile = function(src, dest) {
+    var srcfile = getProfileFile(src);    
+    var destfile = getProfileFile(dest);
+    if (srcfile.exists()) {
+      if (destfile.exists()) {
+        destfile.remove(false);
+      }
+      srcfile.copyTo(null, dest);
+    }
+  };
+
+  var moveProfileFile = function(src, dest) { // XXX: Why does this not work?
+    var srcfile = getProfileFile(src);    
+    var destfile = getProfileFile(dest);
+    if (srcfile.exists()) {
+      if (destfile.exists()) {
+        destfile.remove(false);
+      }
+      srcfile.moveTo(null, dest);
+    }
+  };
+
+  this.clearCookies = function() {
+    Cc["@mozilla.org/cookiemanager;1"]
+    .getService(Ci.nsICookieManager)
+    .removeAll();
+  }
+
+  this.saveCookies = function(name) {
+    copyProfileFile("cookies.txt", "cookies-" + name + ".txt");
+  };
+
+  this.loadCookies = function(name, deleteSavedCookieJar) {
+    var cookieManager =
+      Cc["@mozilla.org/cookiemanager;1"]
+      .getService(Ci.nsICookieManager);
+    cookieManager.QueryInterface(Ci.nsIObserver);
+
+    // Tell the cookie manager to unload cookies from memory and disk
+    var context = "shutdown-cleanse"; 
+    cookieManager.observe(this, "profile-before-change", context);
+
+    // Replace the cookies.txt file with the loaded data
+    var fn = deleteSavedCookieJar ? moveProfileFile : copyProfileFile;
+    fn("cookies-" + name + ".txt", "cookies.txt");
+
+    // Tell the cookie manager to reload cookies from disk
+    cookieManager.observe(this, "profile-do-change", context);
+  };
+
+  // This JSObject is exported directly to chrome
+  this.wrappedJSObject = this;
+}
+
+/**
+ * JS XPCOM component registration goop:
+ *
+ * Everything below is boring boilerplate and can probably be ignored.
+ */
+
+const nsISupports = Components.interfaces.nsISupports;
+const nsIClassInfo = Components.interfaces.nsIClassInfo;
+const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar;
+const nsIObserverService = Components.interfaces.nsIObserverService;
+
+CookieJarSelector.prototype =
+{
+  QueryInterface: function(iid)
+  {
+    if (!iid.equals(nsIClassInfo) &&
+        !iid.equals(nsISupports))
+      throw Components.results.NS_ERROR_NO_INTERFACE;
+    return this;
+  },
+
+  wrappedJSObject: null,  // Initialized by constructor
+
+  // make this an nsIClassInfo object
+  flags: nsIClassInfo.DOM_OBJECT,
+
+  // method of nsIClassInfo
+  classDescription: "CookieJarSelector",
+
+  // method of nsIClassInfo
+  getInterfaces: function(count) {
+    var interfaceList = [nsIClassInfo];
+    count.value = interfaceList.length;
+    return interfaceList;
+  },
+
+  // method of nsIClassInfo
+  getHelperForLanguage: function(count) { return null; },
+
+}
+
+var CookieJarSelectorFactory = new Object();
+
+CookieJarSelectorFactory.createInstance = function (outer, iid)
+{
+  if (outer != null)
+    throw Components.results.NS_ERROR_NO_AGGREGATION;
+
+  if (!iid.equals(nsIClassInfo) &&
+      !iid.equals(nsISupports))
+    throw Components.results.NS_ERROR_NO_INTERFACE;
+
+  return new CookieJarSelector();
+}
+
+var CookieJarSelectorModule = new Object();
+
+CookieJarSelectorModule.registerSelf = 
+function (compMgr, fileSpec, location, type)
+{
+  compMgr = compMgr.QueryInterface(nsIComponentRegistrar);
+  compMgr.registerFactoryLocation(kMODULE_CID,
+                                  kMODULE_NAME,
+                                  kMODULE_CONTRACTID,
+                                  fileSpec, 
+                                  location, 
+                                  type);
+}
+
+CookieJarSelectorModule.getClassObject = function (compMgr, cid, iid)
+{
+  if (!cid.equals(kMODULE_CID))
+    throw Components.results.NS_ERROR_NO_INTERFACE;
+
+  if (!iid.equals(Components.interfaces.nsIFactory))
+    throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+    
+  return CookieJarSelectorFactory;
+}
+
+CookieJarSelectorModule.canUnload = function (compMgr)
+{
+  return true;
+}
+
+function NSGetModule(compMgr, fileSpec)
+{
+  return CookieJarSelectorModule;
+}

Added: torbutton/trunk/src/components/ignore-history.js
===================================================================
--- torbutton/trunk/src/components/ignore-history.js	                        (rev 0)
+++ torbutton/trunk/src/components/ignore-history.js	2007-06-03 05:42:21 UTC (rev 10467)
@@ -0,0 +1,162 @@
+/*************************************************************************
+ * Ignore History (JavaScript XPCOM component)
+ * Disables reading and writing history. This component is implemented as a
+ * wrapper around the true history object that sometimes lies about isVisited
+ * queries and sometimes ignores addURI commands.
+ * Designed as a component of FoxTor, http://cups.cs.cmu.edu/foxtor/
+ * Copyright 2006, distributed under the same (open source) license as FoxTor
+ *   - XXX: ??? Which license is this? Unspecified on website/src! 
+ *
+ * Contributor(s):
+ *         Collin Jackson <mozilla at collinjackson.com>
+ *
+ *************************************************************************/
+
+// Module specific constants
+const kTORBUTTON_STATUS_PREF = "extensions.torbutton.tor_enabled";
+const kSTATUS_THRESHOLD = 300;  // ignore history if status >= threshold
+const kMODULE_NAME = "Ignore History";
+const kMODULE_CONTRACTID = "@mozilla.org/browser/global-history;2";
+const kMODULE_CID = Components.ID("bc666d45-a9a1-4096-9511-f6db6f686881");
+
+/* Mozilla defined interfaces */
+const kREAL_HISTORY_CID = "{59648a91-5a60-4122-8ff2-54b839c84aed}";
+const kREAL_HISTORY = Components.classesByID[kREAL_HISTORY_CID];
+const kHistoryInterfaces = [ "nsIBrowserHistory", "nsIGlobalHistory2" ];
+
+function HistoryWrapper() {
+  this._history = function() {
+    var history = kREAL_HISTORY.getService();
+    for (var i = 0; i < kHistoryInterfaces.length; i++) {
+      history.QueryInterface(Components.interfaces[kHistoryInterfaces[i]]);
+    }
+    return history;
+  };
+}
+
+HistoryWrapper.prototype =
+{
+  QueryInterface: function(iid) {
+
+    if (iid.equals(Components.interfaces.nsISupports)) {
+      return this;
+    }
+
+    var history = this._history().QueryInterface(iid);
+    this.copyMethods(history);
+    return this;
+  },
+
+  /*
+   * Determine whether we should hide visited links
+   */
+  getIgnoreHistoryPref: function() {
+    return Components.classes["@mozilla.org/preferences-service;1"]
+                     .getService(Components.interfaces.nsIPrefBranch)
+                     .getBoolPref(kTORBUTTON_STATUS_PREF);
+  },
+
+  /* 
+   * Copies methods from the true history object we are wrapping
+   */
+  copyMethods: function(history) {
+    var mimic = function(obj, method) {
+      obj[method] = function(a, b, c, d, e, f, g) {
+        history[method](a, b, c, d, e, f, g);
+      };
+    };
+    for (var method in history) {
+      if(typeof(this[method]) == "undefined") mimic(this, method);
+    }
+  },
+
+  /* 
+   * Maybe lie about whether link was visited
+   */ 
+  isVisited: function(aURI) {
+    return (!this.getIgnoreHistoryPref() && 
+            this._history().isVisited(aURI));
+  },
+
+  /*
+   * Maybe add the URI to the history
+   */
+  addURI: function(aURI, redirect, toplevel, referrer) { 
+    // XXX: make it possible to make history writeonly.     
+    if(!this.getIgnoreHistoryPref())
+      this._history().addURI(aURI, redirect, toplevel, referrer);
+  },
+
+  /*
+   * Maybe set the title of a URI in the history
+   */
+  setPageTitle: function(URI, title) {
+    if(!this.getIgnoreHistoryPref())
+      this._history().setPageTitle(URI, title);
+  },
+
+  count getter: function() { return this._history().count; },
+};
+ 
+var HistoryWrapperSingleton = null;
+var HistoryWrapperFactory = new Object();
+
+HistoryWrapperFactory.createInstance = function (outer, iid)
+{
+  if (outer != null)
+    throw Components.results.NS_ERROR_NO_AGGREGATION;
+
+  if (!iid.equals(Components.interfaces.nsIGlobalHistory2) &&
+      !iid.equals(Components.interfaces.nsIBrowserHistory) &&
+      !iid.equals(Components.interfaces.nsISupports))
+    throw Components.results.NS_ERROR_NO_INTERFACE;
+
+  if(!HistoryWrapperSingleton)
+    HistoryWrapperSingleton = new HistoryWrapper();
+
+  return HistoryWrapperSingleton;
+};
+
+
+/**
+ * JS XPCOM component registration goop:
+ *
+ * Everything below is boring boilerplate and can probably be ignored.
+ */
+
+var HistoryWrapperModule = new Object();
+
+// XXX: Interesting.. Can we more easily override Date this way?
+HistoryWrapperModule.registerSelf = 
+function (compMgr, fileSpec, location, type){
+  var nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar;
+  compMgr = compMgr.QueryInterface(nsIComponentRegistrar);
+  compMgr.registerFactoryLocation(kMODULE_CID,
+                                  kMODULE_NAME,
+                                  kMODULE_CONTRACTID,
+                                  fileSpec, 
+                                  location, 
+                                  type);
+};
+
+HistoryWrapperModule.getClassObject = function (compMgr, cid, iid)
+{
+  if (!cid.equals(kMODULE_CID))
+    throw Components.results.NS_ERROR_NO_INTERFACE;
+
+  if (!iid.equals(Components.interfaces.nsIFactory))
+    throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+    
+  return HistoryWrapperFactory;
+};
+
+HistoryWrapperModule.canUnload = function (compMgr)
+{
+  return true;
+};
+
+function NSGetModule(compMgr, fileSpec)
+{
+  return HistoryWrapperModule;
+}
+

Modified: torbutton/trunk/src/defaults/preferences/preferences.js
===================================================================
--- torbutton/trunk/src/defaults/preferences/preferences.js	2007-06-03 04:12:30 UTC (rev 10466)
+++ torbutton/trunk/src/defaults/preferences/preferences.js	2007-06-03 05:42:21 UTC (rev 10467)
@@ -38,7 +38,7 @@
 pref("extensions.{e0204bd5-9d31-402b-a99d-a6aa8ffebdca}.description", "chrome://torbutton/locale/torbutton.properties");
 // XXX: Hrmm, what is the convention for above? do some of these belong in 
 // 'saved'?
-pref("extensions.torbutton.allow_plugins",true);
+pref("extensions.torbutton.tor_enabled",false);
 pref("extensions.torbutton.no_tor_plugins",true);
 pref("extensions.torbutton.clear_cookies",true);
 pref("extensions.torbutton.clear_history",false);



More information about the tor-commits mailing list