// Copyright 2023 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/thumbnail/cc/thumbnail_capture_tracker.h"
#include "base/functional/callback.h"
#include "base/task/sequenced_task_runner.h"
namespace thumbnail {
ThumbnailCaptureTracker::ThumbnailCaptureTracker(
base::OnceCallback<void(ThumbnailCaptureTracker*)> on_deleted)
: on_deleted_(std::move(on_deleted)) {}
ThumbnailCaptureTracker::~ThumbnailCaptureTracker() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// There may be callbacks left if this was interrupted.
if (wrote_jpeg_) {
RunOnJpegFinishedCallbacks(true);
} else {
RunOnJpegFinishedCallbacks(false);
}
std::move(on_deleted_).Run(this);
}
void ThumbnailCaptureTracker::AddOnJpegFinishedCallback(
base::OnceCallback<void(bool)> on_jpeg_finished) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
if (wrote_jpeg_) {
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce(std::move(on_jpeg_finished), true));
} else if (jpeg_failed_ || capture_failed_) {
base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce(std::move(on_jpeg_finished), false));
} else {
on_jpeg_finished_callbacks_.push_back(std::move(on_jpeg_finished));
}
}
void ThumbnailCaptureTracker::SetWroteJpeg() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
wrote_jpeg_ = true;
RunOnJpegFinishedCallbacks(true);
}
void ThumbnailCaptureTracker::MarkCaptureFailed() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
capture_failed_ = true;
RunOnJpegFinishedCallbacks(false);
}
void ThumbnailCaptureTracker::MarkJpegFailed() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
jpeg_failed_ = true;
RunOnJpegFinishedCallbacks(false);
}
base::WeakPtr<ThumbnailCaptureTracker> ThumbnailCaptureTracker::GetWeakPtr() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
return weak_ptr_factory_.GetWeakPtr();
}
void ThumbnailCaptureTracker::RunOnJpegFinishedCallbacks(bool success) {
for (auto& callback : on_jpeg_finished_callbacks_) {
std::move(callback).Run(success);
}
on_jpeg_finished_callbacks_.clear();
}
} // namespace thumbnail