summaryrefslogtreecommitdiffstats
path: root/android_webview
diff options
context:
space:
mode:
authormnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-15 18:47:31 +0000
committermnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-10-15 18:47:31 +0000
commitf4a4b3a3b4061911d20ece9ee780d4abe040b1a5 (patch)
tree382804f7a603bbf59b16ffeacbfaf1a850f1d75d /android_webview
parente7f073ad63e91f3d91be1efaced34a192e1e234f (diff)
downloadchromium_src-f4a4b3a3b4061911d20ece9ee780d4abe040b1a5.zip
chromium_src-f4a4b3a3b4061911d20ece9ee780d4abe040b1a5.tar.gz
chromium_src-f4a4b3a3b4061911d20ece9ee780d4abe040b1a5.tar.bz2
[Android] Make AndroidStreamReaderURLRequestJob to start loading asynchronously.
This fixes undesired destruction of ResourceLoader inside of StartRequestInternal. R=mkosiba@chromium.org Review URL: https://chromiumcodereview.appspot.com/11147021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@161907 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview')
-rw-r--r--android_webview/native/android_stream_reader_url_request_job.cc14
-rw-r--r--android_webview/native/android_stream_reader_url_request_job.h6
2 files changed, 18 insertions, 2 deletions
diff --git a/android_webview/native/android_stream_reader_url_request_job.cc b/android_webview/native/android_stream_reader_url_request_job.cc
index ee545df..1abda1a 100644
--- a/android_webview/native/android_stream_reader_url_request_job.cc
+++ b/android_webview/native/android_stream_reader_url_request_job.cc
@@ -6,6 +6,8 @@
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
+#include "base/bind.h"
+#include "base/message_loop.h"
#include "net/base/io_buffer.h"
#include "net/base/mime_util.h"
#include "net/base/net_errors.h"
@@ -47,7 +49,8 @@ AndroidStreamReaderURLRequestJob::AndroidStreamReaderURLRequestJob(
net::NetworkDelegate* network_delegate,
scoped_ptr<Delegate> delegate)
: URLRequestJob(request, network_delegate),
- delegate_(delegate.Pass()) {
+ delegate_(delegate.Pass()),
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
DCHECK(delegate_.get());
}
@@ -55,6 +58,15 @@ AndroidStreamReaderURLRequestJob::~AndroidStreamReaderURLRequestJob() {
}
void AndroidStreamReaderURLRequestJob::Start() {
+ // Start reading asynchronously so that all error reporting and data
+ // callbacks happen as they would for network requests.
+ MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&AndroidStreamReaderURLRequestJob::StartAsync,
+ weak_factory_.GetWeakPtr()));
+}
+
+void AndroidStreamReaderURLRequestJob::StartAsync() {
JNIEnv* env = AttachCurrentThread();
DCHECK(env);
diff --git a/android_webview/native/android_stream_reader_url_request_job.h b/android_webview/native/android_stream_reader_url_request_job.h
index 2e46572..e29acd8 100644
--- a/android_webview/native/android_stream_reader_url_request_job.h
+++ b/android_webview/native/android_stream_reader_url_request_job.h
@@ -7,6 +7,7 @@
#include "base/android/scoped_java_ref.h"
#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
#include "base/threading/non_thread_safe.h"
#include "net/http/http_byte_range.h"
#include "net/url_request/url_request_job.h"
@@ -43,7 +44,7 @@ class AndroidStreamReaderURLRequestJob : public net::URLRequestJob {
virtual ~Delegate() {}
};
- explicit AndroidStreamReaderURLRequestJob(
+ AndroidStreamReaderURLRequestJob(
net::URLRequest* request,
net::NetworkDelegate* network_delegate,
scoped_ptr<Delegate> delegate);
@@ -68,10 +69,13 @@ class AndroidStreamReaderURLRequestJob : public net::URLRequestJob {
// Skip to the first byte of the requested read range.
bool SkipToRequestedRange(JNIEnv* env);
+ void StartAsync();
+
net::HttpByteRange byte_range_;
scoped_ptr<Delegate> delegate_;
base::android::ScopedJavaGlobalRef<jobject> stream_;
base::android::ScopedJavaGlobalRef<jbyteArray> buffer_;
+ base::WeakPtrFactory<AndroidStreamReaderURLRequestJob> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(AndroidStreamReaderURLRequestJob);
};