Chromium Code Reviews| Index: chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
| diff --git a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
| index 1ea942bff690ca4024f19a338c1ac7a23b7892e9..ded343652a4ad6d0185b7fa5272171f0b1843f45 100644 |
| --- a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
| +++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
| @@ -22,6 +22,7 @@ |
| #include "chrome/browser/metrics/variations/variations_http_header_provider.h" |
| #include "chrome/browser/prefetch/prefetch.h" |
| #include "chrome/browser/prerender/prerender_manager.h" |
| +#include "chrome/browser/prerender/prerender_manager_factory.h" |
| #include "chrome/browser/prerender/prerender_pending_swap_throttle.h" |
| #include "chrome/browser/prerender/prerender_resource_throttle.h" |
| #include "chrome/browser/prerender/prerender_tracker.h" |
| @@ -111,6 +112,64 @@ void NotifyDownloadInitiatedOnUI(int render_process_id, int render_view_id) { |
| content::NotificationService::NoDetails()); |
| } |
| +prerender::PrerenderContents* FindPrerenderContents(int render_process_id, |
| + int render_view_id) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + content::RenderViewHost* rvh = |
| + content::RenderViewHost::FromID(render_process_id, render_view_id); |
| + if (!rvh) |
| + return NULL; |
| + content::WebContents* web_contents = |
| + content::WebContents::FromRenderViewHost(rvh); |
| + if (!web_contents) |
| + return NULL; |
| + |
| + return prerender::PrerenderContents::FromWebContents(web_contents); |
| +} |
| + |
| +prerender::PrerenderManager* GetPrerenderManager(int render_process_id, |
| + int render_view_id) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + |
|
tburkard
2014/02/12 19:54:56
Couldnt you this be done more easily by using Find
jkarlin
2014/02/13 13:24:49
Yes! Done.
|
| + content::RenderViewHost* render_view_host = |
| + content::RenderViewHost::FromID(render_process_id, render_view_id); |
| + if (!render_view_host) |
| + return NULL; |
| + |
| + content::WebContents* web_contents = |
| + content::WebContents::FromRenderViewHost(render_view_host); |
| + if (!web_contents) |
| + return NULL; |
| + |
| + content::BrowserContext* browser_context = web_contents->GetBrowserContext(); |
| + if (!browser_context) |
| + return NULL; |
| + |
| + Profile* profile = Profile::FromBrowserContext(browser_context); |
| + if (!profile) |
| + return NULL; |
| + |
| + return prerender::PrerenderManagerFactory::GetForProfile(profile); |
| +} |
| + |
| +void UpdatePrerenderNetworkBytesCallback(int render_process_id, |
| + int render_view_id, |
| + int64 bytes) { |
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| + |
| + prerender::PrerenderContents* prerender_contents = |
| + FindPrerenderContents(render_process_id, render_view_id); |
| + |
| + if (prerender_contents) |
| + prerender_contents->AddNetworkBytes(bytes); |
| + |
| + prerender::PrerenderManager* prerender_manager = |
| + GetPrerenderManager(render_process_id, render_view_id); |
|
tburkard
2014/02/12 19:54:56
You could remove GetPrerenderManager() entirely, a
jkarlin
2014/02/13 13:24:49
Done.
|
| + if (prerender_manager) { |
| + prerender_manager->AddProfileNetworkBytesIfEnabled(bytes); |
| + } |
| +} |
| + |
| #if !defined(OS_ANDROID) |
| // Goes through the extension's file browser handlers and checks if there is one |
| // that can handle the |mime_type|. |
| @@ -159,19 +218,9 @@ void SendExecuteMimeTypeHandlerEvent(scoped_ptr<content::StreamHandle> stream, |
| void LaunchURL(const GURL& url, int render_process_id, int render_view_id) { |
| // If there is no longer a WebContents, the request may have raced with tab |
| // closing. Don't fire the external request. (It may have been a prerender.) |
| - content::RenderViewHost* rvh = content::RenderViewHost::FromID( |
| - render_process_id, render_view_id); |
| - if (!rvh) |
| - return; |
| - content::WebContents* web_contents = |
| - content::WebContents::FromRenderViewHost(rvh); |
| - if (!web_contents) |
| - return; |
| - // If the request was for a prerender, abort the prerender and do not |
| - // continue. |
| prerender::PrerenderContents* prerender_contents = |
| - prerender::PrerenderContents::FromWebContents(web_contents); |
| + FindPrerenderContents(render_process_id, render_view_id); |
| if (prerender_contents) { |
| prerender_contents->Destroy(prerender::FINAL_STATUS_UNSUPPORTED_SCHEME); |
| prerender::ReportPrerenderExternalURL(); |
| @@ -621,6 +670,22 @@ void ChromeResourceDispatcherHostDelegate::OnRequestRedirected( |
| info->GetChildID(), info->GetRouteID()); |
| } |
| +// Notification that a request has completed. |
| +void ChromeResourceDispatcherHostDelegate::RequestComplete( |
| + net::URLRequest* url_request, |
| + int render_process_id, |
| + int render_view_id) { |
| + // Jump on the UI thread and inform the prerender about the bytes. |
| + if (url_request && !url_request->was_cached()) { |
| + BrowserThread::PostTask(BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(&UpdatePrerenderNetworkBytesCallback, |
| + render_process_id, |
| + render_view_id, |
| + url_request->GetTotalReceivedBytes())); |
| + } |
| +} |
| + |
| // static |
| void ChromeResourceDispatcherHostDelegate:: |
| SetExternalProtocolHandlerDelegateForTesting( |