| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |