15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/browser/aw_request_interceptor.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/browser/aw_contents_io_thread_client.h" 86d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "android_webview/browser/aw_web_resource_response.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_request_info.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_context_getter.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_request_job.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::ResourceRequestInfo; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android_webview { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const void* kRequestAlreadyQueriedDataKey = &kRequestAlreadyQueriedDataKey; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwRequestInterceptor::AwRequestInterceptor() { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwRequestInterceptor::~AwRequestInterceptor() { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)scoped_ptr<AwWebResourceResponse> 386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)AwRequestInterceptor::QueryForAwWebResourceResponse( 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& location, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request) const { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_process_id, render_frame_id; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ResourceRequestInfo::GetRenderFrameForRequest( 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) request, &render_process_id, &render_frame_id)) 456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return scoped_ptr<AwWebResourceResponse>(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AwContentsIoThreadClient> io_thread_client = 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AwContentsIoThreadClient::FromID(render_process_id, render_frame_id); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!io_thread_client.get()) 516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return scoped_ptr<AwWebResourceResponse>(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return io_thread_client->ShouldInterceptRequest(location, request).Pass(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)net::URLRequestJob* AwRequestInterceptor::MaybeInterceptRequest( 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequest* request, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::NetworkDelegate* network_delegate) const { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // See if we've already found out the aw_web_resource_response for this 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is done not only for efficiency reasons, but also for correctness 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as it is possible for the Interceptor chain to be invoked more than once 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // in which case we don't want to query the embedder multiple times. 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Note: The Interceptor chain is not invoked more than once if we create a 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // URLRequestJob in this method, so this is only caching negative hits. 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (request->GetUserData(kRequestAlreadyQueriedDataKey)) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return NULL; 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request->SetUserData(kRequestAlreadyQueriedDataKey, 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new base::SupportsUserData::Data()); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_ptr<AwWebResourceResponse> aw_web_resource_response = 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) QueryForAwWebResourceResponse(request->url(), request); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!aw_web_resource_response) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // The newly created job will own the AwWebResourceResponse. 806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return AwWebResourceResponse::CreateJobFor( 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) aw_web_resource_response.Pass(), request, network_delegate); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace android_webview 85