Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: chromeos/network/network_state_handler.cc

Issue 23712002: Cleanup network type matching. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed unit test in Debug. Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chromeos/network/network_state_handler.h" 5 #include "chromeos/network/network_state_handler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/format_macros.h" 8 #include "base/format_macros.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
13 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
14 #include "base/values.h" 14 #include "base/values.h"
15 #include "chromeos/network/device_state.h" 15 #include "chromeos/network/device_state.h"
16 #include "chromeos/network/favorite_state.h" 16 #include "chromeos/network/favorite_state.h"
17 #include "chromeos/network/managed_state.h" 17 #include "chromeos/network/managed_state.h"
18 #include "chromeos/network/network_event_log.h" 18 #include "chromeos/network/network_event_log.h"
19 #include "chromeos/network/network_state.h" 19 #include "chromeos/network/network_state.h"
20 #include "chromeos/network/network_state_handler_observer.h" 20 #include "chromeos/network/network_state_handler_observer.h"
21 #include "chromeos/network/shill_property_handler.h" 21 #include "chromeos/network/shill_property_handler.h"
22 #include "chromeos/network/shill_property_util.h"
22 #include "third_party/cros_system_api/dbus/service_constants.h" 23 #include "third_party/cros_system_api/dbus/service_constants.h"
23 24
24 namespace chromeos { 25 namespace chromeos {
25 26
26 namespace { 27 namespace {
27 28
28 // Returns true if |network->type()| == |match_type|, or it matches one of the
29 // following special match types:
30 // * kMatchTypeDefault matches any network (i.e. the first instance)
31 // * kMatchTypeNonVirtual matches non virtual networks
32 // * kMatchTypeWireless matches wireless networks
33 // * kMatchTypeMobile matches cellular or wimax networks
34 bool ManagedStateMatchesType(const ManagedState* managed,
35 const std::string& match_type) {
36 const std::string& type = managed->type();
37 if (match_type == NetworkStateHandler::kMatchTypeDefault)
38 return true;
39 if (match_type == type)
40 return true;
41 if (match_type == NetworkStateHandler::kMatchTypeNonVirtual &&
42 type != flimflam::kTypeVPN) {
43 return true;
44 }
45 if (match_type == NetworkStateHandler::kMatchTypeWireless &&
46 type != flimflam::kTypeEthernet && type != flimflam::kTypeVPN) {
47 return true;
48 }
49 if (match_type == NetworkStateHandler::kMatchTypeMobile &&
50 (type == flimflam::kTypeCellular || type == flimflam::kTypeWimax)) {
51 return true;
52 }
53 return false;
54 }
55
56 bool ConnectionStateChanged(NetworkState* network, 29 bool ConnectionStateChanged(NetworkState* network,
57 const std::string& prev_connection_state) { 30 const std::string& prev_connection_state) {
58 return (network->connection_state() != prev_connection_state) && 31 return (network->connection_state() != prev_connection_state) &&
59 (network->connection_state() != flimflam::kStateIdle || 32 (network->connection_state() != flimflam::kStateIdle ||
60 !prev_connection_state.empty()); 33 !prev_connection_state.empty());
61 } 34 }
62 35
63 std::string GetManagedStateLogType(const ManagedState* state) { 36 std::string GetManagedStateLogType(const ManagedState* state) {
64 switch (state->managed_type()) { 37 switch (state->managed_type()) {
65 case ManagedState::MANAGED_TYPE_NETWORK: 38 case ManagedState::MANAGED_TYPE_NETWORK:
66 return "Network"; 39 return "Network";
67 case ManagedState::MANAGED_TYPE_FAVORITE: 40 case ManagedState::MANAGED_TYPE_FAVORITE:
68 return "Favorite"; 41 return "Favorite";
69 case ManagedState::MANAGED_TYPE_DEVICE: 42 case ManagedState::MANAGED_TYPE_DEVICE:
70 return "Device"; 43 return "Device";
71 } 44 }
72 NOTREACHED(); 45 NOTREACHED();
73 return ""; 46 return "";
74 } 47 }
75 48
76 std::string GetManagedStateLogName(const ManagedState* state) { 49 std::string GetManagedStateLogName(const ManagedState* state) {
77 if (!state) 50 if (!state)
78 return "None"; 51 return "None";
79 return base::StringPrintf("%s (%s)", state->name().c_str(), 52 return base::StringPrintf("%s (%s)", state->name().c_str(),
80 state->path().c_str()); 53 state->path().c_str());
81 } 54 }
82 55
83 } // namespace 56 } // namespace
84 57
85 const char NetworkStateHandler::kMatchTypeDefault[] = "default";
86 const char NetworkStateHandler::kMatchTypeWireless[] = "wireless";
87 const char NetworkStateHandler::kMatchTypeMobile[] = "mobile";
88 const char NetworkStateHandler::kMatchTypeNonVirtual[] = "non-virtual";
89 const char NetworkStateHandler::kDefaultCheckPortalList[] = 58 const char NetworkStateHandler::kDefaultCheckPortalList[] =
90 "ethernet,wifi,cellular"; 59 "ethernet,wifi,cellular";
91 60
92 NetworkStateHandler::NetworkStateHandler() { 61 NetworkStateHandler::NetworkStateHandler() {
93 } 62 }
94 63
95 NetworkStateHandler::~NetworkStateHandler() { 64 NetworkStateHandler::~NetworkStateHandler() {
96 STLDeleteContainerPointers(network_list_.begin(), network_list_.end()); 65 STLDeleteContainerPointers(network_list_.begin(), network_list_.end());
97 STLDeleteContainerPointers(favorite_list_.begin(), favorite_list_.end()); 66 STLDeleteContainerPointers(favorite_list_.begin(), favorite_list_.end());
98 STLDeleteContainerPointers(device_list_.begin(), device_list_.end()); 67 STLDeleteContainerPointers(device_list_.begin(), device_list_.end());
(...skipping 30 matching lines...) Expand all
129 network_event_log::LOG_LEVEL_DEBUG, 98 network_event_log::LOG_LEVEL_DEBUG,
130 "NetworkStateHandler::RemoveObserver", ""); 99 "NetworkStateHandler::RemoveObserver", "");
131 } 100 }
132 101
133 void NetworkStateHandler::UpdateManagerProperties() { 102 void NetworkStateHandler::UpdateManagerProperties() {
134 NET_LOG_USER("UpdateManagerProperties", ""); 103 NET_LOG_USER("UpdateManagerProperties", "");
135 shill_property_handler_->UpdateManagerProperties(); 104 shill_property_handler_->UpdateManagerProperties();
136 } 105 }
137 106
138 NetworkStateHandler::TechnologyState NetworkStateHandler::GetTechnologyState( 107 NetworkStateHandler::TechnologyState NetworkStateHandler::GetTechnologyState(
139 const std::string& type) const { 108 const NetworkTypePattern& type) const {
140 std::string technology = GetTechnologyForType(type); 109 std::string technology = GetTechnologyForType(type);
141 TechnologyState state; 110 TechnologyState state;
142 if (shill_property_handler_->IsTechnologyEnabled(technology)) 111 if (shill_property_handler_->IsTechnologyEnabled(technology))
143 state = TECHNOLOGY_ENABLED; 112 state = TECHNOLOGY_ENABLED;
144 else if (shill_property_handler_->IsTechnologyEnabling(technology)) 113 else if (shill_property_handler_->IsTechnologyEnabling(technology))
145 state = TECHNOLOGY_ENABLING; 114 state = TECHNOLOGY_ENABLING;
146 else if (shill_property_handler_->IsTechnologyUninitialized(technology)) 115 else if (shill_property_handler_->IsTechnologyUninitialized(technology))
147 state = TECHNOLOGY_UNINITIALIZED; 116 state = TECHNOLOGY_UNINITIALIZED;
148 else if (shill_property_handler_->IsTechnologyAvailable(technology)) 117 else if (shill_property_handler_->IsTechnologyAvailable(technology))
149 state = TECHNOLOGY_AVAILABLE; 118 state = TECHNOLOGY_AVAILABLE;
150 else 119 else
151 state = TECHNOLOGY_UNAVAILABLE; 120 state = TECHNOLOGY_UNAVAILABLE;
152 VLOG(2) << "GetTechnologyState: " << type << " = " << state; 121 VLOG(2) << "GetTechnologyState: " << type.ToDebugString() << " = " << state;
153 return state; 122 return state;
154 } 123 }
155 124
156 void NetworkStateHandler::SetTechnologyEnabled( 125 void NetworkStateHandler::SetTechnologyEnabled(
157 const std::string& type, 126 const NetworkTypePattern& type,
158 bool enabled, 127 bool enabled,
159 const network_handler::ErrorCallback& error_callback) { 128 const network_handler::ErrorCallback& error_callback) {
160 std::string technology = GetTechnologyForType(type); 129 std::string technology = GetTechnologyForType(type);
161 NET_LOG_USER("SetTechnologyEnabled", 130 NET_LOG_USER("SetTechnologyEnabled",
162 base::StringPrintf("%s:%d", technology.c_str(), enabled)); 131 base::StringPrintf("%s:%d", technology.c_str(), enabled));
163 shill_property_handler_->SetTechnologyEnabled( 132 shill_property_handler_->SetTechnologyEnabled(
164 technology, enabled, error_callback); 133 technology, enabled, error_callback);
165 // Signal Technology state changed -> ENABLING 134 // Signal Technology state changed -> ENABLING
166 NotifyManagerPropertyChanged(); 135 NotifyManagerPropertyChanged();
167 } 136 }
168 137
169 const DeviceState* NetworkStateHandler::GetDeviceState( 138 const DeviceState* NetworkStateHandler::GetDeviceState(
170 const std::string& device_path) const { 139 const std::string& device_path) const {
171 const DeviceState* device = GetModifiableDeviceState(device_path); 140 const DeviceState* device = GetModifiableDeviceState(device_path);
172 DCHECK(!device || device->update_received()); 141 DCHECK(!device || device->update_received());
173 return device; 142 return device;
174 } 143 }
175 144
176 const DeviceState* NetworkStateHandler::GetDeviceStateByType( 145 const DeviceState* NetworkStateHandler::GetDeviceStateByType(
177 const std::string& type) const { 146 const NetworkTypePattern& type) const {
178 for (ManagedStateList::const_iterator iter = device_list_.begin(); 147 for (ManagedStateList::const_iterator iter = device_list_.begin();
179 iter != device_list_.end(); ++iter) { 148 iter != device_list_.end(); ++iter) {
180 ManagedState* device = *iter; 149 ManagedState* device = *iter;
181 if (!device->update_received()) 150 if (!device->update_received())
182 continue; 151 continue;
183 if (ManagedStateMatchesType(device, type)) 152 if (device->Matches(type))
184 return device->AsDeviceState(); 153 return device->AsDeviceState();
185 } 154 }
186 return NULL; 155 return NULL;
187 } 156 }
188 157
189 bool NetworkStateHandler::GetScanningByType(const std::string& type) const { 158 bool NetworkStateHandler::GetScanningByType(
159 const NetworkTypePattern& type) const {
190 for (ManagedStateList::const_iterator iter = device_list_.begin(); 160 for (ManagedStateList::const_iterator iter = device_list_.begin();
191 iter != device_list_.end(); ++iter) { 161 iter != device_list_.end(); ++iter) {
192 const DeviceState* device = (*iter)->AsDeviceState(); 162 const DeviceState* device = (*iter)->AsDeviceState();
193 DCHECK(device); 163 DCHECK(device);
194 if (!device->update_received()) 164 if (!device->update_received())
195 continue; 165 continue;
196 if (ManagedStateMatchesType(device, type) && device->scanning()) 166 if (device->Matches(type) && device->scanning())
197 return true; 167 return true;
198 } 168 }
199 return false; 169 return false;
200 } 170 }
201 171
202 const NetworkState* NetworkStateHandler::GetNetworkState( 172 const NetworkState* NetworkStateHandler::GetNetworkState(
203 const std::string& service_path) const { 173 const std::string& service_path) const {
204 const NetworkState* network = GetModifiableNetworkState(service_path); 174 const NetworkState* network = GetModifiableNetworkState(service_path);
205 DCHECK(!network || network->update_received()); 175 DCHECK(!network || network->update_received());
206 return network; 176 return network;
207 } 177 }
208 178
209 const NetworkState* NetworkStateHandler::DefaultNetwork() const { 179 const NetworkState* NetworkStateHandler::DefaultNetwork() const {
210 if (network_list_.empty()) 180 if (network_list_.empty())
211 return NULL; 181 return NULL;
212 const NetworkState* network = network_list_.front()->AsNetworkState(); 182 const NetworkState* network = network_list_.front()->AsNetworkState();
213 DCHECK(network); 183 DCHECK(network);
214 if (!network->update_received() || !network->IsConnectedState()) 184 if (!network->update_received() || !network->IsConnectedState())
215 return NULL; 185 return NULL;
216 return network; 186 return network;
217 } 187 }
218 188
219 const NetworkState* NetworkStateHandler::ConnectedNetworkByType( 189 const NetworkState* NetworkStateHandler::ConnectedNetworkByType(
220 const std::string& type) const { 190 const NetworkTypePattern& type) const {
221 for (ManagedStateList::const_iterator iter = network_list_.begin(); 191 for (ManagedStateList::const_iterator iter = network_list_.begin();
222 iter != network_list_.end(); ++iter) { 192 iter != network_list_.end(); ++iter) {
223 const NetworkState* network = (*iter)->AsNetworkState(); 193 const NetworkState* network = (*iter)->AsNetworkState();
224 DCHECK(network); 194 DCHECK(network);
225 if (!network->update_received()) 195 if (!network->update_received())
226 continue; 196 continue;
227 if (!network->IsConnectedState()) 197 if (!network->IsConnectedState())
228 break; // Connected networks are listed first. 198 break; // Connected networks are listed first.
229 if (ManagedStateMatchesType(network, type)) 199 if (network->Matches(type))
230 return network; 200 return network;
231 } 201 }
232 return NULL; 202 return NULL;
233 } 203 }
234 204
235 const NetworkState* NetworkStateHandler::ConnectingNetworkByType( 205 const NetworkState* NetworkStateHandler::ConnectingNetworkByType(
236 const std::string& type) const { 206 const NetworkTypePattern& type) const {
237 for (ManagedStateList::const_iterator iter = network_list_.begin(); 207 for (ManagedStateList::const_iterator iter = network_list_.begin();
238 iter != network_list_.end(); ++iter) { 208 iter != network_list_.end(); ++iter) {
239 const NetworkState* network = (*iter)->AsNetworkState(); 209 const NetworkState* network = (*iter)->AsNetworkState();
240 DCHECK(network); 210 DCHECK(network);
241 if (!network->update_received() || network->IsConnectedState()) 211 if (!network->update_received() || network->IsConnectedState())
242 continue; 212 continue;
243 if (!network->IsConnectingState()) 213 if (!network->IsConnectingState())
244 break; // Connected and connecting networks are listed first. 214 break; // Connected and connecting networks are listed first.
245 if (ManagedStateMatchesType(network, type)) 215 if (network->Matches(type))
246 return network; 216 return network;
247 } 217 }
248 return NULL; 218 return NULL;
249 } 219 }
250 220
251 const NetworkState* NetworkStateHandler::FirstNetworkByType( 221 const NetworkState* NetworkStateHandler::FirstNetworkByType(
252 const std::string& type) const { 222 const NetworkTypePattern& type) const {
253 for (ManagedStateList::const_iterator iter = network_list_.begin(); 223 for (ManagedStateList::const_iterator iter = network_list_.begin();
254 iter != network_list_.end(); ++iter) { 224 iter != network_list_.end(); ++iter) {
255 const NetworkState* network = (*iter)->AsNetworkState(); 225 const NetworkState* network = (*iter)->AsNetworkState();
256 DCHECK(network); 226 DCHECK(network);
257 if (!network->update_received()) 227 if (!network->update_received())
258 continue; 228 continue;
259 if (ManagedStateMatchesType(network, type)) 229 if (network->Matches(type))
260 return network; 230 return network;
261 } 231 }
262 return NULL; 232 return NULL;
263 } 233 }
264 234
265 std::string NetworkStateHandler::HardwareAddressForType( 235 std::string NetworkStateHandler::HardwareAddressForType(
266 const std::string& type) const { 236 const NetworkTypePattern& type) const {
267 const NetworkState* network = ConnectedNetworkByType(type); 237 const NetworkState* network = ConnectedNetworkByType(type);
268 if (!network) 238 if (!network)
269 return std::string(); 239 return std::string();
270 const DeviceState* device = GetDeviceState(network->device_path()); 240 const DeviceState* device = GetDeviceState(network->device_path());
271 if (!device) 241 if (!device)
272 return std::string(); 242 return std::string();
273 std::string result = device->mac_address(); 243 std::string result = device->mac_address();
274 StringToUpperASCII(&result); 244 StringToUpperASCII(&result);
275 return result; 245 return result;
276 } 246 }
277 247
278 std::string NetworkStateHandler::FormattedHardwareAddressForType( 248 std::string NetworkStateHandler::FormattedHardwareAddressForType(
279 const std::string& type) const { 249 const NetworkTypePattern& type) const {
280 std::string address = HardwareAddressForType(type); 250 std::string address = HardwareAddressForType(type);
281 if (address.size() % 2 != 0) 251 if (address.size() % 2 != 0)
282 return address; 252 return address;
283 std::string result; 253 std::string result;
284 for (size_t i = 0; i < address.size(); ++i) { 254 for (size_t i = 0; i < address.size(); ++i) {
285 if ((i != 0) && (i % 2 == 0)) 255 if ((i != 0) && (i % 2 == 0))
286 result.push_back(':'); 256 result.push_back(':');
287 result.push_back(address[i]); 257 result.push_back(address[i]);
288 } 258 }
289 return result; 259 return result;
290 } 260 }
291 261
292 void NetworkStateHandler::GetNetworkList(NetworkStateList* list) const { 262 void NetworkStateHandler::GetNetworkList(NetworkStateList* list) const {
293 GetNetworkListByType(kMatchTypeDefault, list); 263 GetNetworkListByType(NetworkTypePattern::Default(), list);
294 } 264 }
295 265
296 void NetworkStateHandler::GetNetworkListByType(const std::string& type, 266 void NetworkStateHandler::GetNetworkListByType(const NetworkTypePattern& type,
297 NetworkStateList* list) const { 267 NetworkStateList* list) const {
298 DCHECK(list); 268 DCHECK(list);
299 list->clear(); 269 list->clear();
300 for (ManagedStateList::const_iterator iter = network_list_.begin(); 270 for (ManagedStateList::const_iterator iter = network_list_.begin();
301 iter != network_list_.end(); ++iter) { 271 iter != network_list_.end(); ++iter) {
302 const NetworkState* network = (*iter)->AsNetworkState(); 272 const NetworkState* network = (*iter)->AsNetworkState();
303 DCHECK(network); 273 DCHECK(network);
304 if (!network->update_received()) 274 if (!network->update_received())
305 continue; 275 continue;
306 if (ManagedStateMatchesType(network, type)) 276 if (network->Matches(type))
307 list->push_back(network); 277 list->push_back(network);
308 } 278 }
309 } 279 }
310 280
311 void NetworkStateHandler::GetDeviceList(DeviceStateList* list) const { 281 void NetworkStateHandler::GetDeviceList(DeviceStateList* list) const {
312 DCHECK(list); 282 DCHECK(list);
313 list->clear(); 283 list->clear();
314 for (ManagedStateList::const_iterator iter = device_list_.begin(); 284 for (ManagedStateList::const_iterator iter = device_list_.begin();
315 iter != device_list_.end(); ++iter) { 285 iter != device_list_.end(); ++iter) {
316 const DeviceState* device = (*iter)->AsDeviceState(); 286 const DeviceState* device = (*iter)->AsDeviceState();
(...skipping 30 matching lines...) Expand all
347 } 317 }
348 318
349 void NetworkStateHandler::RequestScan() const { 319 void NetworkStateHandler::RequestScan() const {
350 NET_LOG_USER("RequestScan", ""); 320 NET_LOG_USER("RequestScan", "");
351 shill_property_handler_->RequestScan(); 321 shill_property_handler_->RequestScan();
352 } 322 }
353 323
354 void NetworkStateHandler::WaitForScan(const std::string& type, 324 void NetworkStateHandler::WaitForScan(const std::string& type,
355 const base::Closure& callback) { 325 const base::Closure& callback) {
356 scan_complete_callbacks_[type].push_back(callback); 326 scan_complete_callbacks_[type].push_back(callback);
357 if (!GetScanningByType(type)) 327 if (!GetScanningByType(NetworkTypePattern::Primitive(type)))
358 RequestScan(); 328 RequestScan();
359 } 329 }
360 330
361 void NetworkStateHandler::ConnectToBestWifiNetwork() { 331 void NetworkStateHandler::ConnectToBestWifiNetwork() {
362 NET_LOG_USER("ConnectToBestWifiNetwork", ""); 332 NET_LOG_USER("ConnectToBestWifiNetwork", "");
363 WaitForScan(flimflam::kTypeWifi, 333 WaitForScan(flimflam::kTypeWifi,
364 base::Bind(&internal::ShillPropertyHandler::ConnectToBestServices, 334 base::Bind(&internal::ShillPropertyHandler::ConnectToBestServices,
365 shill_property_handler_->AsWeakPtr())); 335 shill_property_handler_->AsWeakPtr()));
366 } 336 }
367 337
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 return; 709 return;
740 ScanCallbackList& callback_list = scan_complete_callbacks_[type]; 710 ScanCallbackList& callback_list = scan_complete_callbacks_[type];
741 for (ScanCallbackList::iterator iter = callback_list.begin(); 711 for (ScanCallbackList::iterator iter = callback_list.begin();
742 iter != callback_list.end(); ++iter) { 712 iter != callback_list.end(); ++iter) {
743 (*iter).Run(); 713 (*iter).Run();
744 } 714 }
745 scan_complete_callbacks_.erase(type); 715 scan_complete_callbacks_.erase(type);
746 } 716 }
747 717
748 std::string NetworkStateHandler::GetTechnologyForType( 718 std::string NetworkStateHandler::GetTechnologyForType(
749 const std::string& type) const { 719 const NetworkTypePattern& type) const {
750 if (type == kMatchTypeMobile) { 720 if (type.MatchesType(flimflam::kTypeEthernet))
751 if (shill_property_handler_->IsTechnologyAvailable(flimflam::kTypeWimax)) 721 return flimflam::kTypeEthernet;
722
723 if (type.MatchesType(flimflam::kTypeWifi))
724 return flimflam::kTypeWifi;
725
726 if (type.Equals(NetworkTypePattern::Wimax()))
752 return flimflam::kTypeWimax; 727 return flimflam::kTypeWimax;
753 else 728
729 // Prefer Wimax over Cellular only if it's available.
730 if (type.MatchesType(flimflam::kTypeWimax) &&
731 shill_property_handler_->IsTechnologyAvailable(flimflam::kTypeWimax)) {
732 return flimflam::kTypeWimax;
733 }
734
735 if (type.MatchesType(flimflam::kTypeCellular))
754 return flimflam::kTypeCellular; 736 return flimflam::kTypeCellular;
755 } 737
756 if (type == kMatchTypeDefault || type == kMatchTypeNonVirtual || 738 NOTREACHED();
757 type == kMatchTypeWireless) { 739 return std::string();
758 NOTREACHED();
759 return flimflam::kTypeWifi;
760 }
761 return type;
762 } 740 }
763 741
764 } // namespace chromeos 742 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/network/network_state_handler.h ('k') | chromeos/network/network_state_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698