| 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 | 9 |
| 9 #include "android_webview/browser/input_stream.h" | 10 #include "android_webview/browser/input_stream.h" |
| 10 #include "android_webview/browser/net/input_stream_reader.h" | 11 #include "android_webview/browser/net/input_stream_reader.h" |
| 11 #include "base/android/jni_android.h" | 12 #include "base/android/jni_android.h" |
| 12 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
| 13 #include "base/bind.h" | 14 #include "base/bind.h" |
| 14 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
| 15 #include "base/lazy_instance.h" | 16 #include "base/lazy_instance.h" |
| 16 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
| 17 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| (...skipping 29 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( | 58 InputStreamReaderWrapper(scoped_ptr<InputStream> input_stream, |
| 58 scoped_ptr<InputStream> input_stream, | 59 scoped_ptr<InputStreamReader> input_stream_reader) |
| 59 scoped_ptr<InputStreamReader> input_stream_reader) | 60 : input_stream_(std::move(input_stream)), |
| 60 : input_stream_(input_stream.Pass()), | 61 input_stream_reader_(std::move(input_stream_reader)) { |
| 61 input_stream_reader_(input_stream_reader.Pass()) { | |
| 62 DCHECK(input_stream_); | 62 DCHECK(input_stream_); |
| 63 DCHECK(input_stream_reader_); | 63 DCHECK(input_stream_reader_); |
| 64 } | 64 } |
| 65 | 65 |
| 66 InputStream* input_stream() { | 66 InputStream* input_stream() { |
| 67 return input_stream_.get(); | 67 return input_stream_.get(); |
| 68 } | 68 } |
| 69 | 69 |
| 70 int Seek(const net::HttpByteRange& byte_range) { | 70 int Seek(const net::HttpByteRange& byte_range) { |
| 71 return input_stream_reader_->Seek(byte_range); | 71 return input_stream_reader_->Seek(byte_range); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 84 | 84 |
| 85 DISALLOW_COPY_AND_ASSIGN(InputStreamReaderWrapper); | 85 DISALLOW_COPY_AND_ASSIGN(InputStreamReaderWrapper); |
| 86 }; | 86 }; |
| 87 | 87 |
| 88 AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob( | 88 AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob( |
| 89 net::URLRequest* request, | 89 net::URLRequest* request, |
| 90 net::NetworkDelegate* network_delegate, | 90 net::NetworkDelegate* network_delegate, |
| 91 scoped_ptr<Delegate> delegate) | 91 scoped_ptr<Delegate> delegate) |
| 92 : URLRequestJob(request, network_delegate), | 92 : URLRequestJob(request, network_delegate), |
| 93 range_parse_result_(net::OK), | 93 range_parse_result_(net::OK), |
| 94 delegate_(delegate.Pass()), | 94 delegate_(std::move(delegate)), |
| 95 weak_factory_(this) { | 95 weak_factory_(this) { |
| 96 DCHECK(delegate_); | 96 DCHECK(delegate_); |
| 97 } | 97 } |
| 98 | 98 |
| 99 AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob( | 99 AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob( |
| 100 net::URLRequest* request, | 100 net::URLRequest* request, |
| 101 net::NetworkDelegate* network_delegate, | 101 net::NetworkDelegate* network_delegate, |
| 102 scoped_ptr<DelegateObtainer> delegate_obtainer, | 102 scoped_ptr<DelegateObtainer> delegate_obtainer, |
| 103 bool) | 103 bool) |
| 104 : URLRequestJob(request, network_delegate), | 104 : URLRequestJob(request, network_delegate), |
| 105 range_parse_result_(net::OK), | 105 range_parse_result_(net::OK), |
| 106 delegate_obtainer_(delegate_obtainer.Pass()), | 106 delegate_obtainer_(std::move(delegate_obtainer)), |
| 107 weak_factory_(this) { | 107 weak_factory_(this) { |
| 108 DCHECK(delegate_obtainer_); | 108 DCHECK(delegate_obtainer_); |
| 109 } | 109 } |
| 110 | 110 |
| 111 AndroidStreamReaderURLRequestJob::~AndroidStreamReaderURLRequestJob() { | 111 AndroidStreamReaderURLRequestJob::~AndroidStreamReaderURLRequestJob() { |
| 112 } | 112 } |
| 113 | 113 |
| 114 namespace { | 114 namespace { |
| 115 | 115 |
| 116 typedef base::Callback< | 116 typedef base::Callback< |
| 117 void(scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate>, | 117 void(scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate>, |
| 118 scoped_ptr<InputStream>)> OnInputStreamOpenedCallback; | 118 scoped_ptr<InputStream>)> OnInputStreamOpenedCallback; |
| 119 | 119 |
| 120 // static | 120 // static |
| 121 void OpenInputStreamOnWorkerThread( | 121 void OpenInputStreamOnWorkerThread( |
| 122 scoped_refptr<base::SingleThreadTaskRunner> job_thread_task_runner, | 122 scoped_refptr<base::SingleThreadTaskRunner> job_thread_task_runner, |
| 123 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> delegate, | 123 scoped_ptr<AndroidStreamReaderURLRequestJob::Delegate> delegate, |
| 124 const GURL& url, | 124 const GURL& url, |
| 125 OnInputStreamOpenedCallback callback) { | 125 OnInputStreamOpenedCallback callback) { |
| 126 JNIEnv* env = AttachCurrentThread(); | 126 JNIEnv* env = AttachCurrentThread(); |
| 127 DCHECK(env); | 127 DCHECK(env); |
| 128 | 128 |
| 129 scoped_ptr<InputStream> input_stream = delegate->OpenInputStream(env, url); | 129 scoped_ptr<InputStream> input_stream = delegate->OpenInputStream(env, url); |
| 130 job_thread_task_runner->PostTask( | 130 job_thread_task_runner->PostTask( |
| 131 FROM_HERE, base::Bind(callback, base::Passed(delegate.Pass()), | 131 FROM_HERE, base::Bind(callback, base::Passed(std::move(delegate)), |
| 132 base::Passed(input_stream.Pass()))); | 132 base::Passed(std::move(input_stream)))); |
| 133 } | 133 } |
| 134 | 134 |
| 135 } // namespace | 135 } // namespace |
| 136 | 136 |
| 137 void AndroidStreamReaderURLRequestJob::Start() { | 137 void AndroidStreamReaderURLRequestJob::Start() { |
| 138 DCHECK(thread_checker_.CalledOnValidThread()); | 138 DCHECK(thread_checker_.CalledOnValidThread()); |
| 139 if (!delegate_) { | 139 if (!delegate_) { |
| 140 DCHECK(delegate_obtainer_); | 140 DCHECK(delegate_obtainer_); |
| 141 delegate_obtainer_->ObtainDelegate( | 141 delegate_obtainer_->ObtainDelegate( |
| 142 request(), | 142 request(), |
| (...skipping 16 matching lines...) Expand all Loading... |
| 159 scoped_ptr<InputStreamReader> | 159 scoped_ptr<InputStreamReader> |
| 160 AndroidStreamReaderURLRequestJob::CreateStreamReader(InputStream* stream) { | 160 AndroidStreamReaderURLRequestJob::CreateStreamReader(InputStream* stream) { |
| 161 return make_scoped_ptr(new InputStreamReader(stream)); | 161 return make_scoped_ptr(new InputStreamReader(stream)); |
| 162 } | 162 } |
| 163 | 163 |
| 164 void AndroidStreamReaderURLRequestJob::OnInputStreamOpened( | 164 void AndroidStreamReaderURLRequestJob::OnInputStreamOpened( |
| 165 scoped_ptr<Delegate> returned_delegate, | 165 scoped_ptr<Delegate> returned_delegate, |
| 166 scoped_ptr<android_webview::InputStream> input_stream) { | 166 scoped_ptr<android_webview::InputStream> input_stream) { |
| 167 DCHECK(thread_checker_.CalledOnValidThread()); | 167 DCHECK(thread_checker_.CalledOnValidThread()); |
| 168 DCHECK(returned_delegate); | 168 DCHECK(returned_delegate); |
| 169 delegate_ = returned_delegate.Pass(); | 169 delegate_ = std::move(returned_delegate); |
| 170 | 170 |
| 171 if (!input_stream) { | 171 if (!input_stream) { |
| 172 bool restart_required = false; | 172 bool restart_required = false; |
| 173 delegate_->OnInputStreamOpenFailed(request(), &restart_required); | 173 delegate_->OnInputStreamOpenFailed(request(), &restart_required); |
| 174 if (restart_required) { | 174 if (restart_required) { |
| 175 NotifyRestartRequired(); | 175 NotifyRestartRequired(); |
| 176 } else { | 176 } else { |
| 177 // Clear the IO_PENDING status set in Start(). | 177 // Clear the IO_PENDING status set in Start(). |
| 178 SetStatus(net::URLRequestStatus()); | 178 SetStatus(net::URLRequestStatus()); |
| 179 HeadersComplete(kHTTPNotFound, kHTTPNotFoundText); | 179 HeadersComplete(kHTTPNotFound, kHTTPNotFoundText); |
| 180 } | 180 } |
| 181 return; | 181 return; |
| 182 } | 182 } |
| 183 | 183 |
| 184 scoped_ptr<InputStreamReader> input_stream_reader( | 184 scoped_ptr<InputStreamReader> input_stream_reader( |
| 185 CreateStreamReader(input_stream.get())); | 185 CreateStreamReader(input_stream.get())); |
| 186 DCHECK(input_stream_reader); | 186 DCHECK(input_stream_reader); |
| 187 | 187 |
| 188 DCHECK(!input_stream_reader_wrapper_.get()); | 188 DCHECK(!input_stream_reader_wrapper_.get()); |
| 189 input_stream_reader_wrapper_ = new InputStreamReaderWrapper( | 189 input_stream_reader_wrapper_ = new InputStreamReaderWrapper( |
| 190 input_stream.Pass(), input_stream_reader.Pass()); | 190 std::move(input_stream), std::move(input_stream_reader)); |
| 191 | 191 |
| 192 PostTaskAndReplyWithResult( | 192 PostTaskAndReplyWithResult( |
| 193 GetWorkerThreadRunner(), | 193 GetWorkerThreadRunner(), |
| 194 FROM_HERE, | 194 FROM_HERE, |
| 195 base::Bind(&InputStreamReaderWrapper::Seek, | 195 base::Bind(&InputStreamReaderWrapper::Seek, |
| 196 input_stream_reader_wrapper_, | 196 input_stream_reader_wrapper_, |
| 197 byte_range_), | 197 byte_range_), |
| 198 base::Bind(&AndroidStreamReaderURLRequestJob::OnReaderSeekCompleted, | 198 base::Bind(&AndroidStreamReaderURLRequestJob::OnReaderSeekCompleted, |
| 199 weak_factory_.GetWeakPtr())); | 199 weak_factory_.GetWeakPtr())); |
| 200 } | 200 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 byte_range_ = ranges[0]; | 385 byte_range_ = ranges[0]; |
| 386 } else { | 386 } else { |
| 387 // We don't support multiple range requests in one single URL request, | 387 // We don't support multiple range requests in one single URL request, |
| 388 // because we need to do multipart encoding here. | 388 // because we need to do multipart encoding here. |
| 389 range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE; | 389 range_parse_result_ = net::ERR_REQUEST_RANGE_NOT_SATISFIABLE; |
| 390 } | 390 } |
| 391 } | 391 } |
| 392 } | 392 } |
| 393 | 393 |
| 394 } // namespace android_webview | 394 } // namespace android_webview |
| OLD | NEW |