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

Side by Side Diff: android_webview/browser/net/android_stream_reader_url_request_job.cc

Issue 1852513003: Convert //android_webview to use std::unique_ptr (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git is hard Created 4 years, 8 months 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "android_webview/browser/net/android_stream_reader_url_request_job.h" 5 #include "android_webview/browser/net/android_stream_reader_url_request_job.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "android_webview/browser/input_stream.h" 10 #include "android_webview/browser/input_stream.h"
11 #include "android_webview/browser/net/input_stream_reader.h" 11 #include "android_webview/browser/net/input_stream_reader.h"
12 #include "base/android/jni_android.h" 12 #include "base/android/jni_android.h"
13 #include "base/android/jni_string.h" 13 #include "base/android/jni_string.h"
14 #include "base/bind.h" 14 #include "base/bind.h"
15 #include "base/bind_helpers.h" 15 #include "base/bind_helpers.h"
16 #include "base/lazy_instance.h" 16 #include "base/lazy_instance.h"
17 #include "base/memory/ptr_util.h"
17 #include "base/single_thread_task_runner.h" 18 #include "base/single_thread_task_runner.h"
18 #include "base/strings/string_number_conversions.h" 19 #include "base/strings/string_number_conversions.h"
19 #include "base/task_runner.h" 20 #include "base/task_runner.h"
20 #include "base/thread_task_runner_handle.h" 21 #include "base/thread_task_runner_handle.h"
21 #include "base/threading/sequenced_worker_pool.h" 22 #include "base/threading/sequenced_worker_pool.h"
22 #include "base/threading/thread.h" 23 #include "base/threading/thread.h"
23 #include "content/public/browser/browser_thread.h" 24 #include "content/public/browser/browser_thread.h"
24 #include "net/base/io_buffer.h" 25 #include "net/base/io_buffer.h"
25 #include "net/base/mime_util.h" 26 #include "net/base/mime_util.h"
26 #include "net/http/http_response_headers.h" 27 #include "net/http/http_response_headers.h"
(...skipping 20 matching lines...) Expand all
47 48
48 } // namespace 49 } // namespace
49 50
50 // The requests posted to the worker thread might outlive the job. Thread-safe 51 // The requests posted to the worker thread might outlive the job. Thread-safe
51 // ref counting is used to ensure that the InputStream and InputStreamReader 52 // ref counting is used to ensure that the InputStream and InputStreamReader
52 // members of this class are still there when the closure is run on the worker 53 // members of this class are still there when the closure is run on the worker
53 // thread. 54 // thread.
54 class InputStreamReaderWrapper : 55 class InputStreamReaderWrapper :
55 public base::RefCountedThreadSafe<InputStreamReaderWrapper> { 56 public base::RefCountedThreadSafe<InputStreamReaderWrapper> {
56 public: 57 public:
57 InputStreamReaderWrapper(scoped_ptr<InputStream> input_stream, 58 InputStreamReaderWrapper(
58 scoped_ptr<InputStreamReader> input_stream_reader) 59 std::unique_ptr<InputStream> input_stream,
60 std::unique_ptr<InputStreamReader> input_stream_reader)
59 : input_stream_(std::move(input_stream)), 61 : input_stream_(std::move(input_stream)),
60 input_stream_reader_(std::move(input_stream_reader)) { 62 input_stream_reader_(std::move(input_stream_reader)) {
61 DCHECK(input_stream_); 63 DCHECK(input_stream_);
62 DCHECK(input_stream_reader_); 64 DCHECK(input_stream_reader_);
63 } 65 }
64 66
65 InputStream* input_stream() { 67 InputStream* input_stream() {
66 return input_stream_.get(); 68 return input_stream_.get();
67 } 69 }
68 70
69 int Seek(const net::HttpByteRange& byte_range) { 71 int Seek(const net::HttpByteRange& byte_range) {
70 return input_stream_reader_->Seek(byte_range); 72 return input_stream_reader_->Seek(byte_range);
71 } 73 }
72 74
73 int ReadRawData(net::IOBuffer* buffer, int buffer_size) { 75 int ReadRawData(net::IOBuffer* buffer, int buffer_size) {
74 return input_stream_reader_->ReadRawData(buffer, buffer_size); 76 return input_stream_reader_->ReadRawData(buffer, buffer_size);
75 } 77 }
76 78
77 private: 79 private:
78 friend class base::RefCountedThreadSafe<InputStreamReaderWrapper>; 80 friend class base::RefCountedThreadSafe<InputStreamReaderWrapper>;
79 ~InputStreamReaderWrapper() {} 81 ~InputStreamReaderWrapper() {}
80 82
81 scoped_ptr<InputStream> input_stream_; 83 std::unique_ptr<InputStream> input_stream_;
82 scoped_ptr<InputStreamReader> input_stream_reader_; 84 std::unique_ptr<InputStreamReader> input_stream_reader_;
83 85
84 DISALLOW_COPY_AND_ASSIGN(InputStreamReaderWrapper); 86 DISALLOW_COPY_AND_ASSIGN(InputStreamReaderWrapper);
85 }; 87 };
86 88
87 AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob( 89 AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob(
88 net::URLRequest* request, 90 net::URLRequest* request,
89 net::NetworkDelegate* network_delegate, 91 net::NetworkDelegate* network_delegate,
90 scoped_ptr<Delegate> delegate) 92 std::unique_ptr<Delegate> delegate)
91 : URLRequestJob(request, network_delegate), 93 : URLRequestJob(request, network_delegate),
92 range_parse_result_(net::OK), 94 range_parse_result_(net::OK),
93 delegate_(std::move(delegate)), 95 delegate_(std::move(delegate)),
94 weak_factory_(this) { 96 weak_factory_(this) {
95 DCHECK(delegate_); 97 DCHECK(delegate_);
96 } 98 }
97 99
98 AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob( 100 AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob(
99 net::URLRequest* request, 101 net::URLRequest* request,
100 net::NetworkDelegate* network_delegate, 102 net::NetworkDelegate* network_delegate,
101 scoped_ptr<DelegateObtainer> delegate_obtainer, 103 std::unique_ptr<DelegateObtainer> delegate_obtainer,
102 bool) 104 bool)
103 : URLRequestJob(request, network_delegate), 105 : URLRequestJob(request, network_delegate),
104 range_parse_result_(net::OK), 106 range_parse_result_(net::OK),
105 delegate_obtainer_(std::move(delegate_obtainer)), 107 delegate_obtainer_(std::move(delegate_obtainer)),
106 weak_factory_(this) { 108 weak_factory_(this) {
107 DCHECK(delegate_obtainer_); 109 DCHECK(delegate_obtainer_);
108 } 110 }
109 111
110 AndroidStreamReaderURLRequestJob::~AndroidStreamReaderURLRequestJob() { 112 AndroidStreamReaderURLRequestJob::~AndroidStreamReaderURLRequestJob() {
111 } 113 }
112 114
113 namespace { 115 namespace {
114 116
115 typedef base::Callback< 117 typedef base::Callback<void(
116 void(scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate>, 118 std::unique_ptr<AndroidStreamReaderURLRequestJob::Delegate>,
117 scoped_ptr<InputStream>)> OnInputStreamOpenedCallback; 119 std::unique_ptr<InputStream>)>
120 OnInputStreamOpenedCallback;
118 121
119 // static 122 // static
120 void OpenInputStreamOnWorkerThread( 123 void OpenInputStreamOnWorkerThread(
121 scoped_refptr<base::SingleThreadTaskRunner> job_thread_task_runner, 124 scoped_refptr<base::SingleThreadTaskRunner> job_thread_task_runner,
122 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> delegate, 125 std::unique_ptr<AndroidStreamReaderURLRequestJob::Delegate> delegate,
123 const GURL& url, 126 const GURL& url,
124 OnInputStreamOpenedCallback callback) { 127 OnInputStreamOpenedCallback callback) {
125 JNIEnv* env = AttachCurrentThread(); 128 JNIEnv* env = AttachCurrentThread();
126 DCHECK(env); 129 DCHECK(env);
127 130
128 scoped_ptr<InputStream> input_stream = delegate->OpenInputStream(env, url); 131 std::unique_ptr<InputStream> input_stream =
132 delegate->OpenInputStream(env, url);
129 job_thread_task_runner->PostTask( 133 job_thread_task_runner->PostTask(
130 FROM_HERE, base::Bind(callback, base::Passed(std::move(delegate)), 134 FROM_HERE, base::Bind(callback, base::Passed(std::move(delegate)),
131 base::Passed(std::move(input_stream)))); 135 base::Passed(std::move(input_stream))));
132 } 136 }
133 137
134 } // namespace 138 } // namespace
135 139
136 void AndroidStreamReaderURLRequestJob::Start() { 140 void AndroidStreamReaderURLRequestJob::Start() {
137 DCHECK(thread_checker_.CalledOnValidThread()); 141 DCHECK(thread_checker_.CalledOnValidThread());
138 if (!delegate_) { 142 if (!delegate_) {
139 DCHECK(delegate_obtainer_); 143 DCHECK(delegate_obtainer_);
140 delegate_obtainer_->ObtainDelegate( 144 delegate_obtainer_->ObtainDelegate(
141 request(), 145 request(),
142 base::Bind(&AndroidStreamReaderURLRequestJob::DelegateObtained, 146 base::Bind(&AndroidStreamReaderURLRequestJob::DelegateObtained,
143 weak_factory_.GetWeakPtr())); 147 weak_factory_.GetWeakPtr()));
144 } else { 148 } else {
145 // Run DoStart asynchronously to avoid re-entering the delegate. 149 // Run DoStart asynchronously to avoid re-entering the delegate.
146 base::ThreadTaskRunnerHandle::Get()->PostTask( 150 base::ThreadTaskRunnerHandle::Get()->PostTask(
147 FROM_HERE, base::Bind(&AndroidStreamReaderURLRequestJob::DoStart, 151 FROM_HERE, base::Bind(&AndroidStreamReaderURLRequestJob::DoStart,
148 weak_factory_.GetWeakPtr())); 152 weak_factory_.GetWeakPtr()));
149 } 153 }
150 } 154 }
151 155
152 void AndroidStreamReaderURLRequestJob::Kill() { 156 void AndroidStreamReaderURLRequestJob::Kill() {
153 DCHECK(thread_checker_.CalledOnValidThread()); 157 DCHECK(thread_checker_.CalledOnValidThread());
154 weak_factory_.InvalidateWeakPtrs(); 158 weak_factory_.InvalidateWeakPtrs();
155 URLRequestJob::Kill(); 159 URLRequestJob::Kill();
156 } 160 }
157 161
158 scoped_ptr<InputStreamReader> 162 std::unique_ptr<InputStreamReader>
159 AndroidStreamReaderURLRequestJob::CreateStreamReader(InputStream* stream) { 163 AndroidStreamReaderURLRequestJob::CreateStreamReader(InputStream* stream) {
160 return make_scoped_ptr(new InputStreamReader(stream)); 164 return base::WrapUnique(new InputStreamReader(stream));
161 } 165 }
162 166
163 void AndroidStreamReaderURLRequestJob::OnInputStreamOpened( 167 void AndroidStreamReaderURLRequestJob::OnInputStreamOpened(
164 scoped_ptr<Delegate> returned_delegate, 168 std::unique_ptr<Delegate> returned_delegate,
165 scoped_ptr<android_webview::InputStream> input_stream) { 169 std::unique_ptr<android_webview::InputStream> input_stream) {
166 DCHECK(thread_checker_.CalledOnValidThread()); 170 DCHECK(thread_checker_.CalledOnValidThread());
167 DCHECK(returned_delegate); 171 DCHECK(returned_delegate);
168 delegate_ = std::move(returned_delegate); 172 delegate_ = std::move(returned_delegate);
169 173
170 if (!input_stream) { 174 if (!input_stream) {
171 bool restart_required = false; 175 bool restart_required = false;
172 delegate_->OnInputStreamOpenFailed(request(), &restart_required); 176 delegate_->OnInputStreamOpenFailed(request(), &restart_required);
173 if (restart_required) { 177 if (restart_required) {
174 NotifyRestartRequired(); 178 NotifyRestartRequired();
175 } else { 179 } else {
176 HeadersComplete(kHTTPNotFound, kHTTPNotFoundText); 180 HeadersComplete(kHTTPNotFound, kHTTPNotFoundText);
177 } 181 }
178 return; 182 return;
179 } 183 }
180 184
181 scoped_ptr<InputStreamReader> input_stream_reader( 185 std::unique_ptr<InputStreamReader> input_stream_reader(
182 CreateStreamReader(input_stream.get())); 186 CreateStreamReader(input_stream.get()));
183 DCHECK(input_stream_reader); 187 DCHECK(input_stream_reader);
184 188
185 DCHECK(!input_stream_reader_wrapper_.get()); 189 DCHECK(!input_stream_reader_wrapper_.get());
186 input_stream_reader_wrapper_ = new InputStreamReaderWrapper( 190 input_stream_reader_wrapper_ = new InputStreamReaderWrapper(
187 std::move(input_stream), std::move(input_stream_reader)); 191 std::move(input_stream), std::move(input_stream_reader));
188 192
189 PostTaskAndReplyWithResult( 193 PostTaskAndReplyWithResult(
190 GetWorkerThreadRunner(), 194 GetWorkerThreadRunner(),
191 FROM_HERE, 195 FROM_HERE,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 265
262 // Since it's possible for this call to alter the InputStream a 266 // Since it's possible for this call to alter the InputStream a
263 // Seek or ReadRawData operation running in the background is not permitted. 267 // Seek or ReadRawData operation running in the background is not permitted.
264 DCHECK(!request_->status().is_io_pending()); 268 DCHECK(!request_->status().is_io_pending());
265 269
266 return delegate_->GetCharset( 270 return delegate_->GetCharset(
267 env, request(), input_stream_reader_wrapper_->input_stream(), charset); 271 env, request(), input_stream_reader_wrapper_->input_stream(), charset);
268 } 272 }
269 273
270 void AndroidStreamReaderURLRequestJob::DelegateObtained( 274 void AndroidStreamReaderURLRequestJob::DelegateObtained(
271 scoped_ptr<Delegate> delegate) { 275 std::unique_ptr<Delegate> delegate) {
272 DCHECK(!delegate_); 276 DCHECK(!delegate_);
273 delegate_obtainer_.reset(); 277 delegate_obtainer_.reset();
274 if (delegate) { 278 if (delegate) {
275 delegate_.swap(delegate); 279 delegate_.swap(delegate);
276 DoStart(); 280 DoStart();
277 } else { 281 } else {
278 NotifyRestartRequired(); 282 NotifyRestartRequired();
279 } 283 }
280 } 284 }
281 285
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 byte_range_ = ranges[0]; 376 byte_range_ = ranges[0];
373 } else { 377 } else {
374 // We don't support multiple range requests in one single URL request, 378 // We don't support multiple range requests in one single URL request,
375 // because we need to do multipart encoding here. 379 // because we need to do multipart encoding here.
376 range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE; 380 range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE;
377 } 381 }
378 } 382 }
379 } 383 }
380 384
381 } // namespace android_webview 385 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698