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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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, | 272 const GURL& location, |
240 const net::URLRequest* request) { | 273 const net::URLRequest* request) { |
241 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 274 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
242 if (java_object_.is_null()) | 275 if (java_object_.is_null()) |
243 return scoped_ptr<AwWebResourceResponse>(); | 276 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 | 277 |
263 JNIEnv* env = AttachCurrentThread(); | 278 JNIEnv* env = AttachCurrentThread(); |
264 ScopedJavaLocalRef<jstring> jstring_url = | 279 WebResourceRequest web_request(env, request); |
265 ConvertUTF8ToJavaString(env, location.spec()); | 280 web_request.jstring_url = ConvertUTF8ToJavaString(env, location.spec()); |
sgurun-gerrit only
2015/03/17 00:30:04
question: do you really need to overwrite this? wh
mnaganov (inactive)
2015/03/17 15:29:09
Great question! I've looked up where we are gettin
| |
266 ScopedJavaLocalRef<jstring> jstring_method = | 281 |
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( | 282 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( |
273 "shouldInterceptRequest"); | 283 "shouldInterceptRequest"); |
274 ScopedJavaLocalRef<jobject> ret = | 284 ScopedJavaLocalRef<jobject> ret = |
275 Java_AwContentsIoThreadClient_shouldInterceptRequest( | 285 Java_AwContentsIoThreadClient_shouldInterceptRequest( |
276 env, | 286 env, |
277 java_object_.obj(), | 287 java_object_.obj(), |
278 jstring_url.obj(), | 288 web_request.jstring_url.obj(), |
279 is_main_frame, | 289 web_request.is_main_frame, |
280 has_user_gesture, | 290 web_request.has_user_gesture, |
281 jstring_method.obj(), | 291 web_request.jstring_method.obj(), |
282 jstringArray_headers_names.obj(), | 292 web_request.jstringArray_header_names.obj(), |
283 jstringArray_headers_values.obj()); | 293 web_request.jstringArray_header_values.obj()); |
284 if (ret.is_null()) | 294 if (ret.is_null()) |
285 return scoped_ptr<AwWebResourceResponse>(); | 295 return scoped_ptr<AwWebResourceResponse>(); |
286 return scoped_ptr<AwWebResourceResponse>( | 296 return scoped_ptr<AwWebResourceResponse>( |
287 new AwWebResourceResponseImpl(ret)); | 297 new AwWebResourceResponseImpl(ret)); |
288 } | 298 } |
289 | 299 |
290 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { | 300 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { |
291 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 301 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
292 if (java_object_.is_null()) | 302 if (java_object_.is_null()) |
293 return false; | 303 return false; |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
369 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); | 379 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); |
370 | 380 |
371 ScopedJavaLocalRef<jstring> jaccount; | 381 ScopedJavaLocalRef<jstring> jaccount; |
372 if (!account.empty()) | 382 if (!account.empty()) |
373 jaccount = ConvertUTF8ToJavaString(env, account); | 383 jaccount = ConvertUTF8ToJavaString(env, account); |
374 | 384 |
375 Java_AwContentsIoThreadClient_newLoginRequest( | 385 Java_AwContentsIoThreadClient_newLoginRequest( |
376 env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); | 386 env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); |
377 } | 387 } |
378 | 388 |
389 void AwContentsIoThreadClientImpl::OnReceivedError( | |
390 const net::URLRequest* request) { | |
391 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
392 if (java_object_.is_null()) | |
393 return; | |
394 | |
395 JNIEnv* env = AttachCurrentThread(); | |
396 WebResourceRequest web_request(env, request); | |
397 | |
398 int error_code = request->status().error(); | |
399 ScopedJavaLocalRef<jstring> jstring_description = ConvertUTF8ToJavaString( | |
400 env, net::ErrorToString(request->status().error())); | |
401 | |
402 Java_AwContentsIoThreadClient_onReceivedError( | |
403 env, | |
404 java_object_.obj(), | |
405 web_request.jstring_url.obj(), | |
406 web_request.is_main_frame, | |
407 web_request.has_user_gesture, | |
408 web_request.jstring_method.obj(), | |
409 web_request.jstringArray_header_names.obj(), | |
410 web_request.jstringArray_header_values.obj(), | |
411 error_code, | |
412 jstring_description.obj()); | |
413 } | |
414 | |
379 void AwContentsIoThreadClientImpl::OnReceivedHttpError( | 415 void AwContentsIoThreadClientImpl::OnReceivedHttpError( |
380 const net::URLRequest* request, | 416 const net::URLRequest* request, |
381 const net::HttpResponseHeaders* response_headers) { | 417 const net::HttpResponseHeaders* response_headers) { |
382 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 418 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
383 if (java_object_.is_null()) | 419 if (java_object_.is_null()) |
384 return; | 420 return; |
385 | 421 |
386 vector<string> request_header_names; | 422 JNIEnv* env = AttachCurrentThread(); |
387 vector<string> request_header_values; | 423 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 | 424 |
399 vector<string> response_header_names; | 425 vector<string> response_header_names; |
400 vector<string> response_header_values; | 426 vector<string> response_header_values; |
401 { | 427 { |
402 void* headers_iterator = NULL; | 428 void* headers_iterator = NULL; |
403 string header_name, header_value; | 429 string header_name, header_value; |
404 while (response_headers->EnumerateHeaderLines( | 430 while (response_headers->EnumerateHeaderLines( |
405 &headers_iterator, &header_name, &header_value)) { | 431 &headers_iterator, &header_name, &header_value)) { |
406 response_header_names.push_back(header_name); | 432 response_header_names.push_back(header_name); |
407 response_header_values.push_back(header_value); | 433 response_header_values.push_back(header_value); |
408 } | 434 } |
409 } | 435 } |
410 | 436 |
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; | 437 string mime_type, encoding; |
428 response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); | 438 response_headers->GetMimeTypeAndCharset(&mime_type, &encoding); |
429 ScopedJavaLocalRef<jstring> jstring_mime_type = | 439 ScopedJavaLocalRef<jstring> jstring_mime_type = |
430 ConvertUTF8ToJavaString(env, mime_type); | 440 ConvertUTF8ToJavaString(env, mime_type); |
431 ScopedJavaLocalRef<jstring> jstring_encoding = | 441 ScopedJavaLocalRef<jstring> jstring_encoding = |
432 ConvertUTF8ToJavaString(env, encoding); | 442 ConvertUTF8ToJavaString(env, encoding); |
433 int status_code = response_headers->response_code(); | 443 int status_code = response_headers->response_code(); |
434 ScopedJavaLocalRef<jstring> jstring_reason = | 444 ScopedJavaLocalRef<jstring> jstring_reason = |
435 ConvertUTF8ToJavaString(env, response_headers->GetStatusText()); | 445 ConvertUTF8ToJavaString(env, response_headers->GetStatusText()); |
436 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names = | 446 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_names = |
437 ToJavaArrayOfStrings(env, response_header_names); | 447 ToJavaArrayOfStrings(env, response_header_names); |
438 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values = | 448 ScopedJavaLocalRef<jobjectArray> jstringArray_response_header_values = |
439 ToJavaArrayOfStrings(env, response_header_values); | 449 ToJavaArrayOfStrings(env, response_header_values); |
440 | 450 |
441 Java_AwContentsIoThreadClient_onReceivedHttpError( | 451 Java_AwContentsIoThreadClient_onReceivedHttpError( |
442 env, | 452 env, |
443 java_object_.obj(), | 453 java_object_.obj(), |
444 jstring_url.obj(), | 454 web_request.jstring_url.obj(), |
445 is_main_frame, | 455 web_request.is_main_frame, |
446 has_user_gesture, | 456 web_request.has_user_gesture, |
447 jstring_method.obj(), | 457 web_request.jstring_method.obj(), |
448 jstringArray_request_header_names.obj(), | 458 web_request.jstringArray_header_names.obj(), |
449 jstringArray_request_header_values.obj(), | 459 web_request.jstringArray_header_values.obj(), |
450 jstring_mime_type.obj(), | 460 jstring_mime_type.obj(), |
451 jstring_encoding.obj(), | 461 jstring_encoding.obj(), |
452 status_code, | 462 status_code, |
453 jstring_reason.obj(), | 463 jstring_reason.obj(), |
454 jstringArray_response_header_names.obj(), | 464 jstringArray_response_header_names.obj(), |
455 jstringArray_response_header_values.obj()); | 465 jstringArray_response_header_values.obj()); |
456 } | 466 } |
457 | 467 |
458 bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) { | 468 bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) { |
459 return RegisterNativesImpl(env); | 469 return RegisterNativesImpl(env); |
460 } | 470 } |
461 | 471 |
462 } // namespace android_webview | 472 } // namespace android_webview |
OLD | NEW |