page_annotator.cc 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2019 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/page_image_annotation/core/page_annotator.h"
  5. #include "base/bind.h"
  6. #include "base/observer_list.h"
  7. namespace page_image_annotation {
  8. namespace ia_mojom = image_annotation::mojom;
  9. PageAnnotator::Observer::~Observer() {}
  10. PageAnnotator::PageAnnotator(mojo::PendingRemote<ia_mojom::Annotator> annotator)
  11. : annotator_(std::move(annotator)) {}
  12. PageAnnotator::~PageAnnotator() {}
  13. void PageAnnotator::ImageAddedOrPossiblyModified(
  14. const ImageMetadata& metadata,
  15. base::RepeatingCallback<SkBitmap()> pixels_callback) {
  16. const auto lookup = images_.find(metadata.node_id);
  17. if (lookup == images_.end()) {
  18. // This is an image addition.
  19. AddNewImage(metadata, std::move(pixels_callback));
  20. for (Observer& observer : observers_) {
  21. observer.OnImageAdded(metadata);
  22. }
  23. } else if (lookup->second.first.source_id != metadata.source_id) {
  24. // We already have older data for this node ID; this is an update.
  25. images_.erase(lookup);
  26. AddNewImage(metadata, std::move(pixels_callback));
  27. for (Observer& observer : observers_) {
  28. observer.OnImageModified(metadata);
  29. }
  30. }
  31. }
  32. void PageAnnotator::ImageRemoved(const uint64_t node_id) {
  33. images_.erase(node_id);
  34. for (Observer& observer : observers_) {
  35. observer.OnImageRemoved(node_id);
  36. }
  37. }
  38. void PageAnnotator::AnnotateImage(Observer* const observer,
  39. const uint64_t node_id) {
  40. DCHECK(observers_.HasObserver(observer));
  41. const auto lookup = images_.find(node_id);
  42. if (lookup == images_.end())
  43. return;
  44. // TODO(crbug.com/916363): get a user's preferred language and pass it here.
  45. annotator_->AnnotateImage(
  46. lookup->second.first.source_id,
  47. std::string() /* description_language_tag */,
  48. lookup->second.second.GetPendingRemote(),
  49. base::BindOnce(&PageAnnotator::NotifyObserver, base::Unretained(this),
  50. observer, node_id));
  51. }
  52. void PageAnnotator::AddObserver(Observer* const observer) {
  53. observers_.AddObserver(observer);
  54. // The new observer has not received any previous messages; inform them now of
  55. // all existing images.
  56. for (const auto& image : images_) {
  57. observer->OnImageAdded(image.second.first);
  58. }
  59. }
  60. void PageAnnotator::AddNewImage(
  61. const ImageMetadata& metadata,
  62. base::RepeatingCallback<SkBitmap()> pixels_callback) {
  63. images_.emplace(std::piecewise_construct,
  64. std::forward_as_tuple(metadata.node_id),
  65. std::forward_as_tuple(metadata, std::move(pixels_callback)));
  66. }
  67. void PageAnnotator::NotifyObserver(Observer* const observer,
  68. const uint64_t node_id,
  69. ia_mojom::AnnotateImageResultPtr result) {
  70. observer->OnImageAnnotated(node_id, std::move(result));
  71. }
  72. } // namespace page_image_annotation