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