| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
| 3  * Copyright (C) 2006-present eyeo GmbH | 3  * Copyright (C) 2006-present eyeo GmbH | 
| 4  * | 4  * | 
| 5  * Adblock Plus is free software: you can redistribute it and/or modify | 5  * Adblock Plus is free software: you can redistribute it and/or modify | 
| 6  * it under the terms of the GNU General Public License version 3 as | 6  * it under the terms of the GNU General Public License version 3 as | 
| 7  * published by the Free Software Foundation. | 7  * published by the Free Software Foundation. | 
| 8  * | 8  * | 
| 9  * Adblock Plus is distributed in the hope that it will be useful, | 9  * Adblock Plus is distributed in the hope that it will be useful, | 
| 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 42       // Only spaces before selectorStart position should be removed. | 42       // Only spaces before selectorStart position should be removed. | 
| 43       if (pos < selectorStart && text[pos] == ' ') | 43       if (pos < selectorStart && text[pos] == ' ') | 
| 44         delta++; | 44         delta++; | 
| 45       else | 45       else | 
| 46         text[pos - delta] = text[pos]; | 46         text[pos - delta] = text[pos]; | 
| 47     } | 47     } | 
| 48     selectorStart -= delta; | 48     selectorStart -= delta; | 
| 49 | 49 | 
| 50     text.reset(text, 0, len - delta); | 50     text.reset(text, 0, len - delta); | 
| 51   } | 51   } | 
|  | 52 | 
|  | 53   // Convert filter from the old syntax to the new. | 
|  | 54   OwnedString ConvertFilter(const String& text, String::size_type at) | 
|  | 55   { | 
|  | 56     static const auto propsSelector = u"[-abp-properties="_str; | 
|  | 57     static const auto newPropsSelector = u":-abp-properties("_str; | 
|  | 58     auto selectorPos = text.find(propsSelector, at); | 
|  | 59     if (selectorPos != text.npos) | 
|  | 60     { | 
|  | 61       auto length = text.length(); | 
|  | 62       auto properties = selectorPos + propsSelector.length(); | 
|  | 63       String::value_type quote = 0; | 
|  | 64       bool escape = false; | 
|  | 65       String::size_type removed = 0; // how many chars we remove | 
|  | 66       String::size_type end = properties; | 
|  | 67       String::size_type quote_start = 0; | 
|  | 68       String::size_type quote_end = 0; | 
|  | 69       for (auto index = properties; | 
|  | 70            index < length && end == properties; index++) | 
|  | 71       { | 
|  | 72         if (escape) | 
|  | 73         { | 
|  | 74           escape = false; | 
|  | 75           continue; | 
|  | 76         } | 
|  | 77 | 
|  | 78         auto c = text[index]; | 
|  | 79         switch (c) | 
|  | 80         { | 
|  | 81         case '\\': | 
|  | 82           escape = true; | 
|  | 83           break; | 
|  | 84         case '"': | 
|  | 85         case '\'': | 
|  | 86           if (quote == 0) | 
|  | 87           { | 
|  | 88             quote = c; | 
|  | 89             quote_start = index + 1; | 
|  | 90           } | 
|  | 91           else if (quote == c) | 
|  | 92           { | 
|  | 93             // end of quoted. | 
|  | 94             quote = 0; | 
|  | 95             removed += 2; | 
|  | 96             quote_end = index; | 
|  | 97           } | 
|  | 98           break; | 
|  | 99         case ']': | 
|  | 100           if (quote == 0) | 
|  | 101             end = index + 1; // end of properties (after ]) | 
|  | 102           break; | 
|  | 103         default: | 
|  | 104           break; | 
|  | 105         } | 
|  | 106       } | 
|  | 107 | 
|  | 108       if (quote != 0) | 
|  | 109         quote_end = end - 1; | 
|  | 110       else if (quote_end <= quote_start) | 
|  | 111       { | 
|  | 112         // we likely didn't find a quoted content so we just take it as is. | 
|  | 113         quote_start = properties; | 
|  | 114         quote_end = end - 1; | 
|  | 115       } | 
|  | 116 | 
|  | 117       OwnedString converted(length - removed); | 
|  | 118       String::size_type offset = 0; | 
|  | 119       std::memcpy(converted.data(), text.data(), | 
|  | 120                   selectorPos * sizeof(String::value_type)); | 
|  | 121       offset += selectorPos; | 
|  | 122 | 
|  | 123       std::memcpy(converted.data() + offset, newPropsSelector.data(), | 
|  | 124                   newPropsSelector.length() * sizeof(String::value_type)); | 
|  | 125       offset += newPropsSelector.length(); | 
|  | 126 | 
|  | 127       std::memcpy(converted.data() + offset, text.data() + quote_start, | 
|  | 128                   (quote_end - quote_start) * sizeof(String::value_type)); | 
|  | 129       offset += quote_end - quote_start; | 
|  | 130 | 
|  | 131       std::memcpy(converted.data() + offset, u")", sizeof(String::value_type)); | 
|  | 132       offset++; | 
|  | 133 | 
|  | 134       std::memcpy(converted.data() + offset, text.data() + end, | 
|  | 135                   (length - end) * sizeof(String::value_type)); | 
|  | 136       offset += (length - end) * sizeof(String::value_type); | 
|  | 137 | 
|  | 138       return converted; | 
|  | 139     } | 
|  | 140 | 
|  | 141     return OwnedString(text); | 
|  | 142   } | 
| 52 } | 143 } | 
| 53 | 144 | 
| 54 ElemHideBase::ElemHideBase(Type type, const String& text, const ElemHideData& da
     ta) | 145 ElemHideBase::ElemHideBase(Type type, const String& text, const ElemHideData& da
     ta) | 
| 55     : ActiveFilter(type, text, false), mData(data) | 146     : ActiveFilter(type, ConvertFilter(text, data.mSelectorStart), false), | 
|  | 147       mData(data) | 
| 56 { | 148 { | 
| 57   if (mData.HasDomains()) | 149   if (mData.HasDomains()) | 
| 58     ParseDomains(mData.GetDomainsSource(mText), u','); | 150     ParseDomains(mData.GetDomainsSource(mText), u','); | 
| 59 } | 151 } | 
| 60 | 152 | 
| 61 Filter::Type ElemHideBase::Parse(DependentString& text, ElemHideData& data) | 153 Filter::Type ElemHideBase::Parse(DependentString& text, ElemHideData& data) | 
| 62 { | 154 { | 
| 63   StringScanner scanner(text); | 155   StringScanner scanner(text); | 
| 64 | 156 | 
| 65   // Domains part | 157   // Domains part | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 82       case u'"': | 174       case u'"': | 
| 83       case u'!': | 175       case u'!': | 
| 84         return Type::UNKNOWN; | 176         return Type::UNKNOWN; | 
| 85       case u' ': | 177       case u' ': | 
| 86         seenSpaces = true; | 178         seenSpaces = true; | 
| 87         break; | 179         break; | 
| 88     } | 180     } | 
| 89   } | 181   } | 
| 90 | 182 | 
| 91   seenSpaces |= scanner.skip(u' '); | 183   seenSpaces |= scanner.skip(u' '); | 
|  | 184   bool emulation = false; | 
| 92   bool exception = scanner.skipOne(u'@'); | 185   bool exception = scanner.skipOne(u'@'); | 
| 93   if (exception) | 186   if (exception) | 
| 94     seenSpaces |= scanner.skip(u' '); | 187     seenSpaces |= scanner.skip(u' '); | 
|  | 188   else | 
|  | 189     emulation = scanner.skipOne(u'?'); | 
| 95 | 190 | 
| 96   String::value_type next = scanner.next(); | 191   String::value_type next = scanner.next(); | 
| 97   if (next != u'#') | 192   if (next != u'#') | 
| 98     return Type::UNKNOWN; | 193     return Type::UNKNOWN; | 
| 99 | 194 | 
| 100   // Selector part | 195   // Selector part | 
| 101 | 196 | 
| 102   // Selector shouldn't be empty | 197   // Selector shouldn't be empty | 
| 103   seenSpaces |= scanner.skip(u' '); | 198   seenSpaces |= scanner.skip(u' '); | 
| 104   if (scanner.done()) | 199   if (scanner.done()) | 
| 105     return Type::UNKNOWN; | 200     return Type::UNKNOWN; | 
| 106 | 201 | 
| 107   data.mSelectorStart = scanner.position() + 1; | 202   data.mSelectorStart = scanner.position() + 1; | 
| 108 | 203 | 
| 109   // We are done validating, now we can normalize whitespace and the domain part | 204   // We are done validating, now we can normalize whitespace and the domain part | 
| 110   if (seenSpaces) | 205   if (seenSpaces) | 
| 111     NormalizeWhitespace(text, data.mDomainsEnd, data.mSelectorStart); | 206     NormalizeWhitespace(text, data.mDomainsEnd, data.mSelectorStart); | 
| 112   DependentString(text, 0, data.mDomainsEnd).toLower(); | 207   DependentString(text, 0, data.mDomainsEnd).toLower(); | 
| 113 | 208 | 
| 114   if (exception) | 209   if (exception) | 
| 115     return Type::ELEMHIDEEXCEPTION; | 210     return Type::ELEMHIDEEXCEPTION; | 
| 116 | 211 | 
| 117   if (text.find(u"[-abp-properties="_str, data.mSelectorStart) != text.npos) | 212   if (emulation) | 
| 118     return Type::ELEMHIDEEMULATION; | 213     return Type::ELEMHIDEEMULATION; | 
| 119 | 214 | 
| 120   return Type::ELEMHIDE; | 215   return Type::ELEMHIDE; | 
| 121 } | 216 } | 
| 122 | 217 | 
| 123 namespace | 218 namespace | 
| 124 { | 219 { | 
| 125   static constexpr String::value_type OPENING_CURLY_REPLACEMENT[] = u"\\7B "; | 220   static constexpr String::value_type OPENING_CURLY_REPLACEMENT[] = u"\\7B "; | 
| 126   static constexpr String::value_type CLOSING_CURLY_REPLACEMENT[] = u"\\7D "; | 221   static constexpr String::value_type CLOSING_CURLY_REPLACEMENT[] = u"\\7D "; | 
| 127   static constexpr String::size_type CURLY_REPLACEMENT_SIZE = sizeof(OPENING_CUR
     LY_REPLACEMENT) / sizeof(OPENING_CURLY_REPLACEMENT[0]) - 1; | 222   static constexpr String::size_type CURLY_REPLACEMENT_SIZE = sizeof(OPENING_CUR
     LY_REPLACEMENT) / sizeof(OPENING_CURLY_REPLACEMENT[0]) - 1; | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 181       if (item.second && !item.first.empty()) | 276       if (item.second && !item.first.empty()) | 
| 182       { | 277       { | 
| 183         if (!result.empty()) | 278         if (!result.empty()) | 
| 184           result.append(u','); | 279           result.append(u','); | 
| 185         result.append(item.first); | 280         result.append(item.first); | 
| 186       } | 281       } | 
| 187     } | 282     } | 
| 188   } | 283   } | 
| 189   return result; | 284   return result; | 
| 190 } | 285 } | 
| OLD | NEW | 
|---|