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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d9689f1a8225d26830e9e38aa4a50a46e81380a4 |
--- /dev/null |
+++ b/chrome/browser/prerender/prerender_message_filter.cc |
@@ -0,0 +1,108 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/prerender/prerender_message_filter.h" |
+ |
+#include "base/bind.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/prerender/prerender_link_manager.h" |
+#include "chrome/browser/prerender/prerender_link_manager_factory.h" |
+#include "chrome/browser/profiles/profile_manager.h" |
+#include "chrome/common/prerender_messages.h" |
+#include "content/public/browser/browser_thread.h" |
+ |
+using content::BrowserThread; |
+ |
+namespace { |
+ |
+void OnChannelClosingInUIThread(Profile* profile, int render_process_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (!g_browser_process->profile_manager()->IsValidProfile(profile)) |
+ return; |
+ prerender::PrerenderLinkManager* prerender_link_manager = |
+ prerender::PrerenderLinkManagerFactory::GetForProfile(profile); |
+ if (!prerender_link_manager) |
+ return; |
+ prerender_link_manager->OnChannelClosing(render_process_id); |
+} |
+ |
+} // namespace |
+ |
+namespace prerender { |
+ |
+PrerenderMessageFilter::PrerenderMessageFilter(int render_process_id, |
+ Profile* profile) |
+ : render_process_id_(render_process_id), |
+ profile_(profile) { |
+} |
+ |
+PrerenderMessageFilter::~PrerenderMessageFilter() { |
+} |
+ |
+bool PrerenderMessageFilter::OnMessageReceived(const IPC::Message& message, |
+ bool* message_was_ok) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP_EX(PrerenderMessageFilter, message, *message_was_ok) |
+ IPC_MESSAGE_HANDLER(PrerenderHostMsg_AddPrerender, OnAddPrerender) |
+ IPC_MESSAGE_HANDLER(PrerenderHostMsg_CancelPrerender, OnCancelPrerender) |
+ IPC_MESSAGE_HANDLER(PrerenderHostMsg_AbandonPrerender, OnAbandonPrerender) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ |
+ return handled; |
+} |
+ |
+void PrerenderMessageFilter::OverrideThreadForMessage( |
+ const IPC::Message& message, content::BrowserThread::ID* thread) { |
+ if (message.type() == PrerenderHostMsg_AddPrerender::ID || |
+ message.type() == PrerenderHostMsg_CancelPrerender::ID || |
+ message.type() == PrerenderHostMsg_AbandonPrerender::ID) { |
+ *thread = BrowserThread::UI; |
+ } |
+} |
+ |
+void PrerenderMessageFilter::OnChannelClosing() { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&OnChannelClosingInUIThread, profile_, render_process_id_)); |
+} |
+ |
+void PrerenderMessageFilter::OnAddPrerender( |
+ int prerender_id, |
+ const GURL& url, |
+ const content::Referrer& referrer, |
+ const gfx::Size& size, |
+ int render_view_route_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ PrerenderLinkManager* prerender_link_manager = |
+ PrerenderLinkManagerFactory::GetForProfile(profile_); |
+ if (!prerender_link_manager) |
+ return; |
+ prerender_link_manager->OnAddPrerender( |
+ render_process_id_, prerender_id, |
+ url, referrer, size, render_view_route_id); |
+} |
+ |
+void PrerenderMessageFilter::OnCancelPrerender( |
+ int prerender_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ PrerenderLinkManager* prerender_link_manager = |
+ PrerenderLinkManagerFactory::GetForProfile(profile_); |
+ if (!prerender_link_manager) |
+ return; |
+ prerender_link_manager->OnCancelPrerender(render_process_id_, prerender_id); |
+} |
+ |
+void PrerenderMessageFilter::OnAbandonPrerender( |
+ int prerender_id) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ PrerenderLinkManager* prerender_link_manager = |
+ PrerenderLinkManagerFactory::GetForProfile(profile_); |
+ if (!prerender_link_manager) |
+ return; |
+ prerender_link_manager->OnAbandonPrerender(render_process_id_, prerender_id); |
+} |
+ |
+} // namespace prerender |
+ |