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/intercepted_request_data_impl.h" | 11 #include "android_webview/native/intercepted_request_data_impl.h" |
| 12 #include "base/android/jni_array.h" |
12 #include "base/android/jni_string.h" | 13 #include "base/android/jni_string.h" |
13 #include "base/android/jni_weak_ref.h" | 14 #include "base/android/jni_weak_ref.h" |
14 #include "base/lazy_instance.h" | 15 #include "base/lazy_instance.h" |
15 #include "base/memory/linked_ptr.h" | 16 #include "base/memory/linked_ptr.h" |
16 #include "base/memory/scoped_ptr.h" | 17 #include "base/memory/scoped_ptr.h" |
17 #include "base/synchronization/lock.h" | 18 #include "base/synchronization/lock.h" |
18 #include "content/public/browser/browser_thread.h" | 19 #include "content/public/browser/browser_thread.h" |
19 #include "content/public/browser/render_frame_host.h" | 20 #include "content/public/browser/render_frame_host.h" |
20 #include "content/public/browser/render_process_host.h" | 21 #include "content/public/browser/render_process_host.h" |
21 #include "content/public/browser/render_view_host.h" | 22 #include "content/public/browser/render_view_host.h" |
22 #include "content/public/browser/resource_request_info.h" | 23 #include "content/public/browser/resource_request_info.h" |
23 #include "content/public/browser/web_contents.h" | 24 #include "content/public/browser/web_contents.h" |
24 #include "content/public/browser/web_contents_observer.h" | 25 #include "content/public/browser/web_contents_observer.h" |
25 #include "jni/AwContentsIoThreadClient_jni.h" | 26 #include "jni/AwContentsIoThreadClient_jni.h" |
| 27 #include "net/http/http_request_headers.h" |
26 #include "net/url_request/url_request.h" | 28 #include "net/url_request/url_request.h" |
27 #include "url/gurl.h" | 29 #include "url/gurl.h" |
28 | 30 |
29 using base::android::AttachCurrentThread; | 31 using base::android::AttachCurrentThread; |
30 using base::android::ConvertUTF8ToJavaString; | 32 using base::android::ConvertUTF8ToJavaString; |
31 using base::android::JavaRef; | 33 using base::android::JavaRef; |
32 using base::android::ScopedJavaLocalRef; | 34 using base::android::ScopedJavaLocalRef; |
| 35 using base::android::ToJavaArrayOfStrings; |
33 using base::LazyInstance; | 36 using base::LazyInstance; |
34 using content::BrowserThread; | 37 using content::BrowserThread; |
35 using content::RenderFrameHost; | 38 using content::RenderFrameHost; |
36 using content::WebContents; | 39 using content::WebContents; |
37 using std::map; | 40 using std::map; |
38 using std::pair; | 41 using std::pair; |
| 42 using std::string; |
| 43 using std::vector; |
39 | 44 |
40 namespace android_webview { | 45 namespace android_webview { |
41 | 46 |
42 namespace { | 47 namespace { |
43 | 48 |
44 struct IoThreadClientData { | 49 struct IoThreadClientData { |
45 bool pending_association; | 50 bool pending_association; |
46 JavaObjectWeakGlobalRef io_thread_client; | 51 JavaObjectWeakGlobalRef io_thread_client; |
47 | 52 |
48 IoThreadClientData(); | 53 IoThreadClientData(); |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 AwContentsIoThreadClientImpl::ShouldInterceptRequest( | 236 AwContentsIoThreadClientImpl::ShouldInterceptRequest( |
232 const GURL& location, | 237 const GURL& location, |
233 const net::URLRequest* request) { | 238 const net::URLRequest* request) { |
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 239 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
235 if (java_object_.is_null()) | 240 if (java_object_.is_null()) |
236 return scoped_ptr<InterceptedRequestData>(); | 241 return scoped_ptr<InterceptedRequestData>(); |
237 const content::ResourceRequestInfo* info = | 242 const content::ResourceRequestInfo* info = |
238 content::ResourceRequestInfo::ForRequest(request); | 243 content::ResourceRequestInfo::ForRequest(request); |
239 bool is_main_frame = info && | 244 bool is_main_frame = info && |
240 info->GetResourceType() == ResourceType::MAIN_FRAME; | 245 info->GetResourceType() == ResourceType::MAIN_FRAME; |
| 246 bool has_user_gesture = info && info->HasUserGesture(); |
| 247 |
| 248 vector<string> headers_names; |
| 249 vector<string> headers_values; |
| 250 { |
| 251 net::HttpRequestHeaders headers; |
| 252 if (!request->GetFullRequestHeaders(&headers)) |
| 253 headers = request->extra_request_headers(); |
| 254 net::HttpRequestHeaders::Iterator headers_iterator(headers); |
| 255 while (headers_iterator.GetNext()) { |
| 256 headers_names.push_back(headers_iterator.name()); |
| 257 headers_values.push_back(headers_iterator.value()); |
| 258 } |
| 259 } |
241 | 260 |
242 JNIEnv* env = AttachCurrentThread(); | 261 JNIEnv* env = AttachCurrentThread(); |
243 ScopedJavaLocalRef<jstring> jstring_url = | 262 ScopedJavaLocalRef<jstring> jstring_url = |
244 ConvertUTF8ToJavaString(env, location.spec()); | 263 ConvertUTF8ToJavaString(env, location.spec()); |
| 264 ScopedJavaLocalRef<jstring> jstring_method = |
| 265 ConvertUTF8ToJavaString(env, request->method()); |
| 266 ScopedJavaLocalRef<jobjectArray> jstringArray_headers_names = |
| 267 ToJavaArrayOfStrings(env, headers_names); |
| 268 ScopedJavaLocalRef<jobjectArray> jstringArray_headers_values = |
| 269 ToJavaArrayOfStrings(env, headers_values); |
245 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( | 270 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( |
246 "shouldInterceptRequest"); | 271 "shouldInterceptRequest"); |
247 ScopedJavaLocalRef<jobject> ret = | 272 ScopedJavaLocalRef<jobject> ret = |
248 Java_AwContentsIoThreadClient_shouldInterceptRequest( | 273 Java_AwContentsIoThreadClient_shouldInterceptRequest( |
249 env, java_object_.obj(), jstring_url.obj(), is_main_frame); | 274 env, |
| 275 java_object_.obj(), |
| 276 jstring_url.obj(), |
| 277 is_main_frame, |
| 278 has_user_gesture, |
| 279 jstring_method.obj(), |
| 280 jstringArray_headers_names.obj(), |
| 281 jstringArray_headers_values.obj()); |
250 if (ret.is_null()) | 282 if (ret.is_null()) |
251 return scoped_ptr<InterceptedRequestData>(); | 283 return scoped_ptr<InterceptedRequestData>(); |
252 return scoped_ptr<InterceptedRequestData>( | 284 return scoped_ptr<InterceptedRequestData>( |
253 new InterceptedRequestDataImpl(ret)); | 285 new InterceptedRequestDataImpl(ret)); |
254 } | 286 } |
255 | 287 |
256 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { | 288 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { |
257 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 289 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
258 if (java_object_.is_null()) | 290 if (java_object_.is_null()) |
259 return false; | 291 return false; |
(...skipping 18 matching lines...) Expand all Loading... |
278 if (java_object_.is_null()) | 310 if (java_object_.is_null()) |
279 return false; | 311 return false; |
280 | 312 |
281 JNIEnv* env = AttachCurrentThread(); | 313 JNIEnv* env = AttachCurrentThread(); |
282 return Java_AwContentsIoThreadClient_shouldBlockNetworkLoads( | 314 return Java_AwContentsIoThreadClient_shouldBlockNetworkLoads( |
283 env, java_object_.obj()); | 315 env, java_object_.obj()); |
284 } | 316 } |
285 | 317 |
286 void AwContentsIoThreadClientImpl::NewDownload( | 318 void AwContentsIoThreadClientImpl::NewDownload( |
287 const GURL& url, | 319 const GURL& url, |
288 const std::string& user_agent, | 320 const string& user_agent, |
289 const std::string& content_disposition, | 321 const string& content_disposition, |
290 const std::string& mime_type, | 322 const string& mime_type, |
291 int64 content_length) { | 323 int64 content_length) { |
292 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 324 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
293 if (java_object_.is_null()) | 325 if (java_object_.is_null()) |
294 return; | 326 return; |
295 | 327 |
296 JNIEnv* env = AttachCurrentThread(); | 328 JNIEnv* env = AttachCurrentThread(); |
297 ScopedJavaLocalRef<jstring> jstring_url = | 329 ScopedJavaLocalRef<jstring> jstring_url = |
298 ConvertUTF8ToJavaString(env, url.spec()); | 330 ConvertUTF8ToJavaString(env, url.spec()); |
299 ScopedJavaLocalRef<jstring> jstring_user_agent = | 331 ScopedJavaLocalRef<jstring> jstring_user_agent = |
300 ConvertUTF8ToJavaString(env, user_agent); | 332 ConvertUTF8ToJavaString(env, user_agent); |
301 ScopedJavaLocalRef<jstring> jstring_content_disposition = | 333 ScopedJavaLocalRef<jstring> jstring_content_disposition = |
302 ConvertUTF8ToJavaString(env, content_disposition); | 334 ConvertUTF8ToJavaString(env, content_disposition); |
303 ScopedJavaLocalRef<jstring> jstring_mime_type = | 335 ScopedJavaLocalRef<jstring> jstring_mime_type = |
304 ConvertUTF8ToJavaString(env, mime_type); | 336 ConvertUTF8ToJavaString(env, mime_type); |
305 | 337 |
306 Java_AwContentsIoThreadClient_onDownloadStart( | 338 Java_AwContentsIoThreadClient_onDownloadStart( |
307 env, | 339 env, |
308 java_object_.obj(), | 340 java_object_.obj(), |
309 jstring_url.obj(), | 341 jstring_url.obj(), |
310 jstring_user_agent.obj(), | 342 jstring_user_agent.obj(), |
311 jstring_content_disposition.obj(), | 343 jstring_content_disposition.obj(), |
312 jstring_mime_type.obj(), | 344 jstring_mime_type.obj(), |
313 content_length); | 345 content_length); |
314 } | 346 } |
315 | 347 |
316 void AwContentsIoThreadClientImpl::NewLoginRequest(const std::string& realm, | 348 void AwContentsIoThreadClientImpl::NewLoginRequest(const string& realm, |
317 const std::string& account, | 349 const string& account, |
318 const std::string& args) { | 350 const string& args) { |
319 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 351 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
320 if (java_object_.is_null()) | 352 if (java_object_.is_null()) |
321 return; | 353 return; |
322 | 354 |
323 JNIEnv* env = AttachCurrentThread(); | 355 JNIEnv* env = AttachCurrentThread(); |
324 ScopedJavaLocalRef<jstring> jrealm = ConvertUTF8ToJavaString(env, realm); | 356 ScopedJavaLocalRef<jstring> jrealm = ConvertUTF8ToJavaString(env, realm); |
325 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); | 357 ScopedJavaLocalRef<jstring> jargs = ConvertUTF8ToJavaString(env, args); |
326 | 358 |
327 ScopedJavaLocalRef<jstring> jaccount; | 359 ScopedJavaLocalRef<jstring> jaccount; |
328 if (!account.empty()) | 360 if (!account.empty()) |
329 jaccount = ConvertUTF8ToJavaString(env, account); | 361 jaccount = ConvertUTF8ToJavaString(env, account); |
330 | 362 |
331 Java_AwContentsIoThreadClient_newLoginRequest( | 363 Java_AwContentsIoThreadClient_newLoginRequest( |
332 env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); | 364 env, java_object_.obj(), jrealm.obj(), jaccount.obj(), jargs.obj()); |
333 } | 365 } |
334 | 366 |
335 bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) { | 367 bool RegisterAwContentsIoThreadClientImpl(JNIEnv* env) { |
336 return RegisterNativesImpl(env); | 368 return RegisterNativesImpl(env); |
337 } | 369 } |
338 | 370 |
339 } // namespace android_webview | 371 } // namespace android_webview |
OLD | NEW |