Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(228)

Side by Side Diff: android_webview/native/aw_contents_io_thread_client_impl.cc

Issue 1001003004: [Android WebView] Implement a better OnReceivedError callback (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Restored empty line Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698