Index: src/plugin/PluginFilter.cpp |
=================================================================== |
--- a/src/plugin/PluginFilter.cpp |
+++ b/src/plugin/PluginFilter.cpp |
@@ -11,12 +11,54 @@ |
#include "mlang.h" |
#include "..\shared\CriticalSection.h" |
+#include "..\shared\Utils.h" |
// The filters are described at http://adblockplus.org/en/filters |
static CriticalSection s_criticalSectionFilterMap; |
+namespace |
+{ |
+ std::wstring GetAttributeValueAsString(const ATL::CComVariant& vAttr) |
Oleksandr
2014/11/19 03:24:23
Is it really required for this to be a separate fu
sergei
2014/11/19 11:53:24
It's not required. Firstly I extracted it during d
|
+ { |
+ if (vAttr.vt == VT_BSTR && vAttr.bstrVal) |
+ { |
+ return vAttr.bstrVal; |
+ } |
+ else if (vAttr.vt == VT_I4) |
+ { |
+ return std::to_wstring(vAttr.iVal); |
+ } |
+ return std::wstring(); |
+ } |
+ |
+ std::pair<std::wstring, bool> GetHtmlElementAttribute(IHTMLElement& htmlElement, const ATL::CComBSTR& attributeName) |
Oleksandr
2014/11/19 03:24:23
How about something like this instead
std::wstring
sergei
2014/11/19 11:53:24
- I don't think that making `htmlElement` to be po
Oleksandr
2014/11/20 10:21:56
- I think it is inconsistent. We use pointers for
sergei
2014/11/21 12:02:21
In the function we need to check that it's not nul
Felix Dahlke
2014/11/26 14:23:16
I agree with Sergei here, IMO we should go with re
|
+ { |
+ std::pair<std::wstring, bool> retResult; |
+ retResult.second = false; |
+ ATL::CComVariant vAttr; |
+ ATL::CComQIPtr<IHTMLElement4> htmlElement4 = &htmlElement; |
Oleksandr
2014/11/19 03:24:23
I prefer manually calling QueryInterface. We are c
sergei
2014/11/19 11:53:24
We don't need HRESULT here, so I would say that
AT
Oleksandr
2014/11/20 10:21:56
We do QueryInterface in a lot of places in the cod
|
+ if (!htmlElement4) |
+ { |
+ return retResult; |
+ } |
+ ATL::CComPtr<IHTMLDOMAttribute> attributeNode; |
+ if (FAILED(htmlElement4->getAttributeNode(attributeName, &attributeNode)) || !attributeNode) |
+ { |
+ return retResult; |
+ } |
+ // we set that attribute found but it's not necessary that we can retrieve its value |
+ retResult.second = true; |
+ if (FAILED(attributeNode->get_nodeValue(&vAttr))) |
+ { |
+ return retResult; |
+ } |
+ retResult.first = GetAttributeValueAsString(vAttr); |
+ return retResult; |
+ } |
+} |
+ |
// ============================================================================ |
// CFilterElementHideAttrSelector |
// ============================================================================ |
@@ -272,8 +314,8 @@ |
if (!m_tag.IsEmpty()) |
{ |
CComBSTR tagName; |
+ hr = pEl->get_tagName(&tagName); |
Oleksandr
2014/11/19 03:24:23
Well this was a long living bug :D. Nice!
|
tagName.ToLower(); |
- hr = pEl->get_tagName(&tagName); |
if ((hr != S_OK) || (tagName != CComBSTR(m_tag))) |
{ |
return false; |
@@ -284,7 +326,7 @@ |
for (std::vector<CFilterElementHideAttrSelector>::const_iterator attrIt = m_attributeSelectors.begin(); |
attrIt != m_attributeSelectors.end(); ++ attrIt) |
{ |
- CString value; |
+ ATL::CString value; |
bool attrFound = false; |
if (attrIt->m_type == CFilterElementHideAttrType::STYLE) |
{ |
@@ -319,20 +361,12 @@ |
attrFound = true; |
} |
} |
- else |
+ else |
{ |
- CComVariant vAttr; |
- if (SUCCEEDED(pEl->getAttribute(attrIt->m_bstrAttr, 0, &vAttr))) |
+ auto attribute = GetHtmlElementAttribute(*pEl, attrIt->m_bstrAttr); |
+ if (attrFound = attribute.second) |
{ |
- attrFound = true; |
- if (vAttr.vt == VT_BSTR) |
- { |
- value = vAttr.bstrVal; |
- } |
- else if (vAttr.vt == VT_I4) |
- { |
- value.Format(L"%u", vAttr.iVal); |
- } |
+ value = ToCString(attribute.first); |
} |
} |
@@ -435,13 +469,9 @@ |
bool CPluginFilter::AddFilterElementHide(CString filterText) |
{ |
- |
- |
DEBUG_FILTER("Input: " + filterText + " filterFile" + filterFile); |
- |
- CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
+ CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
{ |
- |
CString filterString = filterText; |
// Create filter descriptor |
std::auto_ptr<CFilterElementHide> filter; |
@@ -464,7 +494,7 @@ |
CString filterChunk = filterText.Left(chunkEnd).TrimRight(); |
std::auto_ptr<CFilterElementHide> filterParent(filter); |
- filter.reset(new CFilterElementHide(filterChunk)); |
+ filter.reset(new CFilterElementHide(filterChunk)); |
if (filterParent.get() != 0) |
{ |
@@ -519,7 +549,7 @@ |
classNames = bstrClassNames; |
} |
- CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
+ CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
{ |
// Search tag/id filters |
if (!id.IsEmpty()) |
@@ -621,7 +651,7 @@ |
// Parse hide string |
int pos = 0; |
- CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
+ CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
{ |
for (std::vector<std::wstring>::iterator it = filters.begin(); it < filters.end(); ++it) |
{ |