Index: lib/filterClasses.js
===================================================================
--- a/lib/filterClasses.js
+++ b/lib/filterClasses.js
@@ -1062,27 +1062,31 @@
   // Note: The ContentFilter.prototype.domainSeparator is duplicated here, if
   // that changes this must be changed too.
   if (domains && /(^|,)~?(,|$)/.test(domains))
     return new InvalidFilter(text, "filter_invalid_domain");
 
   if (type == "@")
     return new ElemHideException(text, domains, body);
 
-  if (type == "$")
-    return new SnippetFilter(text, domains, body);
-
-  if (type == "?")
+  if (type == "?" || type == "$")
   {
-    // Element hiding emulation filters are inefficient so we need to make sure
-    // that they're only applied if they specify active domains
+    // Element hiding emulation and snippet filters are inefficient so we need
+    // to make sure that they're only applied if they specify active domains
     if (!/,[^~][^,.]*\.[^,]/.test("," + domains))
-      return new InvalidFilter(text, "filter_elemhideemulation_nodomain");
+    {
+      return new InvalidFilter(text, type == "?" ?
+                                       "filter_elemhideemulation_nodomain" :
+                                       "filter_snippet_nodomain");
+    }
 
-    return new ElemHideEmulationFilter(text, domains, body);
+    if (type == "?")
+      return new ElemHideEmulationFilter(text, domains, body);
+
+    return new SnippetFilter(text, domains, body);
   }
 
   return new ElemHideFilter(text, domains, body);
 };
 
 /**
  * Base class for element hiding filters
  * @param {string} text see {@link Filter Filter()}
