Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: content/browser/loader/upload_progress_tracker.cc

Issue 2546653003: Factor out upload progress handling from AsyncResourceHandler (Closed)
Patch Set: -#include. +final upload progress in OnResponseCompleted Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/browser/loader/upload_progress_tracker.h"
6
7 #include "net/base/upload_progress.h"
8 #include "net/url_request/url_request.h"
9
10 namespace content {
11 namespace {
12 // The interval for calls to ReportUploadProgress.
13 constexpr base::TimeDelta kUploadProgressInterval =
14 base::TimeDelta::FromMilliseconds(100);
15 } // namespace
16
17 UploadProgressTracker::UploadProgressTracker(
18 UploadProgressReportCallback report_progress,
19 net::URLRequest* request)
20 : request_(request), report_progress_(std::move(report_progress)) {
21 DCHECK(request_);
22 DCHECK(report_progress_);
mmenke 2016/12/08 15:37:08 include base/logging.h
tzik 2016/12/12 07:28:50 Done.
23 }
24
25 UploadProgressTracker::~UploadProgressTracker() {}
26
27 void UploadProgressTracker::OnAckReceived() {
28 waiting_for_upload_progress_ack_ = false;
29 }
30
31 void UploadProgressTracker::Start(const tracked_objects::Location& location) {
32 progress_timer_.Start(location, kUploadProgressInterval, this,
33 &UploadProgressTracker::ReportUploadProgressIfNeeded);
mmenke 2016/12/08 15:37:08 Just do this in the constructor?
tzik 2016/12/12 07:28:50 Done.
34 UploadProgressTracker::ReportUploadProgressIfNeeded();
mmenke 2016/12/08 15:37:08 Why do we call this on start? We haven't uploaded
tzik 2016/12/12 07:28:50 It's just to preserve previous behavior. Seems lik
35 }
36
37 void UploadProgressTracker::OnUploadCompleted() {
38 waiting_for_upload_progress_ack_ = false;
39 ReportUploadProgressIfNeeded();
40 progress_timer_.Stop();
41 }
42
43 void UploadProgressTracker::ReportUploadProgressIfNeeded() {
44 if (waiting_for_upload_progress_ack_)
45 return;
46
47 net::UploadProgress progress = request_->GetUploadProgress();
48 if (!progress.size())
49 return; // Nothing to upload.
50
51 if (progress.position() == last_upload_position_)
52 return; // No progress made since last time.
53
54 const uint64_t kHalfPercentIncrements = 200;
55 const base::TimeDelta kOneSecond = base::TimeDelta::FromMilliseconds(1000);
56
57 uint64_t amt_since_last = progress.position() - last_upload_position_;
58 base::TimeDelta time_since_last = base::TimeTicks::Now() - last_upload_ticks_;
59
60 bool is_finished = (progress.size() == progress.position());
61 bool enough_new_progress =
62 (amt_since_last > (progress.size() / kHalfPercentIncrements));
63 bool too_much_time_passed = time_since_last > kOneSecond;
64
65 if (is_finished || enough_new_progress || too_much_time_passed) {
66 report_progress_.Run(progress.position(), progress.size());
67 waiting_for_upload_progress_ack_ = true;
68 last_upload_ticks_ = base::TimeTicks::Now();
69 last_upload_position_ = progress.position();
70 }
71 }
72
73 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698