| Left: | ||
| Right: |
| LEFT | RIGHT |
|---|---|
| 1 /* | |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | |
| 3 * Copyright (C) 2006-2016 Eyeo GmbH | |
| 4 * | |
| 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 | |
| 7 * published by the Free Software Foundation. | |
| 8 * | |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 12 * GNU General Public License for more details. | |
| 13 * | |
| 14 * You should have received a copy of the GNU General Public License | |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
| 16 */ | |
| 17 | |
| 1 #include "PluginStdAfx.h" | 18 #include "PluginStdAfx.h" |
| 2 | 19 #include "AdblockPlusClient.h" |
| 3 #include "PluginFilter.h" | 20 #include "PluginFilter.h" |
| 4 #include "PluginSettings.h" | 21 #include "PluginSettings.h" |
| 5 #include "PluginClient.h" | |
| 6 #include "PluginClientFactory.h" | |
| 7 #include "PluginMutex.h" | 22 #include "PluginMutex.h" |
| 8 #include "PluginSettings.h" | 23 #include "PluginSettings.h" |
| 9 #include "PluginSystem.h" | 24 #include "PluginSystem.h" |
| 10 #include "PluginClass.h" | 25 #include "PluginClass.h" |
| 11 #include "mlang.h" | 26 #include "mlang.h" |
| 12 | |
| 13 #include "..\shared\CriticalSection.h" | 27 #include "..\shared\CriticalSection.h" |
| 14 #include "..\shared\Utils.h" | 28 #include "..\shared\Utils.h" |
| 15 | 29 #include "..\shared\MsHTMLUtils.h" |
| 16 | 30 |
| 17 // The filters are described at http://adblockplus.org/en/filters | 31 // The filters are described at http://adblockplus.org/en/filters |
| 18 | 32 |
| 19 static CriticalSection s_criticalSectionFilterMap; | 33 static CriticalSection s_criticalSectionFilterMap; |
| 20 | |
| 21 namespace | |
| 22 { | |
| 23 struct GetHtmlElementAttributeResult | |
| 24 { | |
| 25 GetHtmlElementAttributeResult() : isAttributeFound(false) | |
| 26 { | |
| 27 } | |
| 28 std::wstring attributeValue; | |
| 29 bool isAttributeFound; | |
| 30 }; | |
| 31 | |
| 32 GetHtmlElementAttributeResult GetHtmlElementAttribute(IHTMLElement& htmlElemen t, | |
| 33 const ATL::CComBSTR& attributeName) | |
| 34 { | |
| 35 GetHtmlElementAttributeResult retValue; | |
| 36 ATL::CComVariant vAttr; | |
| 37 ATL::CComPtr<IHTMLElement4> htmlElement4; | |
| 38 if (FAILED(htmlElement.QueryInterface(&htmlElement4)) || !htmlElement4) | |
| 39 { | |
| 40 return retValue; | |
| 41 } | |
| 42 ATL::CComPtr<IHTMLDOMAttribute> attributeNode; | |
| 43 if (FAILED(htmlElement4->getAttributeNode(attributeName, &attributeNode)) || !attributeNode) | |
| 44 { | |
| 45 return retValue; | |
| 46 } | |
| 47 // we set that attribute found but it's not necessary that we can retrieve i ts value | |
| 48 retValue.isAttributeFound = true; | |
| 49 if (FAILED(attributeNode->get_nodeValue(&vAttr))) | |
| 50 { | |
| 51 return retValue; | |
| 52 } | |
| 53 if (vAttr.vt == VT_BSTR && vAttr.bstrVal) | |
| 54 { | |
| 55 retValue.attributeValue = vAttr.bstrVal; | |
| 56 } | |
| 57 else if (vAttr.vt == VT_I4) | |
| 58 { | |
| 59 retValue.attributeValue = std::to_wstring(vAttr.iVal); | |
| 60 } | |
| 61 return retValue; | |
| 62 } | |
| 63 } | |
| 64 | 34 |
| 65 // ============================================================================ | 35 // ============================================================================ |
| 66 // CFilterElementHideAttrSelector | 36 // CFilterElementHideAttrSelector |
| 67 // ============================================================================ | 37 // ============================================================================ |
| 68 | 38 |
| 69 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector() : m_type(TYPE_N ONE), m_pos(POS_NONE), m_bstrAttr(NULL) | 39 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector() : m_type(TYPE_N ONE), m_pos(POS_NONE), m_bstrAttr(NULL) |
| 70 { | 40 { |
| 71 } | 41 } |
| 72 | 42 |
| 73 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector(const CFilterElem entHideAttrSelector& filter) | 43 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector(const CFilterElem entHideAttrSelector& filter) |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 248 m_predecessor = filter.m_predecessor; | 218 m_predecessor = filter.m_predecessor; |
| 249 } | 219 } |
| 250 | 220 |
| 251 | 221 |
| 252 // ============================================================================ | 222 // ============================================================================ |
| 253 // CFilter | 223 // CFilter |
| 254 // ============================================================================ | 224 // ============================================================================ |
| 255 | 225 |
| 256 CFilter::CFilter(const CFilter& filter) | 226 CFilter::CFilter(const CFilter& filter) |
| 257 { | 227 { |
| 258 m_contentType = filter.m_contentType; | |
| 259 m_filterType = filter.m_filterType; | 228 m_filterType = filter.m_filterType; |
| 260 | 229 |
| 261 m_isFirstParty = filter.m_isFirstParty; | 230 m_isFirstParty = filter.m_isFirstParty; |
| 262 m_isThirdParty = filter.m_isThirdParty; | 231 m_isThirdParty = filter.m_isThirdParty; |
| 263 | 232 |
| 264 m_isMatchCase = filter.m_isMatchCase; | 233 m_isMatchCase = filter.m_isMatchCase; |
| 265 m_isFromStart = filter.m_isFromStart; | 234 m_isFromStart = filter.m_isFromStart; |
| 266 m_isFromEnd = filter.m_isFromEnd; | 235 m_isFromEnd = filter.m_isFromEnd; |
| 267 | 236 |
| 268 m_filterText = filter.m_filterText; | 237 m_filterText = filter.m_filterText; |
| 269 | 238 |
| 270 m_hitCount = filter.m_hitCount; | 239 m_hitCount = filter.m_hitCount; |
| 271 } | 240 } |
| 272 | 241 |
| 273 | 242 |
| 274 CFilter::CFilter() : m_isMatchCase(false), m_isFirstParty(false), m_isThirdParty (false), m_contentType(CFilter::contentTypeAny), | 243 CFilter::CFilter() : m_isMatchCase(false), m_isFirstParty(false), |
| 244 m_isThirdParty(false), | |
| 275 m_isFromStart(false), m_isFromEnd(false), m_hitCount(0) | 245 m_isFromStart(false), m_isFromEnd(false), m_hitCount(0) |
| 276 { | 246 { |
| 277 } | 247 } |
| 278 | 248 |
| 279 | 249 |
| 280 bool CFilterElementHide::IsMatchFilterElementHide(IHTMLElement* pEl) const | 250 bool CFilterElementHide::IsMatchFilterElementHide(IHTMLElement* pEl) const |
| 281 { | 251 { |
| 282 HRESULT hr; | 252 HRESULT hr; |
| 283 | 253 |
| 284 if (!m_tagId.IsEmpty()) | 254 if (!m_tagId.IsEmpty()) |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 446 | 416 |
| 447 return true; | 417 return true; |
| 448 } | 418 } |
| 449 | 419 |
| 450 | 420 |
| 451 | 421 |
| 452 // ============================================================================ | 422 // ============================================================================ |
| 453 // CPluginFilter | 423 // CPluginFilter |
| 454 // ============================================================================ | 424 // ============================================================================ |
| 455 | 425 |
| 456 CPluginFilter::CPluginFilter(const CString& dataPath) : m_dataPath(dataPath) | |
| 457 { | |
| 458 m_contentMapText[CFilter::contentTypeDocument] = "DOCUMENT"; | |
| 459 m_contentMapText[CFilter::contentTypeObject] = "OBJECT"; | |
| 460 m_contentMapText[CFilter::contentTypeObjectSubrequest] = "OBJECT_SUBREQUEST"; | |
| 461 m_contentMapText[CFilter::contentTypeImage] = "IMAGE"; | |
| 462 m_contentMapText[CFilter::contentTypeScript] = "SCRIPT"; | |
| 463 m_contentMapText[CFilter::contentTypeOther] = "OTHER"; | |
| 464 m_contentMapText[CFilter::contentTypeUnknown] = "OTHER"; | |
| 465 m_contentMapText[CFilter::contentTypeSubdocument] = "SUBDOCUMENT"; | |
| 466 m_contentMapText[CFilter::contentTypeStyleSheet] = "STYLESHEET"; | |
| 467 m_contentMapText[CFilter::contentTypeXmlHttpRequest] = "XMLHTTPREQUEST"; | |
| 468 | |
| 469 ClearFilters(); | |
| 470 } | |
| 471 | |
| 472 | |
| 473 bool CPluginFilter::AddFilterElementHide(CString filterText) | 426 bool CPluginFilter::AddFilterElementHide(CString filterText) |
| 474 { | 427 { |
| 475 DEBUG_FILTER("Input: " + filterText + " filterFile" + filterFile); | 428 DEBUG_FILTER("Input: " + filterText + " filterFile" + filterFile); |
| 476 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 429 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
| 477 { | 430 { |
| 478 CString filterString = filterText; | 431 CString filterString = filterText; |
| 479 // Create filter descriptor | 432 // Create filter descriptor |
| 480 std::auto_ptr<CFilterElementHide> filter; | 433 std::auto_ptr<CFilterElementHide> filter; |
| 481 | 434 |
| 482 CString wholeFilterString = filterString; | 435 CString wholeFilterString = filterString; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 529 } | 482 } |
| 530 } | 483 } |
| 531 } while (separatorChar != '\0'); | 484 } while (separatorChar != '\0'); |
| 532 } | 485 } |
| 533 | 486 |
| 534 return true; | 487 return true; |
| 535 } | 488 } |
| 536 | 489 |
| 537 bool CPluginFilter::IsElementHidden(const std::wstring& tag, IHTMLElement* pEl, const std::wstring& domain, const std::wstring& indent) const | 490 bool CPluginFilter::IsElementHidden(const std::wstring& tag, IHTMLElement* pEl, const std::wstring& domain, const std::wstring& indent) const |
| 538 { | 491 { |
| 539 CString tagCString = to_CString(tag); | 492 CString tagCString = ToCString(tag); |
| 540 | 493 |
| 541 CString id; | 494 CString id; |
| 542 CComBSTR bstrId; | 495 CComBSTR bstrId; |
| 543 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) | 496 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) |
| 544 { | 497 { |
| 545 id = bstrId; | 498 id = bstrId; |
| 546 } | 499 } |
| 547 | 500 |
| 548 CString classNames; | 501 CString classNames; |
| 549 CComBSTR bstrClassNames; | 502 CComBSTR bstrClassNames; |
| 550 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) | 503 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) |
| 551 { | 504 { |
| 552 classNames = bstrClassNames; | 505 classNames = bstrClassNames; |
| 553 } | 506 } |
| 554 | 507 |
| 555 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 508 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
| 556 { | 509 { |
| 557 // Search tag/id filters | 510 // Search tag/id filters |
| 558 if (!id.IsEmpty()) | 511 if (!id.IsEmpty()) |
| 559 { | 512 { |
| 560 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT agsNamed::const_iterator> idItEnum = | 513 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT agsNamed::const_iterator> idItEnum = |
| 561 m_elementHideTagsId.equal_range(std::make_pair(tagCString, id)); | 514 m_elementHideTagsId.equal_range(std::make_pair(tagCString, id)); |
| 562 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id It != idItEnum.second; idIt ++) | 515 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id It != idItEnum.second; idIt ++) |
| 563 { | 516 { |
| 564 if (idIt->second.IsMatchFilterElementHide(pEl)) | 517 if (idIt->second.IsMatchFilterElementHide(pEl)) |
| 565 { | 518 { |
| 566 #ifdef ENABLE_DEBUG_RESULT | 519 #ifdef ENABLE_DEBUG_RESULT |
| 567 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/id) filter:" + idIt->second .m_filterText) | 520 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/id) filter:" + idIt->second .m_filterText) |
| 568 CPluginDebug::DebugResultHiding(tagCString, "id:" + id, idIt->second .m_filterText); | 521 CPluginDebug::DebugResultHiding(tag, L"id:" + ToWstring(id), ToWstri ng(idIt->second.m_filterText)); |
| 569 #endif | 522 #endif |
| 570 return true; | 523 return true; |
| 571 } | 524 } |
| 572 } | 525 } |
| 573 | 526 |
| 574 // Search general id | 527 // Search general id |
| 575 idItEnum = m_elementHideTagsId.equal_range(std::make_pair("", id)); | 528 idItEnum = m_elementHideTagsId.equal_range(std::make_pair("", id)); |
| 576 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id It != idItEnum.second; idIt ++) | 529 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id It != idItEnum.second; idIt ++) |
| 577 { | 530 { |
| 578 if (idIt->second.IsMatchFilterElementHide(pEl)) | 531 if (idIt->second.IsMatchFilterElementHide(pEl)) |
| 579 { | 532 { |
| 580 #ifdef ENABLE_DEBUG_RESULT | 533 #ifdef ENABLE_DEBUG_RESULT |
| 581 DEBUG_HIDE_EL(indent + "HideEl::Found (?/id) filter:" + idIt->second.m _filterText) | 534 DEBUG_HIDE_EL(indent + "HideEl::Found (?/id) filter:" + idIt->second.m _filterText) |
| 582 CPluginDebug::DebugResultHiding(tagCString, "id:" + id, idIt->second .m_filterText); | 535 CPluginDebug::DebugResultHiding(tag, L"id:" + ToWstring(id), ToWstri ng(idIt->second.m_filterText)); |
| 583 #endif | 536 #endif |
| 584 return true; | 537 return true; |
| 585 } | 538 } |
| 586 } | 539 } |
| 587 } | 540 } |
| 588 | 541 |
| 589 // Search tag/className filters | 542 // Search tag/className filters |
| 590 if (!classNames.IsEmpty()) | 543 if (!classNames.IsEmpty()) |
| 591 { | 544 { |
| 592 int pos = 0; | 545 int pos = 0; |
| 593 CString className = classNames.Tokenize(L" \t\n\r", pos); | 546 CString className = classNames.Tokenize(L" \t\n\r", pos); |
| 594 while (pos >= 0) | 547 while (pos >= 0) |
| 595 { | 548 { |
| 596 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHid eTagsNamed::const_iterator> classItEnum = | 549 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHid eTagsNamed::const_iterator> classItEnum = |
| 597 m_elementHideTagsClass.equal_range(std::make_pair(tagCString, classNam e)); | 550 m_elementHideTagsClass.equal_range(std::make_pair(tagCString, classNam e)); |
| 598 | 551 |
| 599 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f irst; classIt != classItEnum.second; ++classIt) | 552 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f irst; classIt != classItEnum.second; ++classIt) |
| 600 { | 553 { |
| 601 if (classIt->second.IsMatchFilterElementHide(pEl)) | 554 if (classIt->second.IsMatchFilterElementHide(pEl)) |
| 602 { | 555 { |
| 603 #ifdef ENABLE_DEBUG_RESULT | 556 #ifdef ENABLE_DEBUG_RESULT |
| 604 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/class) filter:" + classIt ->second.m_filterText) | 557 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/class) filter:" + classIt ->second.m_filterText) |
| 605 CPluginDebug::DebugResultHiding(tagCString, "class:" + className, classIt->second.m_filterText); | 558 CPluginDebug::DebugResultHiding(tag, L"class:" + ToWstring(classNa me), ToWstring(classIt->second.m_filterText)); |
| 606 #endif | 559 #endif |
| 607 return true; | 560 return true; |
| 608 } | 561 } |
| 609 } | 562 } |
| 610 | 563 |
| 611 // Search general class name | 564 // Search general class name |
| 612 classItEnum = m_elementHideTagsClass.equal_range(std::make_pair("", clas sName)); | 565 classItEnum = m_elementHideTagsClass.equal_range(std::make_pair("", clas sName)); |
| 613 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f irst; classIt != classItEnum.second; ++ classIt) | 566 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f irst; classIt != classItEnum.second; ++ classIt) |
| 614 { | 567 { |
| 615 if (classIt->second.IsMatchFilterElementHide(pEl)) | 568 if (classIt->second.IsMatchFilterElementHide(pEl)) |
| 616 { | 569 { |
| 617 #ifdef ENABLE_DEBUG_RESULT | 570 #ifdef ENABLE_DEBUG_RESULT |
| 618 DEBUG_HIDE_EL(indent + "HideEl::Found (?/class) filter:" + classIt-> second.m_filterText) | 571 DEBUG_HIDE_EL(indent + L"HideEl::Found (?/class) filter:" + ToWStrin g(classIt->second.m_filterText)); |
| 619 CPluginDebug::DebugResultHiding(tagCString, "class:" + className, classIt->second.m_filterText); | 572 CPluginDebug::DebugResultHiding(tag, L"class:" + ToWstring(className ), ToWstring(classIt->second.m_filterText)); |
| 620 #endif | 573 #endif |
| 621 return true; | 574 return true; |
| 622 } | 575 } |
| 623 } | 576 } |
| 624 | 577 |
| 625 // Next class name | 578 // Next class name |
| 626 className = classNames.Tokenize(L" \t\n\r", pos); | 579 className = classNames.Tokenize(L" \t\n\r", pos); |
| 627 } | 580 } |
| 628 } | 581 } |
| 629 | 582 |
| 630 // Search tag filters | 583 // Search tag filters |
| 631 std::pair<TFilterElementHideTags::const_iterator, TFilterElementHideTags::co nst_iterator> tagItEnum | 584 std::pair<TFilterElementHideTags::const_iterator, TFilterElementHideTags::co nst_iterator> tagItEnum |
| 632 = m_elementHideTags.equal_range(tagCString); | 585 = m_elementHideTags.equal_range(tagCString); |
| 633 for (TFilterElementHideTags::const_iterator tagIt = tagItEnum.first; tagIt ! = tagItEnum.second; ++ tagIt) | 586 for (TFilterElementHideTags::const_iterator tagIt = tagItEnum.first; tagIt ! = tagItEnum.second; ++ tagIt) |
| 634 { | 587 { |
| 635 if (tagIt->second.IsMatchFilterElementHide(pEl)) | 588 if (tagIt->second.IsMatchFilterElementHide(pEl)) |
| 636 { | 589 { |
| 637 #ifdef ENABLE_DEBUG_RESULT | 590 #ifdef ENABLE_DEBUG_RESULT |
| 638 DEBUG_HIDE_EL(indent + "HideEl::Found (tag) filter:" + tagIt->second.m_f ilterText) | 591 DEBUG_HIDE_EL(indent + "HideEl::Found (tag) filter:" + tagIt->second.m_f ilterText) |
| 639 CPluginDebug::DebugResultHiding(tagCString, "-", tagIt->second.m_filte rText); | 592 CPluginDebug::DebugResultHiding(tag, L"-", ToWstring(tagIt->second.m_f ilterText)); |
| 640 #endif | 593 #endif |
| 641 return true; | 594 return true; |
| 642 } | 595 } |
| 643 } | 596 } |
| 644 } | 597 } |
| 645 | 598 |
| 646 return false; | 599 return false; |
| 647 } | 600 } |
| 648 | 601 |
| 649 bool CPluginFilter::LoadHideFilters(const std::vector<std::wstring>& filters) | 602 CPluginFilter::CPluginFilter(const std::vector<std::wstring>& filters) |
| 650 { | 603 { |
| 651 ClearFilters(); | |
| 652 m_hideFilters = filters; | 604 m_hideFilters = filters; |
| 653 bool isRead = false; | |
| 654 CPluginClient* client = CPluginClient::GetInstance(); | 605 CPluginClient* client = CPluginClient::GetInstance(); |
| 655 | 606 |
| 656 // Parse hide string | 607 // Parse hide string |
| 657 int pos = 0; | 608 int pos = 0; |
| 658 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 609 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
| 659 { | 610 { |
| 660 for (std::vector<std::wstring>::const_iterator it = filters.begin(); it < fi lters.end(); ++it) | 611 for (auto it = filters.begin(); it < filters.end(); ++it) |
| 661 { | 612 { |
| 662 CString filter((*it).c_str()); | 613 CString filter((*it).c_str()); |
| 663 // If the line is not commented out | 614 // If the line is not commented out |
| 664 if (!filter.Trim().IsEmpty() && filter.GetAt(0) != '!' && filter.GetAt(0) != '[') | 615 if (!filter.Trim().IsEmpty() && filter.GetAt(0) != '!' && filter.GetAt(0) != '[') |
| 665 { | 616 { |
| 666 int filterType = 0; | 617 int filterType = 0; |
| 667 | 618 |
| 668 // See http://adblockplus.org/en/filters for further documentation | 619 // See http://adblockplus.org/en/filters for further documentation |
| 669 | 620 |
| 670 try | 621 try |
| 671 { | 622 { |
| 672 AddFilterElementHide(filter); | 623 AddFilterElementHide(filter); |
| 673 } | 624 } |
| 674 catch(...) | 625 catch(...) |
| 675 { | 626 { |
| 676 #ifdef ENABLE_DEBUG_RESULT | 627 #ifdef ENABLE_DEBUG_RESULT |
| 677 CPluginDebug::DebugResult(L"Error loading hide filter: " + filter); | 628 CPluginDebug::DebugResult(L"Error loading hide filter: " + ToWstring(f ilter)); |
| 678 #endif | 629 #endif |
| 679 } | 630 } |
| 680 } | 631 } |
| 681 } | 632 } |
| 682 } | 633 } |
| 683 | |
| 684 return isRead; | |
| 685 } | |
| 686 | |
| 687 void CPluginFilter::ClearFilters() | |
| 688 { | |
| 689 // Clear filter maps | |
| 690 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | |
| 691 { | |
| 692 for (int i = 0; i < 2; i++) | |
| 693 { | |
| 694 for (int j = 0; j < 2; j++) | |
| 695 { | |
| 696 m_filterMap[i][j].clear(); | |
| 697 } | |
| 698 m_filterMapDefault[i].clear(); | |
| 699 } | |
| 700 | |
| 701 m_elementHideTags.clear(); | |
| 702 m_elementHideTagsId.clear(); | |
| 703 m_elementHideTagsClass.clear(); | |
| 704 m_hideFilters.clear(); | |
| 705 } | |
| 706 } | |
| 707 | |
| 708 bool CPluginFilter::ShouldBlock(const std::wstring& src, int contentType, const std::wstring& domain, bool addDebug) const | |
| 709 { | |
| 710 CString srcCString = to_CString(src); | |
| 711 | |
| 712 // We should not block the empty string, so all filtering does not make sense | |
| 713 // Therefore we just return | |
| 714 if (srcCString.Trim().IsEmpty()) | |
| 715 { | |
| 716 return false; | |
| 717 } | |
| 718 | |
| 719 CPluginSettings* settings = CPluginSettings::GetInstance(); | |
| 720 | |
| 721 CString type; | |
| 722 if (addDebug) | |
| 723 { | |
| 724 type = "OTHER"; | |
| 725 | |
| 726 std::map<int,CString>::const_iterator it = m_contentMapText.find(contentType ); | |
| 727 if (it != m_contentMapText.end()) | |
| 728 { | |
| 729 type = it->second; | |
| 730 } | |
| 731 } | |
| 732 | |
| 733 CPluginClient* client = CPluginClient::GetInstance(); | |
| 734 if (client->Matches(to_wstring(srcCString), to_wstring(type), domain)) | |
| 735 { | |
| 736 if (addDebug) | |
| 737 { | |
| 738 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") | |
| 739 | |
| 740 #ifdef ENABLE_DEBUG_RESULT | |
| 741 CPluginDebug::DebugResultBlocking(type, srcCString, domain); | |
| 742 #endif | |
| 743 } | |
| 744 return true; | |
| 745 } | |
| 746 #ifdef ENABLE_DEBUG_RESULT | |
| 747 CPluginDebug::DebugResultIgnoring(type, srcCString, domain); | |
| 748 #endif | |
| 749 return false; | |
| 750 } | |
| 751 | |
| 752 const std::vector<std::wstring>& CPluginFilter::getHideFilters() const | |
| 753 { | |
| 754 DWORD res = WaitForSingleObject(hideFiltersLoadedEvent, ENGINE_STARTUP_TIMEOUT ); | |
|
Oleksandr
2015/02/04 20:59:57
It's hard to understand this from the scattered re
sergei
2015/04/13 08:06:58
`hideFiltersLoadedEvent` is not introduced in thes
| |
| 755 return m_hideFilters; | |
| 756 } | 634 } |
| LEFT | RIGHT |