| Index: compiled/filter/Filter.cpp | 
| =================================================================== | 
| --- a/compiled/filter/Filter.cpp | 
| +++ b/compiled/filter/Filter.cpp | 
| @@ -133,29 +133,40 @@ | 
| break; | 
| case WhitelistFilter::classType: | 
| filter = FilterPtr(new WhitelistFilter(text, data.regexp), false); | 
| break; | 
| case ElemHideFilter::classType: | 
| filter = FilterPtr(new ElemHideFilter(text, data.elemhide), false); | 
| break; | 
| case ElemHideException::classType: | 
| - filter = FilterPtr(new ElemHideException(text, data.elemhide), false); | 
| + filter = FilterPtr( | 
| + new ElemHideException( | 
| + data.elemhide.mNeedConversion ? | 
| + DependentString(ElemHideBase::ConvertFilter(text, data.elemhide.mSelectorStart)) : | 
| + text, data.elemhide), false); | 
| break; | 
| case ElemHideEmulationFilter::classType: | 
| - filter = FilterPtr(new ElemHideEmulationFilter(text, data.elemhide), false); | 
| + filter = FilterPtr( | 
| + new ElemHideEmulationFilter( | 
| + data.elemhide.mNeedConversion ? | 
| + DependentString(ElemHideBase::ConvertFilter(text, data.elemhide.mSelectorStart)) : | 
| + text, data.elemhide), false); | 
| if (static_cast<ElemHideEmulationFilter*>(filter.get())->IsGeneric()) | 
| filter = FilterPtr(new InvalidFilter(text, u"filter_elemhideemulation_nodomain"_str), false); | 
| break; | 
| default: | 
| // This should never happen but just in case | 
| return nullptr; | 
| } | 
| - // This is a hack: we looked up the entry using text but create it using | 
| - // filter->mText. This works because both are equal at this point. However, | 
| - // text refers to a temporary buffer which will go away. | 
| enter_context("Adding to known filters"); | 
| - knownFilter.assign(filter->mText, filter.get()); | 
| + if (text != filter->mText) | 
| + knownFilters[filter->mText] = filter.get(); | 
| + else | 
| + // This is a hack: we looked up the entry using text but create it using | 
| + // filter->mText. This works because both are equal at this point. However, | 
| + // text refers to a temporary buffer which will go away. | 
| + knownFilter.assign(filter->mText, filter.get()); | 
| exit_context(); | 
| return filter.release(); | 
| } |