Get rid of a few more interfaces from RenderViewHostDelegate that aren't needed.
Review URL: http://codereview.chromium.org/6374009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@72522 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/download/save_package.cc b/chrome/browser/download/save_package.cc
index 53fc1fe..8d8a834 100644
--- a/chrome/browser/download/save_package.cc
+++ b/chrome/browser/download/save_package.cc
@@ -44,6 +44,7 @@
 #include "chrome/common/notification_service.h"
 #include "chrome/common/notification_type.h"
 #include "chrome/common/pref_names.h"
+#include "chrome/common/render_messages.h"
 #include "chrome/common/url_constants.h"
 #include "grit/generated_resources.h"
 #include "net/base/io_buffer.h"
@@ -899,6 +900,18 @@
   }
 }
 
+bool SavePackage::OnMessageReceived(const IPC::Message& message) {
+  bool handled = true;
+  IPC_BEGIN_MESSAGE_MAP(SavePackage, message)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_SendCurrentPageAllSavableResourceLinks,
+                        OnReceivedSavableResourceLinksForCurrentPage)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_SendSerializedHtmlData,
+                        OnReceivedSerializedHtmlData)
+    IPC_MESSAGE_UNHANDLED(handled = false)
+  IPC_END_MESSAGE_MAP()
+  return handled;
+}
+
 // After finishing all SaveItems which need to get data from net.
 // We collect all URLs which have local storage and send the
 // map:(originalURL:currentLocalPath) to render process (backend).
diff --git a/chrome/browser/download/save_package.h b/chrome/browser/download/save_package.h
index ddfc172..62c1c1d 100644
--- a/chrome/browser/download/save_package.h
+++ b/chrome/browser/download/save_package.h
@@ -16,8 +16,8 @@
 #include "base/hash_tables.h"
 #include "base/ref_counted.h"
 #include "base/task.h"
-#include "chrome/browser/renderer_host/render_view_host_delegate.h"
 #include "chrome/browser/shell_dialogs.h"
+#include "chrome/browser/tab_contents/web_navigation_observer.h"
 #include "googleurl/src/gurl.h"
 
 class SaveFileManager;
@@ -54,7 +54,7 @@
 // by the SavePackage. SaveItems are created when a user initiates a page
 // saving job, and exist for the duration of one tab's life time.
 class SavePackage : public base::RefCountedThreadSafe<SavePackage>,
-                    public RenderViewHostDelegate::Save,
+                    public WebNavigationObserver,
                     public SelectFileDialog::Listener {
  public:
   enum SavePackageType {
@@ -128,22 +128,6 @@
 
   void GetSaveInfo();
 
-  // RenderViewHostDelegate::Save ----------------------------------------------
-
-  // Process all of the current page's savable links of subresources, resources
-  // referrers and frames (including the main frame and subframes) from the
-  // render view host.
-  virtual void OnReceivedSavableResourceLinksForCurrentPage(
-      const std::vector<GURL>& resources_list,
-      const std::vector<GURL>& referrers_list,
-      const std::vector<GURL>& frames_list);
-
-  // Process the serialized html content data of a specified web page
-  // gotten from render process.
-  virtual void OnReceivedSerializedHtmlData(const GURL& frame_url,
-                                            const std::string& data,
-                                            int32 status);
-
   // Statics -------------------------------------------------------------------
 
   // Used to disable prompting the user for a directory/filename of the saved
@@ -179,6 +163,9 @@
   void SaveNextFile(bool process_all_remainder_items);
   void DoSavingProcess();
 
+  // WebNavigationObserver implementation.
+  virtual bool OnMessageReceived(const IPC::Message& message);
+
   // Create a file name based on the response from the server.
   bool GenerateFileName(const std::string& disposition,
                         const GURL& url,
@@ -205,6 +192,15 @@
                            bool can_save_as_complete);
   void ContinueSave(const FilePath& final_name, int index);
 
+  void OnReceivedSavableResourceLinksForCurrentPage(
+      const std::vector<GURL>& resources_list,
+      const std::vector<GURL>& referrers_list,
+      const std::vector<GURL>& frames_list);
+
+  void OnReceivedSerializedHtmlData(const GURL& frame_url,
+                                    const std::string& data,
+                                    int32 status);
+
 
   typedef base::hash_map<std::string, SaveItem*> SaveUrlItemMap;
   // in_progress_items_ is map of all saving job in in-progress state.
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index b854971..3c707b8 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -757,6 +757,15 @@
   return extension_host_type_;
 }
 
+bool ExtensionHost::OnMessageReceived(const IPC::Message& message) {
+  bool handled = true;
+  IPC_BEGIN_MESSAGE_MAP(ExtensionHost, message)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnRunFileChooser)
+    IPC_MESSAGE_UNHANDLED(handled = false)
+  IPC_END_MESSAGE_MAP()
+  return handled;
+}
+
 const GURL& ExtensionHost::GetURL() const {
   return url_;
 }
@@ -779,12 +788,6 @@
   }
 }
 
-RenderViewHostDelegate::FileSelect* ExtensionHost::GetFileSelectDelegate() {
-  if (file_select_helper_.get() == NULL)
-    file_select_helper_.reset(new FileSelectHelper(profile()));
-  return file_select_helper_.get();
-}
-
 int ExtensionHost::GetBrowserWindowID() const {
   // Hosts not attached to any browser window have an id of -1.  This includes
   // those mentioned below, and background pages.
@@ -802,3 +805,10 @@
   }
   return window_id;
 }
+
+void ExtensionHost::OnRunFileChooser(
+    const ViewHostMsg_RunFileChooser_Params& params) {
+  if (file_select_helper_.get() == NULL)
+    file_select_helper_.reset(new FileSelectHelper(profile()));
+  file_select_helper_->RunFileChooser(render_view_host_, params);
+}
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
index 51db000..c9422ce 100644
--- a/chrome/browser/extensions/extension_host.h
+++ b/chrome/browser/extensions/extension_host.h
@@ -106,11 +106,11 @@
   // |size_limit| in both width and height.
   void DisableScrollbarsForSmallWindows(const gfx::Size& size_limit);
 
-  // RenderViewHostDelegate::View implementation.
+  // RenderViewHostDelegate implementation.
+  virtual bool OnMessageReceived(const IPC::Message& message);
   virtual const GURL& GetURL() const;
   virtual void RenderViewCreated(RenderViewHost* render_view_host);
   virtual ViewType::Type GetRenderViewType() const;
-  virtual FileSelect* GetFileSelectDelegate();
   virtual int GetBrowserWindowID() const;
   virtual void RenderViewGone(RenderViewHost* render_view_host,
                               base::TerminationStatus status,
@@ -226,6 +226,9 @@
   virtual Browser* GetBrowser();
   virtual gfx::NativeView GetNativeViewOfHost();
 
+  // Message handlers.
+  void OnRunFileChooser(const ViewHostMsg_RunFileChooser_Params& params);
+
   // Handles keyboard events that were not handled by HandleKeyboardEvent().
   // Platform specific implementation may override this method to handle the
   // event in platform specific way.
diff --git a/chrome/browser/fav_icon_helper.cc b/chrome/browser/fav_icon_helper.cc
index 544b4e87..8501ef35 100644
--- a/chrome/browser/fav_icon_helper.cc
+++ b/chrome/browser/fav_icon_helper.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/tab_contents/navigation_entry.h"
 #include "chrome/browser/tab_contents/tab_contents_delegate.h"
 #include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/common/render_messages.h"
 #include "gfx/codec/png_codec.h"
 #include "gfx/favicon_size.h"
 #include "skia/ext/image_operations.h"
@@ -111,9 +112,7 @@
   tab_contents_->NotifyNavigationStateChanged(TabContents::INVALIDATE_TAB);
 }
 
-void FavIconHelper::UpdateFavIconURL(RenderViewHost* render_view_host,
-                                     int32 page_id,
-                                     const GURL& icon_url) {
+void FavIconHelper::OnUpdateFavIconURL(int32 page_id, const GURL& icon_url) {
   // TODO(davemoore) Should clear on empty url. Currently we ignore it.
   // This appears to be what FF does as well.
   if (icon_url.is_empty())
@@ -140,11 +139,20 @@
     DownloadFavIconOrAskHistory(entry);
 }
 
-void FavIconHelper::DidDownloadFavIcon(RenderViewHost* render_view_host,
-                                       int id,
-                                       const GURL& image_url,
-                                       bool errored,
-                                       const SkBitmap& image) {
+bool FavIconHelper::OnMessageReceived(const IPC::Message& message) {
+  bool handled = true;
+  IPC_BEGIN_MESSAGE_MAP(FavIconHelper, message)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFavIconURL, OnUpdateFavIconURL)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_DidDownloadFavIcon, OnDidDownloadFavIcon)
+    IPC_MESSAGE_UNHANDLED(handled = false)
+  IPC_END_MESSAGE_MAP()
+  return handled;
+}
+
+void FavIconHelper::OnDidDownloadFavIcon(int id,
+                                         const GURL& image_url,
+                                         bool errored,
+                                         const SkBitmap& image) {
   DownloadRequests::iterator i = download_requests_.find(id);
   if (i == download_requests_.end()) {
     // Currently TabContents notifies us of ANY downloads so that it is
diff --git a/chrome/browser/fav_icon_helper.h b/chrome/browser/fav_icon_helper.h
index a64eba2..f0706bde 100644
--- a/chrome/browser/fav_icon_helper.h
+++ b/chrome/browser/fav_icon_helper.h
@@ -13,7 +13,7 @@
 #include "base/ref_counted.h"
 #include "chrome/browser/cancelable_request.h"
 #include "chrome/browser/favicon_service.h"
-#include "chrome/browser/renderer_host/render_view_host_delegate.h"
+#include "chrome/browser/tab_contents/web_navigation_observer.h"
 #include "chrome/common/ref_counted_util.h"
 #include "googleurl/src/gurl.h"
 
@@ -65,7 +65,7 @@
 // at which point we update the favicon of the NavigationEntry and notify
 // the database to save the favicon.
 
-class FavIconHelper : public RenderViewHostDelegate::FavIcon {
+class FavIconHelper : public WebNavigationObserver {
  public:
   explicit FavIconHelper(TabContents* tab_contents);
   virtual ~FavIconHelper();
@@ -99,15 +99,14 @@
     ImageDownloadCallback* callback;
   };
 
-  // RenderViewHostDelegate::Favicon implementation.
-  virtual void DidDownloadFavIcon(RenderViewHost* render_view_host,
-                                  int id,
-                                  const GURL& image_url,
-                                  bool errored,
-                                  const SkBitmap& image);
-  virtual void UpdateFavIconURL(RenderViewHost* render_view_host,
-                                int32 page_id,
-                                const GURL& icon_url);
+  // WebNavigationObserver implementation.
+  virtual bool OnMessageReceived(const IPC::Message& message);
+
+  void OnDidDownloadFavIcon(int id,
+                            const GURL& image_url,
+                            bool errored,
+                            const SkBitmap& image);
+  void OnUpdateFavIconURL(int32 page_id, const GURL& icon_url);
 
   // Return the NavigationEntry for the active entry, or NULL if the active
   // entries URL does not match that of the URL last passed to FetchFavIcon.
diff --git a/chrome/browser/file_select_helper.h b/chrome/browser/file_select_helper.h
index ba8441b..3a6fb6a 100644
--- a/chrome/browser/file_select_helper.h
+++ b/chrome/browser/file_select_helper.h
@@ -9,7 +9,6 @@
 #include <vector>
 
 #include "chrome/browser/shell_dialogs.h"
-#include "chrome/browser/renderer_host/render_view_host_delegate.h"
 #include "chrome/common/notification_observer.h"
 #include "chrome/common/notification_registrar.h"
 #include "net/base/directory_lister.h"
@@ -21,7 +20,6 @@
 class FileSelectHelper
     : public SelectFileDialog::Listener,
       public net::DirectoryLister::DirectoryListerDelegate,
-      public RenderViewHostDelegate::FileSelect,
       public NotificationObserver {
  public:
   explicit FileSelectHelper(Profile* profile);
@@ -38,9 +36,9 @@
       const net::DirectoryLister::DirectoryListerData& data);
   virtual void OnListDone(int error);
 
-  // RenderViewHostDelegate::FileSelect
-  virtual void RunFileChooser(RenderViewHost* render_view_host,
-                              const ViewHostMsg_RunFileChooser_Params& params);
+  // Show the file chooser dialog.
+  void RunFileChooser(RenderViewHost* render_view_host,
+                      const ViewHostMsg_RunFileChooser_Params& params);
 
  private:
   // NotificationObserver implementation.
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc
index 84efcf4..2677062 100644
--- a/chrome/browser/printing/print_view_manager.cc
+++ b/chrome/browser/printing/print_view_manager.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/tab_contents/tab_contents.h"
 #include "chrome/common/notification_details.h"
 #include "chrome/common/notification_source.h"
+#include "chrome/common/render_messages.h"
 #include "chrome/common/render_messages_params.h"
 #include "grit/generated_resources.h"
 #include "printing/native_metafile.h"
@@ -73,7 +74,7 @@
     return GURL();
 }
 
-void PrintViewManager::DidGetPrintedPagesCount(int cookie, int number_pages) {
+void PrintViewManager::OnDidGetPrintedPagesCount(int cookie, int number_pages) {
   DCHECK_GT(cookie, 0);
   if (!OpportunisticallyCreatePrintJob(cookie))
     return;
@@ -91,7 +92,7 @@
   }
 }
 
-void PrintViewManager::DidPrintPage(
+void PrintViewManager::OnDidPrintPage(
     const ViewHostMsg_DidPrintPage_Params& params) {
   if (!OpportunisticallyCreatePrintJob(params.document_cookie))
     return;
@@ -143,6 +144,17 @@
   ShouldQuitFromInnerMessageLoop();
 }
 
+bool PrintViewManager::OnMessageReceived(const IPC::Message& message) {
+  bool handled = true;
+  IPC_BEGIN_MESSAGE_MAP(PrintViewManager, message)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_DidGetPrintedPagesCount,
+                        OnDidGetPrintedPagesCount)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_DidPrintPage, OnDidPrintPage)
+    IPC_MESSAGE_UNHANDLED(handled = false)
+  IPC_END_MESSAGE_MAP()
+  return handled;
+}
+
 void PrintViewManager::Observe(NotificationType type,
                                const NotificationSource& source,
                                const NotificationDetails& details) {
diff --git a/chrome/browser/printing/print_view_manager.h b/chrome/browser/printing/print_view_manager.h
index cee7382..2fcf4d1 100644
--- a/chrome/browser/printing/print_view_manager.h
+++ b/chrome/browser/printing/print_view_manager.h
@@ -8,7 +8,7 @@
 
 #include "base/ref_counted.h"
 #include "base/string16.h"
-#include "chrome/browser/renderer_host/render_view_host_delegate.h"
+#include "chrome/browser/tab_contents/web_navigation_observer.h"
 #include "chrome/common/notification_observer.h"
 #include "chrome/common/notification_registrar.h"
 #include "printing/printed_pages_source.h"
@@ -27,7 +27,7 @@
 // delegates a few printing related commands to this instance.
 class PrintViewManager : public NotificationObserver,
                          public PrintedPagesSource,
-                         public RenderViewHostDelegate::Printing {
+                         public WebNavigationObserver {
  public:
   explicit PrintViewManager(TabContents& owner);
   virtual ~PrintViewManager();
@@ -43,16 +43,18 @@
   virtual string16 RenderSourceName();
   virtual GURL RenderSourceUrl();
 
-  // RenderViewHostDelegate::Printing implementation.
-  virtual void DidGetPrintedPagesCount(int cookie, int number_pages);
-  virtual void DidPrintPage(const ViewHostMsg_DidPrintPage_Params& params);
-
   // NotificationObserver implementation.
   virtual void Observe(NotificationType type,
                        const NotificationSource& source,
                        const NotificationDetails& details);
 
+  // WebNavigationObserver implementation.
+  virtual bool OnMessageReceived(const IPC::Message& message);
+
  private:
+  void OnDidGetPrintedPagesCount(int cookie, int number_pages);
+  void OnDidPrintPage(const ViewHostMsg_DidPrintPage_Params& params);
+
   // Processes a NOTIFY_PRINT_JOB_EVENT notification.
   void OnNotifyPrintJobEvent(const JobEventDetails& event_details);
 
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index 5f12b626..566f1fc 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -763,8 +763,6 @@
                         OnMsgDocumentOnLoadCompletedInMainFrame)
     IPC_MESSAGE_HANDLER(ViewMsg_ExecuteCodeFinished,
                         OnExecuteCodeFinished)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateFavIconURL, OnMsgUpdateFavIconURL)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_DidDownloadFavIcon, OnMsgDidDownloadFavIcon)
     IPC_MESSAGE_HANDLER(ViewHostMsg_ContextMenu, OnMsgContextMenu)
     IPC_MESSAGE_HANDLER(ViewHostMsg_OpenURL, OnMsgOpenURL)
     IPC_MESSAGE_HANDLER(ViewHostMsg_DidContentsPreferredSizeChange,
@@ -775,7 +773,6 @@
     IPC_MESSAGE_HANDLER(ViewHostMsg_ForwardMessageToExternalHost,
                         OnMsgForwardMessageToExternalHost)
     IPC_MESSAGE_HANDLER(ViewHostMsg_SetTooltipText, OnMsgSetTooltipText)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnMsgRunFileChooser)
     IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunJavaScriptMessage,
                                     OnMsgRunJavaScriptMessage)
     IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_RunBeforeUnloadConfirm,
@@ -786,9 +783,6 @@
     IPC_MESSAGE_HANDLER(ViewHostMsg_UpdateDragCursor, OnUpdateDragCursor)
     IPC_MESSAGE_HANDLER(ViewHostMsg_TakeFocus, OnTakeFocus)
     IPC_MESSAGE_HANDLER(ViewHostMsg_PageHasOSDD, OnMsgPageHasOSDD)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_DidGetPrintedPagesCount,
-                        OnDidGetPrintedPagesCount)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_DidPrintPage, DidPrintPage)
     IPC_MESSAGE_HANDLER(ViewHostMsg_AddMessageToConsole, OnAddMessageToConsole)
     IPC_MESSAGE_HANDLER(ViewHostMsg_ForwardToDevToolsAgent,
                         OnForwardToDevToolsAgent)
@@ -804,10 +798,6 @@
                         OnRequestUndockDevToolsWindow)
     IPC_MESSAGE_HANDLER(ViewHostMsg_DevToolsRuntimePropertyChanged,
                         OnDevToolsRuntimePropertyChanged)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_SendCurrentPageAllSavableResourceLinks,
-                        OnReceivedSavableResourceLinksForCurrentPage)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_SendSerializedHtmlData,
-                        OnReceivedSerializedHtmlData)
     IPC_MESSAGE_FORWARD(ViewHostMsg_JSOutOfMemory, delegate_,
                         RenderViewHostDelegate::OnJSOutOfMemory)
     IPC_MESSAGE_HANDLER(ViewHostMsg_ShouldClose_ACK, OnMsgShouldCloseACK)
@@ -1102,24 +1092,6 @@
       Details<std::pair<int, bool> >(&result_details));
 }
 
-void RenderViewHost::OnMsgUpdateFavIconURL(int32 page_id,
-                                           const GURL& icon_url) {
-  RenderViewHostDelegate::FavIcon* favicon_delegate =
-      delegate_->GetFavIconDelegate();
-  if (favicon_delegate)
-    favicon_delegate->UpdateFavIconURL(this, page_id, icon_url);
-}
-
-void RenderViewHost::OnMsgDidDownloadFavIcon(int id,
-                                             const GURL& image_url,
-                                             bool errored,
-                                             const SkBitmap& image) {
-  RenderViewHostDelegate::FavIcon* favicon_delegate =
-      delegate_->GetFavIconDelegate();
-  if (favicon_delegate)
-    favicon_delegate->DidDownloadFavIcon(this, id, image_url, errored, image);
-}
-
 void RenderViewHost::OnMsgContextMenu(const ContextMenuParams& params) {
   RenderViewHostDelegate::View* view = delegate_->GetViewDelegate();
   if (!view)
@@ -1257,14 +1229,6 @@
     view()->SelectionChanged(text);
 }
 
-void RenderViewHost::OnMsgRunFileChooser(
-    const ViewHostMsg_RunFileChooser_Params& params) {
-  RenderViewHostDelegate::FileSelect* file_select_delegate =
-      delegate()->GetFileSelectDelegate();
-  if (file_select_delegate)
-    file_select_delegate->RunFileChooser(this, params);
-}
-
 void RenderViewHost::OnMsgRunJavaScriptMessage(
     const std::wstring& message,
     const std::wstring& default_prompt,
@@ -1340,21 +1304,6 @@
   delegate_->PageHasOSDD(this, page_id, doc_url, provider_type);
 }
 
-void RenderViewHost::OnDidGetPrintedPagesCount(int cookie, int number_pages) {
-  RenderViewHostDelegate::Printing* printing_delegate =
-      delegate_->GetPrintingDelegate();
-  if (printing_delegate)
-    printing_delegate->DidGetPrintedPagesCount(cookie, number_pages);
-}
-
-void RenderViewHost::DidPrintPage(
-    const ViewHostMsg_DidPrintPage_Params& params) {
-  RenderViewHostDelegate::Printing* printing_delegate =
-      delegate_->GetPrintingDelegate();
-  if (printing_delegate)
-    printing_delegate->DidPrintPage(params);
-}
-
 void RenderViewHost::OnAddMessageToConsole(const std::wstring& message,
                                            int32 line_no,
                                            const std::wstring& source_id) {
@@ -1417,17 +1366,6 @@
                                                             page_url));
 }
 
-void RenderViewHost::OnReceivedSavableResourceLinksForCurrentPage(
-    const std::vector<GURL>& resources_list,
-    const std::vector<GURL>& referrers_list,
-    const std::vector<GURL>& frames_list) {
-  RenderViewHostDelegate::Save* save_delegate = delegate_->GetSaveDelegate();
-  if (save_delegate) {
-    save_delegate->OnReceivedSavableResourceLinksForCurrentPage(
-        resources_list, referrers_list, frames_list);
-  }
-}
-
 void RenderViewHost::GetSerializedHtmlDataForCurrentPageWithLocalLinks(
     const std::vector<GURL>& links,
     const std::vector<FilePath>& local_paths,
@@ -1436,14 +1374,6 @@
       routing_id(), links, local_paths, local_directory_name));
 }
 
-void RenderViewHost::OnReceivedSerializedHtmlData(const GURL& frame_url,
-                                                  const std::string& data,
-                                                  int32 status) {
-  RenderViewHostDelegate::Save* save_delegate = delegate_->GetSaveDelegate();
-  if (save_delegate)
-    save_delegate->OnReceivedSerializedHtmlData(frame_url, data, status);
-}
-
 void RenderViewHost::OnMsgShouldCloseACK(bool proceed) {
   StopHangMonitorTimeout();
   // If this renderer navigated while the beforeunload request was in flight, we
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index e1b6a3a..0864905 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -591,7 +591,6 @@
                            WebKit::WebTextDirection text_direction_hint);
   void OnMsgSelectionChanged(const std::string& text);
   void OnMsgPasteFromSelectionClipboard();
-  void OnMsgRunFileChooser(const ViewHostMsg_RunFileChooser_Params& params);
   void OnMsgRunJavaScriptMessage(const std::wstring& message,
                                  const std::wstring& default_prompt,
                                  const GURL& frame_url,
@@ -612,8 +611,6 @@
   void OnMsgPageHasOSDD(int32 page_id,
                         const GURL& doc_url,
                         const ViewHostMsg_PageHasOSDD_Type& provider_type);
-  void OnDidGetPrintedPagesCount(int cookie, int number_pages);
-  void DidPrintPage(const ViewHostMsg_DidPrintPage_Params& params);
   void OnAddMessageToConsole(const std::wstring& message,
                              int32 line_no,
                              const std::wstring& source_id);
@@ -627,14 +624,6 @@
   void OnRequestUndockDevToolsWindow();
   void OnDevToolsRuntimePropertyChanged(const std::string& name,
                                         const std::string& value);
-  void OnReceivedSavableResourceLinksForCurrentPage(
-      const std::vector<GURL>& resources_list,
-      const std::vector<GURL>& referrers_list,
-      const std::vector<GURL>& frames_list);
-  void OnReceivedSerializedHtmlData(const GURL& frame_url,
-                                    const std::string& data,
-                                    int32 status);
-
   void OnMsgShouldCloseACK(bool proceed);
   void OnShowDesktopNotification(
       const ViewHostMsg_ShowNotification_Params& params);
diff --git a/chrome/browser/renderer_host/render_view_host_delegate.cc b/chrome/browser/renderer_host/render_view_host_delegate.cc
index 0bbbb58..7299844 100644
--- a/chrome/browser/renderer_host/render_view_host_delegate.cc
+++ b/chrome/browser/renderer_host/render_view_host_delegate.cc
@@ -30,20 +30,6 @@
   return NULL;
 }
 
-RenderViewHostDelegate::Save* RenderViewHostDelegate::GetSaveDelegate() {
-  return NULL;
-}
-
-RenderViewHostDelegate::Printing*
-RenderViewHostDelegate::GetPrintingDelegate() {
-  return NULL;
-}
-
-RenderViewHostDelegate::FavIcon*
-RenderViewHostDelegate::GetFavIconDelegate() {
-  return NULL;
-}
-
 RenderViewHostDelegate::BookmarkDrag*
 RenderViewHostDelegate::GetBookmarkDragDelegate() {
   return NULL;
@@ -54,11 +40,6 @@
   return NULL;
 }
 
-RenderViewHostDelegate::FileSelect*
-RenderViewHostDelegate::GetFileSelectDelegate() {
-  return NULL;
-}
-
 AutomationResourceRoutingDelegate*
 RenderViewHostDelegate::GetAutomationResourceRoutingDelegate() {
   return NULL;
diff --git a/chrome/browser/renderer_host/render_view_host_delegate.h b/chrome/browser/renderer_host/render_view_host_delegate.h
index 7cab0bed..ef02f96 100644
--- a/chrome/browser/renderer_host/render_view_host_delegate.h
+++ b/chrome/browser/renderer_host/render_view_host_delegate.h
@@ -318,78 +318,6 @@
     virtual ~ContentSettings() {}
   };
 
-  // Save ----------------------------------------------------------------------
-  // Interface for saving web pages.
-
-  class Save {
-   public:
-    // Notification that we get when we receive all savable links of
-    // sub-resources for the current page, their referrers and list of frames
-    // (include main frame and sub frames).
-    virtual void OnReceivedSavableResourceLinksForCurrentPage(
-        const std::vector<GURL>& resources_list,
-        const std::vector<GURL>& referrers_list,
-        const std::vector<GURL>& frames_list) = 0;
-
-    // Notification that we get when we receive serialized html content data of
-    // a specified web page from render process. The parameter frame_url
-    // specifies what frame the data belongs. The parameter data contains the
-    // available data for sending. The parameter status indicates the
-    // serialization status, See
-    // webkit_glue::DomSerializerDelegate::PageSavingSerializationStatus for
-    // the detail meaning of status.
-    virtual void OnReceivedSerializedHtmlData(const GURL& frame_url,
-                                              const std::string& data,
-                                              int32 status) = 0;
-
-   protected:
-    virtual ~Save() {}
-  };
-
-  // Printing ------------------------------------------------------------------
-
-  class Printing {
-   public:
-    // Notification that the render view has calculated the number of printed
-    // pages.
-    virtual void DidGetPrintedPagesCount(int cookie, int number_pages) = 0;
-
-    // Notification that the render view is done rendering one printed page.
-    // This call is synchronous, the renderer is waiting on us because of the
-    // EMF memory mapped data.
-    virtual void DidPrintPage(
-        const ViewHostMsg_DidPrintPage_Params& params) = 0;
-
-   protected:
-    virtual ~Printing() {}
-  };
-
-  // FavIcon -------------------------------------------------------------------
-  // Interface for the renderer to supply favicon information.
-
-  class FavIcon {
-   public:
-    // An image that was requested to be downloaded by DownloadImage has
-    // completed.
-    //
-    // TODO(brettw) this should be renamed DidDownloadFavIcon, and the RVH
-    // function, IPC message, and the RenderView function DownloadImage should
-    // all be named DownloadFavIcon.
-    virtual void DidDownloadFavIcon(RenderViewHost* render_view_host,
-                                    int id,
-                                    const GURL& image_url,
-                                    bool errored,
-                                    const SkBitmap& image) = 0;
-
-    // The URL for the FavIcon of a page has changed.
-    virtual void UpdateFavIconURL(RenderViewHost* render_view_host,
-                                  int32 page_id,
-                                  const GURL& icon_url) = 0;
-
-   protected:
-    virtual ~FavIcon() {}
-  };
-
   // BookmarkDrag --------------------------------------------------------------
   // Interface for forwarding bookmark drag and drop to extenstions.
 
@@ -445,20 +373,6 @@
     virtual ~SSL() {}
   };
 
-  // FileSelect ----------------------------------------------------------------
-  // Interface for handling file selection.
-
-  class FileSelect {
-   public:
-    // A file chooser should be shown.
-    virtual void RunFileChooser(
-        RenderViewHost* render_view_host,
-        const ViewHostMsg_RunFileChooser_Params& params) = 0;
-
-   protected:
-    virtual ~FileSelect() {}
-  };
-
   // ---------------------------------------------------------------------------
 
   // Returns the current delegate associated with a feature. May return NULL if
@@ -466,13 +380,9 @@
   virtual View* GetViewDelegate();
   virtual RendererManagement* GetRendererManagementDelegate();
   virtual ContentSettings* GetContentSettingsDelegate();
-  virtual Save* GetSaveDelegate();
-  virtual Printing* GetPrintingDelegate();
-  virtual FavIcon* GetFavIconDelegate();
 
   virtual BookmarkDrag* GetBookmarkDragDelegate();
   virtual SSL* GetSSLDelegate();
-  virtual FileSelect* GetFileSelectDelegate();
 
   // Return the delegate for registering RenderViewHosts for automation resource
   // routing.
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index 8b5b74c3..cb494aa6 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -472,6 +472,8 @@
   AddNavigationObserver(autofill_manager_.get());
   autocomplete_history_manager_.reset(new AutocompleteHistoryManager(this));
   AddNavigationObserver(autocomplete_history_manager_.get());
+  AddNavigationObserver(&fav_icon_helper_);
+  AddNavigationObserver(printing_.get());
 }
 
 TabContents::~TabContents() {
@@ -635,6 +637,7 @@
     IPC_MESSAGE_HANDLER(ViewHostMsg_SetSuggestions, OnSetSuggestions)
     IPC_MESSAGE_HANDLER(ViewHostMsg_InstantSupportDetermined,
                         OnInstantSupportDetermined)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_RunFileChooser, OnRunFileChooser)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP_EX()
 
@@ -1456,7 +1459,7 @@
   // Create the save package and possibly prompt the user for the name to save
   // the page as. The user prompt is an asynchronous operation that runs on
   // another thread.
-  save_package_ = new SavePackage(this);
+  SetSavePackage(new SavePackage(this));
   save_package_->GetSaveInfo();
 }
 
@@ -1468,10 +1471,17 @@
   // Stop the page from navigating.
   Stop();
 
-  save_package_ = new SavePackage(this, save_type, main_file, dir_path);
+  SetSavePackage(new SavePackage(this, save_type, main_file, dir_path));
   return save_package_->Init();
 }
 
+void TabContents::SetSavePackage(SavePackage* save_package) {
+  if (save_package_.get())
+    RemoveNavigationObserver(save_package_.get());
+  save_package_ = save_package;
+  AddNavigationObserver(save_package);
+}
+
 void TabContents::EmailPageLocation() {
   std::string title = EscapeQueryParamValue(UTF16ToUTF8(GetTitle()), false);
   std::string page_url = EscapeQueryParamValue(GetURL().spec(), false);
@@ -2423,6 +2433,14 @@
     delegate()->OnInstantSupportDetermined(page_id, result);
 }
 
+void TabContents::OnRunFileChooser(
+    const ViewHostMsg_RunFileChooser_Params& params) {
+  if (file_select_helper_.get() == NULL)
+    file_select_helper_.reset(new FileSelectHelper(profile()));
+  file_select_helper_->RunFileChooser(render_view_host(), params);
+}
+
+
 void TabContents::OnContentSettingsAccessed(bool content_was_blocked) {
   if (delegate_)
     delegate_->OnContentSettingsChange(this);
@@ -2442,28 +2460,10 @@
   return content_settings_delegate_.get();
 }
 
-RenderViewHostDelegate::Save* TabContents::GetSaveDelegate() {
-  return save_package_.get();  // May be NULL, but we can return NULL.
-}
-
-RenderViewHostDelegate::Printing* TabContents::GetPrintingDelegate() {
-  return printing_.get();
-}
-
-RenderViewHostDelegate::FavIcon* TabContents::GetFavIconDelegate() {
-  return &fav_icon_helper_;
-}
-
 RenderViewHostDelegate::SSL* TabContents::GetSSLDelegate() {
   return GetSSLHelper();
 }
 
-RenderViewHostDelegate::FileSelect* TabContents::GetFileSelectDelegate() {
-  if (file_select_helper_.get() == NULL)
-    file_select_helper_.reset(new FileSelectHelper(profile()));
-  return file_select_helper_.get();
-}
-
 AutomationResourceRoutingDelegate*
 TabContents::GetAutomationResourceRoutingDelegate() {
   return delegate();
diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h
index d22eeec..a40edfb 100644
--- a/chrome/browser/tab_contents/tab_contents.h
+++ b/chrome/browser/tab_contents/tab_contents.h
@@ -600,6 +600,9 @@
   bool SavePage(const FilePath& main_file, const FilePath& dir_path,
                 SavePackage::SavePackageType save_type);
 
+  // Sets save_package_, taking care to register and unregister the observers.
+  void SetSavePackage(SavePackage* save_package);
+
   // Tells the user's email client to open a compose window containing the
   // current page's URL.
   void EmailPageLocation();
@@ -835,6 +838,7 @@
   void OnSetSuggestions(int32 page_id,
                         const std::vector<std::string>& suggestions);
   void OnInstantSupportDetermined(int32 page_id, bool result);
+  void OnRunFileChooser(const ViewHostMsg_RunFileChooser_Params& params);
 
   // Changes the IsLoading state and notifies delegate as needed
   // |details| is used to provide details on the load that just finished
@@ -946,11 +950,7 @@
   virtual RenderViewHostDelegate::RendererManagement*
       GetRendererManagementDelegate();
   virtual RenderViewHostDelegate::ContentSettings* GetContentSettingsDelegate();
-  virtual RenderViewHostDelegate::Save* GetSaveDelegate();
-  virtual RenderViewHostDelegate::Printing* GetPrintingDelegate();
-  virtual RenderViewHostDelegate::FavIcon* GetFavIconDelegate();
   virtual RenderViewHostDelegate::SSL* GetSSLDelegate();
-  virtual RenderViewHostDelegate::FileSelect* GetFileSelectDelegate();
   virtual AutomationResourceRoutingDelegate*
       GetAutomationResourceRoutingDelegate();
   virtual TabContents* GetAsTabContents();
diff --git a/chrome/test/automation/tab_proxy.h b/chrome/test/automation/tab_proxy.h
index aabc2a6..0aa0cffd 100644
--- a/chrome/test/automation/tab_proxy.h
+++ b/chrome/test/automation/tab_proxy.h
@@ -24,6 +24,7 @@
 #include "chrome/test/automation/automation_handle_tracker.h"
 #include "chrome/test/automation/dom_element_proxy.h"
 #include "chrome/test/automation/javascript_execution_controller.h"
+#include "webkit/glue/window_open_disposition.h"
 
 class GURL;
 class Value;