Index: extensions/browser/api/system_network/system_network_api.cc |
diff --git a/extensions/browser/api/system_network/system_network_api.cc b/extensions/browser/api/system_network/system_network_api.cc |
index c2c1f7030fa62d1151f6df2ff95726bfe510c159..d82a35aa5a471861d51d91f63b6b9b48ea32e7c0 100644 |
--- a/extensions/browser/api/system_network/system_network_api.cc |
+++ b/extensions/browser/api/system_network/system_network_api.cc |
@@ -4,8 +4,21 @@ |
#include "extensions/browser/api/system_network/system_network_api.h" |
+#include "base/task_scheduler/post_task.h" |
+ |
namespace { |
const char kNetworkListError[] = "Network lookup failed or unsupported"; |
+ |
+std::unique_ptr<net::NetworkInterfaceList> GetListOnBlockingTaskRunner() { |
+ auto interface_list = base::MakeUnique<net::NetworkInterfaceList>(); |
+ if (net::GetNetworkList(interface_list.get(), |
+ net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) { |
+ return interface_list; |
+ } |
+ |
+ return nullptr; |
+} |
+ |
} // namespace |
namespace extensions { |
@@ -21,48 +34,28 @@ SystemNetworkGetNetworkInterfacesFunction:: |
ExtensionFunction::ResponseAction |
SystemNetworkGetNetworkInterfacesFunction::Run() { |
- content::BrowserThread::PostTask( |
- content::BrowserThread::FILE, |
- FROM_HERE, |
- base::Bind( |
- &SystemNetworkGetNetworkInterfacesFunction::GetListOnFileThread, |
- this)); |
- return RespondLater(); |
-} |
- |
-void SystemNetworkGetNetworkInterfacesFunction::GetListOnFileThread() { |
- net::NetworkInterfaceList interface_list; |
- if (net::GetNetworkList(&interface_list, |
- net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) { |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind( |
- &SystemNetworkGetNetworkInterfacesFunction::SendResponseOnUIThread, |
- this, |
- interface_list)); |
- return; |
- } |
- |
- content::BrowserThread::PostTask( |
- content::BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&SystemNetworkGetNetworkInterfacesFunction::HandleGetListError, |
- this)); |
-} |
- |
-void SystemNetworkGetNetworkInterfacesFunction::HandleGetListError() { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
- Respond(Error(kNetworkListError)); |
+ constexpr base::TaskTraits kTraits = { |
+ base::MayBlock(), base::TaskPriority::USER_VISIBLE, |
+ base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}; |
+ using Self = SystemNetworkGetNetworkInterfacesFunction; |
+ base::PostTaskWithTraitsAndReplyWithResult( |
+ FROM_HERE, kTraits, base::BindOnce(&GetListOnBlockingTaskRunner), |
+ base::BindOnce(&Self::SendResponseOnUIThread, this)); |
+ return RespondLater(); |
} |
void SystemNetworkGetNetworkInterfacesFunction::SendResponseOnUIThread( |
- const net::NetworkInterfaceList& interface_list) { |
+ std::unique_ptr<net::NetworkInterfaceList> interface_list) { |
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ if (!interface_list) { |
+ Respond(Error(kNetworkListError)); |
+ return; |
+ } |
std::vector<api::system_network::NetworkInterface> create_arg; |
- create_arg.reserve(interface_list.size()); |
- for (const net::NetworkInterface& interface : interface_list) { |
+ create_arg.reserve(interface_list->size()); |
+ for (const net::NetworkInterface& interface : *interface_list) { |
api::system_network::NetworkInterface info; |
info.name = interface.name; |
info.address = interface.address.ToString(); |