LEFT | RIGHT |
1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
2 | 2 |
3 #include "PluginFilter.h" | 3 #include "PluginFilter.h" |
4 | |
5 #if (defined PRODUCT_ADBLOCKPLUS) | |
6 #include "PluginSettings.h" | 4 #include "PluginSettings.h" |
7 #include "PluginClient.h" | 5 #include "PluginClient.h" |
8 #include "PluginClientFactory.h" | 6 #include "PluginClientFactory.h" |
9 #endif | |
10 | |
11 #include "PluginMutex.h" | 7 #include "PluginMutex.h" |
12 #include "PluginSettings.h" | 8 #include "PluginSettings.h" |
13 #include "PluginSystem.h" | 9 #include "PluginSystem.h" |
14 #include "PluginClass.h" | 10 #include "PluginClass.h" |
15 #include "mlang.h" | 11 #include "mlang.h" |
16 | 12 |
17 #include "..\shared\CriticalSection.h" | 13 #include "..\shared\CriticalSection.h" |
18 | 14 |
19 | 15 |
20 // The filters are described at http://adblockplus.org/en/filters | 16 // The filters are described at http://adblockplus.org/en/filters |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 std::pair<CString, CFilterElementHide> pair = std::make_pair(filter->m
_tag, *filter); | 494 std::pair<CString, CFilterElementHide> pair = std::make_pair(filter->m
_tag, *filter); |
499 m_elementHideTags.insert(pair); | 495 m_elementHideTags.insert(pair); |
500 } | 496 } |
501 } | 497 } |
502 } while (separatorChar != '\0'); | 498 } while (separatorChar != '\0'); |
503 } | 499 } |
504 | 500 |
505 return true; | 501 return true; |
506 } | 502 } |
507 | 503 |
508 bool CPluginFilter::IsElementHidden(const CString& tag, IHTMLElement* pEl, const
CString& domain, const CString& indent) const | 504 bool CPluginFilter::IsElementHidden(const std::wstring& tag, IHTMLElement* pEl,
const std::wstring& domain, const std::wstring& indent) const |
509 { | 505 { |
| 506 CString tagCString = to_CString(tag); |
| 507 |
510 CString id; | 508 CString id; |
511 CComBSTR bstrId; | 509 CComBSTR bstrId; |
512 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) | 510 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) |
513 { | 511 { |
514 id = bstrId; | 512 id = bstrId; |
515 } | 513 } |
516 | 514 |
517 CString classNames; | 515 CString classNames; |
518 CComBSTR bstrClassNames; | 516 CComBSTR bstrClassNames; |
519 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) | 517 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) |
520 { | 518 { |
521 classNames = bstrClassNames; | 519 classNames = bstrClassNames; |
522 } | 520 } |
523 | 521 |
524 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 522 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
525 { | 523 { |
526 CString domainTest = domain; | |
527 | |
528 // Search tag/id filters | 524 // Search tag/id filters |
529 if (!id.IsEmpty()) | 525 if (!id.IsEmpty()) |
530 { | 526 { |
531 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT
agsNamed::const_iterator> idItEnum = | 527 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT
agsNamed::const_iterator> idItEnum = |
532 m_elementHideTagsId.equal_range(std::make_pair(tag, id)); | 528 m_elementHideTagsId.equal_range(std::make_pair(tagCString, id)); |
533 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 ++) |
534 { | 530 { |
535 if (idIt->second.IsMatchFilterElementHide(pEl)) | 531 if (idIt->second.IsMatchFilterElementHide(pEl)) |
536 { | 532 { |
537 #ifdef ENABLE_DEBUG_RESULT | 533 #ifdef ENABLE_DEBUG_RESULT |
538 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/id) filter:" + idIt->second
.m_filterText) | 534 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/id) filter:" + idIt->second
.m_filterText) |
539 CPluginDebug::DebugResultHiding(tag, "id:" + id, idIt->second.m_filt
erText); | 535 CPluginDebug::DebugResultHiding(tagCString, "id:" + id, idIt->second
.m_filterText); |
540 #endif | 536 #endif |
541 return true; | 537 return true; |
542 } | 538 } |
543 } | 539 } |
544 | 540 |
545 // Search general id | 541 // Search general id |
546 idItEnum = m_elementHideTagsId.equal_range(std::make_pair("", id)); | 542 idItEnum = m_elementHideTagsId.equal_range(std::make_pair("", id)); |
547 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id
It != idItEnum.second; idIt ++) | 543 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id
It != idItEnum.second; idIt ++) |
548 { | 544 { |
549 if (idIt->second.IsMatchFilterElementHide(pEl)) | 545 if (idIt->second.IsMatchFilterElementHide(pEl)) |
550 { | 546 { |
551 #ifdef ENABLE_DEBUG_RESULT | 547 #ifdef ENABLE_DEBUG_RESULT |
552 DEBUG_HIDE_EL(indent + "HideEl::Found (?/id) filter:" + idIt->second.m
_filterText) | 548 DEBUG_HIDE_EL(indent + "HideEl::Found (?/id) filter:" + idIt->second.m
_filterText) |
553 CPluginDebug::DebugResultHiding(tag, "id:" + id, idIt->second.m_filt
erText); | 549 CPluginDebug::DebugResultHiding(tagCString, "id:" + id, idIt->second
.m_filterText); |
554 #endif | 550 #endif |
555 return true; | 551 return true; |
556 } | 552 } |
557 } | 553 } |
558 } | 554 } |
559 | 555 |
560 // Search tag/className filters | 556 // Search tag/className filters |
561 if (!classNames.IsEmpty()) | 557 if (!classNames.IsEmpty()) |
562 { | 558 { |
563 int pos = 0; | 559 int pos = 0; |
564 CString className = classNames.Tokenize(L" \t\n\r", pos); | 560 CString className = classNames.Tokenize(L" \t\n\r", pos); |
565 while (pos >= 0) | 561 while (pos >= 0) |
566 { | 562 { |
567 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHid
eTagsNamed::const_iterator> classItEnum = | 563 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHid
eTagsNamed::const_iterator> classItEnum = |
568 m_elementHideTagsClass.equal_range(std::make_pair(tag, className)); | 564 m_elementHideTagsClass.equal_range(std::make_pair(tagCString, classNam
e)); |
569 | 565 |
570 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) |
571 { | 567 { |
572 if (classIt->second.IsMatchFilterElementHide(pEl)) | 568 if (classIt->second.IsMatchFilterElementHide(pEl)) |
573 { | 569 { |
574 #ifdef ENABLE_DEBUG_RESULT | 570 #ifdef ENABLE_DEBUG_RESULT |
575 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/class) filter:" + classIt
->second.m_filterText) | 571 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/class) filter:" + classIt
->second.m_filterText) |
576 CPluginDebug::DebugResultHiding(tag, "class:" + className, classIt
->second.m_filterText); | 572 CPluginDebug::DebugResultHiding(tagCString, "class:" + className,
classIt->second.m_filterText); |
577 #endif | 573 #endif |
578 return true; | 574 return true; |
579 } | 575 } |
580 } | 576 } |
581 | 577 |
582 // Search general class name | 578 // Search general class name |
583 classItEnum = m_elementHideTagsClass.equal_range(std::make_pair("", clas
sName)); | 579 classItEnum = m_elementHideTagsClass.equal_range(std::make_pair("", clas
sName)); |
584 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f
irst; classIt != classItEnum.second; ++ classIt) | 580 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f
irst; classIt != classItEnum.second; ++ classIt) |
585 { | 581 { |
586 if (classIt->second.IsMatchFilterElementHide(pEl)) | 582 if (classIt->second.IsMatchFilterElementHide(pEl)) |
587 { | 583 { |
588 #ifdef ENABLE_DEBUG_RESULT | 584 #ifdef ENABLE_DEBUG_RESULT |
589 DEBUG_HIDE_EL(indent + "HideEl::Found (?/class) filter:" + classIt->
second.m_filterText) | 585 DEBUG_HIDE_EL(indent + "HideEl::Found (?/class) filter:" + classIt->
second.m_filterText) |
590 CPluginDebug::DebugResultHiding(tag, "class:" + className, classIt
->second.m_filterText); | 586 CPluginDebug::DebugResultHiding(tagCString, "class:" + className,
classIt->second.m_filterText); |
591 #endif | 587 #endif |
592 return true; | 588 return true; |
593 } | 589 } |
594 } | 590 } |
595 | 591 |
596 // Next class name | 592 // Next class name |
597 className = classNames.Tokenize(L" \t\n\r", pos); | 593 className = classNames.Tokenize(L" \t\n\r", pos); |
598 } | 594 } |
599 } | 595 } |
600 | 596 |
601 // Search tag filters | 597 // Search tag filters |
602 std::pair<TFilterElementHideTags::const_iterator, TFilterElementHideTags::co
nst_iterator> tagItEnum | 598 std::pair<TFilterElementHideTags::const_iterator, TFilterElementHideTags::co
nst_iterator> tagItEnum |
603 = m_elementHideTags.equal_range(tag); | 599 = m_elementHideTags.equal_range(tagCString); |
604 for (TFilterElementHideTags::const_iterator tagIt = tagItEnum.first; tagIt !
= tagItEnum.second; ++ tagIt) | 600 for (TFilterElementHideTags::const_iterator tagIt = tagItEnum.first; tagIt !
= tagItEnum.second; ++ tagIt) |
605 { | 601 { |
606 if (tagIt->second.IsMatchFilterElementHide(pEl)) | 602 if (tagIt->second.IsMatchFilterElementHide(pEl)) |
607 { | 603 { |
608 #ifdef ENABLE_DEBUG_RESULT | 604 #ifdef ENABLE_DEBUG_RESULT |
609 DEBUG_HIDE_EL(indent + "HideEl::Found (tag) filter:" + tagIt->second.m_f
ilterText) | 605 DEBUG_HIDE_EL(indent + "HideEl::Found (tag) filter:" + tagIt->second.m_f
ilterText) |
610 CPluginDebug::DebugResultHiding(tag, "-", tagIt->second.m_filterText); | 606 CPluginDebug::DebugResultHiding(tagCString, "-", tagIt->second.m_filte
rText); |
611 #endif | 607 #endif |
612 return true; | 608 return true; |
613 } | 609 } |
614 } | 610 } |
615 } | 611 } |
616 | 612 |
617 return false; | 613 return false; |
618 } | 614 } |
619 | 615 |
620 bool CPluginFilter::LoadHideFilters(std::vector<std::wstring> filters) | 616 bool CPluginFilter::LoadHideFilters(std::vector<std::wstring> filters) |
621 { | 617 { |
622 | |
623 ClearFilters(); | 618 ClearFilters(); |
624 | |
625 bool isRead = false; | 619 bool isRead = false; |
626 | |
627 #ifdef PRODUCT_ADBLOCKPLUS | |
628 CPluginClient* client = CPluginClient::GetInstance(); | 620 CPluginClient* client = CPluginClient::GetInstance(); |
629 #endif | |
630 | 621 |
631 // Parse hide string | 622 // Parse hide string |
632 int pos = 0; | 623 int pos = 0; |
633 | |
634 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 624 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
635 { | 625 { |
636 for (std::vector<std::wstring>::iterator it = filters.begin(); it < filters.
end(); ++it) | 626 for (std::vector<std::wstring>::iterator it = filters.begin(); it < filters.
end(); ++it) |
637 { | 627 { |
638 CString filter((*it).c_str()); | 628 CString filter((*it).c_str()); |
639 // If the line is not commented out | 629 // If the line is not commented out |
640 if (!filter.Trim().IsEmpty() && filter.GetAt(0) != '!' && filter.GetAt(0)
!= '[') | 630 if (!filter.Trim().IsEmpty() && filter.GetAt(0) != '!' && filter.GetAt(0)
!= '[') |
641 { | 631 { |
642 int filterType = 0; | 632 int filterType = 0; |
643 | 633 |
(...skipping 29 matching lines...) Expand all Loading... |
673 } | 663 } |
674 m_filterMapDefault[i].clear(); | 664 m_filterMapDefault[i].clear(); |
675 } | 665 } |
676 | 666 |
677 m_elementHideTags.clear(); | 667 m_elementHideTags.clear(); |
678 m_elementHideTagsId.clear(); | 668 m_elementHideTagsId.clear(); |
679 m_elementHideTagsClass.clear(); | 669 m_elementHideTagsClass.clear(); |
680 } | 670 } |
681 } | 671 } |
682 | 672 |
683 bool CPluginFilter::ShouldBlock(CString src, int contentType, const CString& dom
ain, bool addDebug) const | 673 bool CPluginFilter::ShouldBlock(const std::wstring& src, int contentType, const
std::wstring& domain, bool addDebug) const |
684 { | 674 { |
| 675 CString srcCString = to_CString(src); |
| 676 |
685 // We should not block the empty string, so all filtering does not make sense | 677 // We should not block the empty string, so all filtering does not make sense |
686 // Therefore we just return | 678 // Therefore we just return |
687 if (src.Trim().IsEmpty()) | 679 if (srcCString.Trim().IsEmpty()) |
688 { | 680 { |
689 return false; | 681 return false; |
690 } | 682 } |
691 | 683 |
692 CPluginSettings* settings = CPluginSettings::GetInstance(); | 684 CPluginSettings* settings = CPluginSettings::GetInstance(); |
693 | 685 |
694 CString type; | 686 CString type; |
695 if (addDebug) | 687 if (addDebug) |
696 { | 688 { |
697 type = "OTHER"; | 689 type = "OTHER"; |
698 | 690 |
699 std::map<int,CString>::const_iterator it = m_contentMapText.find(contentType
); | 691 std::map<int,CString>::const_iterator it = m_contentMapText.find(contentType
); |
700 if (it != m_contentMapText.end()) | 692 if (it != m_contentMapText.end()) |
701 { | 693 { |
702 type = it->second; | 694 type = it->second; |
703 } | 695 } |
704 } | 696 } |
705 | 697 |
706 CPluginClient* client = CPluginClient::GetInstance(); | 698 CPluginClient* client = CPluginClient::GetInstance(); |
707 if (client->Matches(std::wstring(src), std::wstring(type), std::wstring(domain
))) | 699 if (client->Matches(to_wstring(srcCString), to_wstring(type), domain)) |
708 { | 700 { |
709 if (addDebug) | 701 if (addDebug) |
710 { | 702 { |
711 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") | 703 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") |
712 | 704 |
713 #ifdef ENABLE_DEBUG_RESULT | 705 #ifdef ENABLE_DEBUG_RESULT |
714 CPluginDebug::DebugResultBlocking(type, src, domain); | 706 CPluginDebug::DebugResultBlocking(type, srcCString, domain); |
715 #endif | 707 #endif |
716 } | 708 } |
717 return true; | 709 return true; |
718 } | 710 } |
719 #ifdef ENABLE_DEBUG_RESULT | 711 #ifdef ENABLE_DEBUG_RESULT |
720 CPluginDebug::DebugResultIgnoring(type, src, domain); | 712 CPluginDebug::DebugResultIgnoring(type, src, domain); |
721 #endif | 713 #endif |
722 return false; | 714 return false; |
723 } | 715 } |
LEFT | RIGHT |