importer: Pull ExternalProcessImporterClient out of ImporterHost.

BUG=None
TEST=None

Review URL: http://codereview.chromium.org/6679004

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@77869 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/importer/external_process_importer_client.cc b/chrome/browser/importer/external_process_importer_client.cc
new file mode 100644
index 0000000..e5dc7c07
--- /dev/null
+++ b/chrome/browser/importer/external_process_importer_client.cc
@@ -0,0 +1,237 @@
+// Copyright (c) 2011 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/importer/external_process_importer_client.h"
+
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/importer/importer_bridge.h"
+#include "chrome/browser/importer/importer_host.h"
+#include "chrome/browser/search_engines/template_url.h"
+#include "chrome/browser/search_engines/template_url_model.h"
+#include "content/browser/browser_thread.h"
+
+ExternalProcessImporterClient::ExternalProcessImporterClient(
+    ExternalProcessImporterHost* importer_host,
+    const importer::ProfileInfo& profile_info,
+    uint16 items,
+    InProcessImporterBridge* bridge,
+    bool import_to_bookmark_bar)
+    : bookmarks_options_(0),
+      total_bookmarks_count_(0),
+      total_history_rows_count_(0),
+      total_fav_icons_count_(0),
+      process_importer_host_(importer_host),
+      profile_import_process_host_(NULL),
+      profile_info_(profile_info),
+      items_(items),
+      import_to_bookmark_bar_(import_to_bookmark_bar),
+      bridge_(bridge),
+      cancelled_(false) {
+  bridge_->AddRef();
+  process_importer_host_->NotifyImportStarted();
+}
+
+ExternalProcessImporterClient::~ExternalProcessImporterClient() {
+  bridge_->Release();
+}
+
+void ExternalProcessImporterClient::CancelImportProcessOnIOThread() {
+  profile_import_process_host_->CancelProfileImportProcess();
+}
+
+void ExternalProcessImporterClient::NotifyItemFinishedOnIOThread(
+    importer::ImportItem import_item) {
+  profile_import_process_host_->ReportImportItemFinished(import_item);
+}
+
+void ExternalProcessImporterClient::Cleanup() {
+  if (cancelled_)
+    return;
+
+  if (process_importer_host_)
+    process_importer_host_->NotifyImportEnded();
+  Release();
+}
+
+void ExternalProcessImporterClient::Start() {
+  AddRef();  // balanced in Cleanup.
+  BrowserThread::ID thread_id;
+  CHECK(BrowserThread::GetCurrentThreadIdentifier(&thread_id));
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      NewRunnableMethod(this,
+          &ExternalProcessImporterClient::StartProcessOnIOThread,
+          g_browser_process->resource_dispatcher_host(), thread_id));
+}
+
+void ExternalProcessImporterClient::StartProcessOnIOThread(
+    ResourceDispatcherHost* rdh,
+    BrowserThread::ID thread_id) {
+  profile_import_process_host_ =
+      new ProfileImportProcessHost(rdh, this, thread_id);
+  profile_import_process_host_->StartProfileImportProcess(profile_info_,
+      items_, import_to_bookmark_bar_);
+}
+
+void ExternalProcessImporterClient::Cancel() {
+  if (cancelled_)
+    return;
+
+  cancelled_ = true;
+  if (profile_import_process_host_) {
+    BrowserThread::PostTask(
+        BrowserThread::IO, FROM_HERE,
+        NewRunnableMethod(this,
+            &ExternalProcessImporterClient::CancelImportProcessOnIOThread));
+  }
+  Release();
+}
+
+void ExternalProcessImporterClient::OnProcessCrashed(int exit_code) {
+  if (cancelled_)
+    return;
+
+  process_importer_host_->Cancel();
+}
+
+void ExternalProcessImporterClient::OnImportStart() {
+  if (cancelled_)
+    return;
+
+  bridge_->NotifyStarted();
+}
+
+void ExternalProcessImporterClient::OnImportFinished(bool succeeded,
+                                                     std::string error_msg) {
+  if (cancelled_)
+    return;
+
+  if (!succeeded)
+    LOG(WARNING) << "Import failed.  Error: " << error_msg;
+  Cleanup();
+}
+
+void ExternalProcessImporterClient::OnImportItemStart(int item_data) {
+  if (cancelled_)
+    return;
+
+  bridge_->NotifyItemStarted(static_cast<importer::ImportItem>(item_data));
+}
+
+void ExternalProcessImporterClient::OnImportItemFinished(int item_data) {
+  if (cancelled_)
+    return;
+
+  importer::ImportItem import_item =
+      static_cast<importer::ImportItem>(item_data);
+  bridge_->NotifyItemEnded(import_item);
+  BrowserThread::PostTask(
+      BrowserThread::IO, FROM_HERE,
+      NewRunnableMethod(this,
+          &ExternalProcessImporterClient::NotifyItemFinishedOnIOThread,
+          import_item));
+}
+
+void ExternalProcessImporterClient::OnHistoryImportStart(
+    size_t total_history_rows_count) {
+  if (cancelled_)
+    return;
+
+  total_history_rows_count_ = total_history_rows_count;
+  history_rows_.reserve(total_history_rows_count);
+}
+
+void ExternalProcessImporterClient::OnHistoryImportGroup(
+    const std::vector<history::URLRow>& history_rows_group,
+    int visit_source) {
+  if (cancelled_)
+    return;
+
+  history_rows_.insert(history_rows_.end(), history_rows_group.begin(),
+                       history_rows_group.end());
+  if (history_rows_.size() == total_history_rows_count_)
+    bridge_->SetHistoryItems(history_rows_,
+                             static_cast<history::VisitSource>(visit_source));
+}
+
+void ExternalProcessImporterClient::OnHomePageImportReady(
+    const GURL& home_page) {
+  if (cancelled_)
+    return;
+
+  bridge_->AddHomePage(home_page);
+}
+
+void ExternalProcessImporterClient::OnBookmarksImportStart(
+    const std::wstring first_folder_name,
+    int options, size_t total_bookmarks_count) {
+  if (cancelled_)
+    return;
+
+  bookmarks_first_folder_name_ = first_folder_name;
+  bookmarks_options_ = options;
+  total_bookmarks_count_ = total_bookmarks_count;
+  bookmarks_.reserve(total_bookmarks_count);
+}
+
+void ExternalProcessImporterClient::OnBookmarksImportGroup(
+    const std::vector<ProfileWriter::BookmarkEntry>& bookmarks_group) {
+  if (cancelled_)
+    return;
+
+  // Collect sets of bookmarks from importer process until we have reached
+  // total_bookmarks_count_:
+  bookmarks_.insert(bookmarks_.end(), bookmarks_group.begin(),
+                    bookmarks_group.end());
+  if (bookmarks_.size() == total_bookmarks_count_) {
+    bridge_->AddBookmarkEntries(bookmarks_, bookmarks_first_folder_name_,
+                                bookmarks_options_);
+  }
+}
+
+void ExternalProcessImporterClient::OnFavIconsImportStart(
+    size_t total_fav_icons_count) {
+  if (cancelled_)
+    return;
+
+  total_fav_icons_count_ = total_fav_icons_count;
+  fav_icons_.reserve(total_fav_icons_count);
+}
+
+void ExternalProcessImporterClient::OnFavIconsImportGroup(
+    const std::vector<history::ImportedFavIconUsage>& fav_icons_group) {
+  if (cancelled_)
+    return;
+
+  fav_icons_.insert(fav_icons_.end(), fav_icons_group.begin(),
+                    fav_icons_group.end());
+  if (fav_icons_.size() == total_fav_icons_count_)
+    bridge_->SetFavIcons(fav_icons_);
+}
+
+void ExternalProcessImporterClient::OnPasswordFormImportReady(
+    const webkit_glue::PasswordForm& form) {
+  if (cancelled_)
+    return;
+
+  bridge_->SetPasswordForm(form);
+}
+
+void ExternalProcessImporterClient::OnKeywordsImportReady(
+    const std::vector<TemplateURL>& template_urls,
+        int default_keyword_index, bool unique_on_host_and_path) {
+  if (cancelled_)
+    return;
+
+  std::vector<TemplateURL*> template_url_vec;
+  template_url_vec.reserve(template_urls.size());
+  std::vector<TemplateURL>::const_iterator iter;
+  for (iter = template_urls.begin();
+       iter != template_urls.end();
+       ++iter) {
+    template_url_vec.push_back(new TemplateURL(*iter));
+  }
+  bridge_->SetKeywords(template_url_vec, default_keyword_index,
+                       unique_on_host_and_path);
+}
diff --git a/chrome/browser/importer/external_process_importer_client.h b/chrome/browser/importer/external_process_importer_client.h
new file mode 100644
index 0000000..0cb5484
--- /dev/null
+++ b/chrome/browser/importer/external_process_importer_client.h
@@ -0,0 +1,164 @@
+// Copyright (c) 2011 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.
+
+#ifndef CHROME_BROWSER_IMPORTER_EXTERNAL_PROCESS_IMPORTER_CLIENT_H_
+#define CHROME_BROWSER_IMPORTER_EXTERNAL_PROCESS_IMPORTER_CLIENT_H_
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "chrome/browser/importer/profile_writer.h"
+#include "chrome/browser/profile_import_process_host.h"
+
+class ExternalProcessImporterHost;
+class InProcessImporterBridge;
+
+namespace history {
+class URLRow;
+struct ImportedFavIconUsage;
+}
+
+namespace importer {
+struct ProfileInfo;
+}
+
+// This class is the client for the ProfileImportProcessHost.  It collects
+// notifications from this process host and feeds data back to the importer
+// host, who actually does the writing.
+class ExternalProcessImporterClient
+    : public ProfileImportProcessHost::ImportProcessClient {
+ public:
+  ExternalProcessImporterClient(ExternalProcessImporterHost* importer_host,
+                                const importer::ProfileInfo& profile_info,
+                                uint16 items,
+                                InProcessImporterBridge* bridge,
+                                bool import_to_bookmark_bar);
+  virtual ~ExternalProcessImporterClient();
+
+  // Cancel import process on IO thread.
+  void CancelImportProcessOnIOThread();
+
+  // Report item completely downloaded on IO thread.
+  void NotifyItemFinishedOnIOThread(importer::ImportItem import_item);
+
+  // Notifies the importerhost that import has finished, and calls Release().
+  void Cleanup();
+
+  // Launches the task to start the external process.
+  virtual void Start();
+
+  // Creates a new ProfileImportProcessHost, which launches the import process.
+  virtual void StartProcessOnIOThread(ResourceDispatcherHost* rdh,
+                                      BrowserThread::ID thread_id);
+
+  // Called by the ExternalProcessImporterHost on import cancel.
+  virtual void Cancel();
+
+  // Begin ProfileImportProcessHost::ImportProcessClient implementation.
+  virtual void OnProcessCrashed(int exit_status) OVERRIDE;
+  virtual void OnImportStart() OVERRIDE;
+  virtual void OnImportFinished(bool succeeded, std::string error_msg) OVERRIDE;
+  virtual void OnImportItemStart(int item) OVERRIDE;
+  virtual void OnImportItemFinished(int item) OVERRIDE;
+
+  // Called on first message received when importing history; gives total
+  // number of rows to be imported.
+  virtual void OnHistoryImportStart(size_t total_history_rows_count) OVERRIDE;
+
+  // Called when a group of URLRows has been received.
+  // The source is passed with history::VisitSource type.
+  virtual void OnHistoryImportGroup(
+      const std::vector<history::URLRow> &history_rows_group,
+      int visit_source) OVERRIDE;
+
+  // Called when the home page has been received.
+  virtual void OnHomePageImportReady(const GURL& home_page) OVERRIDE;
+
+  // First message received when importing bookmarks.
+  // |first_folder_name| can be NULL.
+  // |options| is described in ProfileWriter::BookmarkOptions.
+  // |total_bookmarks_count| is the total number of bookmarks to be imported.
+  virtual void OnBookmarksImportStart(const std::wstring first_folder_name,
+                                      int options,
+                                      size_t total_bookmarks_count) OVERRIDE;
+
+  // Called when a group of bookmarks has been received.
+  virtual void OnBookmarksImportGroup(
+      const std::vector<ProfileWriter::BookmarkEntry>& bookmarks_group)
+          OVERRIDE;
+
+  // First message received when importing favicons. |total_fav_icons_size|
+  // gives the total number of fav icons to be imported.
+  virtual void OnFavIconsImportStart(size_t total_fav_icons_count) OVERRIDE;
+
+  // Called when a group of favicons has been received.
+  virtual void OnFavIconsImportGroup(
+      const std::vector<history::ImportedFavIconUsage>& fav_icons_group)
+          OVERRIDE;
+
+  // Called when the passwordform has been received.
+  virtual void OnPasswordFormImportReady(
+      const webkit_glue::PasswordForm& form) OVERRIDE;
+
+  // Called when search engines have been received.
+  virtual void OnKeywordsImportReady(
+      const std::vector<TemplateURL>& template_urls,
+      int default_keyword_index,
+      bool unique_on_host_and_path) OVERRIDE;
+
+  // End ProfileImportProcessHost::ImportProcessClient implementation.
+
+ private:
+  // These variables store data being collected from the importer until the
+  // entire group has been collected and is ready to be written to the profile.
+  std::vector<history::URLRow> history_rows_;
+  std::vector<ProfileWriter::BookmarkEntry> bookmarks_;
+  std::vector<history::ImportedFavIconUsage> fav_icons_;
+
+  // Usually some variation on IDS_BOOKMARK_GROUP_...; the name of the folder
+  // under which imported bookmarks will be placed.
+  std::wstring bookmarks_first_folder_name_;
+
+  // Determines how bookmarks should be added (ProfileWriter::BookmarkOptions).
+  int bookmarks_options_;
+
+  // Total number of bookmarks to import.
+  size_t total_bookmarks_count_;
+
+  // Total number of history items to import.
+  size_t total_history_rows_count_;
+
+  // Total number of fav icons to import.
+  size_t total_fav_icons_count_;
+
+  // Notifications received from the ProfileImportProcessHost are passed back
+  // to process_importer_host_, which calls the ProfileWriter to record the
+  // import data.  When the import process is done, process_importer_host_
+  // deletes itself.
+  ExternalProcessImporterHost* process_importer_host_;
+
+  // Handles sending messages to the external process.  Deletes itself when
+  // the external process dies (see ChildProcessHost::OnChildDied).
+  ProfileImportProcessHost* profile_import_process_host_;
+
+  // Data to be passed from the importer host to the external importer.
+  const importer::ProfileInfo& profile_info_;
+  uint16 items_;
+  bool import_to_bookmark_bar_;
+
+  // Takes import data coming over IPC and delivers it to be written by the
+  // ProfileWriter.  Released by ExternalProcessImporterClient in its
+  // destructor.
+  InProcessImporterBridge* bridge_;
+
+  // True if import process has been cancelled.
+  bool cancelled_;
+
+  DISALLOW_COPY_AND_ASSIGN(ExternalProcessImporterClient);
+};
+
+#endif  // CHROME_BROWSER_IMPORTER_EXTERNAL_PROCESS_IMPORTER_CLIENT_H_
diff --git a/chrome/browser/importer/importer_host.cc b/chrome/browser/importer/importer_host.cc
index 07445eb..7152124 100644
--- a/chrome/browser/importer/importer_host.cc
+++ b/chrome/browser/importer/importer_host.cc
@@ -8,6 +8,7 @@
 #include "chrome/browser/bookmarks/bookmark_model.h"
 #include "chrome/browser/browser_list.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/importer/external_process_importer_client.h"
 #include "chrome/browser/importer/firefox_profile_lock.h"
 #include "chrome/browser/importer/importer_bridge.h"
 #include "chrome/browser/importer/importer_lock_dialog.h"
@@ -315,230 +316,3 @@
   import_to_bookmark_bar_ = (!model->HasBookmarks());
   InvokeTaskIfDone();
 }
-
-// ExternalProcessImporterClient -----------------------------------------------
-
-ExternalProcessImporterClient::ExternalProcessImporterClient(
-    ExternalProcessImporterHost* importer_host,
-    const importer::ProfileInfo& profile_info,
-    int items,
-    InProcessImporterBridge* bridge,
-    bool import_to_bookmark_bar)
-    : bookmarks_options_(0),
-      total_bookmarks_count_(0),
-      total_history_rows_count_(0),
-      total_fav_icons_count_(0),
-      process_importer_host_(importer_host),
-      profile_import_process_host_(NULL),
-      profile_info_(profile_info),
-      items_(items),
-      import_to_bookmark_bar_(import_to_bookmark_bar),
-      bridge_(bridge),
-      cancelled_(false) {
-  bridge_->AddRef();
-  process_importer_host_->NotifyImportStarted();
-}
-
-ExternalProcessImporterClient::~ExternalProcessImporterClient() {
-  bridge_->Release();
-}
-
-void ExternalProcessImporterClient::Start() {
-  AddRef();  // balanced in Cleanup.
-  BrowserThread::ID thread_id;
-  CHECK(BrowserThread::GetCurrentThreadIdentifier(&thread_id));
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      NewRunnableMethod(this,
-          &ExternalProcessImporterClient::StartProcessOnIOThread,
-          g_browser_process->resource_dispatcher_host(), thread_id));
-}
-
-void ExternalProcessImporterClient::StartProcessOnIOThread(
-    ResourceDispatcherHost* rdh,
-    BrowserThread::ID thread_id) {
-  profile_import_process_host_ =
-      new ProfileImportProcessHost(rdh, this, thread_id);
-  profile_import_process_host_->StartProfileImportProcess(profile_info_,
-      items_, import_to_bookmark_bar_);
-}
-
-void ExternalProcessImporterClient::Cancel() {
-  if (cancelled_)
-    return;
-
-  cancelled_ = true;
-  if (profile_import_process_host_) {
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE,
-        NewRunnableMethod(this,
-            &ExternalProcessImporterClient::CancelImportProcessOnIOThread));
-  }
-  Release();
-}
-
-void ExternalProcessImporterClient::CancelImportProcessOnIOThread() {
-  profile_import_process_host_->CancelProfileImportProcess();
-}
-
-void ExternalProcessImporterClient::NotifyItemFinishedOnIOThread(
-    importer::ImportItem import_item) {
-  profile_import_process_host_->ReportImportItemFinished(import_item);
-}
-
-void ExternalProcessImporterClient::OnProcessCrashed(int exit_code) {
-  if (cancelled_)
-    return;
-
-  process_importer_host_->Cancel();
-}
-
-void ExternalProcessImporterClient::Cleanup() {
-  if (cancelled_)
-    return;
-
-  if (process_importer_host_)
-    process_importer_host_->NotifyImportEnded();
-  Release();
-}
-
-void ExternalProcessImporterClient::OnImportStart() {
-  if (cancelled_)
-    return;
-
-  bridge_->NotifyStarted();
-}
-
-void ExternalProcessImporterClient::OnImportFinished(bool succeeded,
-                                                     std::string error_msg) {
-  if (cancelled_)
-    return;
-
-  if (!succeeded)
-    LOG(WARNING) << "Import failed.  Error: " << error_msg;
-  Cleanup();
-}
-
-void ExternalProcessImporterClient::OnImportItemStart(int item_data) {
-  if (cancelled_)
-    return;
-
-  bridge_->NotifyItemStarted(static_cast<importer::ImportItem>(item_data));
-}
-
-void ExternalProcessImporterClient::OnImportItemFinished(int item_data) {
-  if (cancelled_)
-    return;
-
-  importer::ImportItem import_item =
-      static_cast<importer::ImportItem>(item_data);
-  bridge_->NotifyItemEnded(import_item);
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      NewRunnableMethod(this,
-          &ExternalProcessImporterClient::NotifyItemFinishedOnIOThread,
-          import_item));
-}
-
-void ExternalProcessImporterClient::OnHistoryImportStart(
-    size_t total_history_rows_count) {
-  if (cancelled_)
-    return;
-
-  total_history_rows_count_ = total_history_rows_count;
-  history_rows_.reserve(total_history_rows_count);
-}
-
-void ExternalProcessImporterClient::OnHistoryImportGroup(
-    const std::vector<history::URLRow>& history_rows_group,
-    int visit_source) {
-  if (cancelled_)
-    return;
-
-  history_rows_.insert(history_rows_.end(), history_rows_group.begin(),
-                       history_rows_group.end());
-  if (history_rows_.size() == total_history_rows_count_)
-    bridge_->SetHistoryItems(history_rows_,
-                             static_cast<history::VisitSource>(visit_source));
-}
-
-void ExternalProcessImporterClient::OnHomePageImportReady(
-    const GURL& home_page) {
-  if (cancelled_)
-    return;
-
-  bridge_->AddHomePage(home_page);
-}
-
-void ExternalProcessImporterClient::OnBookmarksImportStart(
-    const std::wstring first_folder_name,
-    int options, size_t total_bookmarks_count) {
-  if (cancelled_)
-    return;
-
-  bookmarks_first_folder_name_ = first_folder_name;
-  bookmarks_options_ = options;
-  total_bookmarks_count_ = total_bookmarks_count;
-  bookmarks_.reserve(total_bookmarks_count);
-}
-
-void ExternalProcessImporterClient::OnBookmarksImportGroup(
-    const std::vector<ProfileWriter::BookmarkEntry>& bookmarks_group) {
-  if (cancelled_)
-    return;
-
-  // Collect sets of bookmarks from importer process until we have reached
-  // total_bookmarks_count_:
-  bookmarks_.insert(bookmarks_.end(), bookmarks_group.begin(),
-                    bookmarks_group.end());
-  if (bookmarks_.size() == total_bookmarks_count_) {
-    bridge_->AddBookmarkEntries(bookmarks_, bookmarks_first_folder_name_,
-                                bookmarks_options_);
-  }
-}
-
-void ExternalProcessImporterClient::OnFavIconsImportStart(
-    size_t total_fav_icons_count) {
-  if (cancelled_)
-    return;
-
-  total_fav_icons_count_ = total_fav_icons_count;
-  fav_icons_.reserve(total_fav_icons_count);
-}
-
-void ExternalProcessImporterClient::OnFavIconsImportGroup(
-    const std::vector<history::ImportedFavIconUsage>& fav_icons_group) {
-  if (cancelled_)
-    return;
-
-  fav_icons_.insert(fav_icons_.end(), fav_icons_group.begin(),
-                    fav_icons_group.end());
-  if (fav_icons_.size() == total_fav_icons_count_)
-    bridge_->SetFavIcons(fav_icons_);
-}
-
-void ExternalProcessImporterClient::OnPasswordFormImportReady(
-    const webkit_glue::PasswordForm& form) {
-  if (cancelled_)
-    return;
-
-  bridge_->SetPasswordForm(form);
-}
-
-void ExternalProcessImporterClient::OnKeywordsImportReady(
-    const std::vector<TemplateURL>& template_urls,
-        int default_keyword_index, bool unique_on_host_and_path) {
-  if (cancelled_)
-    return;
-
-  std::vector<TemplateURL*> template_url_vec;
-  template_url_vec.reserve(template_urls.size());
-  std::vector<TemplateURL>::const_iterator iter;
-  for (iter = template_urls.begin();
-       iter != template_urls.end();
-       ++iter) {
-    template_url_vec.push_back(new TemplateURL(*iter));
-  }
-  bridge_->SetKeywords(template_url_vec, default_keyword_index,
-                       unique_on_host_and_path);
-}
diff --git a/chrome/browser/importer/importer_host.h b/chrome/browser/importer/importer_host.h
index 4b20633..1b94a4a 100644
--- a/chrome/browser/importer/importer_host.h
+++ b/chrome/browser/importer/importer_host.h
@@ -17,7 +17,6 @@
 #include "chrome/browser/importer/importer_data_types.h"
 #include "chrome/browser/importer/importer_list.h"
 #include "chrome/browser/importer/profile_writer.h"
-#include "chrome/browser/profile_import_process_host.h"
 #include "content/common/notification_observer.h"
 #include "content/common/notification_registrar.h"
 #include "ui/gfx/native_widget_types.h"
@@ -222,141 +221,4 @@
   DISALLOW_COPY_AND_ASSIGN(ExternalProcessImporterHost);
 };
 
-// This class is the client for the ProfileImportProcessHost.  It collects
-// notifications from this process host and feeds data back to the importer
-// host, who actually does the writing.
-class ExternalProcessImporterClient
-    : public ProfileImportProcessHost::ImportProcessClient {
- public:
-  ExternalProcessImporterClient(ExternalProcessImporterHost* importer_host,
-                                const importer::ProfileInfo& profile_info,
-                                int items,
-                                InProcessImporterBridge* bridge,
-                                bool import_to_bookmark_bar);
-
-  ~ExternalProcessImporterClient();
-
-  // Launches the task to start the external process.
-  virtual void Start();
-
-  // Creates a new ProfileImportProcessHost, which launches the import process.
-  virtual void StartProcessOnIOThread(ResourceDispatcherHost* rdh,
-                                      BrowserThread::ID thread_id);
-
-  // Called by the ExternalProcessImporterHost on import cancel.
-  virtual void Cancel();
-
-  // Cancel import process on IO thread.
-  void CancelImportProcessOnIOThread();
-
-  // Report item completely downloaded on IO thread.
-  void NotifyItemFinishedOnIOThread(importer::ImportItem import_item);
-
-  // Cancel import on process crash.
-  virtual void OnProcessCrashed(int exit_code);
-
-  // Notifies the importerhost that import has finished, and calls Release().
-  void Cleanup();
-
-  // ProfileImportProcessHost messages ----------------------------------------
-  // The following methods are called by ProfileImportProcessHost when the
-  // corresponding message has been received from the import process.
-  virtual void OnImportStart();
-  virtual void OnImportFinished(bool succeeded, std::string error_msg);
-  virtual void OnImportItemStart(int item_data);
-  virtual void OnImportItemFinished(int item_data);
-
-  // Called on first message received when importing history; gives total
-  // number of rows to be imported.
-  virtual void OnHistoryImportStart(size_t total_history_rows_count);
-
-  // Called when a group of URLRows has been received.
-  // The source is passed with history::VisitSource type.
-  virtual void OnHistoryImportGroup(
-      const std::vector<history::URLRow> &history_rows_group,
-      int visit_source);
-
-  // Called when the home page has been received.
-  virtual void OnHomePageImportReady(const GURL& home_page);
-
-  // First message received when importing bookmarks.
-  // |first_folder_name| can be NULL.
-  // |options| is described in ProfileWriter::BookmarkOptions.
-  // |total_bookmarks_count| is the total number of bookmarks to be imported.
-  virtual void OnBookmarksImportStart(
-      const std::wstring first_folder_name,
-          int options, size_t total_bookmarks_count);
-
-  // Called when a group of bookmarks has been received.
-  virtual void OnBookmarksImportGroup(
-      const std::vector<ProfileWriter::BookmarkEntry>& bookmarks_group);
-
-  // First message received when importing favicons.  |total_fav_icons_size|
-  // gives the total number of fav icons to be imported.
-  virtual void OnFavIconsImportStart(size_t total_fav_icons_count);
-
-  // Called when a group of favicons has been received.
-  virtual void OnFavIconsImportGroup(
-      const std::vector<history::ImportedFavIconUsage>& fav_icons_group);
-
-  // Called when the passwordform has been received.
-  virtual void OnPasswordFormImportReady(
-      const webkit_glue::PasswordForm& form);
-
-  // Called when search engines have been received.
-  virtual void OnKeywordsImportReady(
-      const std::vector<TemplateURL>& template_urls,
-        int default_keyword_index, bool unique_on_host_and_path);
-
-  // End ProfileImportProcessHost messages ------------------------------------
-
- private:
-  // These variables store data being collected from the importer until the
-  // entire group has been collected and is ready to be written to the profile.
-  std::vector<history::URLRow> history_rows_;
-  std::vector<ProfileWriter::BookmarkEntry> bookmarks_;
-  std::vector<history::ImportedFavIconUsage> fav_icons_;
-
-  // Usually some variation on IDS_BOOKMARK_GROUP_...; the name of the folder
-  // under which imported bookmarks will be placed.
-  std::wstring bookmarks_first_folder_name_;
-
-  // Determines how bookmarks should be added (ProfileWriter::BookmarkOptions).
-  int bookmarks_options_;
-
-  // Total number of bookmarks to import.
-  size_t total_bookmarks_count_;
-
-  // Total number of history items to import.
-  size_t total_history_rows_count_;
-
-  // Total number of fav icons to import.
-  size_t total_fav_icons_count_;
-
-  // Notifications received from the ProfileImportProcessHost are passed back
-  // to process_importer_host_, which calls the ProfileWriter to record the
-  // import data.  When the import process is done, process_importer_host_
-  // deletes itself.
-  ExternalProcessImporterHost* process_importer_host_;
-
-  // Handles sending messages to the external process.  Deletes itself when
-  // the external process dies (see ChildProcessHost::OnChildDied).
-  ProfileImportProcessHost* profile_import_process_host_;
-
-  // Data to be passed from the importer host to the external importer.
-  const importer::ProfileInfo& profile_info_;
-  int items_;
-  bool import_to_bookmark_bar_;
-
-  // Takes import data coming over IPC and delivers it to be written by the
-  // ProfileWriter.  Released by ExternalProcessImporterClient in its
-  // destructor.
-  InProcessImporterBridge* bridge_;
-
-  // True if import process has been cancelled.
-  bool cancelled_;
-
-  DISALLOW_COPY_AND_ASSIGN(ExternalProcessImporterClient);
-};
-
 #endif  // CHROME_BROWSER_IMPORTER_IMPORTER_HOST_H_
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index d21d2cc..93bf4d77 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1194,6 +1194,8 @@
         'browser/idle_win.cc',
         'browser/ime_input.cc',
         'browser/ime_input.h',
+        'browser/importer/external_process_importer_client.cc',
+        'browser/importer/external_process_importer_client.h',
         'browser/importer/firefox2_importer.cc',
         'browser/importer/firefox2_importer.h',
         'browser/importer/firefox3_importer.cc',