// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_WEB_DOWNLOAD_WEB_STATE_CONTENT_DOWNLOAD_TASK_H_
#define IOS_WEB_DOWNLOAD_WEB_STATE_CONTENT_DOWNLOAD_TASK_H_
#include "base/task/sequenced_task_runner.h"
#include "ios/web/download/download_task_impl.h"
#import "ios/web/public/download/crw_web_view_download.h"
@class WebStateDownloadDelegateBridge;
namespace web {
// Implementation of DownloadTaskImpl that download the content of the web
// state.
class WebStateContentDownloadTask final : public DownloadTaskImpl {
public:
// Constructs a new WebStateContentDownloadTask objects. `web_state` and
// `identifier` must be valid.
WebStateContentDownloadTask(
WebState* web_state,
const GURL& original_url,
NSString* http_method,
const std::string& content_disposition,
int64_t total_bytes,
const std::string& mime_type,
NSString* identifier,
const scoped_refptr<base::SequencedTaskRunner>& task_runner);
WebStateContentDownloadTask(const WebStateContentDownloadTask&) = delete;
WebStateContentDownloadTask& operator=(const WebStateContentDownloadTask&) =
delete;
~WebStateContentDownloadTask() final;
// DownloadTaskImpl overrides:
void StartInternal(const base::FilePath& path) final;
// Cancel the downloads.
// Local downloads (it the webState is showing a file:// URL) cannot be
// cancelled.
void CancelInternal() final;
private:
// Called when the download finishes.
void DownloadDidFinish(NSError* error);
// Called when the WebState created the download object.
void DownloadWasCreated(id<CRWWebViewDownload> download);
// The download object returned by the web_state used to cancel the download.
id<CRWWebViewDownload> download_;
// Bridge to the CRWWebViewDownloadDelegate.
WebStateDownloadDelegateBridge* download_delegate_;
base::WeakPtrFactory<WebStateContentDownloadTask> weak_factory_{this};
};
} // namespace web
#endif // IOS_WEB_DOWNLOAD_WEB_STATE_CONTENT_DOWNLOAD_TASK_H_