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 3// found in the LICENSE file. 4 5#ifndef ANDROID_WEBVIEW_LIB_RENDERER_HOST_AW_RESOURCE_DISPATCHER_HOST_DELEGATE_H_ 6#define ANDROID_WEBVIEW_LIB_RENDERER_HOST_AW_RESOURCE_DISPATCHER_HOST_DELEGATE_H_ 7 8#include <map> 9 10#include "base/lazy_instance.h" 11#include "content/public/browser/resource_dispatcher_host_delegate.h" 12 13namespace content { 14class ResourceDispatcherHostLoginDelegate; 15struct ResourceResponse; 16} // namespace content 17 18namespace IPC { 19class Sender; 20} // namespace IPC 21 22namespace android_webview { 23 24class IoThreadClientThrottle; 25 26class AwResourceDispatcherHostDelegate 27 : public content::ResourceDispatcherHostDelegate { 28 public: 29 static void ResourceDispatcherHostCreated(); 30 31 // Overriden methods from ResourceDispatcherHostDelegate. 32 virtual void RequestBeginning( 33 net::URLRequest* request, 34 content::ResourceContext* resource_context, 35 content::AppCacheService* appcache_service, 36 content::ResourceType resource_type, 37 ScopedVector<content::ResourceThrottle>* throttles) OVERRIDE; 38 virtual void DownloadStarting( 39 net::URLRequest* request, 40 content::ResourceContext* resource_context, 41 int child_id, 42 int route_id, 43 int request_id, 44 bool is_content_initiated, 45 bool must_download, 46 ScopedVector<content::ResourceThrottle>* throttles) OVERRIDE; 47 virtual content::ResourceDispatcherHostLoginDelegate* CreateLoginDelegate( 48 net::AuthChallengeInfo* auth_info, 49 net::URLRequest* request) OVERRIDE; 50 virtual bool HandleExternalProtocol(const GURL& url, 51 int child_id, 52 int route_id) OVERRIDE; 53 virtual void OnResponseStarted( 54 net::URLRequest* request, 55 content::ResourceContext* resource_context, 56 content::ResourceResponse* response, 57 IPC::Sender* sender) OVERRIDE; 58 59 virtual void OnRequestRedirected( 60 const GURL& redirect_url, 61 net::URLRequest* request, 62 content::ResourceContext* resource_context, 63 content::ResourceResponse* response) OVERRIDE; 64 65 void RemovePendingThrottleOnIoThread(IoThreadClientThrottle* throttle); 66 67 static void OnIoThreadClientReady(int new_render_process_id, 68 int new_render_frame_id); 69 static void AddPendingThrottle(int render_process_id, 70 int render_frame_id, 71 IoThreadClientThrottle* pending_throttle); 72 73 private: 74 friend struct base::DefaultLazyInstanceTraits< 75 AwResourceDispatcherHostDelegate>; 76 AwResourceDispatcherHostDelegate(); 77 virtual ~AwResourceDispatcherHostDelegate(); 78 79 // These methods must be called on IO thread. 80 void OnIoThreadClientReadyInternal(int new_render_process_id, 81 int new_render_frame_id); 82 void AddPendingThrottleOnIoThread(int render_process_id, 83 int render_frame_id, 84 IoThreadClientThrottle* pending_throttle); 85 void AddExtraHeadersIfNeeded(net::URLRequest* request, 86 content::ResourceContext* resource_context); 87 88 // Pair of render_process_id and render_frame_id. 89 typedef std::pair<int, int> FrameRouteIDPair; 90 typedef std::map<FrameRouteIDPair, IoThreadClientThrottle*> 91 PendingThrottleMap; 92 93 // Only accessed on the IO thread. 94 PendingThrottleMap pending_throttles_; 95 96 DISALLOW_COPY_AND_ASSIGN(AwResourceDispatcherHostDelegate); 97}; 98 99} // namespace android_webview 100 101#endif // ANDROID_WEBVIEW_LIB_RENDERER_HOST_AW_RESOURCE_DISPATCHER_HOST_H_ 102