Chromium Code Reviews| Index: chrome/browser/extensions/api/networking_private/networking_private_process_client.cc |
| diff --git a/chrome/browser/extensions/api/networking_private/networking_private_process_client.cc b/chrome/browser/extensions/api/networking_private/networking_private_process_client.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8b384a4bdabc7a387f68ed572ebb95915c000c08 |
| --- /dev/null |
| +++ b/chrome/browser/extensions/api/networking_private/networking_private_process_client.cc |
| @@ -0,0 +1,504 @@ |
| +// 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/extensions/api/networking_private/networking_private_process_client.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/lazy_instance.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "chrome/browser/browser_process.h" |
| +#include "chrome/browser/extensions/event_names.h" |
| +#include "chrome/browser/extensions/event_router.h" |
| +#include "chrome/browser/extensions/extension_system.h" |
| +#include "chrome/common/extensions/api/networking_private.h" |
| +#include "chrome/common/networking_private_messages.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/utility_process_host.h" |
| + |
| +using content::BrowserThread; |
| +using content::UtilityProcessHost; |
| +namespace api = extensions::api::networking_private; |
| + |
| +NetworkingPrivateProcessClient::NetworkingPrivateProcessClient(Profile* profile) |
| + : profile_(profile) { |
| + Start(); |
| +} |
| + |
| +NetworkingPrivateProcessClient::~NetworkingPrivateProcessClient() {} |
|
stevenjb
2013/08/13 23:39:04
nit: } on new line
mef
2013/09/24 21:14:37
git cl format insists otherwise.
|
| + |
| +void NetworkingPrivateProcessClient::Start() { |
| + BrowserThread::ID thread_id; |
| + CHECK(BrowserThread::GetCurrentThreadIdentifier(&thread_id)); |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&NetworkingPrivateProcessClient::StartProcessOnIOThread, |
| + this, |
| + thread_id)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::StartProcessOnIOThread( |
| + BrowserThread::ID thread_id) { |
| + utility_process_host_ = UtilityProcessHost::Create( |
| + this, BrowserThread::GetMessageLoopProxyForThread(thread_id).get()) |
| + ->AsWeakPtr(); |
| + utility_process_host_->DisableSandbox(); |
| + utility_process_host_->StartBatchMode(); |
| + |
| + // utility_process_host_->Send(new ProfileImportProcessMsg_StartImport( |
| + // source_profile_, items_, localized_strings)); |
|
stevenjb
2013/08/13 23:39:04
??
mef
2013/09/24 21:14:37
Done.
|
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnProcessCrashed(int exit_code) { |
| + DLOG(ERROR) << __FUNCTION__; |
| + // if (cancelled_) |
|
Greg Spencer (Chromium)
2013/08/13 23:59:30
Yes, remove all commented out code (or uncomment).
mef
2013/09/24 21:14:37
Done. I've added proper logic to handle utility pr
|
| + // return; |
| + |
| + // process_importer_host_->Cancel(); |
|
stevenjb
2013/08/13 23:39:04
??
mef
2013/09/24 21:14:37
Done.
|
| +} |
| + |
| +bool NetworkingPrivateProcessClient::OnMessageReceived( |
| + const IPC::Message& message) { |
| + bool handled = true; |
| + IPC_BEGIN_MESSAGE_MAP(NetworkingPrivateProcessClient, message) |
| + // Responses from NetworkingPrivateHandler. |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_GetProperties_Succeeded, |
| + OnGetPropertiesSucceeded) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_GetProperties_Failed, |
| + OnGetPropertiesFailed) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_StartConnect_Succeeded, |
| + OnStartConnectSucceeded) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_StartConnect_Failed, |
| + OnStartConnectFailed) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_StartDisconnect_Succeeded, |
| + OnStartDisconnectSucceeded) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_StartDisconnect_Failed, |
| + OnStartDisconnectFailed) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_SetProperties_Succeeded, |
| + OnSetPropertiesSucceeded) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_SetProperties_Failed, |
| + OnSetPropertiesFailed) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_GetVisibleNetworksSucceeded, |
| + OnGetVisibleNetworksSucceeded) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_NetworksChanged_Event, |
| + OnNetworksChangedEvent) |
| + IPC_MESSAGE_HANDLER(NetworkingPrivateMsg_NetworkListChanged_Event, |
| + OnNetworkListChangedEvent) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP() |
| + return handled; |
| +} |
| + |
| +void NetworkingPrivateProcessClient::GetProperties( |
| + const std::string& service_path, |
| + const DictionaryResultCallback& callback, |
| + const ErrorCallback& error_callback) { |
| + // MessageBoxA(NULL, __FUNCTION__, "Debug Me", MB_OK); |
|
stevenjb
2013/08/13 23:39:04
??
mef
2013/09/24 21:14:37
Done.
|
| + get_properties_success_callback_ = callback; |
| + get_properties_error_callback_ = error_callback; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&NetworkingPrivateProcessClient::OnGetPropertiesStart, |
|
cbentzel
2013/08/19 19:46:34
What happens if the utility process is killed whil
mef
2013/08/21 17:25:34
Good point. I guess NetworkingPrivateProcessClient
mef
2013/09/24 21:14:37
Done.
|
| + this, |
| + service_path)); |
| +} |
| + |
| +// Message handlers |
| +void NetworkingPrivateProcessClient::OnGetPropertiesStart( |
| + const std::string& network_guid) { |
| + utility_process_host_->Send( |
| + new NetworkingPrivateMsg_GetProperties(network_guid)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnGetPropertiesSucceeded( |
| + const std::string& network_guid, |
| + const base::DictionaryValue& properties) { |
| + LOG(INFO) << properties; |
| + if (!get_properties_success_callback_.is_null()) |
| + get_properties_success_callback_.Run(network_guid, properties); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnGetPropertiesFailed( |
| + const std::string& error_code, |
| + const base::DictionaryValue& error_data) { |
| + scoped_ptr<DictionaryValue> error_data_ptr(error_data.DeepCopy()); |
| + if (!get_properties_error_callback_.is_null()) |
| + get_properties_error_callback_.Run(error_code, error_data_ptr.Pass()); |
| +} |
| + |
| +// Requests network scan. Broadcasts NetworkListChangedEvent upon completion. |
| +void NetworkingPrivateProcessClient::RequestNetworkScan() { |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&NetworkingPrivateProcessClient::OnRequestNetworkScan, this)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnRequestNetworkScan() { |
| + utility_process_host_->Send(new NetworkingPrivateMsg_RequestNetworkScan()); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::GetVisibleNetworks( |
| + const ListResultCallback& callback) { |
| + get_visible_networks_callback_ = callback; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&NetworkingPrivateProcessClient::OnGetVisibleNetworks, this)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnGetVisibleNetworks() { |
| + utility_process_host_->Send(new NetworkingPrivateMsg_GetVisibleNetworks()); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnGetVisibleNetworksSucceeded( |
| + const base::ListValue& network_list) { |
| + if (!get_visible_networks_callback_.is_null()) |
| + get_visible_networks_callback_.Run(network_list); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::StartConnect( |
| + const std::string& service_path, |
| + const VoidResultCallback& callback, |
| + const ErrorCallback& error_callback) { |
| + start_connect_success_callback_ = callback; |
| + start_connect_error_callback_ = error_callback; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&NetworkingPrivateProcessClient::OnStartConnectStart, |
| + this, |
| + service_path)); |
| +} |
| + |
| +// Message handlers |
| +void NetworkingPrivateProcessClient::OnStartConnectStart( |
| + const std::string& network_guid) { |
| + utility_process_host_->Send( |
| + new NetworkingPrivateMsg_StartConnect(network_guid)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnStartConnectSucceeded( |
| + const std::string& network_guid) { |
| + if (!start_connect_success_callback_.is_null()) |
| + start_connect_success_callback_.Run(); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnStartConnectFailed( |
| + const std::string& error_code, |
| + const base::DictionaryValue& error_data) { |
| + scoped_ptr<DictionaryValue> error_data_ptr(error_data.DeepCopy()); |
| + if (!start_connect_error_callback_.is_null()) |
| + start_connect_error_callback_.Run(error_code, error_data_ptr.Pass()); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::StartDisconnect( |
| + const std::string& service_path, |
| + const VoidResultCallback& callback, |
| + const ErrorCallback& error_callback) { |
| + start_disconnect_success_callback_ = callback; |
| + start_disconnect_error_callback_ = error_callback; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&NetworkingPrivateProcessClient::OnStartDisconnectStart, |
| + this, |
| + service_path)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnStartDisconnectStart( |
| + const std::string& network_guid) { |
| + utility_process_host_->Send( |
| + new NetworkingPrivateMsg_StartDisconnect(network_guid)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnStartDisconnectSucceeded( |
| + const std::string& network_guid) { |
| + if (!start_disconnect_success_callback_.is_null()) |
| + start_disconnect_success_callback_.Run(); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnStartDisconnectFailed( |
| + const std::string& error_code, |
| + const base::DictionaryValue& error_data) { |
| + scoped_ptr<DictionaryValue> error_data_ptr(error_data.DeepCopy()); |
| + if (!start_disconnect_error_callback_.is_null()) |
| + start_disconnect_error_callback_.Run(error_code, error_data_ptr.Pass()); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::SetProperties( |
| + const std::string& service_path, |
| + const base::DictionaryValue& properties, |
| + const VoidResultCallback& callback, |
| + const ErrorCallback& error_callback) { |
| + set_properties_success_callback_ = callback; |
| + set_properties_error_callback_ = error_callback; |
| + scoped_ptr<DictionaryValue> properties_ptr(properties.DeepCopy()); |
| + |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&NetworkingPrivateProcessClient::OnSetPropertiesStart, |
| + this, |
| + service_path, |
| + base::Passed(&properties_ptr))); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnSetPropertiesStart( |
| + const std::string& network_guid, |
| + scoped_ptr<base::DictionaryValue> properties) { |
| + LOG(INFO) << *properties; |
| + utility_process_host_->Send( |
| + new NetworkingPrivateMsg_SetProperties(network_guid, *properties)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnSetPropertiesSucceeded( |
| + const std::string& network_guid) { |
| + if (!set_properties_success_callback_.is_null()) |
| + set_properties_success_callback_.Run(); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnSetPropertiesFailed( |
| + const std::string& error_code, |
| + const base::DictionaryValue& error_data) { |
| + scoped_ptr<DictionaryValue> error_data_ptr(error_data.DeepCopy()); |
| + if (!set_properties_error_callback_.is_null()) |
| + set_properties_error_callback_.Run(error_code, error_data_ptr.Pass()); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnNetworksChangedEvent( |
| + const std::vector<std::string>& network_guids) { |
| + extensions::EventRouter* event_router = |
| + extensions::ExtensionSystem::Get(profile_)->event_router(); |
| + scoped_ptr<base::ListValue> args( |
| + api::OnNetworksChanged::Create(network_guids)); |
| + scoped_ptr<extensions::Event> netchanged_event(new extensions::Event( |
| + extensions::event_names::kOnNetworksChanged, args.Pass())); |
| + event_router->BroadcastEvent(netchanged_event.Pass()); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnNetworkListChangedEvent( |
| + const std::vector<std::string>& network_guids) { |
| + extensions::EventRouter* event_router = |
| + extensions::ExtensionSystem::Get(profile_)->event_router(); |
| + scoped_ptr<base::ListValue> args( |
| + api::OnNetworksChanged::Create(network_guids)); |
| + scoped_ptr<extensions::Event> netchanged_event(new extensions::Event( |
| + extensions::event_names::kOnNetworkListChanged, args.Pass())); |
| + event_router->BroadcastEvent(netchanged_event.Pass()); |
| +} |
| + |
| +/* |
|
stevenjb
2013/08/13 23:39:04
??
mef
2013/09/24 21:14:37
Done.
|
| +void NetworkingPrivateProcessClient::OnImportStart() { |
| + if (cancelled_) |
| + return; |
| + |
| + bridge_->NotifyStarted(); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnImportFinishked( |
| + bool succeeded, const std::string& error_msg) { |
| + if (cancelled_) |
| + return; |
| + |
| + if (!succeeded) |
| + LOG(WARNING) << "Import failed. Error: " << error_msg; |
| + Cleanup(); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnImportItemStart(int item_data) { |
| + if (cancelled_) |
| + return; |
| + |
| + bridge_->NotifyItemStarted(static_cast<importer::ImportItem>(item_data)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::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, |
| + base::Bind(&NetworkingPrivateProcessClient::NotifyItemFinishedOnIOThread, |
| + this, |
| + import_item)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::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 NetworkingPrivateProcessClient::OnHistoryImportGroup( |
| + const std::vector<ImporterURLRow>& 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<importer::VisitSource>(visit_source)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnHomePageImportReady( |
| + const GURL& home_page) { |
| + if (cancelled_) |
| + return; |
| + |
| + bridge_->AddHomePage(home_page); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnBookmarksImportStart( |
| + const string16& first_folder_name, |
| + size_t total_bookmarks_count) { |
| + if (cancelled_) |
| + return; |
| + |
| + bookmarks_first_folder_name_ = first_folder_name; |
| + total_bookmarks_count_ = total_bookmarks_count; |
| + bookmarks_.reserve(total_bookmarks_count); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnBookmarksImportGroup( |
| + const std::vector<ImportedBookmarkEntry>& 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_->AddBookmarks(bookmarks_, bookmarks_first_folder_name_); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnFaviconsImportStart( |
| + size_t total_favicons_count) { |
| + if (cancelled_) |
| + return; |
| + |
| + total_favicons_count_ = total_favicons_count; |
| + favicons_.reserve(total_favicons_count); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnFaviconsImportGroup( |
| + const std::vector<ImportedFaviconUsage>& favicons_group) { |
| + if (cancelled_) |
| + return; |
| + |
| + favicons_.insert(favicons_.end(), favicons_group.begin(), |
| + favicons_group.end()); |
| + if (favicons_.size() == total_favicons_count_) |
| + bridge_->SetFavicons(favicons_); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnPasswordFormImportReady( |
| + const content::PasswordForm& form) { |
| + if (cancelled_) |
| + return; |
| + |
| + bridge_->SetPasswordForm(form); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnKeywordsImportReady( |
| + const std::vector<importer::URLKeywordInfo>& url_keywords, |
| + bool unique_on_host_and_path) { |
| + if (cancelled_) |
| + return; |
| + bridge_->SetKeywords(url_keywords, unique_on_host_and_path); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::OnFirefoxSearchEngineDataReceived( |
| + const std::vector<std::string> search_engine_data) { |
| + if (cancelled_) |
| + return; |
| + bridge_->SetFirefoxSearchEnginesXMLData(search_engine_data); |
| +} |
| + |
| +#if defined(OS_WIN) |
| +void NetworkingPrivateProcessClient::OnIE7PasswordReceived( |
| + const importer::ImporterIE7PasswordInfo& importer_password_info) { |
| + if (cancelled_) |
| + return; |
| + bridge_->AddIE7PasswordInfo(importer_password_info); |
| +} |
| +#endif |
| + |
| +NetworkingPrivateProcessClient::~NetworkingPrivateProcessClient() {} |
| + |
| +void NetworkingPrivateProcessClient::Cleanup() { |
| + if (cancelled_) |
| + return; |
| + |
| + if (process_importer_host_) |
| + process_importer_host_->NotifyImportEnded(); |
| + Release(); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::CancelImportProcessOnIOThread() { |
| + if (utility_process_host_.get()) |
| + utility_process_host_->Send(new ProfileImportProcessMsg_CancelImport()); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::NotifyItemFinishedOnIOThread( |
| + importer::ImportItem import_item) { |
| + utility_process_host_->Send( |
| + new ProfileImportProcessMsg_ReportImportItemFinished(import_item)); |
| +} |
| + |
| +void NetworkingPrivateProcessClient::StartProcessOnIOThread( |
| + BrowserThread::ID thread_id) { |
| + utility_process_host_ = UtilityProcessHost::Create( |
| + this, BrowserThread::GetMessageLoopProxyForThread(thread_id).get()) |
| + ->AsWeakPtr(); |
| + utility_process_host_->DisableSandbox(); |
| + |
| +#if defined(OS_MACOSX) |
| + base::EnvironmentVector env; |
| + std::string dylib_path = GetFirefoxDylibPath().value(); |
| + if (!dylib_path.empty()) |
| + env.push_back(std::make_pair("DYLD_FALLBACK_LIBRARY_PATH", dylib_path)); |
| + utility_process_host_->SetEnv(env); |
| +#endif |
| + |
| + // Dictionary of all localized strings that could be needed by the importer |
| + // in the external process. |
| + DictionaryValue localized_strings; |
| + localized_strings.SetString( |
| + base::IntToString(IDS_BOOKMARK_GROUP), |
| + l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP)); |
| + localized_strings.SetString( |
| + base::IntToString(IDS_BOOKMARK_GROUP_FROM_FIREFOX), |
| + l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_FIREFOX)); |
| + localized_strings.SetString( |
| + base::IntToString(IDS_BOOKMARK_GROUP_FROM_SAFARI), |
| + l10n_util::GetStringUTF8(IDS_BOOKMARK_GROUP_FROM_SAFARI)); |
| + localized_strings.SetString( |
| + base::IntToString(IDS_IMPORT_FROM_FIREFOX), |
| + l10n_util::GetStringUTF8(IDS_IMPORT_FROM_FIREFOX)); |
| + localized_strings.SetString( |
| + base::IntToString(IDS_IMPORT_FROM_ICEWEASEL), |
| + l10n_util::GetStringUTF8(IDS_IMPORT_FROM_ICEWEASEL)); |
| + localized_strings.SetString( |
| + base::IntToString(IDS_IMPORT_FROM_SAFARI), |
| + l10n_util::GetStringUTF8(IDS_IMPORT_FROM_SAFARI)); |
| + localized_strings.SetString( |
| + base::IntToString(IDS_BOOKMARK_BAR_FOLDER_NAME), |
| + l10n_util::GetStringUTF8(IDS_BOOKMARK_BAR_FOLDER_NAME)); |
| + |
| + utility_process_host_->Send(new ProfileImportProcessMsg_StartImport( |
| + source_profile_, items_, localized_strings)); |
| +} |
| + |
| +*/ |