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

Side by Side Diff: android_webview/browser/aw_contents_io_thread_client.cc

Issue 2889193004: [WebView] Replace AwContentsIoThreadClient, InputStream and AwWebResourceResponse (Closed)
Patch Set: fix test crash Created 3 years, 7 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/browser/aw_contents_io_thread_client_impl.h" 5 #include "android_webview/browser/aw_contents_io_thread_client.h"
6 6
7 #include <map> 7 #include <map>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 10
11 #include "android_webview/browser/aw_contents_background_thread_client.h" 11 #include "android_webview/browser/aw_contents_background_thread_client.h"
12 #include "android_webview/browser/aw_web_resource_response_impl.h"
13 #include "android_webview/browser/net/aw_web_resource_request.h" 12 #include "android_webview/browser/net/aw_web_resource_request.h"
13 #include "android_webview/browser/net/aw_web_resource_response.h"
14 #include "android_webview/common/devtools_instrumentation.h" 14 #include "android_webview/common/devtools_instrumentation.h"
15 #include "base/android/jni_array.h" 15 #include "base/android/jni_array.h"
16 #include "base/android/jni_string.h" 16 #include "base/android/jni_string.h"
17 #include "base/android/jni_weak_ref.h" 17 #include "base/android/jni_weak_ref.h"
18 #include "base/lazy_instance.h" 18 #include "base/lazy_instance.h"
19 #include "base/synchronization/lock.h" 19 #include "base/synchronization/lock.h"
20 #include "content/public/browser/browser_thread.h" 20 #include "content/public/browser/browser_thread.h"
21 #include "content/public/browser/render_frame_host.h" 21 #include "content/public/browser/render_frame_host.h"
22 #include "content/public/browser/render_process_host.h" 22 #include "content/public/browser/render_process_host.h"
23 #include "content/public/browser/render_view_host.h" 23 #include "content/public/browser/render_view_host.h"
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh)); 184 RfhToIoThreadClientMap::GetInstance()->Erase(GetRenderFrameHostIdPair(rfh));
185 RfhToIoThreadClientMap::GetInstance()->Erase(rfh->GetFrameTreeNodeId()); 185 RfhToIoThreadClientMap::GetInstance()->Erase(rfh->GetFrameTreeNodeId());
186 } 186 }
187 187
188 void ClientMapEntryUpdater::WebContentsDestroyed() { 188 void ClientMapEntryUpdater::WebContentsDestroyed() {
189 delete this; 189 delete this;
190 } 190 }
191 191
192 } // namespace 192 } // namespace
193 193
194 // AwContentsIoThreadClientImpl ----------------------------------------------- 194 // AwContentsIoThreadClient -----------------------------------------------
195 195
196 // static 196 // static
197 std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID( 197 std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID(
198 int render_process_id, 198 int render_process_id,
199 int render_frame_id) { 199 int render_frame_id) {
200 pair<int, int> rfh_id(render_process_id, render_frame_id); 200 pair<int, int> rfh_id(render_process_id, render_frame_id);
201 IoThreadClientData client_data; 201 IoThreadClientData client_data;
202 if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data)) 202 if (!RfhToIoThreadClientMap::GetInstance()->Get(rfh_id, &client_data))
203 return std::unique_ptr<AwContentsIoThreadClient>(); 203 return std::unique_ptr<AwContentsIoThreadClient>();
204 204
205 JNIEnv* env = AttachCurrentThread(); 205 JNIEnv* env = AttachCurrentThread();
206 ScopedJavaLocalRef<jobject> java_delegate = 206 ScopedJavaLocalRef<jobject> java_delegate =
207 client_data.io_thread_client.get(env); 207 client_data.io_thread_client.get(env);
208 DCHECK(!client_data.pending_association || java_delegate.is_null()); 208 DCHECK(!client_data.pending_association || java_delegate.is_null());
209 return std::unique_ptr<AwContentsIoThreadClient>( 209 return std::unique_ptr<AwContentsIoThreadClient>(new AwContentsIoThreadClient(
210 new AwContentsIoThreadClientImpl(client_data.pending_association, 210 client_data.pending_association, java_delegate));
211 java_delegate));
212 } 211 }
213 212
214 std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID( 213 std::unique_ptr<AwContentsIoThreadClient> AwContentsIoThreadClient::FromID(
215 int frame_tree_node_id) { 214 int frame_tree_node_id) {
216 IoThreadClientData client_data; 215 IoThreadClientData client_data;
217 if (!RfhToIoThreadClientMap::GetInstance()->Get(frame_tree_node_id, 216 if (!RfhToIoThreadClientMap::GetInstance()->Get(frame_tree_node_id,
218 &client_data)) 217 &client_data))
219 return std::unique_ptr<AwContentsIoThreadClient>(); 218 return std::unique_ptr<AwContentsIoThreadClient>();
220 219
221 JNIEnv* env = AttachCurrentThread(); 220 JNIEnv* env = AttachCurrentThread();
222 ScopedJavaLocalRef<jobject> java_delegate = 221 ScopedJavaLocalRef<jobject> java_delegate =
223 client_data.io_thread_client.get(env); 222 client_data.io_thread_client.get(env);
224 DCHECK(!client_data.pending_association || java_delegate.is_null()); 223 DCHECK(!client_data.pending_association || java_delegate.is_null());
225 return std::unique_ptr<AwContentsIoThreadClient>( 224 return std::unique_ptr<AwContentsIoThreadClient>(new AwContentsIoThreadClient(
226 new AwContentsIoThreadClientImpl(client_data.pending_association, 225 client_data.pending_association, java_delegate));
227 java_delegate));
228 } 226 }
229 227
230 // static 228 // static
231 void AwContentsIoThreadClient::SubFrameCreated(int render_process_id, 229 void AwContentsIoThreadClient::SubFrameCreated(int render_process_id,
232 int parent_render_frame_id, 230 int parent_render_frame_id,
233 int child_render_frame_id) { 231 int child_render_frame_id) {
234 pair<int, int> parent_rfh_id(render_process_id, parent_render_frame_id); 232 pair<int, int> parent_rfh_id(render_process_id, parent_render_frame_id);
235 pair<int, int> child_rfh_id(render_process_id, child_render_frame_id); 233 pair<int, int> child_rfh_id(render_process_id, child_render_frame_id);
236 IoThreadClientData client_data; 234 IoThreadClientData client_data;
237 if (!RfhToIoThreadClientMap::GetInstance()->Get(parent_rfh_id, 235 if (!RfhToIoThreadClientMap::GetInstance()->Get(parent_rfh_id,
238 &client_data)) { 236 &client_data)) {
239 NOTREACHED(); 237 NOTREACHED();
240 return; 238 return;
241 } 239 }
242 240
243 RfhToIoThreadClientMap::GetInstance()->Set(child_rfh_id, client_data); 241 RfhToIoThreadClientMap::GetInstance()->Set(child_rfh_id, client_data);
244 } 242 }
245 243
246 // static 244 // static
247 void AwContentsIoThreadClientImpl::RegisterPendingContents( 245 void AwContentsIoThreadClient::RegisterPendingContents(
248 WebContents* web_contents) { 246 WebContents* web_contents) {
249 IoThreadClientData client_data; 247 IoThreadClientData client_data;
250 client_data.pending_association = true; 248 client_data.pending_association = true;
251 RfhToIoThreadClientMap::GetInstance()->Set( 249 RfhToIoThreadClientMap::GetInstance()->Set(
252 GetRenderFrameHostIdPair(web_contents->GetMainFrame()), client_data); 250 GetRenderFrameHostIdPair(web_contents->GetMainFrame()), client_data);
253 } 251 }
254 252
255 // static 253 // static
256 void AwContentsIoThreadClientImpl::Associate(WebContents* web_contents, 254 void AwContentsIoThreadClient::Associate(WebContents* web_contents,
257 const JavaRef<jobject>& jclient) { 255 const JavaRef<jobject>& jclient) {
258 JNIEnv* env = AttachCurrentThread(); 256 JNIEnv* env = AttachCurrentThread();
259 // The ClientMapEntryUpdater lifespan is tied to the WebContents. 257 // The ClientMapEntryUpdater lifespan is tied to the WebContents.
260 new ClientMapEntryUpdater(env, web_contents, jclient.obj()); 258 new ClientMapEntryUpdater(env, web_contents, jclient.obj());
261 } 259 }
262 260
263 // static 261 // static
264 void AwContentsIoThreadClientImpl::SetServiceWorkerIoThreadClient( 262 void AwContentsIoThreadClient::SetServiceWorkerIoThreadClient(
265 const base::android::JavaRef<jobject>& jclient, 263 const base::android::JavaRef<jobject>& jclient,
266 const base::android::JavaRef<jobject>& browser_context) { 264 const base::android::JavaRef<jobject>& browser_context) {
267 // TODO: currently there is only one browser context so it is ok to 265 // TODO: currently there is only one browser context so it is ok to
268 // store in a global variable, in the future use browser_context to 266 // store in a global variable, in the future use browser_context to
269 // obtain the correct instance. 267 // obtain the correct instance.
270 JavaObjectWeakGlobalRef temp(AttachCurrentThread(), jclient.obj()); 268 JavaObjectWeakGlobalRef temp(AttachCurrentThread(), jclient.obj());
271 g_sw_instance_.Get() = temp; 269 g_sw_instance_.Get() = temp;
272 } 270 }
273 271
274 // static 272 // static
275 std::unique_ptr<AwContentsIoThreadClient> 273 std::unique_ptr<AwContentsIoThreadClient>
276 AwContentsIoThreadClient::GetServiceWorkerIoThreadClient() { 274 AwContentsIoThreadClient::GetServiceWorkerIoThreadClient() {
277 JNIEnv* env = AttachCurrentThread(); 275 JNIEnv* env = AttachCurrentThread();
278 ScopedJavaLocalRef<jobject> java_delegate = g_sw_instance_.Get().get(env); 276 ScopedJavaLocalRef<jobject> java_delegate = g_sw_instance_.Get().get(env);
279 277
280 if (java_delegate.is_null()) 278 if (java_delegate.is_null())
281 return std::unique_ptr<AwContentsIoThreadClient>(); 279 return std::unique_ptr<AwContentsIoThreadClient>();
282 280
283 return std::unique_ptr<AwContentsIoThreadClient>( 281 return std::unique_ptr<AwContentsIoThreadClient>(
284 new AwContentsIoThreadClientImpl(false, java_delegate)); 282 new AwContentsIoThreadClient(false, java_delegate));
285 } 283 }
286 284
287 AwContentsIoThreadClientImpl::AwContentsIoThreadClientImpl( 285 AwContentsIoThreadClient::AwContentsIoThreadClient(bool pending_association,
288 bool pending_association, 286 const JavaRef<jobject>& obj)
289 const JavaRef<jobject>& obj)
290 : pending_association_(pending_association), java_object_(obj) {} 287 : pending_association_(pending_association), java_object_(obj) {}
291 288
292 AwContentsIoThreadClientImpl::~AwContentsIoThreadClientImpl() { 289 AwContentsIoThreadClient::~AwContentsIoThreadClient() {
293 // explict, out-of-line destructor. 290 // explict, out-of-line destructor.
294 } 291 }
295 292
296 bool AwContentsIoThreadClientImpl::PendingAssociation() const { 293 bool AwContentsIoThreadClient::PendingAssociation() const {
297 return pending_association_; 294 return pending_association_;
298 } 295 }
299 296
300 AwContentsIoThreadClient::CacheMode AwContentsIoThreadClientImpl::GetCacheMode() 297 AwContentsIoThreadClient::CacheMode AwContentsIoThreadClient::GetCacheMode()
301 const { 298 const {
302 DCHECK_CURRENTLY_ON(BrowserThread::IO); 299 DCHECK_CURRENTLY_ON(BrowserThread::IO);
303 if (java_object_.is_null()) 300 if (java_object_.is_null())
304 return AwContentsIoThreadClient::LOAD_DEFAULT; 301 return AwContentsIoThreadClient::LOAD_DEFAULT;
305 302
306 JNIEnv* env = AttachCurrentThread(); 303 JNIEnv* env = AttachCurrentThread();
307 return static_cast<AwContentsIoThreadClient::CacheMode>( 304 return static_cast<AwContentsIoThreadClient::CacheMode>(
308 Java_AwContentsIoThreadClient_getCacheMode(env, java_object_)); 305 Java_AwContentsIoThreadClient_getCacheMode(env, java_object_));
309 } 306 }
310 307
(...skipping 13 matching lines...) Expand all
324 321
325 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback( 322 devtools_instrumentation::ScopedEmbedderCallbackTask embedder_callback(
326 "shouldInterceptRequest"); 323 "shouldInterceptRequest");
327 ScopedJavaLocalRef<jobject> ret = 324 ScopedJavaLocalRef<jobject> ret =
328 AwContentsBackgroundThreadClient::shouldInterceptRequest( 325 AwContentsBackgroundThreadClient::shouldInterceptRequest(
329 env, obj, java_web_resource_request.jurl, request.is_main_frame, 326 env, obj, java_web_resource_request.jurl, request.is_main_frame,
330 request.has_user_gesture, java_web_resource_request.jmethod, 327 request.has_user_gesture, java_web_resource_request.jmethod,
331 java_web_resource_request.jheader_names, 328 java_web_resource_request.jheader_names,
332 java_web_resource_request.jheader_values); 329 java_web_resource_request.jheader_values);
333 return std::unique_ptr<AwWebResourceResponse>( 330 return std::unique_ptr<AwWebResourceResponse>(
334 ret.is_null() ? nullptr : new AwWebResourceResponseImpl(ret)); 331 ret.is_null() ? nullptr : new AwWebResourceResponse(ret));
335 } 332 }
336 333
337 std::unique_ptr<AwWebResourceResponse> ReturnNull() { 334 std::unique_ptr<AwWebResourceResponse> ReturnNull() {
338 return std::unique_ptr<AwWebResourceResponse>(); 335 return std::unique_ptr<AwWebResourceResponse>();
339 } 336 }
340 337
341 } // namespace 338 } // namespace
342 339
343 void AwContentsIoThreadClientImpl::ShouldInterceptRequestAsync( 340 void AwContentsIoThreadClient::ShouldInterceptRequestAsync(
344 const net::URLRequest* request, 341 const net::URLRequest* request,
345 const ShouldInterceptRequestResultCallback callback) { 342 const ShouldInterceptRequestResultCallback callback) {
346 DCHECK_CURRENTLY_ON(BrowserThread::IO); 343 DCHECK_CURRENTLY_ON(BrowserThread::IO);
347 base::Callback<std::unique_ptr<AwWebResourceResponse>()> get_response = 344 base::Callback<std::unique_ptr<AwWebResourceResponse>()> get_response =
348 base::Bind(&ReturnNull); 345 base::Bind(&ReturnNull);
349 JNIEnv* env = AttachCurrentThread(); 346 JNIEnv* env = AttachCurrentThread();
350 if (bg_thread_client_object_.is_null() && !java_object_.is_null()) { 347 if (bg_thread_client_object_.is_null() && !java_object_.is_null()) {
351 bg_thread_client_object_.Reset( 348 bg_thread_client_object_.Reset(
352 Java_AwContentsIoThreadClient_getBackgroundThreadClient(env, 349 Java_AwContentsIoThreadClient_getBackgroundThreadClient(env,
353 java_object_)); 350 java_object_));
354 } 351 }
355 if (!bg_thread_client_object_.is_null()) { 352 if (!bg_thread_client_object_.is_null()) {
356 get_response = base::Bind( 353 get_response = base::Bind(
357 &RunShouldInterceptRequest, AwWebResourceRequest(*request), 354 &RunShouldInterceptRequest, AwWebResourceRequest(*request),
358 JavaObjectWeakGlobalRef(env, bg_thread_client_object_.obj())); 355 JavaObjectWeakGlobalRef(env, bg_thread_client_object_.obj()));
359 } 356 }
360 BrowserThread::PostTaskAndReplyWithResult(BrowserThread::FILE, FROM_HERE, 357 BrowserThread::PostTaskAndReplyWithResult(BrowserThread::FILE, FROM_HERE,
361 get_response, callback); 358 get_response, callback);
362 } 359 }
363 360
364 bool AwContentsIoThreadClientImpl::ShouldBlockContentUrls() const { 361 bool AwContentsIoThreadClient::ShouldBlockContentUrls() const {
365 DCHECK_CURRENTLY_ON(BrowserThread::IO); 362 DCHECK_CURRENTLY_ON(BrowserThread::IO);
366 if (java_object_.is_null()) 363 if (java_object_.is_null())
367 return false; 364 return false;
368 365
369 JNIEnv* env = AttachCurrentThread(); 366 JNIEnv* env = AttachCurrentThread();
370 return Java_AwContentsIoThreadClient_shouldBlockContentUrls(env, 367 return Java_AwContentsIoThreadClient_shouldBlockContentUrls(env,
371 java_object_); 368 java_object_);
372 } 369 }
373 370
374 bool AwContentsIoThreadClientImpl::ShouldBlockFileUrls() const { 371 bool AwContentsIoThreadClient::ShouldBlockFileUrls() const {
375 DCHECK_CURRENTLY_ON(BrowserThread::IO); 372 DCHECK_CURRENTLY_ON(BrowserThread::IO);
376 if (java_object_.is_null()) 373 if (java_object_.is_null())
377 return false; 374 return false;
378 375
379 JNIEnv* env = AttachCurrentThread(); 376 JNIEnv* env = AttachCurrentThread();
380 return Java_AwContentsIoThreadClient_shouldBlockFileUrls(env, java_object_); 377 return Java_AwContentsIoThreadClient_shouldBlockFileUrls(env, java_object_);
381 } 378 }
382 379
383 bool AwContentsIoThreadClientImpl::ShouldAcceptThirdPartyCookies() const { 380 bool AwContentsIoThreadClient::ShouldAcceptThirdPartyCookies() const {
384 DCHECK_CURRENTLY_ON(BrowserThread::IO); 381 DCHECK_CURRENTLY_ON(BrowserThread::IO);
385 if (java_object_.is_null()) 382 if (java_object_.is_null())
386 return false; 383 return false;
387 384
388 JNIEnv* env = AttachCurrentThread(); 385 JNIEnv* env = AttachCurrentThread();
389 return Java_AwContentsIoThreadClient_shouldAcceptThirdPartyCookies( 386 return Java_AwContentsIoThreadClient_shouldAcceptThirdPartyCookies(
390 env, java_object_); 387 env, java_object_);
391 } 388 }
392 389
393 bool AwContentsIoThreadClientImpl::GetSafeBrowsingEnabled() const { 390 bool AwContentsIoThreadClient::GetSafeBrowsingEnabled() const {
394 DCHECK_CURRENTLY_ON(BrowserThread::IO); 391 DCHECK_CURRENTLY_ON(BrowserThread::IO);
395 if (java_object_.is_null()) 392 if (java_object_.is_null())
396 return false; 393 return false;
397 394
398 JNIEnv* env = AttachCurrentThread(); 395 JNIEnv* env = AttachCurrentThread();
399 return Java_AwContentsIoThreadClient_getSafeBrowsingEnabled(env, 396 return Java_AwContentsIoThreadClient_getSafeBrowsingEnabled(env,
400 java_object_); 397 java_object_);
401 } 398 }
402 399
403 bool AwContentsIoThreadClientImpl::ShouldBlockNetworkLoads() const { 400 bool AwContentsIoThreadClient::ShouldBlockNetworkLoads() const {
404 DCHECK_CURRENTLY_ON(BrowserThread::IO); 401 DCHECK_CURRENTLY_ON(BrowserThread::IO);
405 if (java_object_.is_null()) 402 if (java_object_.is_null())
406 return false; 403 return false;
407 404
408 JNIEnv* env = AttachCurrentThread(); 405 JNIEnv* env = AttachCurrentThread();
409 return Java_AwContentsIoThreadClient_shouldBlockNetworkLoads(env, 406 return Java_AwContentsIoThreadClient_shouldBlockNetworkLoads(env,
410 java_object_); 407 java_object_);
411 } 408 }
412 409
413 } // namespace android_webview 410 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698