| 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();
|
|
|