chromium/ios/web/download/download_native_task_bridge.h

// Copyright 2021 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_NATIVE_TASK_BRIDGE_H_
#define IOS_WEB_DOWNLOAD_DOWNLOAD_NATIVE_TASK_BRIDGE_H_

#import <WebKit/WebKit.h>

#include "base/functional/callback_forward.h"
#include "ios/web/download/download_result.h"

namespace base {
class FilePath;
}

// Callback invoked repeatedly when new data is received from the WKDownload*.
using NativeDownloadTaskProgressCallback =
    base::RepeatingCallback<void(int64_t bytes_received,
                                 int64_t total_bytes,
                                 double fraction_completed)>;

// Callback invoked once the NSURLResponse is received for the WKDownload*.
using NativeDownloadTaskResponseCallback =
    base::OnceCallback<void(int http_error_code, NSString* mime_type)>;

// Callback invoked once the WKDownload completes, possibly in error.
using NativeDownloadTaskCompleteCallback =
    base::OnceCallback<void(web::DownloadResult result)>;

@class DownloadNativeTaskBridge;

@protocol DownloadNativeTaskBridgeDelegate <NSObject>

// Used to set response url, content length, mimetype and http response headers
// in CRWWkNavigationHandler so method can interact with WKWebView.
- (BOOL)onDownloadNativeTaskBridgeReadyForDownload:
    (DownloadNativeTaskBridge*)bridge;

// Calls CRWWKNavigationHandlerDelegate to resume download using the web view.
- (void)resumeDownloadNativeTask:(NSData*)data
               completionHandler:(void (^)(WKDownload*))completionHandler;

@end

// Class used to create a download task object that handles downloads through
// WKDownload.
@interface DownloadNativeTaskBridge : NSObject <WKDownloadDelegate>

// Default initializer. `download` and `delegate` must be non-nil.
- (instancetype)initWithDownload:(WKDownload*)download
                        delegate:(id<DownloadNativeTaskBridgeDelegate>)delegate
    NS_DESIGNATED_INITIALIZER;

- (instancetype)init NS_UNAVAILABLE;

// Cancels download
- (void)cancel;

// Starts download to `path` with given `progressCallback`, `responseCallback`
// and `completeCallback`.
- (void)startDownload:(const base::FilePath&)path
     progressCallback:(NativeDownloadTaskProgressCallback)progressCallback
     responseCallback:(NativeDownloadTaskResponseCallback)responseCallback
     completeCallback:(NativeDownloadTaskCompleteCallback)completeCallback;

@property(nonatomic, readonly) WKDownload* download;
@property(nonatomic, readonly) NSURLResponse* response;
@property(nonatomic, readonly) NSString* suggestedFilename;
@property(nonatomic, readonly) NSProgress* progress;
@property(nonatomic, readonly) NSURL* urlForDownload;

@end

#endif  // IOS_WEB_DOWNLOAD_DOWNLOAD_NATIVE_TASK_BRIDGE_H_