Home | History | Annotate | Download | only in appcache
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "webkit/browser/appcache/appcache_interceptor.h"
      6 
      7 #include "webkit/browser/appcache/appcache_backend_impl.h"
      8 #include "webkit/browser/appcache/appcache_host.h"
      9 #include "webkit/browser/appcache/appcache_request_handler.h"
     10 #include "webkit/browser/appcache/appcache_service.h"
     11 #include "webkit/browser/appcache/appcache_url_request_job.h"
     12 #include "webkit/common/appcache/appcache_interfaces.h"
     13 
     14 namespace appcache {
     15 
     16 // static
     17 AppCacheInterceptor* AppCacheInterceptor::GetInstance() {
     18   return Singleton<AppCacheInterceptor>::get();
     19 }
     20 
     21 void AppCacheInterceptor::SetHandler(
     22     net::URLRequest* request, AppCacheRequestHandler* handler) {
     23   request->SetUserData(GetInstance(), handler);  // request takes ownership
     24 }
     25 
     26 AppCacheRequestHandler* AppCacheInterceptor::GetHandler(
     27     net::URLRequest* request) {
     28   return reinterpret_cast<AppCacheRequestHandler*>(
     29       request->GetUserData(GetInstance()));
     30 }
     31 
     32 void AppCacheInterceptor::SetExtraRequestInfo(
     33     net::URLRequest* request, AppCacheService* service, int process_id,
     34     int host_id, ResourceType::Type resource_type) {
     35   if (!service || (host_id == kNoHostId))
     36     return;
     37 
     38   AppCacheBackendImpl* backend = service->GetBackend(process_id);
     39   if (!backend)
     40     return;
     41 
     42   // TODO(michaeln): An invalid host id is indicative of bad data
     43   // from a child process. How should we handle that here?
     44   AppCacheHost* host = backend->GetHost(host_id);
     45   if (!host)
     46     return;
     47 
     48   // Create a handler for this request and associate it with the request.
     49   AppCacheRequestHandler* handler =
     50       host->CreateRequestHandler(request, resource_type);
     51   if (handler)
     52     SetHandler(request, handler);
     53 }
     54 
     55 void AppCacheInterceptor::GetExtraResponseInfo(net::URLRequest* request,
     56                                                int64* cache_id,
     57                                                GURL* manifest_url) {
     58   DCHECK(*cache_id == kNoCacheId);
     59   DCHECK(manifest_url->is_empty());
     60   AppCacheRequestHandler* handler = GetHandler(request);
     61   if (handler)
     62     handler->GetExtraResponseInfo(cache_id, manifest_url);
     63 }
     64 
     65 AppCacheInterceptor::AppCacheInterceptor() {
     66   net::URLRequest::Deprecated::RegisterRequestInterceptor(this);
     67 }
     68 
     69 AppCacheInterceptor::~AppCacheInterceptor() {
     70   net::URLRequest::Deprecated::UnregisterRequestInterceptor(this);
     71 }
     72 
     73 net::URLRequestJob* AppCacheInterceptor::MaybeIntercept(
     74     net::URLRequest* request, net::NetworkDelegate* network_delegate) {
     75   AppCacheRequestHandler* handler = GetHandler(request);
     76   if (!handler)
     77     return NULL;
     78   return handler->MaybeLoadResource(request, network_delegate);
     79 }
     80 
     81 net::URLRequestJob* AppCacheInterceptor::MaybeInterceptRedirect(
     82     net::URLRequest* request,
     83     net::NetworkDelegate* network_delegate,
     84     const GURL& location) {
     85   AppCacheRequestHandler* handler = GetHandler(request);
     86   if (!handler)
     87     return NULL;
     88   return handler->MaybeLoadFallbackForRedirect(
     89       request, network_delegate, location);
     90 }
     91 
     92 net::URLRequestJob* AppCacheInterceptor::MaybeInterceptResponse(
     93     net::URLRequest* request, net::NetworkDelegate* network_delegate) {
     94   AppCacheRequestHandler* handler = GetHandler(request);
     95   if (!handler)
     96     return NULL;
     97   return handler->MaybeLoadFallbackForResponse(request, network_delegate);
     98 }
     99 
    100 }  // namespace appcache
    101