From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Charles Kerr <charles@charleskerr.com>
Date: Wed, 9 Jun 2021 14:28:08 -0500
Subject: refactor: restore base::AdaptCallbackForRepeating

Undo https://chromium-review.googlesource.com/c/chromium/src/+/2941842
to reinstate base::AdaptCallbackForRepeating(). It was removed to fix
https://bugs.chromium.org/p/chromium/issues/detail?id=730593 .

We use AdaptCallbackForRepeating() in about a dozen places. This patch
should be removed as soon as those have been updated. Patching because
every instance is a FTBFS that prevents testing any one instance's fix.

diff --git a/base/functional/callback_helpers.h b/base/functional/callback_helpers.h
index 19d605162f11a09123d4e32336ce961817d780de..2ab5a2b70dc89229225d52ff23d9d80952ca685d 100644
--- a/base/functional/callback_helpers.h
+++ b/base/functional/callback_helpers.h
@@ -97,6 +97,22 @@ class OnceCallbackHolder final {
 
 }  // namespace internal
 
+// Wraps the given OnceCallback into a RepeatingCallback that relays its
+// invocation to the original OnceCallback on the first invocation. The
+// following invocations are just ignored.
+//
+// Note that this deliberately subverts the Once/Repeating paradigm of Callbacks
+// but helps ease the migration from old-style Callbacks. Avoid if possible; use
+// if necessary for migration. TODO(tzik): Remove it. https://crbug.com/730593
+template <typename... Args>
+RepeatingCallback<void(Args...)> AdaptCallbackForRepeating(
+    OnceCallback<void(Args...)> callback) {
+  using Helper = internal::OnceCallbackHolder<Args...>;
+  return base::BindRepeating(
+      &Helper::Run, std::make_unique<Helper>(std::move(callback),
+                                             /*ignore_extra_runs=*/true));
+}
+
 // Wraps the given OnceCallback and returns two OnceCallbacks with an identical
 // signature. On first invokation of either returned callbacks, the original
 // callback is invoked. Invoking the remaining callback results in a crash.
