LEFT | RIGHT |
1 #include <climits> | 1 #include <climits> |
2 | 2 |
3 #include <emscripten.h> | 3 #include <emscripten.h> |
4 | 4 |
5 #include "RegExpFilter.h" | 5 #include "RegExpFilter.h" |
6 #include "StringScanner.h" | 6 #include "StringScanner.h" |
7 #include "StringMap.h" | 7 #include "StringMap.h" |
8 | 8 |
9 namespace | 9 namespace |
10 { | 10 { |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 data.mContentType &= ~it->second; | 118 data.mContentType &= ~it->second; |
119 else | 119 else |
120 data.mContentType |= it->second; | 120 data.mContentType |= it->second; |
121 } | 121 } |
122 else if (name.equals(u"domain"_str)) | 122 else if (name.equals(u"domain"_str)) |
123 { | 123 { |
124 if (valueStart >= 0 && valueEnd > valueStart) | 124 if (valueStart >= 0 && valueEnd > valueStart) |
125 { | 125 { |
126 data.mDomainsStart = valueStart; | 126 data.mDomainsStart = valueStart; |
127 data.mDomainsEnd = valueEnd; | 127 data.mDomainsEnd = valueEnd; |
128 ActiveFilter::ToLower(DependentString(text, data.mDomainsStart, | 128 DependentString(text, valueStart, valueEnd - valueStart).toLower(); |
129 valueEnd - valueStart)); | |
130 } | 129 } |
131 } | 130 } |
132 else if (name.equals(u"sitekey"_str)) | 131 else if (name.equals(u"sitekey"_str)) |
133 { | 132 { |
134 if (valueStart >= 0 && valueEnd > valueStart) | 133 if (valueStart >= 0 && valueEnd > valueStart) |
135 { | 134 { |
136 data.mSitekeysStart = valueStart; | 135 data.mSitekeysStart = valueStart; |
137 data.mSitekeysEnd = valueEnd; | 136 data.mSitekeysEnd = valueEnd; |
138 } | 137 } |
139 } | 138 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 valueStart = -1; | 193 valueStart = -1; |
195 break; | 194 break; |
196 } | 195 } |
197 } | 196 } |
198 | 197 |
199 if (data.mContentType < 0) | 198 if (data.mContentType < 0) |
200 data.mContentType = defaultTypeMask; | 199 data.mContentType = defaultTypeMask; |
201 } | 200 } |
202 } | 201 } |
203 | 202 |
204 RegExpFilter::RegExpFilter(const String& text, const RegExpFilterData& data) | 203 RegExpFilter::RegExpFilter(Type type, const String& text, const RegExpFilterData
& data) |
205 : ActiveFilter(text, true), RegExpFilterData(data) | 204 : ActiveFilter(type, text, true), mData(data) |
206 { | 205 { |
207 } | 206 } |
208 | 207 |
209 RegExpFilter::~RegExpFilter() | 208 RegExpFilter::~RegExpFilter() |
210 { | 209 { |
211 if (HasRegExp()) | 210 if (mData.HasRegExp()) |
212 EM_ASM_ARGS(regexps.delete($0), mRegexpId); | 211 EM_ASM_ARGS(regexps.delete($0), mData.mRegexpId); |
213 } | 212 } |
214 | 213 |
215 Filter::Type RegExpFilter::Parse(DependentString& text, DependentString& error, | 214 Filter::Type RegExpFilter::Parse(DependentString& text, DependentString& error, |
216 RegExpFilterData& data) | 215 RegExpFilterData& data) |
217 { | 216 { |
218 NormalizeWhitespace(text); | 217 NormalizeWhitespace(text); |
219 | 218 |
220 bool blocking = true; | 219 Filter::Type type = Type::BLOCKING; |
221 | 220 |
222 data.mPatternStart = 0; | 221 data.mPatternStart = 0; |
223 if (text.length() >= 2 && text[0] == u'@' && text[1] == u'@') | 222 if (text.length() >= 2 && text[0] == u'@' && text[1] == u'@') |
224 { | 223 { |
225 blocking = false; | 224 type = Type::WHITELIST; |
226 data.mPatternStart = 2; | 225 data.mPatternStart = 2; |
227 } | 226 } |
228 | 227 |
229 data.mPatternEnd = text.find(u'$', data.mPatternStart); | 228 data.mPatternEnd = text.find(u'$', data.mPatternStart); |
230 if (data.mPatternEnd == text.npos) | 229 if (data.mPatternEnd == text.npos) |
231 data.mPatternEnd = text.length(); | 230 data.mPatternEnd = text.length(); |
232 | 231 |
233 ParseOptions(text, error, data, data.mPatternEnd + 1); | 232 ParseOptions(text, error, data, data.mPatternEnd + 1); |
234 if (!error.empty()) | 233 if (!error.empty()) |
235 return Type::INVALID; | 234 return Type::INVALID; |
236 | 235 |
237 if (data.mPatternEnd - data.mPatternStart >= 2 && | 236 if (data.mPatternEnd - data.mPatternStart >= 2 && |
238 text[data.mPatternStart] == u'/' && | 237 text[data.mPatternStart] == u'/' && |
239 text[data.mPatternEnd - 1] == u'/') | 238 text[data.mPatternEnd - 1] == u'/') |
240 { | 239 { |
241 data.SetRegExp(GenerateRegExp(DependentString(text, data.mPatternStart + 1, | 240 data.SetRegExp(GenerateRegExp(DependentString(text, data.mPatternStart + 1, |
242 data.mPatternEnd - data.mPatternStart - 2), data.mMatchCase)); | 241 data.mPatternEnd - data.mPatternStart - 2), data.mMatchCase)); |
243 if (data.mRegexpId == -1) | 242 if (data.mRegexpId == -1) |
244 { | 243 { |
245 error.reset(u"filter_invalid_regexp"_str); | 244 error.reset(u"filter_invalid_regexp"_str); |
246 return Type::INVALID; | 245 return Type::INVALID; |
247 } | 246 } |
248 } | 247 } |
249 | 248 |
250 if (blocking) | 249 return type; |
251 return Type::BLOCKING; | |
252 else | |
253 return Type::WHITELIST; | |
254 } | 250 } |
255 | 251 |
256 void RegExpFilter::ParseSitekeys(const String& sitekeys) const | 252 void RegExpFilter::ParseSitekeys(const String& sitekeys) const |
257 { | 253 { |
258 StringScanner scanner(sitekeys, 0, u'|'); | 254 StringScanner scanner(sitekeys, 0, u'|'); |
259 size_t start = 0; | 255 size_t start = 0; |
260 bool done = false; | 256 bool done = false; |
261 while (!done) | 257 while (!done) |
262 { | 258 { |
263 done = scanner.done(); | 259 done = scanner.done(); |
264 if (scanner.next() == u'|') | 260 if (scanner.next() == u'|') |
265 { | 261 { |
266 if (scanner.position() > start) | 262 if (scanner.position() > start) |
267 AddSitekey(DependentString(sitekeys, start, scanner.position() - start))
; | 263 AddSitekey(DependentString(sitekeys, start, scanner.position() - start))
; |
268 start = scanner.position() + 1; | 264 start = scanner.position() + 1; |
269 } | 265 } |
270 } | 266 } |
271 } | 267 } |
272 | 268 |
273 void RegExpFilter::InitJSTypes() | 269 void RegExpFilter::InitJSTypes() |
274 { | 270 { |
275 EM_ASM(exports.RegExpFilter.typeMap = {};); | 271 EM_ASM(exports.RegExpFilter.typeMap = {};); |
276 for (auto it = typeMap.begin(); it != typeMap.end(); ++it) | 272 for (auto it = typeMap.begin(); it != typeMap.end(); ++it) |
277 EM_ASM_ARGS(exports.RegExpFilter.typeMap[getStringData($0).replace("-", "_")
.toUpperCase()] = $1, &(it->first), it->second); | 273 EM_ASM_ARGS(exports.RegExpFilter.typeMap[readString($0).replace("-", "_").to
UpperCase()] = $1, &(it->first), it->second); |
278 } | 274 } |
279 | 275 |
280 OwnedString RegExpFilter::RegExpFromSource(const String& source) | 276 OwnedString RegExpFilter::RegExpFromSource(const String& source) |
281 { | 277 { |
282 /* TODO: this is very inefficient */ | 278 /* TODO: this is very inefficient */ |
283 | 279 |
284 // Note: This doesn't remove trailing wildcards, otherwise the result should | 280 // Note: This doesn't remove trailing wildcards, otherwise the result should |
285 // be identical to Filter.toRegExp(). | 281 // be identical to Filter.toRegExp(). |
286 OwnedString result; | 282 OwnedString result; |
287 String::value_type prevChar = u'*'; | 283 String::value_type prevChar = u'*'; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 } | 327 } |
332 result.append(currChar); | 328 result.append(currChar); |
333 } | 329 } |
334 prevChar = currChar; | 330 prevChar = currChar; |
335 } | 331 } |
336 return result; | 332 return result; |
337 } | 333 } |
338 | 334 |
339 RegExpFilter::DomainMap* RegExpFilter::GetDomains() const | 335 RegExpFilter::DomainMap* RegExpFilter::GetDomains() const |
340 { | 336 { |
341 if (!DomainsParsingDone()) | 337 if (!mData.DomainsParsingDone()) |
342 { | 338 { |
343 ParseDomains(GetDomainsSource(mText), u'|'); | 339 ParseDomains(mData.GetDomainsSource(mText), u'|'); |
344 SetDomainsParsingDone(); | 340 mData.SetDomainsParsingDone(); |
345 } | 341 } |
346 return ActiveFilter::GetDomains(); | 342 return ActiveFilter::GetDomains(); |
347 } | 343 } |
348 | 344 |
349 RegExpFilter::SitekeySet* RegExpFilter::GetSitekeys() const | 345 RegExpFilter::SitekeySet* RegExpFilter::GetSitekeys() const |
350 { | 346 { |
351 if (!SitekeyParsingDone()) | 347 if (!mData.SitekeyParsingDone()) |
352 { | 348 { |
353 ParseSitekeys(GetSitekeysSource(mText)); | 349 ParseSitekeys(mData.GetSitekeysSource(mText)); |
354 SetSitekeysParsingDone(); | 350 mData.SetSitekeysParsingDone(); |
355 } | 351 } |
356 return ActiveFilter::GetSitekeys(); | 352 return ActiveFilter::GetSitekeys(); |
357 } | 353 } |
358 | 354 |
359 bool RegExpFilter::Matches(const String& location, int typeMask, | 355 bool RegExpFilter::Matches(const String& location, int typeMask, |
360 DependentString& docDomain, bool thirdParty, const String& sitekey) const | 356 DependentString& docDomain, bool thirdParty, const String& sitekey) const |
361 { | 357 { |
362 if (!(mContentType & typeMask) || | 358 if (!(mData.mContentType & typeMask) || |
363 (mThirdParty == TrippleState::YES && !thirdParty) || | 359 (mData.mThirdParty == TrippleState::YES && !thirdParty) || |
364 (mThirdParty == TrippleState::NO && thirdParty) || | 360 (mData.mThirdParty == TrippleState::NO && thirdParty) || |
365 !IsActiveOnDomain(docDomain, sitekey)) | 361 !IsActiveOnDomain(docDomain, sitekey)) |
366 { | 362 { |
367 return false; | 363 return false; |
368 } | 364 } |
369 | 365 |
370 if (!RegExpParsingDone()) | 366 if (!mData.RegExpParsingDone()) |
371 { | 367 { |
372 const OwnedString pattern(GetRegExpSource(mText)); | 368 const OwnedString pattern(mData.GetRegExpSource(mText)); |
373 SetRegExp(GenerateRegExp(RegExpFromSource(pattern), mMatchCase)); | 369 mData.SetRegExp(GenerateRegExp(RegExpFromSource(pattern), mData.mMatchCase))
; |
374 } | 370 } |
375 return EM_ASM_INT(return regexps.test($0, $1), mRegexpId, &location); | 371 return EM_ASM_INT(return regexps.test($0, $1), mData.mRegexpId, &location); |
376 } | 372 } |
LEFT | RIGHT |