[ContentIndex] Notify provider of registered content on start-up.

Bug: 973844
Change-Id: I9d5c64c163abb6bfd81df16ab77fb7b4c9d56d5f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1678181
Reviewed-by: Richard Knoll <[email protected]>
Reviewed-by: Avi Drissman <[email protected]>
Commit-Queue: Rayan Kanso <[email protected]>
Cr-Commit-Position: refs/heads/master@{#673356}
diff --git a/content/browser/content_index/content_index_database.cc b/content/browser/content_index/content_index_database.cc
index 8bf79b8..8ec61d6d 100644
--- a/content/browser/content_index/content_index_database.cc
+++ b/content/browser/content_index/content_index_database.cc
@@ -69,7 +69,7 @@
 ContentIndexDatabase::ContentIndexDatabase(
     BrowserContext* browser_context,
     scoped_refptr<ServiceWorkerContextWrapper> service_worker_context)
-    : browser_context_(browser_context),
+    : provider_(browser_context->GetContentIndexProvider()),
       service_worker_context_(std::move(service_worker_context)),
       weak_ptr_factory_(this) {}
 
@@ -110,8 +110,8 @@
 
   std::move(callback).Run(blink::mojom::ContentIndexError::NONE);
 
-  if (auto* provider = browser_context_->GetContentIndexProvider())
-    provider->OnContentAdded(std::move(entry), weak_ptr_factory_.GetWeakPtr());
+  if (provider_)
+    provider_->OnContentAdded(std::move(entry), weak_ptr_factory_.GetWeakPtr());
 }
 
 void ContentIndexDatabase::DeleteEntry(
@@ -136,8 +136,8 @@
   }
 
   std::move(callback).Run(blink::mojom::ContentIndexError::NONE);
-  if (auto* provider = browser_context_->GetContentIndexProvider())
-    provider->OnContentDeleted(service_worker_registration_id, entry_id);
+  if (provider_)
+    provider_->OnContentDeleted(service_worker_registration_id, entry_id);
 }
 
 void ContentIndexDatabase::GetDescriptions(
@@ -189,6 +189,49 @@
                           std::move(descriptions));
 }
 
+void ContentIndexDatabase::InitializeProviderWithEntries() {
+  if (!provider_)
+    return;
+
+  service_worker_context_->GetUserDataForAllRegistrationsByKeyPrefix(
+      kEntryPrefix, base::BindOnce(&ContentIndexDatabase::DidGetAllEntries,
+                                   weak_ptr_factory_.GetWeakPtr()));
+}
+
+void ContentIndexDatabase::DidGetAllEntries(
+    const std::vector<std::pair<int64_t, std::string>>& user_data,
+    blink::ServiceWorkerStatusCode status) {
+  if (status != blink::ServiceWorkerStatusCode::kOk) {
+    // TODO(crbug.com/973844): Handle or report this error.
+    return;
+  }
+
+  if (!provider_ || user_data.empty())
+    return;
+
+  std::vector<ContentIndexEntry> entries;
+  entries.reserve(user_data.size());
+
+  for (const auto& ud : user_data) {
+    proto::ContentEntry entry_proto;
+    if (!entry_proto.ParseFromString(ud.second)) {
+      // TODO(crbug.com/973844): Handle or report this error.
+      return;
+    }
+
+    int64_t service_worker_registration_id = ud.first;
+    auto description = DescriptionFromProto(entry_proto.description());
+    base::Time registration_time = base::Time::FromDeltaSinceWindowsEpoch(
+        base::TimeDelta::FromMicroseconds(entry_proto.timestamp()));
+
+    entries.emplace_back(service_worker_registration_id, std::move(description),
+                         registration_time);
+  }
+
+  for (auto& entry : entries)
+    provider_->OnContentAdded(std::move(entry), weak_ptr_factory_.GetWeakPtr());
+}
+
 void ContentIndexDatabase::GetIcon(
     int64_t service_worker_registration_id,
     const std::string& description_id,
@@ -197,4 +240,10 @@
   std::move(icon_callback).Run(SkBitmap());
 }
 
+void ContentIndexDatabase::Shutdown() {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+  provider_ = nullptr;
+}
+
 }  // namespace content