blob: b5485ad414226021ffdd663afe0c427a8a650112 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/web_applications/commands/callback_command.h"
#include <memory>
#include <utility>
#include "base/functional/callback_helpers.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/web_applications/locks/all_apps_lock.h"
#include "chrome/browser/web_applications/locks/app_lock.h"
#include "chrome/browser/web_applications/locks/lock.h"
#include "chrome/browser/web_applications/locks/noop_lock.h"
#include "chrome/browser/web_applications/locks/shared_web_contents_lock.h"
#include "chrome/browser/web_applications/locks/shared_web_contents_with_app_lock.h"
namespace web_app {
template <class LockType, class DescriptionType>
CallbackCommand<LockType, DescriptionType>::CallbackCommand(
const std::string& name,
std::unique_ptr<DescriptionType> lock_description,
base::OnceCallback<void(LockType& lock)> callback)
: CallbackCommand<LockType, DescriptionType>::CallbackCommand(
name,
std::move(lock_description),
// Return an empty base::Value() as the debug value.
std::move(callback).Then(
base::BindOnce([]() { return base::Value(); })),
base::DoNothing()) {}
template <class LockType, class DescriptionType>
CallbackCommand<LockType, DescriptionType>::CallbackCommand(
const std::string& name,
std::unique_ptr<DescriptionType> lock_description,
base::OnceCallback<base::Value(LockType& lock)> callback,
base::OnceClosure on_complete)
: WebAppCommandTemplate<LockType>(name),
lock_description_(std::move(lock_description)),
callback_(std::move(callback)),
on_complete_(std::move(on_complete)) {
DCHECK(lock_description_);
}
template <class LockType, class DescriptionType>
CallbackCommand<LockType, DescriptionType>::~CallbackCommand() = default;
template <class LockType, class DescriptionType>
void CallbackCommand<LockType, DescriptionType>::StartWithLock(
std::unique_ptr<LockType> lock) {
CHECK(!lock_);
lock_ = std::move(lock);
debug_value_ = std::move(callback_).Run(*lock_.get());
this->SignalCompletionAndSelfDestruct(CommandResult::kSuccess,
std::move(on_complete_));
}
template <class LockType, class DescriptionType>
const LockDescription&
CallbackCommand<LockType, DescriptionType>::lock_description() const {
return *lock_description_;
}
template <class LockType, class DescriptionType>
base::Value CallbackCommand<LockType, DescriptionType>::ToDebugValue() const {
return debug_value_.Clone();
}
template class CallbackCommand<NoopLock>;
template class CallbackCommand<SharedWebContentsLock>;
template class CallbackCommand<AppLock>;
template class CallbackCommand<SharedWebContentsWithAppLock>;
template class CallbackCommand<AllAppsLock>;
} // namespace web_app