batch_entity_metadata_task.cc 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. // Copyright 2021 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/optimization_guide/core/batch_entity_metadata_task.h"
  5. #include "components/optimization_guide/core/entity_metadata_provider.h"
  6. namespace optimization_guide {
  7. BatchEntityMetadataTask::BatchEntityMetadataTask(
  8. optimization_guide::EntityMetadataProvider* entity_metadata_provider,
  9. const base::flat_set<std::string>& entity_ids)
  10. : entity_metadata_provider_(entity_metadata_provider),
  11. entity_ids_(entity_ids) {
  12. DCHECK(entity_metadata_provider_);
  13. DCHECK(!entity_ids_.empty());
  14. }
  15. BatchEntityMetadataTask::~BatchEntityMetadataTask() = default;
  16. void BatchEntityMetadataTask::Execute(
  17. BatchEntityMetadataRetrievedCallback callback) {
  18. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  19. DCHECK_EQ(task_state_, TaskState::kWaiting);
  20. task_state_ = TaskState::kStarted;
  21. callback_ = std::move(callback);
  22. for (const auto& entity_id : entity_ids_) {
  23. entity_metadata_provider_->GetMetadataForEntityId(
  24. entity_id,
  25. base::BindOnce(&BatchEntityMetadataTask::OnEntityMetadataRetrieved,
  26. weak_ptr_factory_.GetWeakPtr(), entity_id));
  27. }
  28. }
  29. void BatchEntityMetadataTask::OnEntityMetadataRetrieved(
  30. const std::string& entity_id,
  31. const absl::optional<EntityMetadata>& entity_metadata) {
  32. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  33. DCHECK_EQ(task_state_, TaskState::kStarted);
  34. DCHECK(received_entity_ids_.find(entity_id) == received_entity_ids_.end());
  35. received_entity_ids_.insert(entity_id);
  36. if (entity_metadata)
  37. entity_metadata_map_.insert({entity_id, *entity_metadata});
  38. // Run callback if all the metadata has come back.
  39. if (received_entity_ids_.size() == entity_ids_.size()) {
  40. task_state_ = TaskState::kCompleted;
  41. std::move(callback_).Run(entity_metadata_map_);
  42. }
  43. }
  44. } // namespace optimization_guide