[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] r10648: Add nsIContentPolicy to block cross tor-state CSS popups and (in torbutton/trunk/src: . chrome/content chrome/locale/en-US components defaults/preferences)
Author: mikeperry
Date: 2007-06-18 02:01:34 -0400 (Mon, 18 Jun 2007)
New Revision: 10648
Added:
torbutton/trunk/src/components/cssblocker.js
Modified:
torbutton/trunk/src/chrome/content/jshooks.js
torbutton/trunk/src/chrome/content/preferences.js
torbutton/trunk/src/chrome/content/preferences.xul
torbutton/trunk/src/chrome/content/torbutton.js
torbutton/trunk/src/chrome/locale/en-US/torbutton.dtd
torbutton/trunk/src/components/ignore-history.js
torbutton/trunk/src/defaults/preferences/preferences.js
torbutton/trunk/src/install.rdf
Log:
Add nsIContentPolicy to block cross tor-state CSS popups and
to act as safety net for all cross-state content other
mechanisms do not catch. Also added code to set a windows
firefox useragent during Tor usage, so everyone's browser
appears uniform. We are now feature-complete, AFAIK.
Also Change versioning to reject tbird and old FF versions.
Modified: torbutton/trunk/src/chrome/content/jshooks.js
===================================================================
--- torbutton/trunk/src/chrome/content/jshooks.js 2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/content/jshooks.js 2007-06-18 06:01:34 UTC (rev 10648)
@@ -4,16 +4,17 @@
alert("Error, double jshook!");
return;
}
-
+
/* TODO: It might be a good idea to hook window sizes also..
But that will almost certainly fuck with rendering.. Maybe set
user's window to a fixed size? */
/* Hrmm.. Is it possible this breaks plugin install or other weird shit
for non-windows OS's? */
- /* XXX: navigator.userAgent? navigator.plugins? */
- navigator.__defineGetter__("platform", function() { return "Windows";});
- navigator.__defineGetter__("oscpu", function() { return "Win32 i686";});
+ if(__tb_set_uagent) {
+ var tmp_oscpu = __tb_oscpu;
+ navigator.__defineGetter__("oscpu", function() { return tmp_oscpu;});
+ }
/* Timezone fix for http://gemal.dk/browserspy/css.html */
var reparseDate = function(d, str) {
@@ -154,6 +155,8 @@
if (__HookObjects) {
__HookObjects();
__HookObjects = undefined;
+ __tb_set_uagent = undefined;
+ __tb_oscpu = undefined;
/* XXX: Removeme */
window.__tb_hooks_ran = true;
}
Modified: torbutton/trunk/src/chrome/content/preferences.js
===================================================================
--- torbutton/trunk/src/chrome/content/preferences.js 2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/content/preferences.js 2007-06-18 06:01:34 UTC (rev 10648)
@@ -166,8 +166,10 @@
doc.getElementById('torbutton_blockTorHWrite').checked = o_torprefs.getBoolPref('block_thwrite');
doc.getElementById('torbutton_blockNonTorHRead').checked = o_torprefs.getBoolPref('block_nthread');
doc.getElementById('torbutton_blockNonTorHWrite').checked = o_torprefs.getBoolPref('block_nthwrite');
+ doc.getElementById('torbutton_isolateContent').checked = o_torprefs.getBoolPref('isolate_content');
doc.getElementById('torbutton_noSearch').checked = o_torprefs.getBoolPref('no_search');
doc.getElementById('torbutton_noUpdates').checked = o_torprefs.getBoolPref('no_updates');
+ doc.getElementById('torbutton_setUagent').checked = o_torprefs.getBoolPref('set_uagent');
torbutton_prefs_set_field_attributes(doc);
}
@@ -210,6 +212,7 @@
o_torprefs.setBoolPref('no_tor_plugins', doc.getElementById('torbutton_disablePlugins').checked);
o_torprefs.setBoolPref('clear_history', doc.getElementById('torbutton_clearHistory').checked);
o_torprefs.setBoolPref('kill_bad_js', doc.getElementById('torbutton_killBadJS').checked);
+ o_torprefs.setBoolPref('isolate_content', doc.getElementById('torbutton_isolateContent').checked);
o_torprefs.setBoolPref('clear_cache', doc.getElementById('torbutton_clearCache').selected);
o_torprefs.setBoolPref('block_cache', doc.getElementById('torbutton_blockCache').selected);
@@ -222,6 +225,8 @@
o_torprefs.setBoolPref('block_nthwrite', doc.getElementById('torbutton_blockNonTorHWrite').checked);
o_torprefs.setBoolPref('no_search', doc.getElementById('torbutton_noSearch').checked);
o_torprefs.setBoolPref('no_updates', doc.getElementById('torbutton_noUpdates').checked);
+
+ o_torprefs.setBoolPref('set_uagent', doc.getElementById('torbutton_setUagent').checked);
// if tor settings were initially active, update the active settings to reflect any changes
if (tor_enabled) torbutton_activate_tor_settings();
Modified: torbutton/trunk/src/chrome/content/preferences.xul
===================================================================
--- torbutton/trunk/src/chrome/content/preferences.xul 2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/content/preferences.xul 2007-06-18 06:01:34 UTC (rev 10648)
@@ -114,16 +114,19 @@
<caption label="&torbutton.prefs.sec_settings;"/>
<tabbox>
<tabs>
- <tab label="&torbutton.prefs.js_plugins;"/>
+ <tab label="&torbutton.prefs.dynamic;"/>
<tab label="&torbutton.prefs.cookies;"/>
<tab label="&torbutton.prefs.cache;"/>
<tab label="&torbutton.prefs.history;"/>
+ <tab label="&torbutton.prefs.uagent;"/>
</tabs>
<tabpanels>
<tabpanel id="plugins">
<vbox>
<checkbox id="torbutton_disablePlugins" label="&torbutton.prefs.disable_plugins;"
oncommand="torbutton_prefs_set_field_attributes(document)"/>
+ <checkbox id="torbutton_isolateContent" label="&torbutton.prefs.isolate_content;"
+ oncommand="torbutton_prefs_set_field_attributes(document)"/>
<checkbox id="torbutton_killBadJS" label="&torbutton.prefs.kill_bad_js;"
oncommand="torbutton_prefs_set_field_attributes(document)"/>
<checkbox id="torbutton_noUpdates" label="&torbutton.prefs.no_updates;"
@@ -169,6 +172,13 @@
oncommand="torbutton_prefs_set_field_attributes(document)"/>
</vbox>
</tabpanel>
+ <tabpanel id="uagent">
+ <vbox>
+ <checkbox id="torbutton_setUagent" label="&torbutton.prefs.set_uagent;"
+ oncommand="torbutton_prefs_set_field_attributes(document)"/>
+ </vbox>
+ </tabpanel>
+
</tabpanels>
</tabbox>
</groupbox>
Modified: torbutton/trunk/src/chrome/content/torbutton.js
===================================================================
--- torbutton/trunk/src/chrome/content/torbutton.js 2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/content/torbutton.js 2007-06-18 06:01:34 UTC (rev 10648)
@@ -1,17 +1,4 @@
-// XXX unresolved security issues:
-// - http://www.w3.org/TR/REC-CSS2/selector.html#dynamic-pseudo-classes
-// - Create an nsIContentPolicy based on tor tag state.
-// - can CSS create popups? a cached fetch may not go through content
-// policy, open an (untagged/safe tagged) window, and fetch some urls
-// - Clearing cache on tor state change blocks this, but worth
-// investigating
-// - http://meyerweb.com/eric/css/edge/popups/demo.html
-// - http://meyerweb.com/eric/css/edge/popups/demo2.html
-// - http://www.tjkdesign.com/articles/css%20pop%20ups/default.asp
-// - http://www.brunildo.org/test/CPop.html
-// - http://www.brunildo.org/test/cssPopMenus.html
-// - http://bucarotechelp.com/design/csseasy/97112700.asp
-//
+// TODO: check for leaks: http://www.mozilla.org/scriptable/avoiding-leaks.html
// status
var m_wasinited = false;
@@ -175,7 +162,7 @@
if (!m_wasinited) {
// Runs every time a new window is opened
m_prefs = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
+ .getService(Components.interfaces.nsIPrefBranch);
torbutton_init_jshooks();
@@ -415,10 +402,39 @@
var changed = (torprefs.getBoolPref('tor_enabled') != mode);
torprefs.setBoolPref('tor_enabled', mode);
- torbutton_log(2, 'called update_status('+mode+')');
+ torbutton_log(2, 'called update_status: '+mode);
torbutton_update_toolbutton(mode);
torbutton_update_statusbar(mode);
+ if(torprefs.getBoolPref("set_uagent")) {
+ if(mode) {
+ m_prefs.setCharPref("general.appname.override",
+ torprefs.getCharPref("appname_override"));
+
+ m_prefs.setCharPref("general.appversion.override",
+ torprefs.getCharPref("appversion_override"));
+
+ m_prefs.setCharPref("general.platform.override",
+ torprefs.getCharPref("platform_override"));
+
+ m_prefs.setCharPref("general.useragent.override",
+ torprefs.getCharPref("useragent_override"));
+
+ m_prefs.setCharPref("general.useragent.vendor",
+ torprefs.getCharPref("useragent_vendor"));
+
+ m_prefs.setCharPref("general.useragent.vendorSub",
+ torprefs.getCharPref("useragent_vendorSub"));
+ } else {
+ m_prefs.clearUserPref("general.appname.override");
+ m_prefs.clearUserPref("general.appversion.override");
+ m_prefs.clearUserPref("general.platform.override");
+ m_prefs.clearUserPref("general.useragent.override");
+ m_prefs.clearUserPref("general.useragent.vendor");
+ m_prefs.clearUserPref("general.useragent.vendorSub");
+ }
+ }
+
// this function is called every time there is a new window! Alot of this
// stuff expects to be called on toggle only.. like the cookie jars and
// history/cookie clearing
@@ -435,10 +451,16 @@
if (torprefs.getBoolPref('block_cache')) {
m_prefs.setBoolPref("browser.cache.memory.enable", !mode);
- m_prefs.setBoolPref("browser.cache.disk.enable", !mode);
m_prefs.setBoolPref("network.http.use-cache", !mode);
}
+ // Always block disk cache during Tor. We clear it on toggle,
+ // so no need to keep it around for someone to rifle through.
+ m_prefs.setBoolPref("browser.cache.disk.enable", !mode);
+
+ // Always, always disable remote "safe browsing" lookups.
+ m_prefs.setBoolPref("browser.safebrowsing.remoteLookups", false);
+
if (torprefs.getBoolPref("no_search")) {
m_prefs.setBoolPref("browser.search.suggest.enabled", !mode);
}
@@ -448,7 +470,7 @@
}
torbutton_toggle_jsplugins(!mode,
- torprefs.getBoolPref("kill_bad_js"),
+ torprefs.getBoolPref("isolate_content"),
torprefs.getBoolPref("no_tor_plugins"));
// TODO: Investigate Firefox privacy clear-data settings..
@@ -631,11 +653,11 @@
}
}
-function torbutton_toggle_win_jsplugins(win, allowed, js_enabled, kill_js,
+function torbutton_toggle_win_jsplugins(win, allowed, js_enabled, isolate_js,
kill_plugins) {
var browser = win.getBrowser();
- if(kill_js) CheckDocshellTagForJS(browser, allowed, js_enabled);
+ if(isolate_js) CheckDocshellTagForJS(browser, allowed, js_enabled);
if(kill_plugins) browser.docShell.allowPlugins = allowed;
var browsers = browser.browsers;
@@ -644,7 +666,7 @@
var b = browser.browsers[i];
if (b) {
if(kill_plugins) b.docShell.allowPlugins = allowed;
- if(kill_js) CheckDocshellTagForJS(b, allowed, js_enabled);
+ if(isolate_js) CheckDocshellTagForJS(b, allowed, js_enabled);
// kill meta-refresh and existing page loading
b.webNavigation.stop(b.webNavigation.STOP_ALL);
}
@@ -653,16 +675,15 @@
// 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_toggle_jsplugins(allowed, kill_js, kill_plugins) {
+function torbutton_toggle_jsplugins(allowed, isolate_js, kill_plugins) {
torbutton_log(1, "Plugins: "+allowed);
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
+ var enumerator = wm.getEnumerator("navigator:browser");
var js_enabled = m_prefs.getBoolPref("javascript.enabled");
-
- var enumerator = wm.getEnumerator("navigator:browser");
while(enumerator.hasMoreElements()) {
var win = enumerator.getNext();
- torbutton_toggle_win_jsplugins(win, allowed, js_enabled, kill_js,
+ torbutton_toggle_win_jsplugins(win, allowed, js_enabled, isolate_js,
kill_plugins);
}
}
@@ -689,7 +710,7 @@
var browser = event.currentTarget;
TagNewBrowser(browser, tor_tag, no_plugins);
-
+
// Fucking garbage.. event is delivered to the current tab, not the
// newly created one. Need to traverse the current window for it.
for (var i = 0; i < browser.browsers.length; ++i) {
@@ -761,6 +782,7 @@
var tor_tag = !m_prefs.getBoolPref("extensions.torbutton.tor_enabled");
var js_enabled = m_prefs.getBoolPref("javascript.enabled");
+ // TODO: try nsIWindowWatcher.getChromeForWindow()
if (browser.contentDocument == doc) {
browser.__tb_js_state = tor_tag;
browser.docShell.allowJavascript = js_enabled;
@@ -777,7 +799,7 @@
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'))
@@ -790,7 +812,9 @@
* A: Negatory.. Date() is not an XPCOM component :(
*/
- var str = "<"+"script>";
+ var str = "<"+"script>\r\n";
+ str += "var __tb_set_uagent="+m_prefs.getBoolPref('extensions.torbutton.set_uagent')+";\r\n";
+ str += "var __tb_oscpu=\""+m_prefs.getCharPref('extensions.torbutton.oscpu_override')+"\";\r\n";
str += m_jshooks;
str += "</"+"script>";
var d = doc.createElement("div");
Modified: torbutton/trunk/src/chrome/locale/en-US/torbutton.dtd
===================================================================
--- torbutton/trunk/src/chrome/locale/en-US/torbutton.dtd 2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/chrome/locale/en-US/torbutton.dtd 2007-06-18 06:01:34 UTC (rev 10648)
@@ -20,17 +20,20 @@
<!ENTITY torbutton.prefs.block_nthread "Block history read during Non-Tor (optional)">
<!ENTITY torbutton.prefs.block_nthwrite "Block history write during Non-Tor (optional)">
<!ENTITY torbutton.prefs.clear_history "Clear history on Tor toggle (optional)">
-<!ENTITY torbutton.prefs.clear_cache "Clear cache on Tor toggle">
-<!ENTITY torbutton.prefs.block_cache "Block cache during Tor">
+<!ENTITY torbutton.prefs.clear_cache "Block Tor disk cache and clear all cache on Tor toggle">
+<!ENTITY torbutton.prefs.block_cache "Block all cache during Tor">
<!ENTITY torbutton.prefs.cookie_jars "Store Non-Tor cookies in a protected jar">
<!ENTITY torbutton.prefs.clear_cookies "Clear cookies on Tor toggle">
<!ENTITY torbutton.prefs.disable_plugins "Disable plugins during Tor usage (recommended)">
<!ENTITY torbutton.prefs.kill_bad_js "Block dangerous javascript (recommended)">
+<!ENTITY torbutton.prefs.isolate_content "Isolate dynamic content to Tor state (recommended)">
<!ENTITY torbutton.prefs.no_updates "Disable updates during Tor usage (recommended)">
-<!ENTITY torbutton.prefs.js_plugins "Plugins+javascript">
+<!ENTITY torbutton.prefs.set_uagent "Set user agent for Tor usage (recommended)">
+<!ENTITY torbutton.prefs.dynamic "Dynamic Content">
<!ENTITY torbutton.prefs.cookies "Cookies">
<!ENTITY torbutton.prefs.cache "Cache">
<!ENTITY torbutton.prefs.history "History">
+<!ENTITY torbutton.prefs.uagent "User Agent">
<!ENTITY torbutton.prefs.no_search "Disable search suggestions (optional)">
<!ENTITY torbutton.about.title "About Torbutton">
<!ENTITY torbutton.pref_connection.notice "Disable Torbutton to change these settings.">
Added: torbutton/trunk/src/components/cssblocker.js
===================================================================
--- torbutton/trunk/src/components/cssblocker.js (rev 0)
+++ torbutton/trunk/src/components/cssblocker.js 2007-06-18 06:01:34 UTC (rev 10648)
@@ -0,0 +1,266 @@
+/*************************************************************************
+ * Content policy to block stuff not handled by other components
+ * (such as CSS)
+ * - http://www.w3.org/TR/REC-CSS2/selector.html#dynamic-pseudo-classes
+ *
+ * Also serves as a safety net to catch content the other
+ * mechaanisms somehow fail to block.
+ *
+ * Based on examples from:
+ * - http://adblockplus.org/en/faq_internal
+ * - http://developer.mozilla.org/en/docs/How_to_Build_an_XPCOM_Component_in_Javascript
+ * - http://www.xulplanet.com/references/xpcomref/ifaces/nsICategoryManager.html
+ * - http://www.xulplanet.com/references/xpcomref/ifaces/nsIContentPolicy.html
+ * - http://greasemonkey.devjavu.com/projects/greasemonkey/browser/trunk/src/components/greasemonkey.js
+ *
+ * Test cases:
+ * - http://www.tjkdesign.com/articles/css%20pop%20ups/default.asp
+ *
+ *************************************************************************/
+
+const CSSB_CONTRACTID = "@freehaven.net/cssblocker;1";
+const CSSB_CID = Components.ID("{23f4d9ba-023a-94ab-eb75-67aed7562a18}");
+
+const DNode = Components.interfaces.nsIDOMNode;
+const DWindow = Components.interfaces.nsIDOMWindow;
+const ok = Components.interfaces.nsIContentPolicy.ACCEPT;
+const block = Components.interfaces.nsIContentPolicy.REJECT_REQUEST;
+const CPolicy = Components.interfaces.nsIContentPolicy;
+
+// Retrieves the window object for a node or returns null if it isn't possible
+function getWindow(node) {
+ if (node && node.nodeType != DNode.DOCUMENT_NODE)
+ node = node.ownerDocument;
+
+ if (!node || node.nodeType != DNode.DOCUMENT_NODE)
+ return null;
+
+ return node.defaultView;
+}
+
+//HACKHACK: need a way to get an implicit wrapper for nodes because of bug 337095 (fixed in Gecko 1.8.0.5)
+var fakeFactory = {
+ createInstance: function(outer, iid) {
+ return outer;
+ },
+
+ QueryInterface: function(iid) {
+ if (iid.equals(Components.interfaces.nsISupports) ||
+ iid.equals(Components.interfaces.nsIFactory))
+ return this;
+
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ }
+};
+var array = Components.classes['@mozilla.org/supports-array;1'].createInstance(Components.interfaces.nsISupportsArray);
+array.AppendElement(fakeFactory);
+fakeFactory = array.GetElementAt(0).QueryInterface(Components.interfaces.nsIFactory);
+array = null;
+
+function wrapNode(insecNode) {
+ return fakeFactory.createInstance(insecNode, Components.interfaces.nsISupports);
+}
+
+// Unwraps jar:, view-source: and wyciwyg: URLs, returns the contained URL
+function unwrapURL(url) {
+ if (!url)
+ return url;
+
+ var ret = url.replace(/^view-source:/).replace(/^wyciwyg:\/\/\d+\//);
+ if (/^jar:(.*?)!/.test(ret))
+ ret = RegExp.$1;
+
+ if (ret == url)
+ return url;
+ else
+ return unwrapURL(ret);
+}
+
+var localSchemes = {"about" : true, "chrome" : true, "file" : true,
+ "resource" : true, "x-jsd" : true, "addbook" : true, "cid" : true,
+ "mailbox" : true, "data" : true, "javascript" : true};
+
+var policy = {
+ allowOnce: null,
+
+ init: function() {
+ dump("init\n");
+ this._prefs = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranch);
+
+ return;
+ },
+
+ isLocalScheme: function(loc) {
+ if (loc.indexOf(":") < 0)
+ return false;
+
+ var scheme = loc.replace(/:.*/, "").toLowerCase();
+ return (scheme in localSchemes) || loc == "about:blank";
+ },
+
+
+ // TODO: Optimize this with a pref observer so it doesn't
+ // have to continually query prefs
+ // nsIContentPolicy interface implementation
+ shouldLoad: function(contentType, contentLocation, requestOrigin, insecNode, mimeTypeGuess, extra) {
+ dump("ContentLocation: "+contentLocation.spec + " request "+requestOrigin.spec+"\n");
+
+ /*. Debugging hack. DO NOT UNCOMMENT IN PRODUCTION ENVIRONMENTS
+ if(contentLocation.spec.search("venkman") != -1) {
+ dump("chrome-venk\n");
+ return ok;
+ }*/
+
+ if(!insecNode) {
+ // Happens on startup
+ return ok;
+ }
+
+ if(!this._prefs.getBoolPref("extensions.torbutton.isolate_content")) {
+ dump("disabled\n");
+ return ok;
+ }
+
+ var node = wrapNode(insecNode);
+ var wind = getWindow(wrapNode(insecNode));
+
+ if (!wind || !wind.top.location || !wind.top.location.href) {
+ dump("Location\n");
+ return ok;
+ }
+
+ if (this.isLocalScheme(unwrapURL(contentLocation.spec))) {
+ return ok;
+ }
+
+ // For frame elements go to their window
+ if (contentType == CPolicy.TYPE_SUBDOCUMENT && node.contentWindow) {
+ node = node.contentWindow;
+ wind = node;
+ }
+
+ var doc = wind.top.document;
+ if(!doc) {
+ // 1st load of a page in a new location
+ return ok;
+ }
+
+ // FIXME: Ugly.. But seems to be no better option..
+ var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Components.interfaces.nsIWindowMediator);
+ var mainWindow = wm.getMostRecentWindow("navigator:browser");
+ var browser = mainWindow.getBrowser();
+ var torTag = !this._prefs.getBoolPref("extensions.torbutton.tor_enabled");
+
+ // Find proper browser for this document.. ugh. this
+ // is gonna be SO fucking slow :(
+ // TODO: try nsIWindowWatcher.getChromeForWindow()
+ if (browser.contentDocument == doc) {
+ if(browser.__tb_js_state == torTag) {
+ return ok;
+ } else {
+ dump("block1\n");
+ return block;
+ }
+ }
+
+ for (var i = 0; i < browser.browsers.length; ++i) {
+ var b = browser.browsers[i];
+ if (b && b.contentDocument == doc) {
+ if(b.__tb_js_state == torTag) {
+ return ok;
+ } else {
+ dump("block2\n");
+ return block;
+ }
+ }
+ }
+
+ // Favicons hit this.. They have no DOM document.
+ return ok;
+ },
+
+ shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra) {
+ return ok;
+ }
+};
+
+/*
+ * Factory object
+ */
+
+const factory = {
+ // nsIFactory interface implementation
+ createInstance: function(outer, iid) {
+ if (outer != null)
+ throw Components.results.NS_ERROR_NO_AGGREGATION;
+
+ if (!iid.equals(Components.interfaces.nsIContentPolicy) &&
+ !iid.equals(Components.interfaces.nsISupports))
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+
+ policy.init();
+ return policy;
+ },
+
+ // nsISupports interface implementation
+ QueryInterface: function(iid) {
+ if (iid.equals(Components.interfaces.nsISupports) ||
+ iid.equals(Components.interfaces.nsIFactory))
+ return this;
+
+ if (!iid.equals(Components.interfaces.nsIClassInfo))
+ dump("CSS Blocker: factory.QI to an unknown interface: " + iid + "\n");
+
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ }
+};
+
+
+/*
+ * Module object
+ */
+const module = {
+ registerSelf: function(compMgr, fileSpec, location, type) {
+ compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
+ compMgr.registerFactoryLocation(CSSB_CID,
+ "Adblock content policy",
+ CSSB_CONTRACTID,
+ fileSpec, location, type);
+
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ catman.addCategoryEntry("content-policy", CSSB_CONTRACTID,
+ CSSB_CONTRACTID, true, true);
+ },
+
+ unregisterSelf: function(compMgr, fileSpec, location) {
+ compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
+
+ compMgr.unregisterFactoryLocation(CSSB_CID, fileSpec);
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ catman.deleteCategoryEntry("content-policy", CSSB_CONTRACTID, true);
+ },
+
+ getClassObject: function(compMgr, cid, iid) {
+ if (!cid.equals(CSSB_CID))
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+
+ if (!iid.equals(Components.interfaces.nsIFactory))
+ throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
+
+ return factory;
+ },
+
+ canUnload: function(compMgr) {
+ return true;
+ }
+};
+
+function NSGetModule(comMgr, fileSpec) {
+ return module;
+}
+
+
Modified: torbutton/trunk/src/components/ignore-history.js
===================================================================
--- torbutton/trunk/src/components/ignore-history.js 2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/components/ignore-history.js 2007-06-18 06:01:34 UTC (rev 10648)
@@ -24,7 +24,7 @@
function HistoryWrapper() {
this._prefs = Components.classes["@mozilla.org/preferences-service;1"]
- .getService(Components.interfaces.nsIPrefService);
+ .getService(Components.interfaces.nsIPrefBranch);
this._history = function() {
var history = kREAL_HISTORY.getService();
Modified: torbutton/trunk/src/defaults/preferences/preferences.js
===================================================================
--- torbutton/trunk/src/defaults/preferences/preferences.js 2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/defaults/preferences/preferences.js 2007-06-18 06:01:34 UTC (rev 10648)
@@ -51,4 +51,15 @@
pref("extensions.torbutton.block_nthread",true);
pref("extensions.torbutton.block_nthwrite",false);
pref("extensions.torbutton.no_updates",true);
+pref("extensions.torbutton.isolate_content",true);
pref("extensions.torbutton.no_search",true);
+pref("extensions.torbutton.set_uagent",true);
+
+// Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4
+pref("extensions.torbutton.appname_override","Netscape");
+pref("extensions.torbutton.appversion_override","5.0 (Windows; en-US)");
+pref("extensions.torbutton.platform_override","Win32");
+pref("extensions.torbutton.oscpu_override", "Windows NT 5.1");
+pref("extensions.torbutton.useragent_override","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4");
+pref("extensions.torbutton.useragent_vendor", "");
+pref("extensions.torbutton.useragent_vendorSub","");
Modified: torbutton/trunk/src/install.rdf
===================================================================
--- torbutton/trunk/src/install.rdf 2007-06-17 20:05:56 UTC (rev 10647)
+++ torbutton/trunk/src/install.rdf 2007-06-18 06:01:34 UTC (rev 10648)
@@ -16,12 +16,12 @@
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
- <em:minVersion>0.9</em:minVersion>
+ <em:minVersion>2.0</em:minVersion>
<em:maxVersion>2.0.0.*</em:maxVersion>
</Description>
</em:targetApplication>
- <!-- thunderbird -->
+ <!-- FIXME:
<em:targetApplication>
<Description>
<em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
@@ -29,7 +29,11 @@
<em:maxVersion>1.5.0.*</em:maxVersion>
</Description>
</em:targetApplication>
+
+ thunderbird -->
+ <!-- TODO: seamonkey -->
+
<!-- firefox 1.5 uses the chrome.manifest file -->
<!-- firefox 1.0 uses the RDF information below -->
<em:file>