OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "extensions/browser/api/system_network/system_network_api.h" | 5 #include "extensions/browser/api/system_network/system_network_api.h" |
6 | 6 |
| 7 #include "base/task_scheduler/post_task.h" |
| 8 |
7 namespace { | 9 namespace { |
8 const char kNetworkListError[] = "Network lookup failed or unsupported"; | 10 const char kNetworkListError[] = "Network lookup failed or unsupported"; |
| 11 |
| 12 std::unique_ptr<net::NetworkInterfaceList> GetListOnBlockingTaskRunner() { |
| 13 auto interface_list = base::MakeUnique<net::NetworkInterfaceList>(); |
| 14 if (net::GetNetworkList(interface_list.get(), |
| 15 net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) { |
| 16 return interface_list; |
| 17 } |
| 18 |
| 19 return nullptr; |
| 20 } |
| 21 |
9 } // namespace | 22 } // namespace |
10 | 23 |
11 namespace extensions { | 24 namespace extensions { |
12 namespace api { | 25 namespace api { |
13 | 26 |
14 SystemNetworkGetNetworkInterfacesFunction:: | 27 SystemNetworkGetNetworkInterfacesFunction:: |
15 SystemNetworkGetNetworkInterfacesFunction() { | 28 SystemNetworkGetNetworkInterfacesFunction() { |
16 } | 29 } |
17 | 30 |
18 SystemNetworkGetNetworkInterfacesFunction:: | 31 SystemNetworkGetNetworkInterfacesFunction:: |
19 ~SystemNetworkGetNetworkInterfacesFunction() { | 32 ~SystemNetworkGetNetworkInterfacesFunction() { |
20 } | 33 } |
21 | 34 |
22 ExtensionFunction::ResponseAction | 35 ExtensionFunction::ResponseAction |
23 SystemNetworkGetNetworkInterfacesFunction::Run() { | 36 SystemNetworkGetNetworkInterfacesFunction::Run() { |
24 content::BrowserThread::PostTask( | 37 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
25 content::BrowserThread::FILE, | 38 constexpr base::TaskTraits kTraits = { |
26 FROM_HERE, | 39 base::MayBlock(), base::TaskPriority::USER_VISIBLE, |
27 base::Bind( | 40 base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}; |
28 &SystemNetworkGetNetworkInterfacesFunction::GetListOnFileThread, | 41 using Self = SystemNetworkGetNetworkInterfacesFunction; |
29 this)); | 42 base::PostTaskWithTraitsAndReplyWithResult( |
| 43 FROM_HERE, kTraits, base::BindOnce(&GetListOnBlockingTaskRunner), |
| 44 base::BindOnce(&Self::SendResponseOnUIThread, this)); |
30 return RespondLater(); | 45 return RespondLater(); |
31 } | 46 } |
32 | 47 |
33 void SystemNetworkGetNetworkInterfacesFunction::GetListOnFileThread() { | 48 void SystemNetworkGetNetworkInterfacesFunction::SendResponseOnUIThread( |
34 net::NetworkInterfaceList interface_list; | 49 std::unique_ptr<net::NetworkInterfaceList> interface_list) { |
35 if (net::GetNetworkList(&interface_list, | 50 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
36 net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) { | 51 if (!interface_list) { |
37 content::BrowserThread::PostTask( | 52 Respond(Error(kNetworkListError)); |
38 content::BrowserThread::UI, | |
39 FROM_HERE, | |
40 base::Bind( | |
41 &SystemNetworkGetNetworkInterfacesFunction::SendResponseOnUIThread, | |
42 this, | |
43 interface_list)); | |
44 return; | 53 return; |
45 } | 54 } |
46 | 55 |
47 content::BrowserThread::PostTask( | |
48 content::BrowserThread::UI, | |
49 FROM_HERE, | |
50 base::Bind(&SystemNetworkGetNetworkInterfacesFunction::HandleGetListError, | |
51 this)); | |
52 } | |
53 | |
54 void SystemNetworkGetNetworkInterfacesFunction::HandleGetListError() { | |
55 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
56 Respond(Error(kNetworkListError)); | |
57 } | |
58 | |
59 void SystemNetworkGetNetworkInterfacesFunction::SendResponseOnUIThread( | |
60 const net::NetworkInterfaceList& interface_list) { | |
61 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | |
62 | |
63 std::vector<api::system_network::NetworkInterface> create_arg; | 56 std::vector<api::system_network::NetworkInterface> create_arg; |
64 create_arg.reserve(interface_list.size()); | 57 create_arg.reserve(interface_list->size()); |
65 for (const net::NetworkInterface& interface : interface_list) { | 58 for (const net::NetworkInterface& interface : *interface_list) { |
66 api::system_network::NetworkInterface info; | 59 api::system_network::NetworkInterface info; |
67 info.name = interface.name; | 60 info.name = interface.name; |
68 info.address = interface.address.ToString(); | 61 info.address = interface.address.ToString(); |
69 info.prefix_length = interface.prefix_length; | 62 info.prefix_length = interface.prefix_length; |
70 create_arg.push_back(std::move(info)); | 63 create_arg.push_back(std::move(info)); |
71 } | 64 } |
72 | 65 |
73 Respond(ArgumentList( | 66 Respond(ArgumentList( |
74 api::system_network::GetNetworkInterfaces::Results::Create(create_arg))); | 67 api::system_network::GetNetworkInterfaces::Results::Create(create_arg))); |
75 } | 68 } |
76 | 69 |
77 } // namespace api | 70 } // namespace api |
78 } // namespace extensions | 71 } // namespace extensions |
OLD | NEW |