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/native/aw_contents_io_thread_client_impl.h" | 5 #include "android_webview/native/aw_contents_io_thread_client_impl.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "android_webview/common/devtools_instrumentation.h" | 10 #include "android_webview/common/devtools_instrumentation.h" |
11 #include "android_webview/native/aw_web_resource_response_impl.h" | 11 #include "android_webview/native/aw_web_resource_response_impl.h" |
12 #include "base/android/jni_array.h" | 12 #include "base/android/jni_array.h" |
13 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
14 #include "base/android/jni_weak_ref.h" | 14 #include "base/android/jni_weak_ref.h" |
15 #include "base/lazy_instance.h" | 15 #include "base/lazy_instance.h" |
16 #include "base/memory/linked_ptr.h" | 16 #include "base/memory/linked_ptr.h" |
17 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
18 #include "base/synchronization/lock.h" | 18 #include "base/synchronization/lock.h" |
19 #include "content/public/browser/browser_thread.h" | 19 #include "content/public/browser/browser_thread.h" |
20 #include "content/public/browser/render_frame_host.h" | 20 #include "content/public/browser/render_frame_host.h" |
21 #include "content/public/browser/render_process_host.h" | 21 #include "content/public/browser/render_process_host.h" |
22 #include "content/public/browser/render_view_host.h" | 22 #include "content/public/browser/render_view_host.h" |
23 #include "content/public/browser/resource_request_info.h" | 23 #include "content/public/browser/resource_request_info.h" |
24 #include "content/public/browser/web_contents.h" | 24 #include "content/public/browser/web_contents.h" |
25 #include "content/public/browser/web_contents_observer.h" | 25 #include "content/public/browser/web_contents_observer.h" |
26 #include "jni/AwContentsIoThreadClient_jni.h" | 26 #include "jni/AwContentsIoThreadClient_jni.h" |
| 27 #include "net/base/net_errors.h" |
27 #include "net/http/http_request_headers.h" | 28 #include "net/http/http_request_headers.h" |
28 #include "net/http/http_response_headers.h" | 29 #include "net/http/http_response_headers.h" |
29 #include "net/url_request/url_request.h" | 30 #include "net/url_request/url_request.h" |
30 #include "url/gurl.h" | 31 #include "url/gurl.h" |
31 | 32 |
32 using base::android::AttachCurrentThread; | 33 using base::android::AttachCurrentThread; |
33 using base::android::ConvertUTF8ToJavaString; | 34 using base::android::ConvertUTF8ToJavaString; |
34 using base::android::JavaRef; | 35 using base::android::JavaRef; |
35 using base::android::ScopedJavaLocalRef; | 36 using base::android::ScopedJavaLocalRef; |
36 using base::android::ToJavaArrayOfStrings; | 37 using base::android::ToJavaArrayOfStrings; |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 } | 147 } |
147 | 148 |
148 void ClientMapEntryUpdater::RenderFrameDeleted(RenderFrameHost* rfh) { | 149 void ClientMapEntryUpdater::RenderFrameDeleted(RenderFrameHost* rfh) { |
149 RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh)); | 150 RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh)); |
150 } | 151 } |
151 | 152 |
152 void ClientMapEntryUpdater::WebContentsDestroyed() { | 153 void ClientMapEntryUpdater::WebContentsDestroyed() { |
153 delete this; | 154 delete this; |
154 } | 155 } |
155 | 156 |
| 157 struct WebResourceRequest { |
| 158 ScopedJavaLocalRef<jstring> jstring_url; |
| 159 bool is_main_frame; |
| 160 bool has_user_gesture; |
| 161 ScopedJavaLocalRef<jstring> jstring_method; |
| 162 ScopedJavaLocalRef<jobjectArray> jstringArray_header_names; |
| 163 ScopedJavaLocalRef<jobjectArray> jstringArray_header_values; |
| 164 |
| 165 WebResourceRequest(JNIEnv* env, const net::URLRequest* request) |
| 166 : jstring_url(ConvertUTF8ToJavaString(env, request->url().spec())), |
| 167 jstring_method(ConvertUTF8ToJavaString(env, request->method())) { |
| 168 const content::ResourceRequestInfo* info = |
| 169 content::ResourceRequestInfo::ForRequest(request); |
| 170 is_main_frame = |
| 171 info && info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; |
| 172 has_user_gesture = info && info->HasUserGesture(); |
| 173 |
| 174 vector<string> header_names; |
| 175 vector<string> header_values; |
| 176 net::HttpRequestHeaders headers; |
| 177 if (!request->GetFullRequestHeaders(&headers)) |
| 178 headers = request->extra_request_headers(); |
| 179 net::HttpRequestHeaders::Iterator headers_iterator(headers); |
| 180 while (headers_iterator.GetNext()) { |
| 181 header_names.push_back(headers_iterator.name()); |
| 182 header_values.push_back(headers_iterator.value()); |
| 183 } |
| 184 jstringArray_header_names = ToJavaArrayOfStrings(env, header_names); |
| 185 jstringArray_header_values = ToJavaArrayOfStrings(env, header_values); |
| 186 } |
| 187 }; |
| 188 |
156 } // namespace | 189 } // namespace |
157 | 190 |
158 // AwContentsIoThreadClientImpl ----------------------------------------------- | 191 // AwContentsIoThreadClientImpl ----------------------------------------------- |
159 | 192 |
160 // static | 193 // static |
161 scoped_ptr<AwContentsIoThreadClient> | 194 scoped_ptr<AwContentsIoThreadClient> |
162 AwContentsIoThreadClient::FromID(int render_process_id, int render_frame_id) { | 195 AwContentsIoThreadClient::FromID(int render_process_id, int render_frame_id) { |
163 pair<int, int> rfh_id(render_process_id, render_frame_id); | 196 pair<int, int> rfh_id(render_process_id, render_frame_id); |
164 IoThreadClientData client_data; | 197 IoThreadClientData client_data; |
165 if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data)) | 198 if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data)) |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 return AwContentsIoThreadClient::LOAD_DEFAULT; | 262 return AwContentsIoThreadClient::LOAD_DEFAULT; |
230 | 263 |
231 JNIEnv* env = AttachCurrentThread(); | 264 JNIEnv* env = AttachCurrentThread(); |
232 return static_cast<AwContentsIoThreadClient::CacheMode>( | 265 return static_cast<AwContentsIoThreadClient::CacheMode>( |
233 Java_AwContentsIoThreadClient_getCacheMode( | 266 Java_AwContentsIoThreadClient_getCacheMode( |
234 env, java_object_.obj())); | 267 env, java_object_.obj())); |
235 } | 268 } |
236 | 269 |
237 scoped_ptr<AwWebResourceResponse> | 270 scoped_ptr<AwWebResourceResponse> |
238 AwContentsIoThreadClientImpl::ShouldInterceptRequest( | 271 AwContentsIoThreadClientImpl::ShouldInterceptRequest( |
239 const GURL& location, | |
240 const net::URLRequest* request) { | 272 const net::URLRequest* request) { |
241 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 273 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
242 if (java_object_.is_null()) | 274 if (java_object_.is_null()) |
243 return scoped_ptr<AwWebResourceResponse>(); | 275 return scoped_ptr<AwWebResourceResponse>(); |
244 const content::ResourceRequestInfo* info = | |
245 content::ResourceRequestInfo::ForRequest(request); | |
246 bool is_main_frame = info && | |
247 info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; | |
248 bool has_user_gesture = info && info->HasUserGesture(); | |
249 | |
250 vector<string> headers_names; | |
251 vector<string> headers_values; | |
252 { | |
253 net::HttpRequestHeaders headers; | |
254 if (!request->GetFullRequestHeaders(&headers)) | |
255 headers = request->extra_request_headers(); | |
256 net::HttpRequestHeaders::Iterator headers_iterator(headers); | |
257 while (headers_iterator.GetNext()) { | |
258 headers_names.push_back(headers_iterator.name()); | |
259 headers_values.push_back(headers_iterator.value()); | |
260 } | |
261 } | |
262 | 276 |
263 JNIEnv* env = AttachCurrentThread(); | 277 JNIEnv* env = AttachCurrentThread(); |
264 ScopedJavaLocalRef<jstring> jstring_url = | 278 WebResourceRequest web_request(env, request); |
265 ConvertUTF8ToJavaString(env, location.spec()); | 279 |
266 ScopedJavaLocalRef<jstring> jstring_method = | |
267 ConvertUTF8ToJavaString(env, request->method()); | |
268 ScopedJavaLocalRef<jobjectArray> jstringArray_headers_names = | |
269 ToJavaArrayOfStrings(env, headers_names); | |
270 ScopedJavaLocalRef<jobjectArray> jstringArray_headers_values = | |
271 ToJavaArrayOfStrings(env, headers_values); | |
272 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( | 280 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( |
273 "shouldInterceptRequest"); | 281 "shouldInterceptRequest"); |
274 ScopedJavaLocalRef<jobject> ret = | 282 ScopedJavaLocalRef<jobject> ret = |
275 Java_AwContentsIoThreadClient_shouldInterceptRequest( | 283 Java_AwContentsIoThreadClient_shouldInterceptRequest( |
276 env, | 284 env, |
277 java_object_.obj(), | 285 java_object_.obj(), |
278 jstring_url.obj(), | 286 web_request.jstring_url.obj(), |
279 is_main_frame, | 287 web_request.is_main_frame, |
280 has_user_gesture, | 288 web_request.has_user_gesture, |
281 jstring_method.obj(), | 289 web_request.jstring_method.obj(), |
282 jstringArray_headers_names.obj(), | 290 web_request.jstringArray_header_names.obj(), |
283 jstringArray_headers_values.obj()); | 291 web_request.jstringArray_header_values.obj()); |
284 if (ret.is_null()) | 292 if (ret.is_null()) |
285 return scoped_ptr<AwWebResourceResponse>(); | 293 return scoped_ptr<AwWebResourceResponse>(); |
286 return scoped_ptr<AwWebResourceResponse>( | 294 return scoped_ptr<AwWebResourceResponse>( |
287 new AwWebResourceResponseImpl(ret)); | 295 new AwWebResourceResponseImpl(ret)); |
288 } | 296 } |
289 | 297 |
290 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { | 298 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { |
291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 299 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
292 if (java_object_.is_null()) | 300 if (java_object_.is_null()) |
293 return false; | 301 return false; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); | 377 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); |
370 | 378 |
371 ScopedJavaLocalRef<jstring> jaccount; | 379 ScopedJavaLocalRef<jstring> jaccount; |
372 if (!account.empty()) | 380 if (!account.empty()) |
373 jaccount = ConvertUTF8ToJavaString(env, account); | 381 jaccount = ConvertUTF8ToJavaString(env, account); |
374 | 382 |
375 Java_AwContentsIoThreadClient_newLoginRequest( | 383 Java_AwContentsIoThreadClient_newLoginRequest( |
376 env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); | 384 env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); |
377 } | 385 } |
378 | 386 |
| 387 void AwContentsIoThreadClientImpl::OnReceivedError( |
| 388 const net::URLRequest* request) { |
| 389 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 390 if (java_object_.is_null()) |
| 391 return; |
| 392 |
| 393 JNIEnv* env = AttachCurrentThread(); |
| 394 WebResourceRequest web_request(env, request); |
| 395 |
| 396 int error_code = request->status().error(); |
| 397 ScopedJavaLocalRef<jstring> jstring_description = ConvertUTF8ToJavaString( |
| 398 env, net::ErrorToString(request->status().error())); |
| 399 |
| 400 Java_AwContentsIoThreadClient_onReceivedError( |
| 401 env, |
| 402 java_object_.obj(), |
| 403 web_request.jstring_url.obj(), |
| 404 web_request.is_main_frame, |
| 405 web_request.has_user_gesture, |
| 406 web_request.jstring_method.obj(), |
| 407 web_request.jstringArray_header_names.obj(), |
| 408 web_request.jstringArray_header_values.obj(), |
| 409 error_code, |
| 410 jstring_description.obj()); |
| 411 } |
| 412 |
379 void AwContentsIoThreadClientImpl::OnReceivedHttpError( | 413 void AwContentsIoThreadClientImpl::OnReceivedHttpError( |
380 const net::URLRequest* request, | 414 const net::URLRequest* request, |
381 const net::HttpResponseHeaders* response_headers) { | 415 const net::HttpResponseHeaders* response_headers) { |
382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 416 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
383 if (java_object_.is_null()) | 417 if (java_object_.is_null()) |
384 return; | 418 return; |
385 | 419 |
386 vector<string> request_header_names; | 420 JNIEnv* env = AttachCurrentThread(); |
387 vector<string> request_header_values; | 421 WebResourceRequest web_request(env, request); |
388 { | |
389 net::HttpRequestHeaders headers; | |
390 if (!request->GetFullRequestHeaders(&headers)) | |
391 headers = request->extra_request_headers(); | |
392 net::HttpRequestHeaders::Iterator headers_iterator(headers); | |
393 while (headers_iterator.GetNext()) { | |
394 request_header_names.push_back(headers_iterator.name()); | |
395 request_header_values.push_back(headers_iterator.value()); | |
396 } | |
397 } | |
398 | 422 |
399 vector<string> response_header_names; | 423 vector<string> response_header_names; |
400 vector<string> response_header_values; | 424 vector<string> response_header_values; |
401 { | 425 { |
402 void* headers_iterator = NULL; | 426 void* headers_iterator = NULL; |
403 string header_name, header_value; | 427 string header_name, header_value; |
404 while (response_headers->EnumerateHeaderLines( | 428 while (response_headers->EnumerateHeaderLines( |
405 &headers_iterator, &header_name, &header_value)) { | 429 &headers_iterator, &header_name, &header_value)) { |
406 response_header_names.push_back(header_name); | 430 response_header_names.push_back(header_name); |
407 response_header_values.push_back(header_value); | 431 response_header_values.push_back(header_value); |
408 } | 432 } |
409 } | 433 } |
410 | 434 |
411 JNIEnv* env = AttachCurrentThread(); | |
412 ScopedJavaLocalRef<jstring> jstring_url = | |
413 ConvertUTF8ToJavaString(env, request->url().spec()); | |
414 ScopedJavaLocalRef<jstring> jstring_method = | |
415 ConvertUTF8ToJavaString(env, request->method()); | |
416 ScopedJavaLocalRef<jobjectArray> jstringArray_request_header_names = | |
417 ToJavaArrayOfStrings(env, request_header_names); | |
418 ScopedJavaLocalRef<jobjectArray> jstringArray_request_header_values = | |
419 ToJavaArrayOfStrings(env, request_header_values); | |
420 | |
421 const content::ResourceRequestInfo* info = | |
422 content::ResourceRequestInfo::ForRequest(request); | |
423 bool is_main_frame = info && | |
424 info->GetResourceType() == content::RESOURCE_TYPE_MAIN_FRAME; | |
425 bool has_user_gesture = info && info->HasUserGesture(); | |
426 | |
427 string mime_type, encoding; | 435 string mime_type, encoding; |
428 response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); | 436 response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); |
429 ScopedJavaLocalRef<jstring> jstring_mime_type = | 437 ScopedJavaLocalRef<jstring> jstring_mime_type = |
430 ConvertUTF8ToJavaString(env, mime_type); | 438 ConvertUTF8ToJavaString(env, mime_type); |
431 ScopedJavaLocalRef<jstring> jstring_encoding = | 439 ScopedJavaLocalRef<jstring> jstring_encoding = |
432 ConvertUTF8ToJavaString(env, encoding); | 440 ConvertUTF8ToJavaString(env, encoding); |
433 int status_code = response_headers->response_code(); | 441 int status_code = response_headers->response_code(); |
434 ScopedJavaLocalRef<jstring> jstring_reason = | 442 ScopedJavaLocalRef<jstring> jstring_reason = |
435 ConvertUTF8ToJavaString(env, response_headers->GetStatusText()); | 443 ConvertUTF8ToJavaString(env, response_headers->GetStatusText()); |
436 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names = | 444 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names = |
437 ToJavaArrayOfStrings(env, response_header_names); | 445 ToJavaArrayOfStrings(env, response_header_names); |
438 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values = | 446 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values = |
439 ToJavaArrayOfStrings(env, response_header_values); | 447 ToJavaArrayOfStrings(env, response_header_values); |
440 | 448 |
441 Java_AwContentsIoThreadClient_onReceivedHttpError( | 449 Java_AwContentsIoThreadClient_onReceivedHttpError( |
442 env, | 450 env, |
443 java_object_.obj(), | 451 java_object_.obj(), |
444 jstring_url.obj(), | 452 web_request.jstring_url.obj(), |
445 is_main_frame, | 453 web_request.is_main_frame, |
446 has_user_gesture, | 454 web_request.has_user_gesture, |
447 jstring_method.obj(), | 455 web_request.jstring_method.obj(), |
448 jstringArray_request_header_names.obj(), | 456 web_request.jstringArray_header_names.obj(), |
449 jstringArray_request_header_values.obj(), | 457 web_request.jstringArray_header_values.obj(), |
450 jstring_mime_type.obj(), | 458 jstring_mime_type.obj(), |
451 jstring_encoding.obj(), | 459 jstring_encoding.obj(), |
452 status_code, | 460 status_code, |
453 jstring_reason.obj(), | 461 jstring_reason.obj(), |
454 jstringArray_response_header_names.obj(), | 462 jstringArray_response_header_names.obj(), |
455 jstringArray_response_header_values.obj()); | 463 jstringArray_response_header_values.obj()); |
456 } | 464 } |
457 | 465 |
458 bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) { | 466 bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) { |
459 return RegisterNativesImpl(env); | 467 return RegisterNativesImpl(env); |
460 } | 468 } |
461 | 469 |
462 } // namespace android_webview | 470 } // namespace android_webview |
OLD | NEW |