1 // Copyright 2014 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.
5 #include "content/browser/appcache/appcache_interceptor.h"
7 #include "content/browser/appcache/appcache_backend_impl.h"
8 #include "content/browser/appcache/appcache_host.h"
9 #include "content/browser/appcache/appcache_request_handler.h"
10 #include "content/browser/appcache/appcache_service_impl.h"
11 #include "content/browser/appcache/appcache_url_request_job.h"
12 #include "content/common/appcache_interfaces.h"
16 class AppCacheInterceptor::StartInterceptor
17 : public net::URLRequestInterceptor {
20 ~StartInterceptor() override {}
21 net::URLRequestJob* MaybeInterceptRequest(
22 net::URLRequest* request,
23 net::NetworkDelegate* network_delegate) const override {
24 AppCacheRequestHandler* handler = GetHandler(request);
27 return handler->MaybeLoadResource(request, network_delegate);
31 DISALLOW_COPY_AND_ASSIGN(StartInterceptor);
36 AppCacheInterceptor* AppCacheInterceptor::GetInstance() {
37 return Singleton<AppCacheInterceptor>::get();
41 scoped_ptr<net::URLRequestInterceptor>
42 AppCacheInterceptor::CreateStartInterceptor() {
43 return scoped_ptr<net::URLRequestInterceptor>(
44 new StartInterceptor);
47 void AppCacheInterceptor::SetHandler(net::URLRequest* request,
48 AppCacheRequestHandler* handler) {
49 request->SetUserData(GetInstance(), handler); // request takes ownership
52 AppCacheRequestHandler* AppCacheInterceptor::GetHandler(
53 net::URLRequest* request) {
54 return static_cast<AppCacheRequestHandler*>(
55 request->GetUserData(GetInstance()));
58 void AppCacheInterceptor::SetExtraRequestInfo(
59 net::URLRequest* request,
60 AppCacheServiceImpl* service,
63 ResourceType resource_type) {
64 if (!service || (host_id == kAppCacheNoHostId))
67 AppCacheBackendImpl* backend = service->GetBackend(process_id);
71 // TODO(michaeln): An invalid host id is indicative of bad data
72 // from a child process. How should we handle that here?
73 AppCacheHost* host = backend->GetHost(host_id);
77 // Create a handler for this request and associate it with the request.
78 AppCacheRequestHandler* handler =
79 host->CreateRequestHandler(request, resource_type);
81 SetHandler(request, handler);
84 void AppCacheInterceptor::GetExtraResponseInfo(net::URLRequest* request,
87 DCHECK(*cache_id == kAppCacheNoCacheId);
88 DCHECK(manifest_url->is_empty());
89 AppCacheRequestHandler* handler = GetHandler(request);
91 handler->GetExtraResponseInfo(cache_id, manifest_url);
94 void AppCacheInterceptor::PrepareForCrossSiteTransfer(
95 net::URLRequest* request,
97 AppCacheRequestHandler* handler = GetHandler(request);
100 handler->PrepareForCrossSiteTransfer(old_process_id);
103 void AppCacheInterceptor::CompleteCrossSiteTransfer(
104 net::URLRequest* request,
107 AppCacheRequestHandler* handler = GetHandler(request);
110 DCHECK_NE(kAppCacheNoHostId, new_host_id);
111 handler->CompleteCrossSiteTransfer(new_process_id,
115 AppCacheInterceptor::AppCacheInterceptor() {
116 net::URLRequest::Deprecated::RegisterRequestInterceptor(this);
119 AppCacheInterceptor::~AppCacheInterceptor() {
120 net::URLRequest::Deprecated::UnregisterRequestInterceptor(this);
123 net::URLRequestJob* AppCacheInterceptor::MaybeIntercept(
124 net::URLRequest* request, net::NetworkDelegate* network_delegate) {
125 // Intentionally empty, handled by class StartInterceptor.
129 net::URLRequestJob* AppCacheInterceptor::MaybeInterceptRedirect(
130 net::URLRequest* request,
131 net::NetworkDelegate* network_delegate,
132 const GURL& location) {
133 AppCacheRequestHandler* handler = GetHandler(request);
136 return handler->MaybeLoadFallbackForRedirect(
137 request, network_delegate, location);
140 net::URLRequestJob* AppCacheInterceptor::MaybeInterceptResponse(
141 net::URLRequest* request, net::NetworkDelegate* network_delegate) {
142 AppCacheRequestHandler* handler = GetHandler(request);
145 return handler->MaybeLoadFallbackForResponse(request, network_delegate);
148 } // namespace content