LEFT | RIGHT |
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-2015 Eyeo GmbH | 3 * Copyright (C) 2006-2016 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 |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 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/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 #include "PluginStdAfx.h" | 18 #include "PluginStdAfx.h" |
19 | 19 #include "AdblockPlusClient.h" |
20 #include "PluginFilter.h" | 20 #include "PluginFilter.h" |
21 #include "PluginSettings.h" | 21 #include "PluginSettings.h" |
22 #include "PluginClient.h" | |
23 #include "PluginClientFactory.h" | |
24 #include "PluginMutex.h" | 22 #include "PluginMutex.h" |
25 #include "PluginSettings.h" | 23 #include "PluginSettings.h" |
26 #include "PluginSystem.h" | 24 #include "PluginSystem.h" |
27 #include "PluginClass.h" | 25 #include "PluginClass.h" |
28 #include "mlang.h" | 26 #include "mlang.h" |
29 | |
30 #include "..\shared\CriticalSection.h" | 27 #include "..\shared\CriticalSection.h" |
31 #include "..\shared\Utils.h" | 28 #include "..\shared\Utils.h" |
| 29 #include "..\shared\MsHTMLUtils.h" |
32 | 30 |
33 // The filters are described at http://adblockplus.org/en/filters | 31 // The filters are described at http://adblockplus.org/en/filters |
34 | 32 |
35 static CriticalSection s_criticalSectionFilterMap; | 33 static CriticalSection s_criticalSectionFilterMap; |
36 | |
37 namespace | |
38 { | |
39 struct GetHtmlElementAttributeResult | |
40 { | |
41 GetHtmlElementAttributeResult() : isAttributeFound(false) | |
42 { | |
43 } | |
44 std::wstring attributeValue; | |
45 bool isAttributeFound; | |
46 }; | |
47 | |
48 GetHtmlElementAttributeResult GetHtmlElementAttribute(IHTMLElement& htmlElemen
t, | |
49 const ATL::CComBSTR& attributeName) | |
50 { | |
51 GetHtmlElementAttributeResult retValue; | |
52 ATL::CComVariant vAttr; | |
53 ATL::CComPtr<IHTMLElement4> htmlElement4; | |
54 if (FAILED(htmlElement.QueryInterface(&htmlElement4)) || !htmlElement4) | |
55 { | |
56 return retValue; | |
57 } | |
58 ATL::CComPtr<IHTMLDOMAttribute> attributeNode; | |
59 if (FAILED(htmlElement4->getAttributeNode(attributeName, &attributeNode)) ||
!attributeNode) | |
60 { | |
61 return retValue; | |
62 } | |
63 // we set that attribute found but it's not necessary that we can retrieve i
ts value | |
64 retValue.isAttributeFound = true; | |
65 if (FAILED(attributeNode->get_nodeValue(&vAttr))) | |
66 { | |
67 return retValue; | |
68 } | |
69 if (vAttr.vt == VT_BSTR && vAttr.bstrVal) | |
70 { | |
71 retValue.attributeValue = vAttr.bstrVal; | |
72 } | |
73 else if (vAttr.vt == VT_I4) | |
74 { | |
75 retValue.attributeValue = std::to_wstring(vAttr.iVal); | |
76 } | |
77 return retValue; | |
78 } | |
79 } | |
80 | 34 |
81 // ============================================================================ | 35 // ============================================================================ |
82 // CFilterElementHideAttrSelector | 36 // CFilterElementHideAttrSelector |
83 // ============================================================================ | 37 // ============================================================================ |
84 | 38 |
85 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) |
86 { | 40 { |
87 } | 41 } |
88 | 42 |
89 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector(const CFilterElem
entHideAttrSelector& filter) | 43 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector(const CFilterElem
entHideAttrSelector& filter) |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 | 416 |
463 return true; | 417 return true; |
464 } | 418 } |
465 | 419 |
466 | 420 |
467 | 421 |
468 // ============================================================================ | 422 // ============================================================================ |
469 // CPluginFilter | 423 // CPluginFilter |
470 // ============================================================================ | 424 // ============================================================================ |
471 | 425 |
472 CPluginFilter::CPluginFilter(const CString& dataPath) : m_dataPath(dataPath) | |
473 { | |
474 ClearFilters(); | |
475 } | |
476 | |
477 | |
478 bool CPluginFilter::AddFilterElementHide(CString filterText) | 426 bool CPluginFilter::AddFilterElementHide(CString filterText) |
479 { | 427 { |
480 DEBUG_FILTER("Input: " + filterText + " filterFile" + filterFile); | 428 DEBUG_FILTER("Input: " + filterText + " filterFile" + filterFile); |
481 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 429 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
482 { | 430 { |
483 CString filterString = filterText; | 431 CString filterString = filterText; |
484 // Create filter descriptor | 432 // Create filter descriptor |
485 std::auto_ptr<CFilterElementHide> filter; | 433 std::auto_ptr<CFilterElementHide> filter; |
486 | 434 |
487 CString wholeFilterString = filterString; | 435 CString wholeFilterString = filterString; |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 CPluginDebug::DebugResultHiding(tag, L"-", ToWstring(tagIt->second.m_f
ilterText)); | 592 CPluginDebug::DebugResultHiding(tag, L"-", ToWstring(tagIt->second.m_f
ilterText)); |
645 #endif | 593 #endif |
646 return true; | 594 return true; |
647 } | 595 } |
648 } | 596 } |
649 } | 597 } |
650 | 598 |
651 return false; | 599 return false; |
652 } | 600 } |
653 | 601 |
654 bool CPluginFilter::LoadHideFilters(const std::vector<std::wstring>& filters) | 602 CPluginFilter::CPluginFilter(const std::vector<std::wstring>& filters) |
655 { | 603 { |
656 ClearFilters(); | |
657 m_hideFilters = filters; | 604 m_hideFilters = filters; |
658 bool isRead = false; | |
659 CPluginClient* client = CPluginClient::GetInstance(); | 605 CPluginClient* client = CPluginClient::GetInstance(); |
660 | 606 |
661 // Parse hide string | 607 // Parse hide string |
662 int pos = 0; | 608 int pos = 0; |
663 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 609 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
664 { | 610 { |
665 for (auto it = filters.begin(); it < filters.end(); ++it) | 611 for (auto it = filters.begin(); it < filters.end(); ++it) |
666 { | 612 { |
667 CString filter((*it).c_str()); | 613 CString filter((*it).c_str()); |
668 // If the line is not commented out | 614 // If the line is not commented out |
669 if (!filter.Trim().IsEmpty() && filter.GetAt(0) != '!' && filter.GetAt(0)
!= '[') | 615 if (!filter.Trim().IsEmpty() && filter.GetAt(0) != '!' && filter.GetAt(0)
!= '[') |
670 { | 616 { |
671 int filterType = 0; | 617 int filterType = 0; |
672 | 618 |
673 // See http://adblockplus.org/en/filters for further documentation | 619 // See http://adblockplus.org/en/filters for further documentation |
674 | 620 |
675 try | 621 try |
676 { | 622 { |
677 AddFilterElementHide(filter); | 623 AddFilterElementHide(filter); |
678 } | 624 } |
679 catch(...) | 625 catch(...) |
680 { | 626 { |
681 #ifdef ENABLE_DEBUG_RESULT | 627 #ifdef ENABLE_DEBUG_RESULT |
682 CPluginDebug::DebugResult(L"Error loading hide filter: " + ToWstring(f
ilter)); | 628 CPluginDebug::DebugResult(L"Error loading hide filter: " + ToWstring(f
ilter)); |
683 #endif | 629 #endif |
684 } | 630 } |
685 } | 631 } |
686 } | 632 } |
687 } | 633 } |
688 | |
689 return isRead; | |
690 } | |
691 | |
692 void CPluginFilter::ClearFilters() | |
693 { | |
694 // Clear filter maps | |
695 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | |
696 m_elementHideTags.clear(); | |
697 m_elementHideTagsId.clear(); | |
698 m_elementHideTagsClass.clear(); | |
699 m_hideFilters.clear(); | |
700 } | |
701 | |
702 bool CPluginFilter::ShouldBlock(const std::wstring& src, AdblockPlus::FilterEngi
ne::ContentType contentType, const std::wstring& domain, bool addDebug) const | |
703 { | |
704 std::wstring srcTrimmed = TrimString(src); | |
705 | |
706 // We should not block the empty string, so all filtering does not make sense | |
707 // Therefore we just return | |
708 if (srcTrimmed.empty()) | |
709 { | |
710 return false; | |
711 } | |
712 | |
713 CPluginSettings* settings = CPluginSettings::GetInstance(); | |
714 | |
715 CPluginClient* client = CPluginClient::GetInstance(); | |
716 bool result = client->Matches(srcTrimmed, contentType, domain); | |
717 | |
718 #ifdef ENABLE_DEBUG_RESULT | |
719 if (addDebug) | |
720 { | |
721 std::wstring type = ToUtf16String(AdblockPlus::FilterEngine::ContentTypeToSt
ring(contentType)); | |
722 if (result) | |
723 { | |
724 CPluginDebug::DebugResultBlocking(type, srcTrimmed, domain); | |
725 } | |
726 else | |
727 { | |
728 CPluginDebug::DebugResultIgnoring(type, srcTrimmed, domain); | |
729 } | |
730 } | |
731 #endif | |
732 return result; | |
733 } | |
734 | |
735 const std::vector<std::wstring>& CPluginFilter::GetHideFilters() const | |
736 { | |
737 DWORD res = WaitForSingleObject(hideFiltersLoadedEvent, ENGINE_STARTUP_TIMEOUT
); | |
738 return m_hideFilters; | |
739 } | 634 } |
LEFT | RIGHT |