Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(376)

Side by Side Diff: chrome/browser/safe_browsing/database_manager.cc

Issue 910953002: Move SafeBrowsing to the blocking pool via an experiment. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/safe_browsing/database_manager.h" 5 #include "chrome/browser/safe_browsing/database_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/debug/leak_tracker.h" 13 #include "base/debug/leak_tracker.h"
14 #include "base/metrics/histogram_macros.h"
14 #include "base/stl_util.h" 15 #include "base/stl_util.h"
15 #include "base/strings/string_util.h" 16 #include "base/strings/string_util.h"
16 #include "base/threading/thread.h" 17 #include "base/threading/thread.h"
17 #include "base/threading/thread_restrictions.h" 18 #include "base/threading/thread_restrictions.h"
18 #include "chrome/browser/browser_process.h" 19 #include "chrome/browser/browser_process.h"
19 #include "chrome/browser/chrome_notification_types.h" 20 #include "chrome/browser/chrome_notification_types.h"
20 #include "chrome/browser/prerender/prerender_field_trial.h" 21 #include "chrome/browser/prerender/prerender_field_trial.h"
21 #include "chrome/browser/safe_browsing/client_side_detection_service.h" 22 #include "chrome/browser/safe_browsing/client_side_detection_service.h"
22 #include "chrome/browser/safe_browsing/download_protection_service.h" 23 #include "chrome/browser/safe_browsing/download_protection_service.h"
23 #include "chrome/browser/safe_browsing/malware_details.h" 24 #include "chrome/browser/safe_browsing/malware_details.h"
24 #include "chrome/browser/safe_browsing/protocol_manager.h" 25 #include "chrome/browser/safe_browsing/protocol_manager.h"
25 #include "chrome/browser/safe_browsing/safe_browsing_database.h" 26 #include "chrome/browser/safe_browsing/safe_browsing_database.h"
26 #include "chrome/browser/safe_browsing/safe_browsing_service.h" 27 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
27 #include "chrome/browser/safe_browsing/ui_manager.h" 28 #include "chrome/browser/safe_browsing/ui_manager.h"
28 #include "chrome/common/chrome_constants.h" 29 #include "chrome/common/chrome_constants.h"
29 #include "chrome/common/chrome_paths.h" 30 #include "chrome/common/chrome_paths.h"
30 #include "chrome/common/chrome_switches.h" 31 #include "chrome/common/chrome_switches.h"
31 #include "components/metrics/metrics_service.h"
32 #include "components/startup_metric_utils/startup_metric_utils.h" 32 #include "components/startup_metric_utils/startup_metric_utils.h"
33 #include "components/variations/variations_associated_data.h"
33 #include "content/public/browser/browser_thread.h" 34 #include "content/public/browser/browser_thread.h"
34 #include "content/public/browser/notification_service.h" 35 #include "content/public/browser/notification_service.h"
35 #include "url/url_constants.h" 36 #include "url/url_constants.h"
36 37
37 using content::BrowserThread; 38 using content::BrowserThread;
38 39
39 namespace { 40 namespace {
40 41
41 // Timeout for match checks, e.g. download URLs, hashes. 42 // Timeout for match checks, e.g. download URLs, hashes.
42 const int kCheckTimeoutMs = 10000; 43 const int kCheckTimeoutMs = 10000;
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 589
589 // Cache the GetHash results. 590 // Cache the GetHash results.
590 if (cache_lifetime != base::TimeDelta() && MakeDatabaseAvailable()) 591 if (cache_lifetime != base::TimeDelta() && MakeDatabaseAvailable())
591 database_->CacheHashResults(prefixes, full_hashes, cache_lifetime); 592 database_->CacheHashResults(prefixes, full_hashes, cache_lifetime);
592 } 593 }
593 594
594 void SafeBrowsingDatabaseManager::GetChunks(GetChunksCallback callback) { 595 void SafeBrowsingDatabaseManager::GetChunks(GetChunksCallback callback) {
595 DCHECK_CURRENTLY_ON(BrowserThread::IO); 596 DCHECK_CURRENTLY_ON(BrowserThread::IO);
596 DCHECK(enabled_); 597 DCHECK(enabled_);
597 DCHECK(!callback.is_null()); 598 DCHECK(!callback.is_null());
598 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( 599 safe_browsing_task_runner_->PostTask(
599 &SafeBrowsingDatabaseManager::GetAllChunksFromDatabase, this, callback)); 600 FROM_HERE,
601 base::Bind(&SafeBrowsingDatabaseManager::GetAllChunksFromDatabase, this,
602 callback));
600 } 603 }
601 604
602 void SafeBrowsingDatabaseManager::AddChunks( 605 void SafeBrowsingDatabaseManager::AddChunks(
603 const std::string& list, 606 const std::string& list,
604 scoped_ptr<ScopedVector<SBChunkData> > chunks, 607 scoped_ptr<ScopedVector<SBChunkData> > chunks,
605 AddChunksCallback callback) { 608 AddChunksCallback callback) {
606 DCHECK_CURRENTLY_ON(BrowserThread::IO); 609 DCHECK_CURRENTLY_ON(BrowserThread::IO);
607 DCHECK(enabled_); 610 DCHECK(enabled_);
608 DCHECK(!callback.is_null()); 611 DCHECK(!callback.is_null());
609 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( 612 safe_browsing_task_runner_->PostTask(
610 &SafeBrowsingDatabaseManager::AddDatabaseChunks, this, list, 613 FROM_HERE, base::Bind(&SafeBrowsingDatabaseManager::AddDatabaseChunks,
611 base::Passed(&chunks), callback)); 614 this, list, base::Passed(&chunks), callback));
612 } 615 }
613 616
614 void SafeBrowsingDatabaseManager::DeleteChunks( 617 void SafeBrowsingDatabaseManager::DeleteChunks(
615 scoped_ptr<std::vector<SBChunkDelete> > chunk_deletes) { 618 scoped_ptr<std::vector<SBChunkDelete> > chunk_deletes) {
616 DCHECK_CURRENTLY_ON(BrowserThread::IO); 619 DCHECK_CURRENTLY_ON(BrowserThread::IO);
617 DCHECK(enabled_); 620 DCHECK(enabled_);
618 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( 621 safe_browsing_task_runner_->PostTask(
619 &SafeBrowsingDatabaseManager::DeleteDatabaseChunks, this, 622 FROM_HERE, base::Bind(&SafeBrowsingDatabaseManager::DeleteDatabaseChunks,
620 base::Passed(&chunk_deletes))); 623 this, base::Passed(&chunk_deletes)));
621 } 624 }
622 625
623 void SafeBrowsingDatabaseManager::UpdateStarted() { 626 void SafeBrowsingDatabaseManager::UpdateStarted() {
624 DCHECK_CURRENTLY_ON(BrowserThread::IO); 627 DCHECK_CURRENTLY_ON(BrowserThread::IO);
625 DCHECK(enabled_); 628 DCHECK(enabled_);
626 DCHECK(!update_in_progress_); 629 DCHECK(!update_in_progress_);
627 update_in_progress_ = true; 630 update_in_progress_ = true;
628 } 631 }
629 632
630 void SafeBrowsingDatabaseManager::UpdateFinished(bool update_succeeded) { 633 void SafeBrowsingDatabaseManager::UpdateFinished(bool update_succeeded) {
631 DCHECK_CURRENTLY_ON(BrowserThread::IO); 634 DCHECK_CURRENTLY_ON(BrowserThread::IO);
632 DCHECK(enabled_); 635 DCHECK(enabled_);
633 if (update_in_progress_) { 636 if (update_in_progress_) {
634 update_in_progress_ = false; 637 update_in_progress_ = false;
635 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, 638 safe_browsing_task_runner_->PostTask(
636 base::Bind(&SafeBrowsingDatabaseManager::DatabaseUpdateFinished, 639 FROM_HERE,
637 this, update_succeeded)); 640 base::Bind(&SafeBrowsingDatabaseManager::DatabaseUpdateFinished, this,
641 update_succeeded));
638 } 642 }
639 } 643 }
640 644
641 void SafeBrowsingDatabaseManager::ResetDatabase() { 645 void SafeBrowsingDatabaseManager::ResetDatabase() {
642 DCHECK_CURRENTLY_ON(BrowserThread::IO); 646 DCHECK_CURRENTLY_ON(BrowserThread::IO);
643 DCHECK(enabled_); 647 DCHECK(enabled_);
644 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, base::Bind( 648 safe_browsing_task_runner_->PostTask(
645 &SafeBrowsingDatabaseManager::OnResetDatabase, this)); 649 FROM_HERE,
650 base::Bind(&SafeBrowsingDatabaseManager::OnResetDatabase, this));
646 } 651 }
647 652
648 void SafeBrowsingDatabaseManager::StartOnIOThread() { 653 void SafeBrowsingDatabaseManager::StartOnIOThread() {
649 DCHECK_CURRENTLY_ON(BrowserThread::IO); 654 DCHECK_CURRENTLY_ON(BrowserThread::IO);
650 if (enabled_) 655 if (enabled_)
651 return; 656 return;
652 657
653 DCHECK(!safe_browsing_thread_.get()); 658 // Don't create the thread under "BlockingPool" experimental group - instead
gab 2015/02/19 14:38:22 "BlockingPool" is not really an experimental group
Alexei Svitkine (slow) 2015/02/20 15:42:44 Updated comment.
654 safe_browsing_thread_.reset(new base::Thread("Chrome_SafeBrowsingThread")); 659 // the blocking pool will be used for safe browsing work.
655 if (!safe_browsing_thread_->Start()) 660 const std::string sb_threading_mode =
656 return; 661 variations::GetVariationParamValue("LightSpeed", "SBThreadingMode");
662 if (sb_threading_mode == "BlockingPool") {
663 base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
664 safe_browsing_task_runner_ =
665 pool->GetSequencedTaskRunner(pool->GetSequenceToken());
gab 2015/02/19 14:38:22 I think we also want SKIP_ON_SHUTDOWN behaviour he
Alexei Svitkine (slow) 2015/02/20 15:42:44 Done.
666 } else {
667 DCHECK(!safe_browsing_thread_.get());
668 safe_browsing_thread_.reset(new base::Thread("Chrome_SafeBrowsingThread"));
669 if (!safe_browsing_thread_->Start())
670 return;
671 safe_browsing_task_runner_ = safe_browsing_thread_->task_runner();
672 }
657 enabled_ = true; 673 enabled_ = true;
658 674
659 MakeDatabaseAvailable(); 675 MakeDatabaseAvailable();
660 } 676 }
661 677
662 void SafeBrowsingDatabaseManager::StopOnIOThread(bool shutdown) { 678 void SafeBrowsingDatabaseManager::StopOnIOThread(bool shutdown) {
663 DCHECK_CURRENTLY_ON(BrowserThread::IO); 679 DCHECK_CURRENTLY_ON(BrowserThread::IO);
664 680
665 DoStopOnIOThread(); 681 DoStopOnIOThread();
666 if (shutdown) { 682 if (shutdown) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 // could start using it on the IO thread and then have the second request 738 // could start using it on the IO thread and then have the second request
723 // handler delete it out from under us. 739 // handler delete it out from under us.
724 // * If |database_| is NULL, then either no creation request is in flight, in 740 // * If |database_| is NULL, then either no creation request is in flight, in
725 // which case we don't need to do anything, or one is in flight, in which 741 // which case we don't need to do anything, or one is in flight, in which
726 // case the database will be recreated before our deletion request is 742 // case the database will be recreated before our deletion request is
727 // handled, and could be used on the IO thread in that time period, leading 743 // handled, and could be used on the IO thread in that time period, leading
728 // to the same problem as above. 744 // to the same problem as above.
729 // Checking DatabaseAvailable() avoids both of these. 745 // Checking DatabaseAvailable() avoids both of these.
730 if (DatabaseAvailable()) { 746 if (DatabaseAvailable()) {
731 closing_database_ = true; 747 closing_database_ = true;
732 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, 748 safe_browsing_task_runner_->PostTask(
749 FROM_HERE,
733 base::Bind(&SafeBrowsingDatabaseManager::OnCloseDatabase, this)); 750 base::Bind(&SafeBrowsingDatabaseManager::OnCloseDatabase, this));
734 } 751 }
735 752
736 // Flush the database thread. Any in-progress database check results will be 753 // Flush the database thread. Any in-progress database check results will be
737 // ignored and cleaned up below. 754 // ignored and cleaned up below.
738 // 755 //
739 // Note that to avoid leaking the database, we rely on the fact that no new 756 // Note that to avoid leaking the database, we rely on the fact that no new
740 // tasks will be added to the db thread between the call above and this one. 757 // tasks will be added to the db thread between the call above and this one.
741 // See comments on the declaration of |safe_browsing_thread_|. 758 // See comments on the declaration of |safe_browsing_thread_|.
742 { 759 if (safe_browsing_thread_) {
743 // A ScopedAllowIO object is required to join the thread when calling Stop. 760 // A ScopedAllowIO object is required to join the thread when calling Stop.
744 // See http://crbug.com/72696. Note that we call Stop() first to clear out 761 // See http://crbug.com/72696. Note that we call Stop() first to clear out
745 // any remaining tasks before clearing safe_browsing_thread_. 762 // any remaining tasks before clearing safe_browsing_thread_.
746 base::ThreadRestrictions::ScopedAllowIO allow_io_for_thread_join; 763 base::ThreadRestrictions::ScopedAllowIO allow_io_for_thread_join;
747 safe_browsing_thread_->Stop(); 764 safe_browsing_thread_->Stop();
748 safe_browsing_thread_.reset(); 765 safe_browsing_thread_.reset();
gab 2015/02/19 14:38:22 Previously this guaranteed that the |safe_browsing
Alexei Svitkine (slow) 2015/02/20 15:42:44 Hmm, so by switching to SKIP_ON_SHUTDOWN as you s
mattm 2015/02/21 02:03:06 Should also keep an eye on the FAILURE_DATABASE_CO
749 } 766 }
750 767
751 // Delete pending checks, calling back any clients with 'SB_THREAT_TYPE_SAFE'. 768 // Delete pending checks, calling back any clients with 'SB_THREAT_TYPE_SAFE'.
752 // We have to do this after the db thread returns because methods on it can 769 // We have to do this after the db thread returns because methods on it can
753 // have copies of these pointers, so deleting them might lead to accessing 770 // have copies of these pointers, so deleting them might lead to accessing
754 // garbage. 771 // garbage.
755 for (CurrentChecks::iterator it = checks_.begin(); 772 for (CurrentChecks::iterator it = checks_.begin();
756 it != checks_.end(); ++it) { 773 it != checks_.end(); ++it) {
757 SafeBrowsingCheck* check = *it; 774 SafeBrowsingCheck* check = *it;
758 if (check->client) 775 if (check->client)
759 check->client->OnSafeBrowsingResult(*check); 776 check->client->OnSafeBrowsingResult(*check);
760 } 777 }
761 STLDeleteElements(&checks_); 778 STLDeleteElements(&checks_);
762 779
763 gethash_requests_.clear(); 780 gethash_requests_.clear();
764 } 781 }
765 782
766 bool SafeBrowsingDatabaseManager::DatabaseAvailable() const { 783 bool SafeBrowsingDatabaseManager::DatabaseAvailable() const {
767 base::AutoLock lock(database_lock_); 784 base::AutoLock lock(database_lock_);
768 return !closing_database_ && (database_ != NULL); 785 return !closing_database_ && (database_ != NULL);
769 } 786 }
770 787
771 bool SafeBrowsingDatabaseManager::MakeDatabaseAvailable() { 788 bool SafeBrowsingDatabaseManager::MakeDatabaseAvailable() {
772 DCHECK_CURRENTLY_ON(BrowserThread::IO); 789 DCHECK_CURRENTLY_ON(BrowserThread::IO);
773 DCHECK(enabled_); 790 DCHECK(enabled_);
774 if (DatabaseAvailable()) 791 if (DatabaseAvailable())
775 return true; 792 return true;
776 safe_browsing_thread_->message_loop()->PostTask( 793 safe_browsing_task_runner_->PostTask(
777 FROM_HERE, 794 FROM_HERE,
778 base::Bind(base::IgnoreResult(&SafeBrowsingDatabaseManager::GetDatabase), 795 base::Bind(base::IgnoreResult(&SafeBrowsingDatabaseManager::GetDatabase),
779 this)); 796 this));
780 return false; 797 return false;
781 } 798 }
782 799
783 SafeBrowsingDatabase* SafeBrowsingDatabaseManager::GetDatabase() { 800 SafeBrowsingDatabase* SafeBrowsingDatabaseManager::GetDatabase() {
784 DCHECK_EQ(base::MessageLoop::current(), 801 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
785 safe_browsing_thread_->message_loop()); 802
786 if (database_) 803 if (database_)
787 return database_; 804 return database_;
788 startup_metric_utils::ScopedSlowStartupUMA 805 startup_metric_utils::ScopedSlowStartupUMA
789 scoped_timer("Startup.SlowStartupSafeBrowsingGetDatabase"); 806 scoped_timer("Startup.SlowStartupSafeBrowsingGetDatabase");
790 const base::TimeTicks before = base::TimeTicks::Now(); 807 const base::TimeTicks before = base::TimeTicks::Now();
791 808
792 SafeBrowsingDatabase* database = 809 SafeBrowsingDatabase* database = SafeBrowsingDatabase::Create(
793 SafeBrowsingDatabase::Create(enable_download_protection_, 810 safe_browsing_task_runner_, enable_download_protection_,
794 enable_csd_whitelist_, 811 enable_csd_whitelist_, enable_download_whitelist_,
795 enable_download_whitelist_, 812 enable_extension_blacklist_, enable_side_effect_free_whitelist_,
796 enable_extension_blacklist_, 813 enable_ip_blacklist_, enable_unwanted_software_blacklist_);
797 enable_side_effect_free_whitelist_,
798 enable_ip_blacklist_,
799 enable_unwanted_software_blacklist_);
800 814
801 database->Init(SafeBrowsingService::GetBaseFilename()); 815 database->Init(SafeBrowsingService::GetBaseFilename());
802 { 816 {
803 // Acquiring the lock here guarantees correct ordering between the writes to 817 // Acquiring the lock here guarantees correct ordering between the writes to
804 // the new database object above, and the setting of |database_| below. 818 // the new database object above, and the setting of |database_| below.
805 base::AutoLock lock(database_lock_); 819 base::AutoLock lock(database_lock_);
806 database_ = database; 820 database_ = database;
807 } 821 }
808 822
809 BrowserThread::PostTask( 823 BrowserThread::PostTask(
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 is_download); 875 is_download);
862 } else { 876 } else {
863 // We may have cached results for previous GetHash queries. Since 877 // We may have cached results for previous GetHash queries. Since
864 // this data comes from cache, don't histogram hits. 878 // this data comes from cache, don't histogram hits.
865 HandleOneCheck(check, check->cache_hits); 879 HandleOneCheck(check, check->cache_hits);
866 } 880 }
867 } 881 }
868 882
869 void SafeBrowsingDatabaseManager::GetAllChunksFromDatabase( 883 void SafeBrowsingDatabaseManager::GetAllChunksFromDatabase(
870 GetChunksCallback callback) { 884 GetChunksCallback callback) {
871 DCHECK_EQ(base::MessageLoop::current(), 885 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
872 safe_browsing_thread_->message_loop());
873 886
874 bool database_error = true; 887 bool database_error = true;
875 std::vector<SBListChunkRanges> lists; 888 std::vector<SBListChunkRanges> lists;
876 DCHECK(!database_update_in_progress_); 889 DCHECK(!database_update_in_progress_);
877 database_update_in_progress_ = true; 890 database_update_in_progress_ = true;
878 GetDatabase(); // This guarantees that |database_| is non-NULL. 891 GetDatabase(); // This guarantees that |database_| is non-NULL.
879 if (database_->UpdateStarted(&lists)) { 892 if (database_->UpdateStarted(&lists)) {
880 database_error = false; 893 database_error = false;
881 } else { 894 } else {
882 database_->UpdateFinished(false); 895 database_->UpdateFinished(false);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 check.client->OnSafeBrowsingResult(sb_check); 945 check.client->OnSafeBrowsingResult(sb_check);
933 } 946 }
934 queued_checks_.pop_front(); 947 queued_checks_.pop_front();
935 } 948 }
936 } 949 }
937 950
938 void SafeBrowsingDatabaseManager::AddDatabaseChunks( 951 void SafeBrowsingDatabaseManager::AddDatabaseChunks(
939 const std::string& list_name, 952 const std::string& list_name,
940 scoped_ptr<ScopedVector<SBChunkData> > chunks, 953 scoped_ptr<ScopedVector<SBChunkData> > chunks,
941 AddChunksCallback callback) { 954 AddChunksCallback callback) {
942 DCHECK_EQ(base::MessageLoop::current(), 955 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
943 safe_browsing_thread_->message_loop());
944 if (chunks) 956 if (chunks)
945 GetDatabase()->InsertChunks(list_name, chunks->get()); 957 GetDatabase()->InsertChunks(list_name, chunks->get());
946 BrowserThread::PostTask( 958 BrowserThread::PostTask(
947 BrowserThread::IO, FROM_HERE, 959 BrowserThread::IO, FROM_HERE,
948 base::Bind(&SafeBrowsingDatabaseManager::OnAddChunksComplete, this, 960 base::Bind(&SafeBrowsingDatabaseManager::OnAddChunksComplete, this,
949 callback)); 961 callback));
950 } 962 }
951 963
952 void SafeBrowsingDatabaseManager::DeleteDatabaseChunks( 964 void SafeBrowsingDatabaseManager::DeleteDatabaseChunks(
953 scoped_ptr<std::vector<SBChunkDelete> > chunk_deletes) { 965 scoped_ptr<std::vector<SBChunkDelete> > chunk_deletes) {
954 DCHECK_EQ(base::MessageLoop::current(), 966 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
955 safe_browsing_thread_->message_loop());
956 if (chunk_deletes) 967 if (chunk_deletes)
957 GetDatabase()->DeleteChunks(*chunk_deletes); 968 GetDatabase()->DeleteChunks(*chunk_deletes);
958 } 969 }
959 970
960 void SafeBrowsingDatabaseManager::DatabaseUpdateFinished( 971 void SafeBrowsingDatabaseManager::DatabaseUpdateFinished(
961 bool update_succeeded) { 972 bool update_succeeded) {
962 DCHECK_EQ(base::MessageLoop::current(), 973 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
963 safe_browsing_thread_->message_loop());
964 GetDatabase()->UpdateFinished(update_succeeded); 974 GetDatabase()->UpdateFinished(update_succeeded);
965 DCHECK(database_update_in_progress_); 975 DCHECK(database_update_in_progress_);
966 database_update_in_progress_ = false; 976 database_update_in_progress_ = false;
967 BrowserThread::PostTask( 977 BrowserThread::PostTask(
968 BrowserThread::UI, FROM_HERE, 978 BrowserThread::UI, FROM_HERE,
969 base::Bind(&SafeBrowsingDatabaseManager::NotifyDatabaseUpdateFinished, 979 base::Bind(&SafeBrowsingDatabaseManager::NotifyDatabaseUpdateFinished,
970 this, update_succeeded)); 980 this, update_succeeded));
971 } 981 }
972 982
973 void SafeBrowsingDatabaseManager::OnCloseDatabase() { 983 void SafeBrowsingDatabaseManager::OnCloseDatabase() {
974 DCHECK_EQ(base::MessageLoop::current(), 984 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
975 safe_browsing_thread_->message_loop());
976 DCHECK(closing_database_); 985 DCHECK(closing_database_);
977 986
978 // Because |closing_database_| is true, nothing on the IO thread will be 987 // Because |closing_database_| is true, nothing on the IO thread will be
979 // accessing the database, so it's safe to delete and then NULL the pointer. 988 // accessing the database, so it's safe to delete and then NULL the pointer.
980 delete database_; 989 delete database_;
981 database_ = NULL; 990 database_ = NULL;
982 991
983 // Acquiring the lock here guarantees correct ordering between the resetting 992 // Acquiring the lock here guarantees correct ordering between the resetting
984 // of |database_| above and of |closing_database_| below, which ensures there 993 // of |database_| above and of |closing_database_| below, which ensures there
985 // won't be a window during which the IO thread falsely believes the database 994 // won't be a window during which the IO thread falsely believes the database
986 // is available. 995 // is available.
987 base::AutoLock lock(database_lock_); 996 base::AutoLock lock(database_lock_);
988 closing_database_ = false; 997 closing_database_ = false;
989 } 998 }
990 999
991 void SafeBrowsingDatabaseManager::OnResetDatabase() { 1000 void SafeBrowsingDatabaseManager::OnResetDatabase() {
992 DCHECK_EQ(base::MessageLoop::current(), 1001 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
993 safe_browsing_thread_->message_loop()); 1002
994 GetDatabase()->ResetDatabase(); 1003 GetDatabase()->ResetDatabase();
995 } 1004 }
996 1005
997 void SafeBrowsingDatabaseManager::OnHandleGetHashResults( 1006 void SafeBrowsingDatabaseManager::OnHandleGetHashResults(
998 SafeBrowsingCheck* check, 1007 SafeBrowsingCheck* check,
999 const std::vector<SBFullHashResult>& full_hashes) { 1008 const std::vector<SBFullHashResult>& full_hashes) {
1000 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1009 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1001 safe_browsing_util::ListType check_type = check->check_type; 1010 safe_browsing_util::ListType check_type = check->check_type;
1002 SBPrefix prefix = check->prefix_hits[0]; 1011 SBPrefix prefix = check->prefix_hits[0];
1003 GetHashRequests::iterator it = gethash_requests_.find(prefix); 1012 GetHashRequests::iterator it = gethash_requests_.find(prefix);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1065 is_threat = true; 1074 is_threat = true;
1066 } 1075 }
1067 } 1076 }
1068 1077
1069 SafeBrowsingCheckDone(check); 1078 SafeBrowsingCheckDone(check);
1070 return is_threat; 1079 return is_threat;
1071 } 1080 }
1072 1081
1073 void SafeBrowsingDatabaseManager::CheckDownloadUrlOnSBThread( 1082 void SafeBrowsingDatabaseManager::CheckDownloadUrlOnSBThread(
1074 SafeBrowsingCheck* check) { 1083 SafeBrowsingCheck* check) {
1075 DCHECK_EQ(base::MessageLoop::current(), 1084 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
1076 safe_browsing_thread_->message_loop());
1077 DCHECK(enable_download_protection_); 1085 DCHECK(enable_download_protection_);
1078 1086
1079 std::vector<SBPrefix> prefix_hits; 1087 std::vector<SBPrefix> prefix_hits;
1080 1088
1081 if (!database_->ContainsDownloadUrl(check->urls, &prefix_hits)) { 1089 if (!database_->ContainsDownloadUrl(check->urls, &prefix_hits)) {
1082 // Good, we don't have hash for this url prefix. 1090 // Good, we don't have hash for this url prefix.
1083 BrowserThread::PostTask( 1091 BrowserThread::PostTask(
1084 BrowserThread::IO, FROM_HERE, 1092 BrowserThread::IO, FROM_HERE,
1085 base::Bind(&SafeBrowsingDatabaseManager::CheckDownloadUrlDone, this, 1093 base::Bind(&SafeBrowsingDatabaseManager::CheckDownloadUrlDone, this,
1086 check)); 1094 check));
1087 return; 1095 return;
1088 } 1096 }
1089 1097
1090 check->need_get_hash = true; 1098 check->need_get_hash = true;
1091 check->prefix_hits.clear(); 1099 check->prefix_hits.clear();
1092 check->prefix_hits = prefix_hits; 1100 check->prefix_hits = prefix_hits;
1093 BrowserThread::PostTask( 1101 BrowserThread::PostTask(
1094 BrowserThread::IO, FROM_HERE, 1102 BrowserThread::IO, FROM_HERE,
1095 base::Bind(&SafeBrowsingDatabaseManager::OnCheckDone, this, check)); 1103 base::Bind(&SafeBrowsingDatabaseManager::OnCheckDone, this, check));
1096 } 1104 }
1097 1105
1098 void SafeBrowsingDatabaseManager::CheckExtensionIDsOnSBThread( 1106 void SafeBrowsingDatabaseManager::CheckExtensionIDsOnSBThread(
1099 SafeBrowsingCheck* check) { 1107 SafeBrowsingCheck* check) {
1100 DCHECK_EQ(base::MessageLoop::current(), 1108 DCHECK(safe_browsing_task_runner_->RunsTasksOnCurrentThread());
1101 safe_browsing_thread_->message_loop());
1102 1109
1103 std::vector<SBPrefix> prefixes; 1110 std::vector<SBPrefix> prefixes;
1104 for (std::vector<SBFullHash>::iterator it = check->full_hashes.begin(); 1111 for (std::vector<SBFullHash>::iterator it = check->full_hashes.begin();
1105 it != check->full_hashes.end(); ++it) { 1112 it != check->full_hashes.end(); ++it) {
1106 prefixes.push_back((*it).prefix); 1113 prefixes.push_back((*it).prefix);
1107 } 1114 }
1108 database_->ContainsExtensionPrefixes(prefixes, &check->prefix_hits); 1115 database_->ContainsExtensionPrefixes(prefixes, &check->prefix_hits);
1109 1116
1110 if (check->prefix_hits.empty()) { 1117 if (check->prefix_hits.empty()) {
1111 // No matches for any extensions. 1118 // No matches for any extensions.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 } 1169 }
1163 1170
1164 void SafeBrowsingDatabaseManager::StartSafeBrowsingCheck( 1171 void SafeBrowsingDatabaseManager::StartSafeBrowsingCheck(
1165 SafeBrowsingCheck* check, 1172 SafeBrowsingCheck* check,
1166 const base::Closure& task) { 1173 const base::Closure& task) {
1167 DCHECK_CURRENTLY_ON(BrowserThread::IO); 1174 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1168 check->timeout_factory_.reset( 1175 check->timeout_factory_.reset(
1169 new base::WeakPtrFactory<SafeBrowsingDatabaseManager>(this)); 1176 new base::WeakPtrFactory<SafeBrowsingDatabaseManager>(this));
1170 checks_.insert(check); 1177 checks_.insert(check);
1171 1178
1172 safe_browsing_thread_->message_loop()->PostTask(FROM_HERE, task); 1179 safe_browsing_task_runner_->PostTask(FROM_HERE, task);
1173 1180
1174 base::MessageLoop::current()->PostDelayedTask(FROM_HERE, 1181 base::MessageLoop::current()->PostDelayedTask(FROM_HERE,
1175 base::Bind(&SafeBrowsingDatabaseManager::TimeoutCallback, 1182 base::Bind(&SafeBrowsingDatabaseManager::TimeoutCallback,
1176 check->timeout_factory_->GetWeakPtr(), check), 1183 check->timeout_factory_->GetWeakPtr(), check),
1177 check_timeout_); 1184 check_timeout_);
1178 } 1185 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698