// Copyright 2017 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_DOWNLOAD_CONTROLLER_IMPL_H_
#define IOS_WEB_DOWNLOAD_DOWNLOAD_CONTROLLER_IMPL_H_
#include <Foundation/Foundation.h>
#include <set>
#import "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/sequence_checker.h"
#include "base/supports_user_data.h"
#include "ios/web/download/download_task_impl.h"
#include "ios/web/public/download/download_controller.h"
#include "ios/web/public/download/download_task_observer.h"
#include "ui/base/page_transition_types.h"
namespace base {
class SequencedTaskRunner;
}
namespace web {
class DownloadControllerDelegate;
class WebState;
class DownloadControllerImpl : public DownloadController,
public base::SupportsUserData::Data,
public DownloadTaskObserver {
public:
DownloadControllerImpl();
DownloadControllerImpl(const DownloadControllerImpl&) = delete;
DownloadControllerImpl& operator=(const DownloadControllerImpl&) = delete;
~DownloadControllerImpl() override;
// DownloadController overrides:
void CreateNativeDownloadTask(WebState* web_state,
NSString* identifier,
const GURL& original_url,
NSString* http_method,
const std::string& content_disposition,
int64_t total_bytes,
const std::string& mime_type,
DownloadNativeTaskBridge* download) override;
void CreateWebStateDownloadTask(WebState* web_state,
NSString* identifier,
int64_t total_bytes) override;
void SetDelegate(DownloadControllerDelegate* delegate) override;
DownloadControllerDelegate* GetDelegate() const override;
// DownloadTaskObserver overrides:
void OnDownloadDestroyed(DownloadTask* task) override;
private:
// Called when a new task is created.
void OnDownloadCreated(std::unique_ptr<DownloadTaskImpl> task);
// Set of tasks which are currently alive.
scoped_refptr<base::SequencedTaskRunner> task_runner_;
std::set<DownloadTask*> alive_tasks_;
raw_ptr<DownloadControllerDelegate> delegate_ = nullptr;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace web
#endif // IOS_WEB_DOWNLOAD_DOWNLOAD_CONTROLLER_IMPL_H_