| 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()} | 
|  |