From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Charles Kerr 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 +RepeatingCallback AdaptCallbackForRepeating( + OnceCallback callback) { + using Helper = internal::OnceCallbackHolder; + return base::BindRepeating( + &Helper::Run, std::make_unique(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.