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 |