Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 // This file should not be build on Android but is currently getting built. | 5 // This file should not be build on Android but is currently getting built. |
| 6 // TODO(vakh): Fix that: http://crbug.com/621647 | 6 // TODO(vakh): Fix that: http://crbug.com/621647 |
| 7 | 7 |
| 8 #include "components/safe_browsing_db/v4_local_database_manager.h" | 8 #include "components/safe_browsing_db/v4_local_database_manager.h" |
| 9 | 9 |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 509 queued_checks_.push_back(std::move(check)); | 509 queued_checks_.push_back(std::move(check)); |
| 510 return false; | 510 return false; |
| 511 } | 511 } |
| 512 | 512 |
| 513 FullHashToStoreAndHashPrefixesMap full_hash_to_store_and_hash_prefixes; | 513 FullHashToStoreAndHashPrefixesMap full_hash_to_store_and_hash_prefixes; |
| 514 if (!GetPrefixMatches(check, &full_hash_to_store_and_hash_prefixes)) { | 514 if (!GetPrefixMatches(check, &full_hash_to_store_and_hash_prefixes)) { |
| 515 return true; | 515 return true; |
| 516 } | 516 } |
| 517 | 517 |
| 518 // Post on the IO thread to enforce async behavior. | 518 // Post on the IO thread to enforce async behavior. |
| 519 pending_clients_.insert(check->client); | |
| 519 BrowserThread::PostTask( | 520 BrowserThread::PostTask( |
| 520 BrowserThread::IO, FROM_HERE, | 521 BrowserThread::IO, FROM_HERE, |
| 521 base::Bind(&V4LocalDatabaseManager::PerformFullHashCheck, this, | 522 base::Bind(&V4LocalDatabaseManager::PerformFullHashCheck, this, |
| 522 base::Passed(std::move(check)), | 523 base::Passed(std::move(check)), |
| 523 full_hash_to_store_and_hash_prefixes)); | 524 full_hash_to_store_and_hash_prefixes)); |
| 524 | 525 |
| 525 return false; | 526 return false; |
| 526 } | 527 } |
| 527 | 528 |
| 528 bool V4LocalDatabaseManager::HandleHashSynchronously( | 529 bool V4LocalDatabaseManager::HandleHashSynchronously( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 575 RespondToClient(std::move(pending_check)); | 576 RespondToClient(std::move(pending_check)); |
| 576 } | 577 } |
| 577 | 578 |
| 578 void V4LocalDatabaseManager::PerformFullHashCheck( | 579 void V4LocalDatabaseManager::PerformFullHashCheck( |
| 579 std::unique_ptr<PendingCheck> check, | 580 std::unique_ptr<PendingCheck> check, |
| 580 const FullHashToStoreAndHashPrefixesMap& | 581 const FullHashToStoreAndHashPrefixesMap& |
| 581 full_hash_to_store_and_hash_prefixes) { | 582 full_hash_to_store_and_hash_prefixes) { |
| 582 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 583 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 583 | 584 |
| 584 DCHECK(enabled_); | 585 DCHECK(enabled_); |
| 585 DCHECK(!full_hash_to_store_and_hash_prefixes.empty()); | 586 DCHECK(!full_hash_to_store_and_hash_prefixes.empty()); |
|
Nathan Parker
2016/12/14 18:03:03
Maybe add a comment that the caller should have ad
Scott Hess - ex-Googler
2016/12/14 20:45:58
Should have, but if CancelCheck() was called betwe
| |
| 586 | 587 |
| 587 pending_clients_.insert(check->client); | |
| 588 | |
| 589 v4_get_hash_protocol_manager_->GetFullHashes( | 588 v4_get_hash_protocol_manager_->GetFullHashes( |
| 590 full_hash_to_store_and_hash_prefixes, | 589 full_hash_to_store_and_hash_prefixes, |
| 591 base::Bind(&V4LocalDatabaseManager::OnFullHashResponse, | 590 base::Bind(&V4LocalDatabaseManager::OnFullHashResponse, |
| 592 weak_factory_.GetWeakPtr(), base::Passed(std::move(check)))); | 591 weak_factory_.GetWeakPtr(), base::Passed(std::move(check)))); |
| 593 } | 592 } |
| 594 | 593 |
| 595 void V4LocalDatabaseManager::ProcessQueuedChecks() { | 594 void V4LocalDatabaseManager::ProcessQueuedChecks() { |
| 596 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 595 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 597 for (auto& it : queued_checks_) { | 596 |
| 597 // Steal the queue to protect against reentrant CancelCheck() calls. | |
|
Nathan Parker
2016/12/14 18:03:04
Is this if they call Cancel() from within RespondT
Scott Hess - ex-Googler
2016/12/14 20:45:58
Yes, that is my concern. We're calling out to ext
Scott Hess - ex-Googler
2016/12/14 20:56:33
OK, it looks like for(:) implementation expects to
| |
| 598 QueuedChecks checks; | |
| 599 checks.swap(queued_checks_); | |
| 600 | |
| 601 for (auto& it : checks) { | |
| 598 FullHashToStoreAndHashPrefixesMap full_hash_to_store_and_hash_prefixes; | 602 FullHashToStoreAndHashPrefixesMap full_hash_to_store_and_hash_prefixes; |
| 599 if (!GetPrefixMatches(it, &full_hash_to_store_and_hash_prefixes)) { | 603 if (!GetPrefixMatches(it, &full_hash_to_store_and_hash_prefixes)) { |
| 600 RespondToClient(std::move(it)); | 604 RespondToClient(std::move(it)); |
|
Scott Hess - ex-Googler
2016/12/15 01:14:13
Ha, it took some work, but the amusing result is t
| |
| 601 } else { | 605 } else { |
| 606 pending_clients_.insert(it->client); | |
| 602 PerformFullHashCheck(std::move(it), full_hash_to_store_and_hash_prefixes); | 607 PerformFullHashCheck(std::move(it), full_hash_to_store_and_hash_prefixes); |
| 603 } | 608 } |
| 604 } | 609 } |
| 605 queued_checks_.clear(); | |
| 606 } | 610 } |
| 607 | 611 |
| 608 void V4LocalDatabaseManager::RespondSafeToQueuedChecks() { | 612 void V4LocalDatabaseManager::RespondSafeToQueuedChecks() { |
| 609 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 613 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 610 for (std::unique_ptr<PendingCheck>& it : queued_checks_) { | 614 |
| 615 // Steal the queue to protect against reentrant CancelCheck() calls. | |
| 616 QueuedChecks checks; | |
| 617 checks.swap(queued_checks_); | |
| 618 | |
| 619 for (std::unique_ptr<PendingCheck>& it : checks) { | |
| 611 RespondToClient(std::move(it)); | 620 RespondToClient(std::move(it)); |
| 612 } | 621 } |
| 613 queued_checks_.clear(); | |
| 614 } | 622 } |
| 615 | 623 |
| 616 void V4LocalDatabaseManager::RespondToClient( | 624 void V4LocalDatabaseManager::RespondToClient( |
| 617 std::unique_ptr<PendingCheck> check) { | 625 std::unique_ptr<PendingCheck> check) { |
| 618 DCHECK(check.get()); | 626 DCHECK(check.get()); |
| 619 | 627 |
| 620 if (check->client_callback_type == ClientCallbackType::CHECK_BROWSE_URL) { | 628 if (check->client_callback_type == ClientCallbackType::CHECK_BROWSE_URL) { |
| 621 DCHECK_EQ(1u, check->urls.size()); | 629 DCHECK_EQ(1u, check->urls.size()); |
| 622 // TODO(vakh): Remove these CHECKs after fixing bugs 660293, 660359. | 630 // TODO(vakh): Remove these CHECKs after fixing bugs 660293, 660359. |
| 623 CHECK(check.get()); | 631 CHECK(check.get()); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 674 } | 682 } |
| 675 | 683 |
| 676 void V4LocalDatabaseManager::UpdateRequestCompleted( | 684 void V4LocalDatabaseManager::UpdateRequestCompleted( |
| 677 std::unique_ptr<ParsedServerResponse> parsed_server_response) { | 685 std::unique_ptr<ParsedServerResponse> parsed_server_response) { |
| 678 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 686 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 679 v4_database_->ApplyUpdate(std::move(parsed_server_response), | 687 v4_database_->ApplyUpdate(std::move(parsed_server_response), |
| 680 db_updated_callback_); | 688 db_updated_callback_); |
| 681 } | 689 } |
| 682 | 690 |
| 683 } // namespace safe_browsing | 691 } // namespace safe_browsing |
| OLD | NEW |