visitedlink_reader.cc 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright (c) 2006-2008 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/visitedlink/renderer/visitedlink_reader.h"
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include "base/bind.h"
  8. #include "base/check.h"
  9. #include "third_party/blink/public/web/web_view.h"
  10. using blink::WebView;
  11. namespace visitedlink {
  12. VisitedLinkReader::VisitedLinkReader() = default;
  13. VisitedLinkReader::~VisitedLinkReader() {
  14. FreeTable();
  15. }
  16. base::RepeatingCallback<
  17. void(mojo::PendingReceiver<mojom::VisitedLinkNotificationSink>)>
  18. VisitedLinkReader::GetBindCallback() {
  19. return base::BindRepeating(&VisitedLinkReader::Bind,
  20. weak_factory_.GetWeakPtr());
  21. }
  22. // Initializes the table with the given shared memory handle. This memory is
  23. // mapped into the process.
  24. void VisitedLinkReader::UpdateVisitedLinks(
  25. base::ReadOnlySharedMemoryRegion table_region) {
  26. // Since this function may be called again to change the table, we may need
  27. // to free old objects.
  28. FreeTable();
  29. DCHECK(hash_table_ == nullptr);
  30. int32_t table_len = 0;
  31. {
  32. // Map the header into our process so we can see how long the rest is,
  33. // and set the salt.
  34. base::ReadOnlySharedMemoryMapping header_mapping =
  35. table_region.MapAt(0, sizeof(SharedHeader));
  36. if (!header_mapping.IsValid())
  37. return;
  38. const SharedHeader* header =
  39. static_cast<const SharedHeader*>(header_mapping.memory());
  40. table_len = header->length;
  41. memcpy(salt_, header->salt, sizeof(salt_));
  42. }
  43. // Now we know the length, so map the table contents.
  44. table_mapping_ = table_region.Map();
  45. if (!table_mapping_.IsValid())
  46. return;
  47. // Commit the data.
  48. hash_table_ = const_cast<Fingerprint*>(reinterpret_cast<const Fingerprint*>(
  49. static_cast<const SharedHeader*>(table_mapping_.memory()) + 1));
  50. table_length_ = table_len;
  51. }
  52. void VisitedLinkReader::AddVisitedLinks(
  53. const std::vector<VisitedLinkReader::Fingerprint>& fingerprints) {
  54. for (size_t i = 0; i < fingerprints.size(); ++i)
  55. WebView::UpdateVisitedLinkState(fingerprints[i]);
  56. }
  57. void VisitedLinkReader::ResetVisitedLinks(bool invalidate_hashes) {
  58. WebView::ResetVisitedLinkState(invalidate_hashes);
  59. }
  60. void VisitedLinkReader::FreeTable() {
  61. if (!hash_table_)
  62. return;
  63. table_mapping_ = base::ReadOnlySharedMemoryMapping();
  64. hash_table_ = nullptr;
  65. table_length_ = 0;
  66. }
  67. void VisitedLinkReader::Bind(
  68. mojo::PendingReceiver<mojom::VisitedLinkNotificationSink> receiver) {
  69. receiver_.Bind(std::move(receiver));
  70. }
  71. } // namespace visitedlink