LEFT | RIGHT |
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" | |
6 #if (defined PRODUCT_ADBLOCKPLUS) | 5 #if (defined PRODUCT_ADBLOCKPLUS) |
7 #include "PluginSettings.h" | 6 #include "PluginSettings.h" |
8 #include "PluginClient.h" | 7 #include "PluginClient.h" |
9 #include "PluginClientFactory.h" | 8 #include "PluginClientFactory.h" |
10 #endif | 9 #endif |
11 | 10 |
12 #include "PluginMutex.h" | 11 #include "PluginMutex.h" |
13 #include "PluginSettings.h" | 12 #include "PluginSettings.h" |
14 #include "PluginSystem.h" | 13 #include "PluginSystem.h" |
15 #include "PluginClass.h" | 14 #include "PluginClass.h" |
16 #include "mlang.h" | 15 #include "mlang.h" |
17 | 16 |
18 #include "..\shared\CriticalSection.h" | 17 #include "..\shared\CriticalSection.h" |
19 | 18 |
| 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_attr(L"") | 28 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector() : m_type(TYPE_N
ONE), m_pos(POS_NONE), m_bstrAttr(NULL) |
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_attr = filter.m_attr; | 36 m_bstrAttr = filter.m_bstrAttr; |
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_attr = arg.Left(delimiterPos - 1); | 153 attrSelector.m_bstrAttr = 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_attr = arg.Left(delimiterPos - 1); | 158 attrSelector.m_bstrAttr = 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_attr = arg.Left(delimiterPos - 1); | 163 attrSelector.m_bstrAttr = 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_attr = arg.Left(delimiterPos); | 168 attrSelector.m_bstrAttr = arg.Left(delimiterPos); |
169 attrSelector.m_pos = CFilterElementHideAttrPos::EXACT; | 169 attrSelector.m_pos = CFilterElementHideAttrPos::EXACT; |
170 } | 170 } |
171 } | 171 } |
172 CString tag = attrSelector.m_attr; | 172 CString tag = attrSelector.m_bstrAttr; |
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 AdblockPlus::COM::BSTR_Argument id; | 245 CComBSTR id; |
246 hr = pEl->get_id(&id); | 246 hr = pEl->get_id(&id); |
247 if ((hr != S_OK) || (to_CString(id) != m_tagId)) | 247 if ((hr != S_OK) || (id != CComBSTR(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 AdblockPlus::COM::BSTR_Argument result; | 254 CComBSTR classNameBSTR; |
255 hr = pEl->get_className(&result); | 255 hr = pEl->get_className(&classNameBSTR); |
256 if (hr == S_OK) | 256 if (hr == S_OK) |
257 { | 257 { |
258 CString className = to_CString(result); | 258 CString className = classNameBSTR; |
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 AdblockPlus::COM::BSTR_Argument result; | 278 CComBSTR tagName; |
279 hr = pEl->get_tagName(&result); | 279 tagName.ToLower(); |
280 CString tagName = to_CString(result); | 280 hr = pEl->get_tagName(&tagName); |
281 tagName.MakeLower(); | 281 if ((hr != S_OK) || (tagName != CComBSTR(m_tag))) |
282 if ((hr != S_OK) || tagName != m_tag) | |
283 { | 282 { |
284 return false; | 283 return false; |
285 } | 284 } |
286 } | 285 } |
287 | 286 |
288 // Check attributes | 287 // Check attributes |
289 for (std::vector<CFilterElementHideAttrSelector>::const_iterator attrIt = m_at
tributeSelectors.begin(); | 288 for (std::vector<CFilterElementHideAttrSelector>::const_iterator attrIt = m_at
tributeSelectors.begin(); |
290 attrIt != m_attributeSelectors.end(); ++ attrIt) | 289 attrIt != m_attributeSelectors.end(); ++ attrIt) |
291 { | 290 { |
292 CString value; | 291 CString value; |
293 bool attrFound = false; | 292 bool attrFound = false; |
294 if (attrIt->m_type == CFilterElementHideAttrType::STYLE) | 293 if (attrIt->m_type == CFilterElementHideAttrType::STYLE) |
295 { | 294 { |
296 CComPtr<IHTMLStyle> pStyle; | 295 CComPtr<IHTMLStyle> pStyle; |
297 if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) | 296 if (SUCCEEDED(pEl->get_style(&pStyle)) && pStyle) |
298 { | 297 { |
299 AdblockPlus::COM::BSTR_Argument cssText; | 298 CComBSTR bstrStyle; |
300 if (SUCCEEDED(pStyle->get_cssText(&cssText))) | 299 |
301 { | 300 if (SUCCEEDED(pStyle->get_cssText(&bstrStyle)) && bstrStyle) |
302 value = to_CString(cssText); | 301 { |
303 if (!value.IsEmpty()) | 302 value = bstrStyle; |
304 { | 303 value.MakeLower(); |
305 value.MakeLower(); | 304 attrFound = true; |
306 attrFound = true; | |
307 } | |
308 } | 305 } |
309 } | 306 } |
310 } | 307 } |
311 else if (attrIt->m_type == CFilterElementHideAttrType::CLASS) | 308 else if (attrIt->m_type == CFilterElementHideAttrType::CLASS) |
312 { | 309 { |
313 AdblockPlus::COM::BSTR_Argument classNames; | 310 CComBSTR bstrClassNames; |
314 if (SUCCEEDED(pEl->get_className(&classNames))) | 311 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) |
315 { | 312 { |
316 value = to_CString(classNames); | 313 value = bstrClassNames; |
317 if (!value.IsEmpty()) | 314 attrFound = true; |
318 { | |
319 attrFound = true; | |
320 } | |
321 } | 315 } |
322 } | 316 } |
323 else if (attrIt->m_type == CFilterElementHideAttrType::ID) | 317 else if (attrIt->m_type == CFilterElementHideAttrType::ID) |
324 { | 318 { |
325 AdblockPlus::COM::BSTR_Argument id; | 319 CComBSTR bstrId; |
326 if (SUCCEEDED(pEl->get_id(&id))) | 320 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) |
327 { | 321 { |
328 value = to_CString(id); | 322 value = bstrId; |
329 if (!value.IsEmpty()) | 323 attrFound = true; |
330 { | |
331 attrFound = true; | |
332 } | |
333 } | 324 } |
334 } | 325 } |
335 else | 326 else |
336 { | 327 { |
337 CComVariant vAttr; | 328 CComVariant vAttr; |
338 AdblockPlus::COM::BSTR_Argument attribute_name(to_wstring(attrIt->m_attr))
; | 329 if (SUCCEEDED(pEl->getAttribute(attrIt->m_bstrAttr, 0, &vAttr))) |
339 if (SUCCEEDED(pEl->getAttribute(attribute_name, 0, &vAttr))) | |
340 { | 330 { |
341 attrFound = true; | 331 attrFound = true; |
342 if (vAttr.vt == VT_BSTR) | 332 if (vAttr.vt == VT_BSTR) |
343 { | 333 { |
344 value = vAttr.bstrVal; | 334 value = vAttr.bstrVal; |
345 } | 335 } |
346 else if (vAttr.vt == VT_I4) | 336 else if (vAttr.vt == VT_I4) |
347 { | 337 { |
348 value.Format(L"%u", vAttr.iVal); | 338 value.Format(L"%u", vAttr.iVal); |
349 } | 339 } |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 } | 500 } |
511 } while (separatorChar != '\0'); | 501 } while (separatorChar != '\0'); |
512 } | 502 } |
513 | 503 |
514 return true; | 504 return true; |
515 } | 505 } |
516 | 506 |
517 bool CPluginFilter::IsElementHidden(const CString& tag, IHTMLElement* pEl, const
CString& domain, const CString& indent) const | 507 bool CPluginFilter::IsElementHidden(const CString& tag, IHTMLElement* pEl, const
CString& domain, const CString& indent) const |
518 { | 508 { |
519 CString id; | 509 CString id; |
520 AdblockPlus::COM::BSTR_Argument result; | 510 CComBSTR bstrId; |
521 if (SUCCEEDED(pEl->get_id(&result))) | 511 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) |
522 { | 512 { |
523 id = to_CString(result); | 513 id = bstrId; |
524 } | 514 } |
525 | 515 |
526 CString classNames; | 516 CString classNames; |
527 // reuse of 'result' is not an error, since address-of operator permits it | 517 CComBSTR bstrClassNames; |
528 if (SUCCEEDED(pEl->get_className(&result))) | 518 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) |
529 { | 519 { |
530 classNames = to_CString(result); | 520 classNames = bstrClassNames; |
531 } | 521 } |
532 | 522 |
533 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); | 523 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap); |
534 { | 524 { |
535 CString domainTest = domain; | 525 CString domainTest = domain; |
536 | 526 |
537 // Search tag/id filters | 527 // Search tag/id filters |
538 if (!id.IsEmpty()) | 528 if (!id.IsEmpty()) |
539 { | 529 { |
540 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT
agsNamed::const_iterator> idItEnum = | 530 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT
agsNamed::const_iterator> idItEnum = |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
720 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") | 710 DEBUG_FILTER("Filter::ShouldBlock " + type + " YES") |
721 | 711 |
722 #ifdef ENABLE_DEBUG_RESULT | 712 #ifdef ENABLE_DEBUG_RESULT |
723 CPluginDebug::DebugResultBlocking(type, src, domain); | 713 CPluginDebug::DebugResultBlocking(type, src, domain); |
724 #endif | 714 #endif |
725 } | 715 } |
726 return true; | 716 return true; |
727 } | 717 } |
728 return false; | 718 return false; |
729 } | 719 } |
LEFT | RIGHT |