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

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: Addressed the last comment 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
« no previous file with comments | « android_webview/native/aw_contents_io_thread_client_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW
« no previous file with comments | « android_webview/native/aw_contents_io_thread_client_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698