Index: chrome/browser/prerender/prerender_message_filter.cc |
diff --git a/chrome/browser/prerender/prerender_message_filter.cc b/chrome/browser/prerender/prerender_message_filter.cc |
index f69a1be4cedc806c4c5743f0ab9d1cd520b5350b..438ee4d00563e57694c26c5789fc15015d1a2021 100644 |
--- a/chrome/browser/prerender/prerender_message_filter.cc |
+++ b/chrome/browser/prerender/prerender_message_filter.cc |
@@ -7,8 +7,10 @@ |
#include "base/bind.h" |
#include "base/macros.h" |
#include "base/memory/singleton.h" |
+#include "chrome/browser/prerender/prerender_final_status.h" |
#include "chrome/browser/prerender/prerender_link_manager.h" |
#include "chrome/browser/prerender/prerender_link_manager_factory.h" |
+#include "chrome/browser/prerender/prerender_manager_factory.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/prerender_messages.h" |
#include "components/keyed_service/content/browser_context_keyed_service_shutdown_notifier_factory.h" |
@@ -45,6 +47,8 @@ class ShutdownNotifierFactory |
PrerenderMessageFilter::PrerenderMessageFilter(int render_process_id, |
Profile* profile) |
: BrowserMessageFilter(PrerenderMsgStart), |
+ prerender_manager_( |
+ PrerenderManagerFactory::GetForBrowserContext(profile)), |
render_process_id_(render_process_id), |
prerender_link_manager_( |
PrerenderLinkManagerFactory::GetForProfile(profile)) { |
@@ -71,6 +75,7 @@ bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message) { |
PrerenderHostMsg_CancelLinkRelPrerender, OnCancelPrerender) |
IPC_MESSAGE_HANDLER( |
PrerenderHostMsg_AbandonLinkRelPrerender, OnAbandonPrerender) |
+ IPC_MESSAGE_HANDLER(PrerenderHostMsg_PrefetchFinished, OnPrefetchFinished) |
IPC_MESSAGE_UNHANDLED(handled = false) |
IPC_END_MESSAGE_MAP() |
@@ -81,7 +86,8 @@ void PrerenderMessageFilter::OverrideThreadForMessage( |
const IPC::Message& message, content::BrowserThread::ID* thread) { |
if (message.type() == PrerenderHostMsg_AddLinkRelPrerender::ID || |
message.type() == PrerenderHostMsg_CancelLinkRelPrerender::ID || |
- message.type() == PrerenderHostMsg_AbandonLinkRelPrerender::ID) { |
+ message.type() == PrerenderHostMsg_AbandonLinkRelPrerender::ID || |
+ message.type() == PrerenderHostMsg_PrefetchFinished::ID) { |
*thread = BrowserThread::UI; |
} |
} |
@@ -128,6 +134,19 @@ void PrerenderMessageFilter::OnAbandonPrerender( |
prerender_link_manager_->OnAbandonPrerender(render_process_id_, prerender_id); |
} |
+void PrerenderMessageFilter::OnPrefetchFinished() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ DCHECK(prerender_manager_); |
+ // Kill the process doing the prefetch. Only one prefetch per renderer is |
+ // possible, also prefetches are not shared with other renderer processes. |
+ if (prerender_manager_) { |
+ PrerenderContents* prerender_contents = |
+ prerender_manager_->GetPrerenderContentsForProcess(render_process_id_); |
+ if (prerender_contents) |
+ prerender_contents->Destroy(FINAL_STATUS_NOSTATE_PREFETCH_FINISHED); |
+ } |
+} |
+ |
void PrerenderMessageFilter::ShutdownOnUIThread() { |
prerender_link_manager_ = nullptr; |
shutdown_notifier_.reset(); |