Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/plugin/PluginFilter.cpp

Issue 11012013: Hanging resolved (critical sections unlocking) (Closed)
Patch Set: Using CriticalSection class instead Created June 17, 2013, 10:03 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 #include "PluginStdAfx.h" 1 #include "PluginStdAfx.h"
2 2
3 #include "PluginFilter.h" 3 #include "PluginFilter.h"
4 4
5 #if (defined PRODUCT_ADBLOCKPLUS) 5 #if (defined PRODUCT_ADBLOCKPLUS)
6 #include "PluginSettings.h" 6 #include "PluginSettings.h"
7 #include "PluginClient.h" 7 #include "PluginClient.h"
8 #include "PluginClientFactory.h" 8 #include "PluginClientFactory.h"
9 #endif 9 #endif
10 10
11 #include "PluginMutex.h" 11 #include "PluginMutex.h"
12 #include "PluginHttpRequest.h" 12 #include "PluginHttpRequest.h"
13 #include "PluginSettings.h" 13 #include "PluginSettings.h"
14 #include "PluginSystem.h" 14 #include "PluginSystem.h"
15 #include "PluginClass.h" 15 #include "PluginClass.h"
16 #include "mlang.h" 16 #include "mlang.h"
17 17
18 18
19 // The filters are described at http://adblockplus.org/en/filters 19 // The filters are described at http://adblockplus.org/en/filters
20 20
21 CComAutoCriticalSection CPluginFilter::s_criticalSectionFilterMap; 21 static CriticalSection s_criticalSectionFilterMap;
22
23 22
24 // ============================================================================ 23 // ============================================================================
25 // CFilterElementHideAttrSelector 24 // CFilterElementHideAttrSelector
26 // ============================================================================ 25 // ============================================================================
27 26
28 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector() : m_type(TYPE_N ONE), m_pos(POS_NONE), m_bstrAttr(NULL) 27 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector() : m_type(TYPE_N ONE), m_pos(POS_NONE), m_bstrAttr(NULL)
29 { 28 {
30 } 29 }
31 30
32 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector(const CFilterElem entHideAttrSelector& filter) 31 CFilterElementHideAttrSelector::CFilterElementHideAttrSelector(const CFilterElem entHideAttrSelector& filter)
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 ClearFilters(); 438 ClearFilters();
440 } 439 }
441 440
442 441
443 bool CPluginFilter::AddFilterElementHide(CString filterText) 442 bool CPluginFilter::AddFilterElementHide(CString filterText)
444 { 443 {
445 444
446 445
447 DEBUG_FILTER("Input: " + filterText + " filterFile" + filterFile); 446 DEBUG_FILTER("Input: " + filterText + " filterFile" + filterFile);
448 447
449 s_criticalSectionFilterMap.Lock(); 448 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap);
450 { 449 {
451 450
452 CString filterString = filterText; 451 CString filterString = filterText;
453 // Create filter descriptor 452 // Create filter descriptor
454 std::auto_ptr<CFilterElementHide> filter; 453 std::auto_ptr<CFilterElementHide> filter;
455 454
456 CString wholeFilterString = filterString; 455 CString wholeFilterString = filterString;
457 TCHAR separatorChar; 456 TCHAR separatorChar;
458 do 457 do
459 { 458 {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 m_elementHideTagsClass.insert(std::make_pair(std::make_pair(filter->m_ tag, filter->m_tagClassName), *filter)); 496 m_elementHideTagsClass.insert(std::make_pair(std::make_pair(filter->m_ tag, filter->m_tagClassName), *filter));
498 } 497 }
499 else 498 else
500 { 499 {
501 std::pair<CString, CFilterElementHide> pair = std::make_pair(filter->m _tag, *filter); 500 std::pair<CString, CFilterElementHide> pair = std::make_pair(filter->m _tag, *filter);
502 m_elementHideTags.insert(pair); 501 m_elementHideTags.insert(pair);
503 } 502 }
504 } 503 }
505 } while (separatorChar != '\0'); 504 } while (separatorChar != '\0');
506 } 505 }
507 s_criticalSectionFilterMap.Unlock();
508 506
509 return true; 507 return true;
510 } 508 }
511 509
512 bool CPluginFilter::IsElementHidden(const CString& tag, IHTMLElement* pEl, const CString& domain, const CString& indent) const 510 bool CPluginFilter::IsElementHidden(const CString& tag, IHTMLElement* pEl, const CString& domain, const CString& indent) const
513 { 511 {
514 CString id; 512 CString id;
515 CComBSTR bstrId; 513 CComBSTR bstrId;
516 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId) 514 if (SUCCEEDED(pEl->get_id(&bstrId)) && bstrId)
517 { 515 {
518 id = bstrId; 516 id = bstrId;
519 } 517 }
520 518
521 CString classNames; 519 CString classNames;
522 CComBSTR bstrClassNames; 520 CComBSTR bstrClassNames;
523 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames) 521 if (SUCCEEDED(pEl->get_className(&bstrClassNames)) && bstrClassNames)
524 { 522 {
525 classNames = bstrClassNames; 523 classNames = bstrClassNames;
526 } 524 }
527 525
528 s_criticalSectionFilterMap.Lock(); 526 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap);
529 { 527 {
530 CString domainTest = domain; 528 CString domainTest = domain;
531 529
532 // Search tag/id filters 530 // Search tag/id filters
533 if (!id.IsEmpty()) 531 if (!id.IsEmpty())
534 { 532 {
535 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT agsNamed::const_iterator> idItEnum = 533 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHideT agsNamed::const_iterator> idItEnum =
536 m_elementHideTagsId.equal_range(std::make_pair(tag, id)); 534 m_elementHideTagsId.equal_range(std::make_pair(tag, id));
537 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id It != idItEnum.second; idIt ++) 535 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id It != idItEnum.second; idIt ++)
538 { 536 {
539 if (idIt->second.IsMatchFilterElementHide(pEl)) 537 if (idIt->second.IsMatchFilterElementHide(pEl))
540 { 538 {
541 #ifdef ENABLE_DEBUG_RESULT 539 #ifdef ENABLE_DEBUG_RESULT
542 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/id) filter:" + idIt->second .m_filterText) 540 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/id) filter:" + idIt->second .m_filterText)
543 CPluginDebug::DebugResultHiding(tag, "id:" + id, idIt->second.m_filt erText); 541 CPluginDebug::DebugResultHiding(tag, "id:" + id, idIt->second.m_filt erText);
544 #endif 542 #endif
545 s_criticalSectionFilterMap.Unlock();
546 return true; 543 return true;
547 } 544 }
548 } 545 }
549 546
550 // Search general id 547 // Search general id
551 idItEnum = m_elementHideTagsId.equal_range(std::make_pair("", id)); 548 idItEnum = m_elementHideTagsId.equal_range(std::make_pair("", id));
552 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id It != idItEnum.second; idIt ++) 549 for (TFilterElementHideTagsNamed::const_iterator idIt = idItEnum.first; id It != idItEnum.second; idIt ++)
553 { 550 {
554 if (idIt->second.IsMatchFilterElementHide(pEl)) 551 if (idIt->second.IsMatchFilterElementHide(pEl))
555 { 552 {
556 #ifdef ENABLE_DEBUG_RESULT 553 #ifdef ENABLE_DEBUG_RESULT
557 DEBUG_HIDE_EL(indent + "HideEl::Found (?/id) filter:" + idIt->second.m _filterText) 554 DEBUG_HIDE_EL(indent + "HideEl::Found (?/id) filter:" + idIt->second.m _filterText)
558 CPluginDebug::DebugResultHiding(tag, "id:" + id, idIt->second.m_filt erText); 555 CPluginDebug::DebugResultHiding(tag, "id:" + id, idIt->second.m_filt erText);
559 #endif 556 #endif
560 s_criticalSectionFilterMap.Unlock();
561 return true; 557 return true;
562 } 558 }
563 } 559 }
564 } 560 }
565 561
566 // Search tag/className filters 562 // Search tag/className filters
567 if (!classNames.IsEmpty()) 563 if (!classNames.IsEmpty())
568 { 564 {
569 int pos = 0; 565 int pos = 0;
570 CString className = classNames.Tokenize(L" \t\n\r", pos); 566 CString className = classNames.Tokenize(L" \t\n\r", pos);
571 while (pos >= 0) 567 while (pos >= 0)
572 { 568 {
573 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHid eTagsNamed::const_iterator> classItEnum = 569 std::pair<TFilterElementHideTagsNamed::const_iterator, TFilterElementHid eTagsNamed::const_iterator> classItEnum =
574 m_elementHideTagsClass.equal_range(std::make_pair(tag, className)); 570 m_elementHideTagsClass.equal_range(std::make_pair(tag, className));
575 571
576 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f irst; classIt != classItEnum.second; ++classIt) 572 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f irst; classIt != classItEnum.second; ++classIt)
577 { 573 {
578 if (classIt->second.IsMatchFilterElementHide(pEl)) 574 if (classIt->second.IsMatchFilterElementHide(pEl))
579 { 575 {
580 #ifdef ENABLE_DEBUG_RESULT 576 #ifdef ENABLE_DEBUG_RESULT
581 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/class) filter:" + classIt ->second.m_filterText) 577 DEBUG_HIDE_EL(indent + "HideEl::Found (tag/class) filter:" + classIt ->second.m_filterText)
582 CPluginDebug::DebugResultHiding(tag, "class:" + className, classIt ->second.m_filterText); 578 CPluginDebug::DebugResultHiding(tag, "class:" + className, classIt ->second.m_filterText);
583 #endif 579 #endif
584 s_criticalSectionFilterMap.Unlock();
585 return true; 580 return true;
586 } 581 }
587 } 582 }
588 583
589 // Search general class name 584 // Search general class name
590 classItEnum = m_elementHideTagsClass.equal_range(std::make_pair("", clas sName)); 585 classItEnum = m_elementHideTagsClass.equal_range(std::make_pair("", clas sName));
591 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f irst; classIt != classItEnum.second; ++ classIt) 586 for (TFilterElementHideTagsNamed::const_iterator classIt = classItEnum.f irst; classIt != classItEnum.second; ++ classIt)
592 { 587 {
593 if (classIt->second.IsMatchFilterElementHide(pEl)) 588 if (classIt->second.IsMatchFilterElementHide(pEl))
594 { 589 {
595 #ifdef ENABLE_DEBUG_RESULT 590 #ifdef ENABLE_DEBUG_RESULT
596 DEBUG_HIDE_EL(indent + "HideEl::Found (?/class) filter:" + classIt-> second.m_filterText) 591 DEBUG_HIDE_EL(indent + "HideEl::Found (?/class) filter:" + classIt-> second.m_filterText)
597 CPluginDebug::DebugResultHiding(tag, "class:" + className, classIt ->second.m_filterText); 592 CPluginDebug::DebugResultHiding(tag, "class:" + className, classIt ->second.m_filterText);
598 #endif 593 #endif
599 s_criticalSectionFilterMap.Unlock();
600 return true; 594 return true;
601 } 595 }
602 } 596 }
603 597
604 // Next class name 598 // Next class name
605 className = classNames.Tokenize(L" \t\n\r", pos); 599 className = classNames.Tokenize(L" \t\n\r", pos);
606 } 600 }
607 } 601 }
608 602
609 // Search tag filters 603 // Search tag filters
610 std::pair<TFilterElementHideTags::const_iterator, TFilterElementHideTags::co nst_iterator> tagItEnum 604 std::pair<TFilterElementHideTags::const_iterator, TFilterElementHideTags::co nst_iterator> tagItEnum
611 = m_elementHideTags.equal_range(tag); 605 = m_elementHideTags.equal_range(tag);
612 for (TFilterElementHideTags::const_iterator tagIt = tagItEnum.first; tagIt ! = tagItEnum.second; ++ tagIt) 606 for (TFilterElementHideTags::const_iterator tagIt = tagItEnum.first; tagIt ! = tagItEnum.second; ++ tagIt)
613 { 607 {
614 if (tagIt->second.IsMatchFilterElementHide(pEl)) 608 if (tagIt->second.IsMatchFilterElementHide(pEl))
615 { 609 {
616 #ifdef ENABLE_DEBUG_RESULT 610 #ifdef ENABLE_DEBUG_RESULT
617 DEBUG_HIDE_EL(indent + "HideEl::Found (tag) filter:" + tagIt->second.m_f ilterText) 611 DEBUG_HIDE_EL(indent + "HideEl::Found (tag) filter:" + tagIt->second.m_f ilterText)
618 CPluginDebug::DebugResultHiding(tag, "-", tagIt->second.m_filterText); 612 CPluginDebug::DebugResultHiding(tag, "-", tagIt->second.m_filterText);
619 #endif 613 #endif
620 s_criticalSectionFilterMap.Unlock();
621 return true; 614 return true;
622 } 615 }
623 } 616 }
624 } 617 }
625 s_criticalSectionFilterMap.Unlock();
626 618
627 return false; 619 return false;
628 } 620 }
629 621
630 bool CPluginFilter::LoadHideFilters(std::vector<std::string> filters) 622 bool CPluginFilter::LoadHideFilters(std::vector<std::string> filters)
631 { 623 {
632 624
633 ClearFilters(); 625 ClearFilters();
634 626
635 bool isRead = false; 627 bool isRead = false;
636 628
637 #ifdef PRODUCT_ADBLOCKPLUS 629 #ifdef PRODUCT_ADBLOCKPLUS
638 CPluginClient* client = CPluginClient::GetInstance(); 630 CPluginClient* client = CPluginClient::GetInstance();
639 #endif 631 #endif
640 632
641 // Parse hide string 633 // Parse hide string
642 int pos = 0; 634 int pos = 0;
643 635
644 s_criticalSectionFilterMap.Lock(); 636 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap);
645 { 637 {
646 for (std::vector<std::string>::iterator it = filters.begin(); it < filters.e nd(); ++it) 638 for (std::vector<std::string>::iterator it = filters.begin(); it < filters.e nd(); ++it)
647 { 639 {
648 CString filter((*it).c_str()); 640 CString filter((*it).c_str());
649 // If the line is not commented out 641 // If the line is not commented out
650 if (!filter.Trim().IsEmpty() && filter.GetAt(0) != '!' && filter.GetAt(0) != '[') 642 if (!filter.Trim().IsEmpty() && filter.GetAt(0) != '!' && filter.GetAt(0) != '[')
651 { 643 {
652 int filterType = 0; 644 int filterType = 0;
653 645
654 // See http://adblockplus.org/en/filters for further documentation 646 // See http://adblockplus.org/en/filters for further documentation
655 647
656 try 648 try
657 { 649 {
658 AddFilterElementHide(filter); 650 AddFilterElementHide(filter);
659 } 651 }
660 catch(...) 652 catch(...)
661 { 653 {
662 #ifdef ENABLE_DEBUG_RESULT 654 #ifdef ENABLE_DEBUG_RESULT
663 CPluginDebug::DebugResult(L"Error loading hide filter: " + filter); 655 CPluginDebug::DebugResult(L"Error loading hide filter: " + filter);
664 #endif 656 #endif
665 } 657 }
666 } 658 }
667 } 659 }
668 } 660 }
669 s_criticalSectionFilterMap.Unlock();
670 661
671 return isRead; 662 return isRead;
672 } 663 }
673 664
674 void CPluginFilter::ClearFilters() 665 void CPluginFilter::ClearFilters()
675 { 666 {
676 // Clear filter maps 667 // Clear filter maps
677 s_criticalSectionFilterMap.Lock(); 668 CriticalSection::Lock filterEngineLock(s_criticalSectionFilterMap);
678 { 669 {
679 for (int i = 0; i < 2; i++) 670 for (int i = 0; i < 2; i++)
680 { 671 {
681 for (int j = 0; j < 2; j++) 672 for (int j = 0; j < 2; j++)
682 { 673 {
683 m_filterMap[i][j].clear(); 674 m_filterMap[i][j].clear();
684 } 675 }
685 m_filterMapDefault[i].clear(); 676 m_filterMapDefault[i].clear();
686 } 677 }
687 678
688 m_elementHideTags.clear(); 679 m_elementHideTags.clear();
689 m_elementHideTagsId.clear(); 680 m_elementHideTagsId.clear();
690 m_elementHideTagsClass.clear(); 681 m_elementHideTagsClass.clear();
691 } 682 }
692 s_criticalSectionFilterMap.Unlock();
693 } 683 }
694 684
695 685
696 bool CPluginFilter::ShouldWhiteList(CString src) const 686 bool CPluginFilter::ShouldWhiteList(CString src) const
697 { 687 {
698 // We should not block the empty string, so all filtering does not make sense 688 // We should not block the empty string, so all filtering does not make sense
699 // Therefore we just return 689 // Therefore we just return
700 if (src.Trim().IsEmpty()) 690 if (src.Trim().IsEmpty())
701 { 691 {
702 return false; 692 return false;
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 if (pos > 0 && domain.GetLength() + pos == subdomain.GetLength()) 888 if (pos > 0 && domain.GetLength() + pos == subdomain.GetLength())
899 { 889 {
900 if (subdomain.GetAt(pos - 1) == '.') 890 if (subdomain.GetAt(pos - 1) == '.')
901 { 891 {
902 return true; 892 return true;
903 } 893 }
904 } 894 }
905 895
906 return false; 896 return false;
907 } 897 }
OLDNEW

Powered by Google App Engine
This is Rietveld