1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/profile_import_process_host.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox_importer_utils.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/profile_import_process_client.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/importer/profile_import_process_messages.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "ipc/ipc_switches.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochProfileImportProcessHost::ProfileImportProcessHost( 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ProfileImportProcessClient* import_process_client, 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::ID thread_id) 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : BrowserChildProcessHost(PROFILE_IMPORT_PROCESS), 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch import_process_client_(import_process_client), 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_id_(thread_id) { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickProfileImportProcessHost::~ProfileImportProcessHost() { 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ProfileImportProcessHost::StartProfileImportProcess( 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const importer::SourceProfile& source_profile, 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen uint16 items, 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool import_to_bookmark_bar) { 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!StartProcess()) 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Dictionary of all localized strings that could be needed by the importer 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // in the external process. 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue localized_strings; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch localized_strings.SetString( 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString(IDS_BOOKMARK_GROUP_FROM_FIREFOX), 433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_FIREFOX)); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch localized_strings.SetString( 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString(IDS_BOOKMARK_GROUP_FROM_SAFARI), 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_SAFARI)); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch localized_strings.SetString( 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString(IDS_IMPORT_FROM_FIREFOX), 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick l10n_util::GetStringUTF8(IDS_IMPORT_FROM_FIREFOX)); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch localized_strings.SetString( 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString(IDS_IMPORT_FROM_GOOGLE_TOOLBAR), 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick l10n_util::GetStringUTF8(IDS_IMPORT_FROM_GOOGLE_TOOLBAR)); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch localized_strings.SetString( 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString(IDS_IMPORT_FROM_SAFARI), 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick l10n_util::GetStringUTF8(IDS_IMPORT_FROM_SAFARI)); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Send(new ProfileImportProcessMsg_StartImport( 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen source_profile, items, localized_strings, import_to_bookmark_bar)); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ProfileImportProcessHost::CancelProfileImportProcess() { 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Send(new ProfileImportProcessMsg_CancelImport()); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ProfileImportProcessHost::ReportImportItemFinished( 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch importer::ImportItem item) { 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Send(new ProfileImportProcessMsg_ReportImportItemFinished(item)); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFilePath ProfileImportProcessHost::GetProfileImportProcessCmd() { 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return GetChildPath(true); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ProfileImportProcessHost::StartProcess() { 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_name(L"profile import process"); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!CreateChannel()) 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath exe_path = GetProfileImportProcessCmd(); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (exe_path.empty()) { 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED() << "Unable to get profile import process binary name."; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CommandLine* cmd_line = new CommandLine(exe_path); 923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cmd_line->AppendSwitchASCII(switches::kProcessType, 933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick switches::kProfileImportProcess); 943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick cmd_line->AppendSwitchASCII(switches::kProcessChannelID, channel_id()); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetCrashReporterCommandLine(cmd_line); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser_command_line.HasSwitch(switches::kChromeFrame)) 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch cmd_line->AppendSwitch(switches::kChromeFrame); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::environment_vector env; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string dylib_path = GetFirefoxDylibPath().value(); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!dylib_path.empty()) 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch env.push_back(std::make_pair("DYLD_FALLBACK_LIBRARY_PATH", dylib_path)); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Launch(false, env, cmd_line); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_WIN) 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath no_exposed_directory; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Launch(no_exposed_directory, cmd_line); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::environment_vector env; 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Launch(false, env, cmd_line); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool ProfileImportProcessHost::OnMessageReceived(const IPC::Message& message) { 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_id_, FROM_HERE, 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(import_process_client_.get(), 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &ProfileImportProcessClient::OnMessageReceived, 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message)); 12921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ProfileImportProcessHost::OnProcessCrashed(int exit_code) { 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch thread_id_, FROM_HERE, 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(import_process_client_.get(), 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen &ProfileImportProcessClient::OnProcessCrashed, 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen exit_code)); 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool ProfileImportProcessHost::CanShutdown() { 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 144