#ifndef CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_REQUEST_INFO_H_
#define CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_REQUEST_INFO_H_
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/memory/ref_counted.h"
#include "base/memory/ref_counted_delete_on_sequence.h"
#include "base/sequence_checker.h"
#include "base/time/time.h"
#include "components/download/public/common/download_item.h"
#include "content/browser/background_fetch/background_fetch_constants.h"
#include "content/common/content_export.h"
#include "content/public/browser/background_fetch_response.h"
#include "content/public/browser/browser_thread.h"
#include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
#include "url/gurl.h"
namespace storage {
class BlobDataHandle;
}
namespace content {
struct BackgroundFetchResponse;
struct BackgroundFetchResult;
class ChromeBlobStorageContext;
class CONTENT_EXPORT BackgroundFetchRequestInfo
: public base::RefCountedDeleteOnSequence<BackgroundFetchRequestInfo> {
public:
BackgroundFetchRequestInfo(int request_index,
blink::mojom::FetchAPIRequestPtr fetch_request,
uint64_t request_body_size);
BackgroundFetchRequestInfo(const BackgroundFetchRequestInfo&) = delete;
BackgroundFetchRequestInfo& operator=(const BackgroundFetchRequestInfo&) =
delete;
void InitializeDownloadGuid();
void SetDownloadGuid(const std::string& download_guid);
void PopulateWithResponse(std::unique_ptr<BackgroundFetchResponse> response);
void SetResult(std::unique_ptr<BackgroundFetchResult> result);
void SetEmptyResultWithFailureReason(
BackgroundFetchResult::FailureReason failure_reason);
int request_index() const { return request_index_; }
const std::string& download_guid() const { return download_guid_; }
const blink::mojom::FetchAPIRequestPtr& fetch_request() const {
return fetch_request_;
}
const blink::mojom::FetchAPIRequestPtr& fetch_request_ptr() const {
return fetch_request_;
}
uint64_t request_body_size() const { return request_body_size_; }
void set_can_populate_body(bool can_populate_body) {
can_populate_body_ = can_populate_body;
}
bool can_populate_body() const { return can_populate_body_; }
int GetResponseCode() const;
const std::string& GetResponseText() const;
const std::map<std::string, std::string>& GetResponseHeaders() const;
const std::vector<GURL>& GetURLChain() const;
void CreateResponseBlobDataHandle(
scoped_refptr<ChromeBlobStorageContext> blob_storage_context);
std::unique_ptr<storage::BlobDataHandle> TakeResponseBlobDataHandleOnIO();
uint64_t GetResponseSize() const;
const base::Time& GetResponseTime() const;
bool IsResultSuccess() const;
private:
class BlobDataOnIO;
friend class base::RefCountedDeleteOnSequence<BackgroundFetchRequestInfo>;
friend class base::DeleteHelper<BackgroundFetchRequestInfo>;
friend class BackgroundFetchCrossOriginFilterTest;
~BackgroundFetchRequestInfo();
int request_index_ = kInvalidBackgroundFetchRequestIndex;
blink::mojom::FetchAPIRequestPtr fetch_request_;
uint64_t request_body_size_;
std::string download_guid_;
download::DownloadItem::DownloadState download_state_ =
download::DownloadItem::IN_PROGRESS;
int response_code_ = 0;
std::string response_text_;
std::map<std::string, std::string> response_headers_;
std::vector<GURL> url_chain_;
bool can_populate_body_ = false;
std::unique_ptr<BackgroundFetchResult> result_;
std::unique_ptr<BlobDataOnIO, BrowserThread::DeleteOnIOThread> io_blob_data_;
uint64_t response_size_ = 0u;
SEQUENCE_CHECKER(sequence_checker_);
};
}
#endif