| OLD | NEW |
| 1 #include "PluginStdAfx.h" | 1 #include "PluginStdAfx.h" |
| 2 | 2 |
| 3 #include "PluginFilter.h" | 3 #include "PluginFilter.h" |
| 4 | 4 |
| 5 #include "COM_Value.h" |
| 5 #if (defined PRODUCT_ADBLOCKPLUS) | 6 #if (defined PRODUCT_ADBLOCKPLUS) |
| 6 #include "PluginSettings.h" | 7 #include "PluginSettings.h" |
| 7 #include "PluginClient.h" | 8 #include "PluginClient.h" |
| 8 #include "PluginClientFactory.h" | 9 #include "PluginClientFactory.h" |
| 9 #endif | 10 #endif |
| 10 | 11 |
| 11 #include "PluginMutex.h" | 12 #include "PluginMutex.h" |
| 12 #include "PluginSettings.h" | 13 #include "PluginSettings.h" |
| 13 #include "PluginSystem.h" | 14 #include "PluginSystem.h" |
| 14 #include "PluginClass.h" | 15 #include "PluginClass.h" |
| 15 #include "mlang.h" | 16 #include "mlang.h" |
| 16 | 17 |
| 17 #include "..\shared\CriticalSection.h" | 18 #include "..\shared\CriticalSection.h" |
| 18 | 19 |
| 19 | |
| 20 // The filters are described at http://adblockplus.org/en/filters | 20 // The filters are described at http://adblockplus.org/en/filters |
| 21 | 21 |
| 22 static CriticalSection s_criticalSectionFilterMap; | 22 static CriticalSection s_criticalSectionFilterMap; |
| 23 | 23 |
| 24 // ============================================================================ | 24 // ============================================================================ |
| 25 // CFilterElementHideAttrSelector | 25 // CFilterElementHideAttrSelector |
| 26 // ============================================================================ | 26 // ============================================================================ |
| 27 | 27 |
| 28 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector() : m_type(TYPE_N
ONE), m_pos(POS_NONE), m_bstrAttr(NULL) | 28 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector() : m_type(TYPE_N
ONE), m_pos(POS_NONE) |
| 29 { | 29 { |
| 30 } | 30 } |
| 31 | 31 |
| 32 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector(const CFilterElem
entHideAttrSelector& filter) | 32 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector(const CFilterElem
entHideAttrSelector& filter) |
| 33 { | 33 { |
| 34 m_type = filter.m_type; | 34 m_type = filter.m_type; |
| 35 m_pos = filter.m_pos; | 35 m_pos = filter.m_pos; |
| 36 m_bstrAttr = filter.m_bstrAttr; | 36 m_attr = filter.m_attr; |
| 37 | 37 |
| 38 m_value = filter.m_value; | 38 m_value = filter.m_value; |
| 39 } | 39 } |
| 40 | 40 |
| 41 CFilterElementHideAttrSelector::~CFilterElementHideAttrSelector() | 41 CFilterElementHideAttrSelector::~CFilterElementHideAttrSelector() |
| 42 { | 42 { |
| 43 } | 43 } |
| 44 | 44 |
| 45 | 45 |
| 46 // ============================================================================ | 46 // ============================================================================ |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 if (delimiterPos > 0) | 143 if (delimiterPos > 0) |
| 144 { | 144 { |
| 145 attrSelector.m_value = arg.Mid(delimiterPos + 1); | 145 attrSelector.m_value = arg.Mid(delimiterPos + 1); |
| 146 if (attrSelector.m_value.GetLength() >= 2 && attrSelector.m_value.GetAt(0)
== '\"' && attrSelector.m_value.GetAt(attrSelector.m_value.GetLength() - 1) ==
'\"') | 146 if (attrSelector.m_value.GetLength() >= 2 && attrSelector.m_value.GetAt(0)
== '\"' && attrSelector.m_value.GetAt(attrSelector.m_value.GetLength() - 1) ==
'\"') |
| 147 { | 147 { |
| 148 attrSelector.m_value = attrSelector.m_value.Mid(1, attrSelector.m_value.
GetLength() - 2); | 148 attrSelector.m_value = attrSelector.m_value.Mid(1, attrSelector.m_value.
GetLength() - 2); |
| 149 } | 149 } |
| 150 | 150 |
| 151 if (arg.GetAt(delimiterPos - 1) == '^') | 151 if (arg.GetAt(delimiterPos - 1) == '^') |
| 152 { | 152 { |
| 153 attrSelector.m_bstrAttr = arg.Left(delimiterPos - 1); | 153 attrSelector.m_attr = arg.Left(delimiterPos - 1); |
| 154 attrSelector.m_pos = CFilterElementHideAttrPos::STARTING; | 154 attrSelector.m_pos = CFilterElementHideAttrPos::STARTING; |
| 155 } | 155 } |
| 156 else if (arg.GetAt(delimiterPos - 1) == '*') | 156 else if (arg.GetAt(delimiterPos - 1) == '*') |
| 157 { | 157 { |
| 158 attrSelector.m_bstrAttr = arg.Left(delimiterPos - 1); | 158 attrSelector.m_attr = arg.Left(delimiterPos - 1); |
| 159 attrSelector.m_pos = CFilterElementHideAttrPos::ANYWHERE; | 159 attrSelector.m_pos = CFilterElementHideAttrPos::ANYWHERE; |
| 160 } | 160 } |
| 161 else if (arg.GetAt(delimiterPos - 1) == '$') | 161 else if (arg.GetAt(delimiterPos - 1) == '$') |
| 162 { | 162 { |
| 163 attrSelector.m_bstrAttr = arg.Left(delimiterPos - 1); | 163 attrSelector.m_attr = arg.Left(delimiterPos - 1); |
| 164 attrSelector.m_pos = CFilterElementHideAttrPos::ENDING; | 164 attrSelector.m_pos = CFilterElementHideAttrPos::ENDING; |
| 165 } | 165 } |
| 166 else | 166 else |
| 167 { | 167 { |
| 168 attrSelector.m_bstrAttr = arg.Left(delimiterPos); | 168 attrSelector.m_attr = arg.Left(delimiterPos); |
| 169 attrSelector.m_pos = CFilterElementHideAttrPos::EXACT; | 169 attrSelector.m_pos = CFilterElementHideAttrPos::EXACT; |
| 170 } | 170 } |
| 171 } | 171 } |
| 172 CString tag = attrSelector.m_bstrAttr; | 172 CString tag = attrSelector.m_attr; |
| 173 if (tag == "style") | 173 if (tag == "style") |
| 174 { | 174 { |
| 175 attrSelector.m_type = CFilterElementHideAttrType::STYLE; | 175 attrSelector.m_type = CFilterElementHideAttrType::STYLE; |
| 176 attrSelector.m_value.MakeLower(); | 176 attrSelector.m_value.MakeLower(); |
| 177 } | 177 } |
| 178 else if (tag == "id") | 178 else if (tag == "id") |
| 179 { | 179 { |
| 180 attrSelector.m_type = CFilterElementHideAttrType::ID; | 180 attrSelector.m_type = CFilterElementHideAttrType::ID; |
| 181 } | 181 } |
| 182 else if (tag == "class") | 182 else if (tag == "class") |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 { | 235 { |
| 236 } | 236 } |
| 237 | 237 |
| 238 | 238 |
| 239 bool CFilterElementHide::IsMatchFilterElementHide(IHTMLElement* pEl) const | 239 bool CFilterElementHide::IsMatchFilterElementHide(IHTMLElement* pEl) const |
| 240 { | 240 { |
| 241 HRESULT hr; | 241 HRESULT hr; |
| 242 | 242 |
| 243 if (!m_tagId.IsEmpty()) | 243 if (!m_tagId.IsEmpty()) |
| 244 { | 244 { |
| 245 CComBSTR id; | 245 AdblockPlus::COM::BSTR_ParamResult id; |
| 246 hr = pEl->get_id(&id); | 246 hr = pEl->get_id(&id); |
| 247 if ((hr != S_OK) || (id != CComBSTR(m_tagId))) | 247 if ((hr != S_OK) || (to_CString(id) != m_tagId)) |
| 248 { | 248 { |
| 249 return false; | 249 return false; |
| 250 } | 250 } |
| 251 } | 251 } |
| 252 if (!m_tagClassName.IsEmpty()) | 252 if (!m_tagClassName.IsEmpty()) |
| 253 { | 253 { |
| 254 CComBSTR classNameBSTR; | 254 AdblockPlus::COM::BSTR_ParamResult result; |
| 255 hr = pEl->get_className(&classNameBSTR); | 255 hr = pEl->get_className(&result); |
| 256 if (hr == S_OK) | 256 if (hr == S_OK) |
| 257 { | 257 { |
| 258 CString className = classNameBSTR; | 258 CString className = to_CString(result); |
| 259 int start = 0; | 259 int start = 0; |
| 260 CString specificClass; | 260 CString specificClass; |
| 261 bool foundMatch = false; | 261 bool foundMatch = false; |
| 262 while ((specificClass = className.Tokenize(L" ", start)) != L"") | 262 while ((specificClass = className.Tokenize(L" ", start)) != L"") |
| 263 { | 263 { |
| 264 // TODO: Consider case of multiple classes. (m_tagClassName can be somet
hing like "foo.bar") | 264 // TODO: Consider case of multiple classes. (m_tagClassName can be somet
hing like "foo.bar") |
| 265 if (specificClass == m_tagClassName) | 265 if (specificClass == m_tagClassName) |
| 266 { | 266 { |
| 267 foundMatch = true; | 267 foundMatch = true; |
| 268 } | 268 } |
| 269 } | 269 } |
| 270 if (!foundMatch) | 270 if (!foundMatch) |
| 271 { | 271 { |
| 272 return false; | 272 return false; |
| 273 } | 273 } |
| 274 } | 274 } |
| 275 } | 275 } |
| 276 if (!m_tag.IsEmpty()) | 276 if (!m_tag.IsEmpty()) |
| 277 { | 277 { |
| 278 CComBSTR tagName; | 278 AdblockPlus::COM::BSTR_ParamResult result; |
| 279 tagName.ToLower(); | 279 hr = pEl->get_tagName(&result); |
| 280 hr = pEl->get_tagName(&tagName); | 280 CString tagName = to_CString(result); |
| 281 if ((hr != S_OK) || (tagName != CComBSTR(m_tag))) | 281 tagName.MakeLower(); |
| 282 if ((hr != S_OK) || tagName != m_tag) |
| 282 { | 283 { |
| 283 return false; | 284 return false; |
| 284 } | 285 } |
| 285 } | 286 } |
| 286 | 287 |
| 287 // Check attributes | 288 // Check attributes |
| 288 for (std::vector<CFilterElementHideAttrSelector>::const_iterator attrIt = m_at
tributeSelectors.begin(); | 289 for (std::vector<CFilterElementHideAttrSelector>::const_iterator attrIt = m_at
tributeSelectors.begin(); |
| 289 attrIt != m_attributeSelectors.end(); ++ attrIt) | 290 attrIt != m_attributeSelectors.end(); ++ attrIt) |
| 290 { | 291 { |
| 291 CString value; | 292 CString value; |
| 292 bool attrFound = false; | 293 bool attrFound = false; |
| 293 if (attrIt->m_type == CFilterElementHideAttrType::STYLE) | 294 if (attrIt->m_type == CFilterElementHideAttrType::STYLE) |
| 294 { | 295 { |
| 295 CComPtr<IHTMLStyle> pStyle; | 296 CComPtr<IHTMLStyle> pStyle; |
| 296 if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) | 297 if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) |
| 297 { | 298 { |
| 298 CComBSTR bstrStyle; | 299 AdblockPlus::COM::BSTR_ParamResult cssText; |
| 299 | 300 if (SUCCEEDED(pStyle->get_cssText(&cssText))) |
| 300 if (SUCCEEDED(pStyle->get_cssText(&bstrStyle)) && bstrStyle) | |
| 301 { | 301 { |
| 302 value = bstrStyle; | 302 value = to_CString(cssText); |
| 303 value.MakeLower(); | 303 if (!value.IsEmpty()) |
| 304 attrFound = true; | 304 { |
| 305 value.MakeLower(); |
| 306 attrFound = true; |
| 307 } |
| 305 } | 308 } |
| 306 } | 309 } |
| 307 } | 310 } |
| 308 else if (attrIt->m_type == CFilterElementHideAttrType::CLASS) | 311 else if (attrIt->m_type == CFilterElementHideAttrType::CLASS) |
| 309 { | 312 { |
| 310 CComBSTR bstrClassNames; | 313 AdblockPlus::COM::BSTR_ParamResult classNames; |
| 311 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) | 314 if (SUCCEEDED(pEl->get_className(&classNames))) |
| 312 { | 315 { |
| 313 value = bstrClassNames; | 316 value = to_CString(classNames); |
| 314 attrFound = true; | 317 if (!value.IsEmpty()) |
| 318 { |
| 319 attrFound = true; |
| 320 } |
| 315 } | 321 } |
| 316 } | 322 } |
| 317 else if (attrIt->m_type == CFilterElementHideAttrType::ID) | 323 else if (attrIt->m_type == CFilterElementHideAttrType::ID) |
| 318 { | 324 { |
| 319 CComBSTR bstrId; | 325 AdblockPlus::COM::BSTR_ParamResult id; |
| 320 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) | 326 if (SUCCEEDED(pEl->get_id(&id))) |
| 321 { | 327 { |
| 322 value = bstrId; | 328 value = to_CString(id); |
| 323 attrFound = true; | 329 if (!value.IsEmpty()) |
| 330 { |
| 331 attrFound = true; |
| 332 } |
| 324 } | 333 } |
| 325 } | 334 } |
| 326 else | 335 else |
| 327 { | 336 { |
| 328 CComVariant vAttr; | 337 CComVariant vAttr; |
| 329 if (SUCCEEDED(pEl->getAttribute(attrIt->m_bstrAttr, 0, &vAttr))) | 338 AdblockPlus::COM::BSTR_ParamArgument attribute_name(to_wstring(attrIt->m_a
ttr)); |
| 339 if (SUCCEEDED(pEl->getAttribute(attribute_name, 0, &vAttr))) |
| 330 { | 340 { |
| 331 attrFound = true; | 341 attrFound = true; |
| 332 if (vAttr.vt == VT_BSTR) | 342 if (vAttr.vt == VT_BSTR) |
| 333 { | 343 { |
| 334 value = vAttr.bstrVal; | 344 value = vAttr.bstrVal; |
| 335 } | 345 } |
| 336 else if (vAttr.vt == VT_I4) | 346 else if (vAttr.vt == VT_I4) |
| 337 { | 347 { |
| 338 value.Format(L"%u", vAttr.iVal); | 348 value.Format(L"%u", vAttr.iVal); |
| 339 } | 349 } |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 } | 510 } |
| 501 } while (separatorChar != '\0'); | 511 } while (separatorChar != '\0'); |
| 502 } | 512 } |
| 503 | 513 |
| 504 return true; | 514 return true; |
| 505 } | 515 } |
| 506 | 516 |
| 507 bool CPluginFilter::IsElementHidden(const CString& tag, IHTMLElement* pEl, const
CString& domain, const CString& indent) const | 517 bool CPluginFilter::IsElementHidden(const CString& tag, IHTMLElement* pEl, const
CString& domain, const CString& indent) const |
| 508 { | 518 { |
| 509 CString id; | 519 CString id; |
| 510 CComBSTR bstrId; | 520 AdblockPlus::COM::BSTR_ParamResult result; |
| 511 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) | 521 if (SUCCEEDED(pEl->get_id(&result))) |
| 512 { | 522 { |
| 513 id = bstrId; | 523 id = to_CString(result); |
| 514 } | 524 } |
| 515 | 525 |
| 516 CString classNames; | 526 CString classNames; |
| 517 CComBSTR bstrClassNames; | 527 // reuse of 'result' is not an error, since address-of operator permits it |
| 518 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) | 528 if (SUCCEEDED(pEl->get_className(&result))) |
| 519 { | 529 { |
| 520 classNames = bstrClassNames; | 530 classNames = to_CString(result); |
| 521 } | 531 } |
| 522 | 532 |
| 523 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 533 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
| 524 { | 534 { |
| 525 CString domainTest = domain; | 535 CString domainTest = domain; |
| 526 | 536 |
| 527 // Search tag/id filters | 537 // Search tag/id filters |
| 528 if (!id.IsEmpty()) | 538 if (!id.IsEmpty()) |
| 529 { | 539 { |
| 530 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT
agsNamed::const_iterator> idItEnum = | 540 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT
agsNamed::const_iterator> idItEnum = |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") | 720 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") |
| 711 | 721 |
| 712 #ifdef ENABLE_DEBUG_RESULT | 722 #ifdef ENABLE_DEBUG_RESULT |
| 713 CPluginDebug::DebugResultBlocking(type, src, domain); | 723 CPluginDebug::DebugResultBlocking(type, src, domain); |
| 714 #endif | 724 #endif |
| 715 } | 725 } |
| 716 return true; | 726 return true; |
| 717 } | 727 } |
| 718 return false; | 728 return false; |
| 719 } | 729 } |
| OLD | NEW |