Index: chrome/browser/renderer_host/resource_dispatcher_host.cc |
=================================================================== |
--- chrome/browser/renderer_host/resource_dispatcher_host.cc (revision 19906) |
+++ chrome/browser/renderer_host/resource_dispatcher_host.cc (working copy) |
@@ -30,13 +30,14 @@ |
#include "chrome/browser/renderer_host/cross_site_resource_handler.h" |
#include "chrome/browser/renderer_host/download_resource_handler.h" |
#include "chrome/browser/renderer_host/render_view_host.h" |
+#include "chrome/browser/renderer_host/render_view_host_delegate.h" |
#include "chrome/browser/renderer_host/resource_request_details.h" |
#include "chrome/browser/renderer_host/safe_browsing_resource_handler.h" |
#include "chrome/browser/renderer_host/save_file_resource_handler.h" |
#include "chrome/browser/renderer_host/sync_resource_handler.h" |
#include "chrome/browser/ssl/ssl_client_auth_handler.h" |
+#include "chrome/browser/ssl/ssl_manager.h" |
#include "chrome/browser/tab_contents/tab_util.h" |
-#include "chrome/browser/tab_contents/tab_contents.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/notification_service.h" |
#include "chrome/common/render_messages.h" |
@@ -108,6 +109,48 @@ |
// This bound is 25MB, which allows for around 6000 outstanding requests. |
const int kMaxOutstandingRequestsCostPerProcess = 26214400; |
+// A NotificationTask proxies a resource dispatcher notification from the IO |
+// thread to the RenderViewHostDelegate on the UI thread. It should be |
+// constructed on the IO thread and run in the UI thread. |
+class NotificationTask : public Task { |
+ public: |
+ // Supply the originating URLRequest, a function on RenderViewHostDelegate |
+ // to call, and the details to use as the parameter to the given function. |
+ // |
+ // This object will take ownership of the details pointer, which must be |
+ // allocated on the heap. |
+ NotificationTask( |
+ URLRequest* request, |
+ void (RenderViewHostDelegate::* function)(ResourceRequestDetails*), |
+ ResourceRequestDetails* details) |
+ : function_(function), |
+ details_(details) { |
+ if (!ResourceDispatcherHost::RenderViewForRequest(request, |
+ &render_process_host_id_, |
+ &render_view_host_id_)) |
+ NOTREACHED(); |
+ } |
+ |
+ virtual void Run() { |
+ RenderViewHost* rvh = RenderViewHost::FromID(render_process_host_id_, |
+ render_view_host_id_); |
+ if (rvh) |
+ (rvh->delegate()->*function_)(details_.get()); |
+ } |
+ |
+ private: |
+ int render_process_host_id_; |
+ int render_view_host_id_; |
+ |
+ // The function to call on RenderViewHostDelegate on the UI thread. |
+ void (RenderViewHostDelegate::* function_)(ResourceRequestDetails*); |
+ |
+ // The details for the notification. |
+ scoped_ptr<ResourceRequestDetails> details_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(NotificationTask); |
+}; |
+ |
// Consults the RendererSecurity policy to determine whether the |
// ResourceDispatcherHost should service this request. A request might be |
// disallowed if the renderer is not authorized to restrive the request URL or |
@@ -1325,46 +1368,6 @@ |
return i->second; |
} |
-// A NotificationTask proxies a resource dispatcher notification from the IO |
-// thread to the UI thread. It should be constructed on the IO thread and run |
-// in the UI thread. Takes ownership of |details|. |
-class NotificationTask : public Task { |
- public: |
- NotificationTask(NotificationType type, |
- URLRequest* request, |
- ResourceRequestDetails* details) |
- : type_(type), |
- details_(details) { |
- if (!ResourceDispatcherHost::RenderViewForRequest(request, |
- &process_id_, |
- &tab_contents_id_)) |
- NOTREACHED(); |
- } |
- |
- void Run() { |
- // Find the tab associated with this request. |
- TabContents* tab_contents = |
- tab_util::GetTabContentsByID(process_id_, tab_contents_id_); |
- |
- if (tab_contents) { |
- // Issue the notification. |
- NotificationService::current()->Notify( |
- type_, |
- Source<NavigationController>(&tab_contents->controller()), |
- Details<ResourceRequestDetails>(details_.get())); |
- } |
- } |
- |
- private: |
- // These IDs let us find the correct tab on the UI thread. |
- int process_id_; |
- int tab_contents_id_; |
- |
- // The type and details of the notification. |
- NotificationType type_; |
- scoped_ptr<ResourceRequestDetails> details_; |
-}; |
- |
static int GetCertID(URLRequest* request, int process_id) { |
if (request->ssl_info().cert) { |
return CertStore::GetSharedInstance()->StoreCert(request->ssl_info().cert, |
@@ -1388,10 +1391,10 @@ |
FOR_EACH_OBSERVER(Observer, observer_list_, OnRequestStarted(this, request)); |
// Notify the observers on the UI thread. |
- ui_loop_->PostTask(FROM_HERE, |
- new NotificationTask(NotificationType::RESOURCE_RESPONSE_STARTED, request, |
- new ResourceRequestDetails(request, |
- GetCertID(request, process_id)))); |
+ ui_loop_->PostTask(FROM_HERE, new NotificationTask(request, |
+ &RenderViewHostDelegate::DidStartReceivingResourceResponse, |
+ new ResourceRequestDetails(request, |
+ GetCertID(request, process_id)))); |
} |
void ResourceDispatcherHost::NotifyResponseCompleted( |
@@ -1400,13 +1403,6 @@ |
// Notify the observers on the IO thread. |
FOR_EACH_OBSERVER(Observer, observer_list_, |
OnResponseCompleted(this, request)); |
- |
- // Notify the observers on the UI thread. |
- ui_loop_->PostTask(FROM_HERE, |
- new NotificationTask(NotificationType::RESOURCE_RESPONSE_COMPLETED, |
- request, |
- new ResourceRequestDetails(request, |
- GetCertID(request, process_id)))); |
} |
void ResourceDispatcherHost::NotifyReceivedRedirect(URLRequest* request, |
@@ -1420,8 +1416,8 @@ |
// Notify the observers on the UI thread. |
ui_loop_->PostTask(FROM_HERE, |
- new NotificationTask(NotificationType::RESOURCE_RECEIVED_REDIRECT, |
- request, |
+ new NotificationTask(request, |
+ &RenderViewHostDelegate::DidRedirectResource, |
new ResourceRedirectDetails(request, |
cert_id, |
new_url))); |