1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
content / browser / background_fetch / background_fetch_request_info.h [blame]
// 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 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_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 storage
namespace content {
struct BackgroundFetchResponse;
struct BackgroundFetchResult;
class ChromeBlobStorageContext;
// Class to encapsulate the components of a fetch request.
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;
// Sets the download GUID to a newly generated value. Can only be used if no
// GUID is already set.
void InitializeDownloadGuid();
// Sets the download GUID to a given value (to be used when requests are
// retrieved from storage). Can only be used if no GUID is already set.
void SetDownloadGuid(const std::string& download_guid);
// Extracts the headers and the status code.
void PopulateWithResponse(std::unique_ptr<BackgroundFetchResponse> response);
void SetResult(std::unique_ptr<BackgroundFetchResult> result);
// Creates an empty result, with no response, and assigns |failure_reason|
// as its failure_reason.
void SetEmptyResultWithFailureReason(
BackgroundFetchResult::FailureReason failure_reason);
// Returns the index of this request within a Background Fetch registration.
int request_index() const { return request_index_; }
// Returns the GUID used to identify this download. (Empty before the download
// becomes active).
const std::string& download_guid() const { return download_guid_; }
// Returns the Fetch API Request object that details the developer's request.
const blink::mojom::FetchAPIRequestPtr& fetch_request() const {
return fetch_request_;
}
// Returns the Fetch API Request Ptr object that details the developer's
// request.
const blink::mojom::FetchAPIRequestPtr& fetch_request_ptr() const {
return fetch_request_;
}
// Returns the size of the blob to upload.
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_; }
// Returns the response code for the download. Available for both successful
// and failed requests.
int GetResponseCode() const;
// Returns the response text for the download. Available for all started
// items.
const std::string& GetResponseText() const;
// Returns the response headers for the download. Available for both
// successful and failed requests.
const std::map<std::string, std::string>& GetResponseHeaders() const;
// Returns the URL chain for the response, including redirects.
const std::vector<GURL>& GetURLChain() const;
// Creates a blob data handle for the response.
void CreateResponseBlobDataHandle(
scoped_refptr<ChromeBlobStorageContext> blob_storage_context);
// Hands over ownership of the blob data handle. Called on the IO thread.
//
// This must be called after `CreateResponseBlobDataHandle` has been called
// and a task that it posted to the IO thread has run.
std::unique_ptr<storage::BlobDataHandle> TakeResponseBlobDataHandleOnIO();
// Returns the size of the response.
uint64_t GetResponseSize() const;
// Returns the time at which the response was completed.
const base::Time& GetResponseTime() const;
// Whether the BackgroundFetchResult was successful.
bool IsResultSuccess() const;
private:
class BlobDataOnIO;
friend class base::RefCountedDeleteOnSequence<BackgroundFetchRequestInfo>;
friend class base::DeleteHelper<BackgroundFetchRequestInfo>;
friend class BackgroundFetchCrossOriginFilterTest;
~BackgroundFetchRequestInfo();
// ---- Data associated with the request -------------------------------------
int request_index_ = kInvalidBackgroundFetchRequestIndex;
blink::mojom::FetchAPIRequestPtr fetch_request_;
uint64_t request_body_size_;
// ---- Data associated with the in-progress download ------------------------
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;
// ---- Data associated with the response ------------------------------------
std::unique_ptr<BackgroundFetchResult> result_;
// Created on this class's sequence, then accessed on the IO thread only.
std::unique_ptr<BlobDataOnIO, BrowserThread::DeleteOnIOThread> io_blob_data_;
uint64_t response_size_ = 0u;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace content
#endif // CONTENT_BROWSER_BACKGROUND_FETCH_BACKGROUND_FETCH_REQUEST_INFO_H_