Index: lib/filterListener.js
===================================================================
--- a/lib/filterListener.js
+++ b/lib/filterListener.js
@@ -29,16 +29,17 @@
 const {FilterNotifier} = require("./filterNotifier");
 const {ElemHide} = require("./elemHide");
 const {ElemHideEmulation} = require("./elemHideEmulation");
 const {Snippets} = require("./snippets");
 const {defaultMatcher} = require("./matcher");
 const {ActiveFilter, RegExpFilter,
        ElemHideBase, ElemHideEmulationFilter,
        SnippetFilter} = require("./filterClasses");
+const {SpecialSubscription} = require("./subscriptionClasses");
 const {Prefs} = require("prefs");
 
 /**
  * Increases on filter changes, filters will be saved if it exceeds 1.
  * @type {number}
  */
 let isDirty = 0;
 
@@ -135,37 +136,48 @@
  * @param {Filter} filter filter that has been added
  */
 function addFilter(filter)
 {
   if (!(filter instanceof ActiveFilter) || filter.disabled)
     return;
 
   let hasEnabled = false;
+  let allowSnippets = false;
   for (let i = 0; i < filter.subscriptions.length; i++)
   {
-    if (!filter.subscriptions[i].disabled)
+    let subscription = filter.subscriptions[i];
+
+    if (!subscription.disabled)
     {
       hasEnabled = true;
-      break;
+
+      // Allow snippets to be executed only by the circumvention lists or the
+      // user's own filters.
+      if (subscription.type == "circumvention" ||
+          subscription instanceof SpecialSubscription)
+      {
+        allowSnippets = true;
+        break;
+      }
     }
   }
   if (!hasEnabled)
     return;
 
   if (filter instanceof RegExpFilter)
     defaultMatcher.add(filter);
   else if (filter instanceof ElemHideBase)
   {
     if (filter instanceof ElemHideEmulationFilter)
       ElemHideEmulation.add(filter);
     else
       ElemHide.add(filter);
   }
-  else if (filter instanceof SnippetFilter)
+  else if (allowSnippets && filter instanceof SnippetFilter)
     Snippets.add(filter);
 }
 
 /**
  * Notifies Matcher instances or ElemHide object about removal of a filter
  * if necessary.
  * @param {Filter} filter filter that has been removed
  */
Index: test/filterListener.js
===================================================================
--- a/test/filterListener.js
+++ b/test/filterListener.js
@@ -27,17 +27,18 @@
 let SpecialSubscription = null;
 let ElemHideException = null;
 
 exports.setUp = function(callback)
 {
   sandboxedRequire = createSandbox({
     extraExports: {
       elemHide: ["knownFilters"],
-      elemHideEmulation: ["filters"]
+      elemHideEmulation: ["filters"],
+      snippets: ["filters"]
     }
   });
 
   // We need to require the filterListener module so that filter changes will be
   // noticed, even though we don't directly use the module here.
   sandboxedRequire("../lib/filterListener");
 
   (
@@ -89,18 +90,23 @@
       result.elemhide.push(filter.text);
   }
 
   let elemHideEmulation = sandboxedRequire("../lib/elemHideEmulation");
   result.elemhideemulation = [];
   for (let filterText of elemHideEmulation.filters)
     result.elemhideemulation.push(filterText);
 
+  let snippets = sandboxedRequire("../lib/snippets");
+  result.snippets = [];
+  for (let filterText of snippets.filters)
+    result.snippets.push(filterText);
+
   let types = ["blacklist", "whitelist", "elemhide", "elemhideexception",
-               "elemhideemulation"];
+               "elemhideemulation", "snippets"];
   for (let type of types)
   {
     if (!(type in expected))
       expected[type] = [];
     else
       expected[type].sort();
     result[type].sort();
   }
@@ -320,8 +326,35 @@
   FilterStorage.removeSubscription(subscription4);
   checkKnownFilters(test, "remove subscription from the list", {blacklist: [filter1.text]});
 
   subscription3.disabled = false;
   checkKnownFilters(test, "enable exception rules", {blacklist: [filter1.text], whitelist: [filter2.text]});
 
   test.done();
 };
+
+exports.testSnippetFilters = function(test)
+{
+  let filter1 = Filter.fromText("example.com#$#filter1");
+  let filter2 = Filter.fromText("example.com#$#filter2");
+
+  let subscription1 = Subscription.fromURL("http://test1/");
+  subscription1.filters = [filter1, filter2];
+
+  FilterStorage.addSubscription(subscription1);
+  checkKnownFilters(test, "add subscription with filter1 and filter2", {});
+
+  let subscription2 = Subscription.fromURL("http://test2/");
+  subscription2.type = "circumvention";
+  subscription2.filters = [filter1];
+
+  FilterStorage.addSubscription(subscription2);
+  checkKnownFilters(test, "add subscription of type circumvention with filter1", {snippets: [filter1.text]});
+
+  let subscription3 = Subscription.fromURL("~foo");
+  subscription3.filters = [filter2];
+
+  FilterStorage.addSubscription(subscription3);
+  checkKnownFilters(test, "add special subscription with filter2", {snippets: [filter1.text, filter2.text]});
+
+  test.done();
+};
