OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/safe_browsing/incident_reporting/download_metadata_mana ger.h" | 5 #include "chrome/browser/safe_browsing/incident_reporting/download_metadata_mana ger.h" |
6 | 6 |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | |
9 #include <list> | 10 #include <list> |
10 #include <utility> | 11 #include <utility> |
11 | 12 |
12 #include "base/bind.h" | 13 #include "base/bind.h" |
13 #include "base/callback.h" | 14 #include "base/callback.h" |
14 #include "base/files/file.h" | 15 #include "base/files/file.h" |
15 #include "base/files/file_util.h" | 16 #include "base/files/file_util.h" |
16 #include "base/files/important_file_writer.h" | 17 #include "base/files/important_file_writer.h" |
17 #include "base/location.h" | 18 #include "base/location.h" |
18 #include "base/macros.h" | 19 #include "base/macros.h" |
20 #include "base/memory/ptr_util.h" | |
19 #include "base/metrics/histogram.h" | 21 #include "base/metrics/histogram.h" |
20 #include "base/sequenced_task_runner.h" | 22 #include "base/sequenced_task_runner.h" |
21 #include "base/threading/sequenced_worker_pool.h" | 23 #include "base/threading/sequenced_worker_pool.h" |
22 #include "chrome/common/safe_browsing/csd.pb.h" | 24 #include "chrome/common/safe_browsing/csd.pb.h" |
23 #include "content/public/browser/browser_context.h" | 25 #include "content/public/browser/browser_context.h" |
24 #include "content/public/browser/download_item.h" | 26 #include "content/public/browser/download_item.h" |
25 | 27 |
26 namespace safe_browsing { | 28 namespace safe_browsing { |
27 | 29 |
28 namespace { | 30 namespace { |
(...skipping 24 matching lines...) Expand all Loading... | |
53 FILE_PATH_LITERAL("DownloadMetadata"); | 55 FILE_PATH_LITERAL("DownloadMetadata"); |
54 | 56 |
55 | 57 |
56 // DownloadItemData ------------------------------------------------------------ | 58 // DownloadItemData ------------------------------------------------------------ |
57 | 59 |
58 // A UserData object that holds the ClientDownloadRequest for a download while | 60 // A UserData object that holds the ClientDownloadRequest for a download while |
59 // it is in progress. | 61 // it is in progress. |
60 class DownloadItemData : public base::SupportsUserData::Data { | 62 class DownloadItemData : public base::SupportsUserData::Data { |
61 public: | 63 public: |
62 // Sets the ClientDownloadRequest for a given DownloadItem. | 64 // Sets the ClientDownloadRequest for a given DownloadItem. |
63 static void SetRequestForDownload(content::DownloadItem* item, | 65 static void SetRequestForDownload( |
64 scoped_ptr<ClientDownloadRequest> request); | 66 content::DownloadItem* item, |
67 std::unique_ptr<ClientDownloadRequest> request); | |
65 | 68 |
66 // Returns the ClientDownloadRequest for a download or null if there is none. | 69 // Returns the ClientDownloadRequest for a download or null if there is none. |
67 static scoped_ptr<ClientDownloadRequest> TakeRequestForDownload( | 70 static std::unique_ptr<ClientDownloadRequest> TakeRequestForDownload( |
68 content::DownloadItem* item); | 71 content::DownloadItem* item); |
69 | 72 |
70 private: | 73 private: |
71 // A unique id for associating metadata with a content::DownloadItem. | 74 // A unique id for associating metadata with a content::DownloadItem. |
72 static const void* const kKey_; | 75 static const void* const kKey_; |
73 | 76 |
74 explicit DownloadItemData(scoped_ptr<ClientDownloadRequest> request) | 77 explicit DownloadItemData(std::unique_ptr<ClientDownloadRequest> request) |
75 : request_(std::move(request)) {} | 78 : request_(std::move(request)) {} |
76 ~DownloadItemData() override {} | 79 ~DownloadItemData() override {} |
77 | 80 |
78 scoped_ptr<ClientDownloadRequest> request_; | 81 std::unique_ptr<ClientDownloadRequest> request_; |
79 | 82 |
80 DISALLOW_COPY_AND_ASSIGN(DownloadItemData); | 83 DISALLOW_COPY_AND_ASSIGN(DownloadItemData); |
81 }; | 84 }; |
82 | 85 |
83 // Make the key's value unique by setting it to its own location. | 86 // Make the key's value unique by setting it to its own location. |
84 // static | 87 // static |
85 const void* const DownloadItemData::kKey_ = &DownloadItemData::kKey_; | 88 const void* const DownloadItemData::kKey_ = &DownloadItemData::kKey_; |
86 | 89 |
87 // static | 90 // static |
88 void DownloadItemData::SetRequestForDownload( | 91 void DownloadItemData::SetRequestForDownload( |
89 content::DownloadItem* item, | 92 content::DownloadItem* item, |
90 scoped_ptr<ClientDownloadRequest> request) { | 93 std::unique_ptr<ClientDownloadRequest> request) { |
91 item->SetUserData(&kKey_, new DownloadItemData(std::move(request))); | 94 item->SetUserData(&kKey_, new DownloadItemData(std::move(request))); |
92 } | 95 } |
93 | 96 |
94 // static | 97 // static |
95 scoped_ptr<ClientDownloadRequest> DownloadItemData::TakeRequestForDownload( | 98 std::unique_ptr<ClientDownloadRequest> DownloadItemData::TakeRequestForDownload( |
96 content::DownloadItem* item) { | 99 content::DownloadItem* item) { |
97 DownloadItemData* data = | 100 DownloadItemData* data = |
98 static_cast<DownloadItemData*>(item->GetUserData(&kKey_)); | 101 static_cast<DownloadItemData*>(item->GetUserData(&kKey_)); |
99 if (!data) | 102 if (!data) |
100 return nullptr; | 103 return nullptr; |
101 scoped_ptr<ClientDownloadRequest> request = std::move(data->request_); | 104 std::unique_ptr<ClientDownloadRequest> request = std::move(data->request_); |
102 item->RemoveUserData(&kKey_); | 105 item->RemoveUserData(&kKey_); |
103 return request; | 106 return request; |
104 } | 107 } |
105 | 108 |
106 | 109 |
107 // Utility functions------------------------------------------------------------ | 110 // Utility functions------------------------------------------------------------ |
108 | 111 |
109 // Returns the path to the metadata file for |browser_context|. | 112 // Returns the path to the metadata file for |browser_context|. |
110 base::FilePath GetMetadataPath(content::BrowserContext* browser_context) { | 113 base::FilePath GetMetadataPath(content::BrowserContext* browser_context) { |
111 return browser_context->GetPath().Append(kDownloadMetadataBasename); | 114 return browser_context->GetPath().Append(kDownloadMetadataBasename); |
(...skipping 13 matching lines...) Expand all Loading... | |
125 DownloadMetadata* metadata) { | 128 DownloadMetadata* metadata) { |
126 using base::File; | 129 using base::File; |
127 DCHECK(metadata); | 130 DCHECK(metadata); |
128 MetadataReadResult result = NUM_READ_RESULTS; | 131 MetadataReadResult result = NUM_READ_RESULTS; |
129 File metadata_file(metadata_path, File::FLAG_OPEN | File::FLAG_READ); | 132 File metadata_file(metadata_path, File::FLAG_OPEN | File::FLAG_READ); |
130 if (metadata_file.IsValid()) { | 133 if (metadata_file.IsValid()) { |
131 base::File::Info info; | 134 base::File::Info info; |
132 if (metadata_file.GetInfo(&info)) { | 135 if (metadata_file.GetInfo(&info)) { |
133 if (info.size <= INT_MAX) { | 136 if (info.size <= INT_MAX) { |
134 const int size = static_cast<int>(info.size); | 137 const int size = static_cast<int>(info.size); |
135 scoped_ptr<char[]> file_data(new char[info.size]); | 138 std::unique_ptr<char[]> file_data(new char[info.size]); |
136 if (metadata_file.Read(0, file_data.get(), size)) { | 139 if (metadata_file.Read(0, file_data.get(), size)) { |
137 if (!metadata->ParseFromArray(file_data.get(), size)) | 140 if (!metadata->ParseFromArray(file_data.get(), size)) |
138 result = PARSE_FAILURE; | 141 result = PARSE_FAILURE; |
139 else if (!MetadataIsValid(*metadata)) | 142 else if (!MetadataIsValid(*metadata)) |
140 result = MALFORMED_DATA; | 143 result = MALFORMED_DATA; |
141 else | 144 else |
142 result = READ_SUCCESS; | 145 result = READ_SUCCESS; |
143 } else { | 146 } else { |
144 result = READ_FAILURE; | 147 result = READ_FAILURE; |
145 } | 148 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
179 | 182 |
180 // Deletes |metadata_path|. | 183 // Deletes |metadata_path|. |
181 void DeleteMetadataOnWorkerPool(const base::FilePath& metadata_path) { | 184 void DeleteMetadataOnWorkerPool(const base::FilePath& metadata_path) { |
182 bool success = base::DeleteFile(metadata_path, false /* not recursive */); | 185 bool success = base::DeleteFile(metadata_path, false /* not recursive */); |
183 UMA_HISTOGRAM_BOOLEAN("SBIRS.DownloadMetadata.DeleteSuccess", success); | 186 UMA_HISTOGRAM_BOOLEAN("SBIRS.DownloadMetadata.DeleteSuccess", success); |
184 } | 187 } |
185 | 188 |
186 // Runs |callback| with the DownloadDetails in |download_metadata|. | 189 // Runs |callback| with the DownloadDetails in |download_metadata|. |
187 void ReturnResults( | 190 void ReturnResults( |
188 const DownloadMetadataManager::GetDownloadDetailsCallback& callback, | 191 const DownloadMetadataManager::GetDownloadDetailsCallback& callback, |
189 scoped_ptr<DownloadMetadata> download_metadata) { | 192 std::unique_ptr<DownloadMetadata> download_metadata) { |
190 if (!download_metadata->has_download_id()) | 193 if (!download_metadata->has_download_id()) |
191 callback.Run(scoped_ptr<ClientIncidentReport_DownloadDetails>()); | 194 callback.Run(std::unique_ptr<ClientIncidentReport_DownloadDetails>()); |
192 else | 195 else |
193 callback.Run(make_scoped_ptr(download_metadata->release_download())); | 196 callback.Run(base::WrapUnique(download_metadata->release_download())); |
Nathan Parker
2016/04/11 17:56:44
Should every use of WrapUnique also include <memor
dcheng
2016/04/11 18:31:15
The jury's out on that one. On one hand, it's part
| |
194 } | 197 } |
195 | 198 |
196 } // namespace | 199 } // namespace |
197 | 200 |
198 // Applies operations to the profile's persistent DownloadMetadata as they occur | 201 // Applies operations to the profile's persistent DownloadMetadata as they occur |
199 // on its corresponding download item. An instance can be in one of three | 202 // on its corresponding download item. An instance can be in one of three |
200 // states: waiting for metatada load, waiting for metadata to load after its | 203 // states: waiting for metatada load, waiting for metadata to load after its |
201 // corresponding DownloadManager has gone down, and not waiting for metadata to | 204 // corresponding DownloadManager has gone down, and not waiting for metadata to |
202 // load. The instance observes all download items beloing to its manager. While | 205 // load. The instance observes all download items beloing to its manager. While |
203 // it is waiting for metadata to load, it records all operations on download | 206 // it is waiting for metadata to load, it records all operations on download |
(...skipping 15 matching lines...) Expand all Loading... | |
219 // callbacks. | 222 // callbacks. |
220 void Detach(content::DownloadManager* download_manager); | 223 void Detach(content::DownloadManager* download_manager); |
221 | 224 |
222 // Notifies the context that |download| has been added to its manager. | 225 // Notifies the context that |download| has been added to its manager. |
223 void OnDownloadCreated(content::DownloadItem* download); | 226 void OnDownloadCreated(content::DownloadItem* download); |
224 | 227 |
225 // Sets |request| as the relevant metadata to persist for |download| if or | 228 // Sets |request| as the relevant metadata to persist for |download| if or |
226 // when it is complete. If |request| is null, the metadata for |download| | 229 // when it is complete. If |request| is null, the metadata for |download| |
227 // is/will be removed. | 230 // is/will be removed. |
228 void SetRequest(content::DownloadItem* download, | 231 void SetRequest(content::DownloadItem* download, |
229 scoped_ptr<ClientDownloadRequest> request); | 232 std::unique_ptr<ClientDownloadRequest> request); |
230 | 233 |
231 // Gets the persisted DownloadDetails. |callback| will be run immediately if | 234 // Gets the persisted DownloadDetails. |callback| will be run immediately if |
232 // the data is available. Otherwise, it will be run later on the caller's | 235 // the data is available. Otherwise, it will be run later on the caller's |
233 // thread. | 236 // thread. |
234 void GetDownloadDetails(const GetDownloadDetailsCallback& callback); | 237 void GetDownloadDetails(const GetDownloadDetailsCallback& callback); |
235 | 238 |
236 protected: | 239 protected: |
237 // content::DownloadItem::Observer methods. | 240 // content::DownloadItem::Observer methods. |
238 void OnDownloadUpdated(content::DownloadItem* download) override; | 241 void OnDownloadUpdated(content::DownloadItem* download) override; |
239 void OnDownloadOpened(content::DownloadItem* download) override; | 242 void OnDownloadOpened(content::DownloadItem* download) override; |
(...skipping 20 matching lines...) Expand all Loading... | |
260 | 263 |
261 // A mapping of download IDs to their corresponding data. | 264 // A mapping of download IDs to their corresponding data. |
262 typedef std::map<uint32_t, ItemData> ItemDataMap; | 265 typedef std::map<uint32_t, ItemData> ItemDataMap; |
263 | 266 |
264 ~ManagerContext() override; | 267 ~ManagerContext() override; |
265 | 268 |
266 // Commits |request| to the DownloadDetails for |item|'s BrowserContext. | 269 // Commits |request| to the DownloadDetails for |item|'s BrowserContext. |
267 // Callbacks will be run immediately if the context had been waiting for a | 270 // Callbacks will be run immediately if the context had been waiting for a |
268 // load (which will be abandoned). | 271 // load (which will be abandoned). |
269 void CommitRequest(content::DownloadItem* item, | 272 void CommitRequest(content::DownloadItem* item, |
270 scoped_ptr<ClientDownloadRequest> request); | 273 std::unique_ptr<ClientDownloadRequest> request); |
271 | 274 |
272 // Posts a task in the worker pool to read the metadata from disk. | 275 // Posts a task in the worker pool to read the metadata from disk. |
273 void ReadMetadata(); | 276 void ReadMetadata(); |
274 | 277 |
275 // Posts a task in the worker pool to write the metadata to disk. | 278 // Posts a task in the worker pool to write the metadata to disk. |
276 void WriteMetadata(); | 279 void WriteMetadata(); |
277 | 280 |
278 // Removes metadata for the context from memory and posts a task in the worker | 281 // Removes metadata for the context from memory and posts a task in the worker |
279 // pool to delete it on disk. | 282 // pool to delete it on disk. |
280 void RemoveMetadata(); | 283 void RemoveMetadata(); |
281 | 284 |
282 // Clears the |pending_items_| mapping. | 285 // Clears the |pending_items_| mapping. |
283 void ClearPendingItems(); | 286 void ClearPendingItems(); |
284 | 287 |
285 // Runs all |get_details_callbacks_| with the current metadata. | 288 // Runs all |get_details_callbacks_| with the current metadata. |
286 void RunCallbacks(); | 289 void RunCallbacks(); |
287 | 290 |
288 // Returns true if metadata corresponding to |item| is available. | 291 // Returns true if metadata corresponding to |item| is available. |
289 bool HasMetadataFor(const content::DownloadItem* item) const; | 292 bool HasMetadataFor(const content::DownloadItem* item) const; |
290 | 293 |
291 // A callback run on the main thread with the results from reading the | 294 // A callback run on the main thread with the results from reading the |
292 // metadata file from disk. | 295 // metadata file from disk. |
293 void OnMetadataReady(scoped_ptr<DownloadMetadata> download_metadata); | 296 void OnMetadataReady(std::unique_ptr<DownloadMetadata> download_metadata); |
294 | 297 |
295 // Updates the last opened time in the metadata and writes it to disk. | 298 // Updates the last opened time in the metadata and writes it to disk. |
296 void UpdateLastOpenedTime(const base::Time& last_opened_time); | 299 void UpdateLastOpenedTime(const base::Time& last_opened_time); |
297 | 300 |
298 // A task runner to which read tasks are posted. | 301 // A task runner to which read tasks are posted. |
299 scoped_refptr<base::SequencedTaskRunner> read_runner_; | 302 scoped_refptr<base::SequencedTaskRunner> read_runner_; |
300 | 303 |
301 // A task runner to which write tasks are posted. | 304 // A task runner to which write tasks are posted. |
302 scoped_refptr<base::SequencedTaskRunner> write_runner_; | 305 scoped_refptr<base::SequencedTaskRunner> write_runner_; |
303 | 306 |
304 // The path to the metadata file for this context. | 307 // The path to the metadata file for this context. |
305 base::FilePath metadata_path_; | 308 base::FilePath metadata_path_; |
306 | 309 |
307 // When not LOAD_COMPLETE, the context is waiting for a pending read operation | 310 // When not LOAD_COMPLETE, the context is waiting for a pending read operation |
308 // to complete. While this is the case, events are temporarily recorded in | 311 // to complete. While this is the case, events are temporarily recorded in |
309 // |pending_items_|. Once the read completes, pending operations for the item | 312 // |pending_items_|. Once the read completes, pending operations for the item |
310 // corresponding to the metadata file are applied to the file and all other | 313 // corresponding to the metadata file are applied to the file and all other |
311 // recorded data are dropped. Queued GetDownloadDetailsCallbacks are run upon | 314 // recorded data are dropped. Queued GetDownloadDetailsCallbacks are run upon |
312 // read completion as well. The context is moved to the DETACHED_WAIT state if | 315 // read completion as well. The context is moved to the DETACHED_WAIT state if |
313 // the corresponding DownloadManager goes away while a read operation is | 316 // the corresponding DownloadManager goes away while a read operation is |
314 // outstanding. When the read subsequently completes, the context is destroyed | 317 // outstanding. When the read subsequently completes, the context is destroyed |
315 // after the processing described above is performed. | 318 // after the processing described above is performed. |
316 State state_; | 319 State state_; |
317 | 320 |
318 // The current metadata for the context. May be supplied either by reading | 321 // The current metadata for the context. May be supplied either by reading |
319 // from the file or by having been set via |SetRequest|. | 322 // from the file or by having been set via |SetRequest|. |
320 scoped_ptr<DownloadMetadata> download_metadata_; | 323 std::unique_ptr<DownloadMetadata> download_metadata_; |
321 | 324 |
322 // The operation data that accumulates for added download items while the | 325 // The operation data that accumulates for added download items while the |
323 // metadata file is being read. | 326 // metadata file is being read. |
324 ItemDataMap pending_items_; | 327 ItemDataMap pending_items_; |
325 | 328 |
326 // Pending callbacks in response to GetDownloadDetails. The callbacks are run | 329 // Pending callbacks in response to GetDownloadDetails. The callbacks are run |
327 // in order when a pending read operation completes. | 330 // in order when a pending read operation completes. |
328 std::list<GetDownloadDetailsCallback> get_details_callbacks_; | 331 std::list<GetDownloadDetailsCallback> get_details_callbacks_; |
329 | 332 |
330 base::WeakPtrFactory<ManagerContext> weak_factory_; | 333 base::WeakPtrFactory<ManagerContext> weak_factory_; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
371 new ManagerContext(read_runner_, write_runner_, download_manager); | 374 new ManagerContext(read_runner_, write_runner_, download_manager); |
372 } | 375 } |
373 | 376 |
374 void DownloadMetadataManager::SetRequest(content::DownloadItem* item, | 377 void DownloadMetadataManager::SetRequest(content::DownloadItem* item, |
375 const ClientDownloadRequest* request) { | 378 const ClientDownloadRequest* request) { |
376 DCHECK(request); | 379 DCHECK(request); |
377 content::DownloadManager* download_manager = | 380 content::DownloadManager* download_manager = |
378 GetDownloadManagerForBrowserContext(item->GetBrowserContext()); | 381 GetDownloadManagerForBrowserContext(item->GetBrowserContext()); |
379 DCHECK_EQ(contexts_.count(download_manager), 1U); | 382 DCHECK_EQ(contexts_.count(download_manager), 1U); |
380 contexts_[download_manager]->SetRequest( | 383 contexts_[download_manager]->SetRequest( |
381 item, make_scoped_ptr(new ClientDownloadRequest(*request))); | 384 item, base::WrapUnique(new ClientDownloadRequest(*request))); |
382 } | 385 } |
383 | 386 |
384 void DownloadMetadataManager::GetDownloadDetails( | 387 void DownloadMetadataManager::GetDownloadDetails( |
385 content::BrowserContext* browser_context, | 388 content::BrowserContext* browser_context, |
386 const GetDownloadDetailsCallback& callback) { | 389 const GetDownloadDetailsCallback& callback) { |
387 DCHECK(browser_context); | 390 DCHECK(browser_context); |
388 // The DownloadManager for |browser_context| may not have been created yet. In | 391 // The DownloadManager for |browser_context| may not have been created yet. In |
389 // this case, asking for it would cause history to load in the background and | 392 // this case, asking for it would cause history to load in the background and |
390 // wouldn't really help much. Instead, scan the contexts to see if one belongs | 393 // wouldn't really help much. Instead, scan the contexts to see if one belongs |
391 // to |browser_context|. If one is not found, read the metadata and return it. | 394 // to |browser_context|. If one is not found, read the metadata and return it. |
392 scoped_ptr<ClientIncidentReport_DownloadDetails> download_details; | 395 std::unique_ptr<ClientIncidentReport_DownloadDetails> download_details; |
393 for (const auto& manager_context_pair : contexts_) { | 396 for (const auto& manager_context_pair : contexts_) { |
394 if (manager_context_pair.first->GetBrowserContext() == browser_context) { | 397 if (manager_context_pair.first->GetBrowserContext() == browser_context) { |
395 manager_context_pair.second->GetDownloadDetails(callback); | 398 manager_context_pair.second->GetDownloadDetails(callback); |
396 return; | 399 return; |
397 } | 400 } |
398 } | 401 } |
399 | 402 |
400 // Fire off a task to load the details and return them to the caller. | 403 // Fire off a task to load the details and return them to the caller. |
401 DownloadMetadata* metadata = new DownloadMetadata(); | 404 DownloadMetadata* metadata = new DownloadMetadata(); |
402 read_runner_->PostTaskAndReply( | 405 read_runner_->PostTaskAndReply( |
403 FROM_HERE, | 406 FROM_HERE, base::Bind(&ReadMetadataOnWorkerPool, |
404 base::Bind(&ReadMetadataOnWorkerPool, | 407 GetMetadataPath(browser_context), metadata), |
405 GetMetadataPath(browser_context), | 408 base::Bind(&ReturnResults, callback, |
406 metadata), | 409 base::Passed(base::WrapUnique(metadata)))); |
407 base::Bind( | |
408 &ReturnResults, callback, base::Passed(make_scoped_ptr(metadata)))); | |
409 } | 410 } |
410 | 411 |
411 content::DownloadManager* | 412 content::DownloadManager* |
412 DownloadMetadataManager::GetDownloadManagerForBrowserContext( | 413 DownloadMetadataManager::GetDownloadManagerForBrowserContext( |
413 content::BrowserContext* context) { | 414 content::BrowserContext* context) { |
414 return content::BrowserContext::GetDownloadManager(context); | 415 return content::BrowserContext::GetDownloadManager(context); |
415 } | 416 } |
416 | 417 |
417 void DownloadMetadataManager::OnDownloadCreated( | 418 void DownloadMetadataManager::OnDownloadCreated( |
418 content::DownloadManager* download_manager, | 419 content::DownloadManager* download_manager, |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
470 } | 471 } |
471 } | 472 } |
472 | 473 |
473 void DownloadMetadataManager::ManagerContext::OnDownloadCreated( | 474 void DownloadMetadataManager::ManagerContext::OnDownloadCreated( |
474 content::DownloadItem* download) { | 475 content::DownloadItem* download) { |
475 download->AddObserver(this); | 476 download->AddObserver(this); |
476 } | 477 } |
477 | 478 |
478 void DownloadMetadataManager::ManagerContext::SetRequest( | 479 void DownloadMetadataManager::ManagerContext::SetRequest( |
479 content::DownloadItem* download, | 480 content::DownloadItem* download, |
480 scoped_ptr<ClientDownloadRequest> request) { | 481 std::unique_ptr<ClientDownloadRequest> request) { |
481 DCHECK(request); | 482 DCHECK(request); |
482 // Hold on to the request for completion time if the download is in progress. | 483 // Hold on to the request for completion time if the download is in progress. |
483 // Otherwise, commit the request. | 484 // Otherwise, commit the request. |
484 if (download->GetState() == content::DownloadItem::IN_PROGRESS) | 485 if (download->GetState() == content::DownloadItem::IN_PROGRESS) |
485 DownloadItemData::SetRequestForDownload(download, std::move(request)); | 486 DownloadItemData::SetRequestForDownload(download, std::move(request)); |
486 else | 487 else |
487 CommitRequest(download, std::move(request)); | 488 CommitRequest(download, std::move(request)); |
488 } | 489 } |
489 | 490 |
490 void DownloadMetadataManager::ManagerContext::GetDownloadDetails( | 491 void DownloadMetadataManager::ManagerContext::GetDownloadDetails( |
491 const GetDownloadDetailsCallback& callback) { | 492 const GetDownloadDetailsCallback& callback) { |
492 if (state_ != LOAD_COMPLETE) { | 493 if (state_ != LOAD_COMPLETE) { |
493 get_details_callbacks_.push_back(callback); | 494 get_details_callbacks_.push_back(callback); |
494 } else { | 495 } else { |
495 callback.Run(download_metadata_ ? | 496 callback.Run( |
496 make_scoped_ptr(new ClientIncidentReport_DownloadDetails( | 497 download_metadata_ |
497 download_metadata_->download())) : | 498 ? base::WrapUnique(new ClientIncidentReport_DownloadDetails( |
498 nullptr); | 499 download_metadata_->download())) |
500 : nullptr); | |
499 } | 501 } |
500 } | 502 } |
501 | 503 |
502 void DownloadMetadataManager::ManagerContext::OnDownloadUpdated( | 504 void DownloadMetadataManager::ManagerContext::OnDownloadUpdated( |
503 content::DownloadItem* download) { | 505 content::DownloadItem* download) { |
504 // Persist metadata for this download if it has just completed. | 506 // Persist metadata for this download if it has just completed. |
505 if (download->GetState() == content::DownloadItem::COMPLETE) { | 507 if (download->GetState() == content::DownloadItem::COMPLETE) { |
506 // Ignore downloads we don't have a ClientDownloadRequest for. | 508 // Ignore downloads we don't have a ClientDownloadRequest for. |
507 scoped_ptr<ClientDownloadRequest> request = | 509 std::unique_ptr<ClientDownloadRequest> request = |
508 DownloadItemData::TakeRequestForDownload(download); | 510 DownloadItemData::TakeRequestForDownload(download); |
509 if (request) | 511 if (request) |
510 CommitRequest(download, std::move(request)); | 512 CommitRequest(download, std::move(request)); |
511 } | 513 } |
512 } | 514 } |
513 | 515 |
514 void DownloadMetadataManager::ManagerContext::OnDownloadOpened( | 516 void DownloadMetadataManager::ManagerContext::OnDownloadOpened( |
515 content::DownloadItem* download) { | 517 content::DownloadItem* download) { |
516 const base::Time now = base::Time::Now(); | 518 const base::Time now = base::Time::Now(); |
517 if (state_ != LOAD_COMPLETE) | 519 if (state_ != LOAD_COMPLETE) |
(...skipping 11 matching lines...) Expand all Loading... | |
529 } | 531 } |
530 | 532 |
531 DownloadMetadataManager::ManagerContext::~ManagerContext() { | 533 DownloadMetadataManager::ManagerContext::~ManagerContext() { |
532 // A context should not be deleted while waiting for a load to complete. | 534 // A context should not be deleted while waiting for a load to complete. |
533 DCHECK(pending_items_.empty()); | 535 DCHECK(pending_items_.empty()); |
534 DCHECK(get_details_callbacks_.empty()); | 536 DCHECK(get_details_callbacks_.empty()); |
535 } | 537 } |
536 | 538 |
537 void DownloadMetadataManager::ManagerContext::CommitRequest( | 539 void DownloadMetadataManager::ManagerContext::CommitRequest( |
538 content::DownloadItem* item, | 540 content::DownloadItem* item, |
539 scoped_ptr<ClientDownloadRequest> request) { | 541 std::unique_ptr<ClientDownloadRequest> request) { |
540 DCHECK_EQ(content::DownloadItem::COMPLETE, item->GetState()); | 542 DCHECK_EQ(content::DownloadItem::COMPLETE, item->GetState()); |
541 if (state_ != LOAD_COMPLETE) { | 543 if (state_ != LOAD_COMPLETE) { |
542 // Abandon the read task since |item| is the new top dog. | 544 // Abandon the read task since |item| is the new top dog. |
543 weak_factory_.InvalidateWeakPtrs(); | 545 weak_factory_.InvalidateWeakPtrs(); |
544 state_ = LOAD_COMPLETE; | 546 state_ = LOAD_COMPLETE; |
545 // Drop any recorded operations. | 547 // Drop any recorded operations. |
546 ClearPendingItems(); | 548 ClearPendingItems(); |
547 } | 549 } |
548 // Take the request. | 550 // Take the request. |
549 download_metadata_.reset(new DownloadMetadata); | 551 download_metadata_.reset(new DownloadMetadata); |
(...skipping 11 matching lines...) Expand all Loading... | |
561 void DownloadMetadataManager::ManagerContext::ReadMetadata() { | 563 void DownloadMetadataManager::ManagerContext::ReadMetadata() { |
562 DCHECK_NE(state_, LOAD_COMPLETE); | 564 DCHECK_NE(state_, LOAD_COMPLETE); |
563 | 565 |
564 DownloadMetadata* metadata = new DownloadMetadata(); | 566 DownloadMetadata* metadata = new DownloadMetadata(); |
565 // Do not block shutdown on this read since nothing will come of it. | 567 // Do not block shutdown on this read since nothing will come of it. |
566 read_runner_->PostTaskAndReply( | 568 read_runner_->PostTaskAndReply( |
567 FROM_HERE, | 569 FROM_HERE, |
568 base::Bind(&ReadMetadataOnWorkerPool, metadata_path_, metadata), | 570 base::Bind(&ReadMetadataOnWorkerPool, metadata_path_, metadata), |
569 base::Bind(&DownloadMetadataManager::ManagerContext::OnMetadataReady, | 571 base::Bind(&DownloadMetadataManager::ManagerContext::OnMetadataReady, |
570 weak_factory_.GetWeakPtr(), | 572 weak_factory_.GetWeakPtr(), |
571 base::Passed(make_scoped_ptr(metadata)))); | 573 base::Passed(base::WrapUnique(metadata)))); |
572 } | 574 } |
573 | 575 |
574 void DownloadMetadataManager::ManagerContext::WriteMetadata() { | 576 void DownloadMetadataManager::ManagerContext::WriteMetadata() { |
575 write_runner_->PostTask( | 577 write_runner_->PostTask( |
576 FROM_HERE, | 578 FROM_HERE, |
577 base::Bind(&WriteMetadataOnWorkerPool, | 579 base::Bind(&WriteMetadataOnWorkerPool, |
578 metadata_path_, | 580 metadata_path_, |
579 base::Owned(new DownloadMetadata(*download_metadata_)))); | 581 base::Owned(new DownloadMetadata(*download_metadata_)))); |
580 } | 582 } |
581 | 583 |
(...skipping 13 matching lines...) Expand all Loading... | |
595 RunCallbacks(); | 597 RunCallbacks(); |
596 } | 598 } |
597 | 599 |
598 void DownloadMetadataManager::ManagerContext::ClearPendingItems() { | 600 void DownloadMetadataManager::ManagerContext::ClearPendingItems() { |
599 pending_items_.clear(); | 601 pending_items_.clear(); |
600 } | 602 } |
601 | 603 |
602 void DownloadMetadataManager::ManagerContext::RunCallbacks() { | 604 void DownloadMetadataManager::ManagerContext::RunCallbacks() { |
603 while (!get_details_callbacks_.empty()) { | 605 while (!get_details_callbacks_.empty()) { |
604 const auto& callback = get_details_callbacks_.front(); | 606 const auto& callback = get_details_callbacks_.front(); |
605 callback.Run(download_metadata_ ? | 607 callback.Run( |
606 make_scoped_ptr(new ClientIncidentReport_DownloadDetails( | 608 download_metadata_ |
607 download_metadata_->download())) : | 609 ? base::WrapUnique(new ClientIncidentReport_DownloadDetails( |
608 nullptr); | 610 download_metadata_->download())) |
611 : nullptr); | |
609 get_details_callbacks_.pop_front(); | 612 get_details_callbacks_.pop_front(); |
610 } | 613 } |
611 } | 614 } |
612 | 615 |
613 bool DownloadMetadataManager::ManagerContext::HasMetadataFor( | 616 bool DownloadMetadataManager::ManagerContext::HasMetadataFor( |
614 const content::DownloadItem* item) const { | 617 const content::DownloadItem* item) const { |
615 // There must not be metadata if the load is not complete. | 618 // There must not be metadata if the load is not complete. |
616 DCHECK(state_ == LOAD_COMPLETE || !download_metadata_); | 619 DCHECK(state_ == LOAD_COMPLETE || !download_metadata_); |
617 return (download_metadata_ && | 620 return (download_metadata_ && |
618 download_metadata_->download_id() == item->GetId()); | 621 download_metadata_->download_id() == item->GetId()); |
619 } | 622 } |
620 | 623 |
621 void DownloadMetadataManager::ManagerContext::OnMetadataReady( | 624 void DownloadMetadataManager::ManagerContext::OnMetadataReady( |
622 scoped_ptr<DownloadMetadata> download_metadata) { | 625 std::unique_ptr<DownloadMetadata> download_metadata) { |
623 DCHECK_NE(state_, LOAD_COMPLETE); | 626 DCHECK_NE(state_, LOAD_COMPLETE); |
624 | 627 |
625 const bool is_detached = (state_ == DETACHED_WAIT); | 628 const bool is_detached = (state_ == DETACHED_WAIT); |
626 | 629 |
627 // Note that any available data has been read. | 630 // Note that any available data has been read. |
628 state_ = LOAD_COMPLETE; | 631 state_ = LOAD_COMPLETE; |
629 if (download_metadata->has_download_id()) | 632 if (download_metadata->has_download_id()) |
630 download_metadata_ = std::move(download_metadata); | 633 download_metadata_ = std::move(download_metadata); |
631 else | 634 else |
632 download_metadata_.reset(); | 635 download_metadata_.reset(); |
(...skipping 22 matching lines...) Expand all Loading... | |
655 } | 658 } |
656 | 659 |
657 void DownloadMetadataManager::ManagerContext::UpdateLastOpenedTime( | 660 void DownloadMetadataManager::ManagerContext::UpdateLastOpenedTime( |
658 const base::Time& last_opened_time) { | 661 const base::Time& last_opened_time) { |
659 download_metadata_->mutable_download()->set_open_time_msec( | 662 download_metadata_->mutable_download()->set_open_time_msec( |
660 last_opened_time.ToJavaTime()); | 663 last_opened_time.ToJavaTime()); |
661 WriteMetadata(); | 664 WriteMetadata(); |
662 } | 665 } |
663 | 666 |
664 } // namespace safe_browsing | 667 } // namespace safe_browsing |
OLD | NEW |