Home | History | Annotate | Download | only in networking_private
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/extensions/api/networking_private/networking_private_api.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "base/callback.h"
     10 #include "chrome/browser/extensions/api/networking_private/networking_private_delegate.h"
     11 #include "chrome/common/extensions/api/networking_private.h"
     12 #include "components/onc/onc_constants.h"
     13 #include "extensions/browser/extension_function_registry.h"
     14 
     15 namespace {
     16 
     17 const int kDefaultNetworkListLimit = 1000;
     18 
     19 extensions::NetworkingPrivateDelegate* GetDelegate(
     20     content::BrowserContext* browser_context) {
     21   return extensions::NetworkingPrivateDelegate::GetForBrowserContext(
     22       browser_context);
     23 }
     24 
     25 }  // namespace
     26 
     27 namespace private_api = extensions::api::networking_private;
     28 
     29 namespace extensions {
     30 
     31 namespace networking_private {
     32 
     33 // static
     34 const char kErrorInvalidNetworkGuid[] = "Error.InvalidNetworkGuid";
     35 const char kErrorNetworkUnavailable[] = "Error.NetworkUnavailable";
     36 const char kErrorEncryptionError[] = "Error.EncryptionError";
     37 const char kErrorNotReady[] = "Error.NotReady";
     38 const char kErrorNotSupported[] = "Error.NotSupported";
     39 
     40 }  // namespace networking_private
     41 
     42 ////////////////////////////////////////////////////////////////////////////////
     43 // NetworkingPrivateGetPropertiesFunction
     44 
     45 NetworkingPrivateGetPropertiesFunction::
     46     ~NetworkingPrivateGetPropertiesFunction() {
     47 }
     48 
     49 bool NetworkingPrivateGetPropertiesFunction::RunAsync() {
     50   scoped_ptr<private_api::GetProperties::Params> params =
     51       private_api::GetProperties::Params::Create(*args_);
     52   EXTENSION_FUNCTION_VALIDATE(params);
     53 
     54   GetDelegate(browser_context())->GetProperties(
     55       params->network_guid,
     56       base::Bind(&NetworkingPrivateGetPropertiesFunction::Success, this),
     57       base::Bind(&NetworkingPrivateGetPropertiesFunction::Failure, this));
     58   return true;
     59 }
     60 
     61 void NetworkingPrivateGetPropertiesFunction::Success(
     62     scoped_ptr<base::DictionaryValue> result) {
     63   SetResult(result.release());
     64   SendResponse(true);
     65 }
     66 
     67 void NetworkingPrivateGetPropertiesFunction::Failure(const std::string& error) {
     68   error_ = error;
     69   SendResponse(false);
     70 }
     71 
     72 ////////////////////////////////////////////////////////////////////////////////
     73 // NetworkingPrivateGetManagedPropertiesFunction
     74 
     75 NetworkingPrivateGetManagedPropertiesFunction::
     76     ~NetworkingPrivateGetManagedPropertiesFunction() {
     77 }
     78 
     79 bool NetworkingPrivateGetManagedPropertiesFunction::RunAsync() {
     80   scoped_ptr<private_api::GetManagedProperties::Params> params =
     81       private_api::GetManagedProperties::Params::Create(*args_);
     82   EXTENSION_FUNCTION_VALIDATE(params);
     83 
     84   GetDelegate(browser_context())->GetManagedProperties(
     85       params->network_guid,
     86       base::Bind(&NetworkingPrivateGetManagedPropertiesFunction::Success, this),
     87       base::Bind(&NetworkingPrivateGetManagedPropertiesFunction::Failure,
     88                  this));
     89   return true;
     90 }
     91 
     92 void NetworkingPrivateGetManagedPropertiesFunction::Success(
     93     scoped_ptr<base::DictionaryValue> result) {
     94   SetResult(result.release());
     95   SendResponse(true);
     96 }
     97 
     98 void NetworkingPrivateGetManagedPropertiesFunction::Failure(
     99     const std::string& error) {
    100   error_ = error;
    101   SendResponse(false);
    102 }
    103 
    104 ////////////////////////////////////////////////////////////////////////////////
    105 // NetworkingPrivateGetStateFunction
    106 
    107 NetworkingPrivateGetStateFunction::~NetworkingPrivateGetStateFunction() {
    108 }
    109 
    110 bool NetworkingPrivateGetStateFunction::RunAsync() {
    111   scoped_ptr<private_api::GetState::Params> params =
    112       private_api::GetState::Params::Create(*args_);
    113   EXTENSION_FUNCTION_VALIDATE(params);
    114 
    115   GetDelegate(browser_context())->GetState(
    116       params->network_guid,
    117       base::Bind(&NetworkingPrivateGetStateFunction::Success, this),
    118       base::Bind(&NetworkingPrivateGetStateFunction::Failure, this));
    119   return true;
    120 }
    121 
    122 void NetworkingPrivateGetStateFunction::Success(
    123     scoped_ptr<base::DictionaryValue> result) {
    124   SetResult(result.release());
    125   SendResponse(true);
    126 }
    127 
    128 void NetworkingPrivateGetStateFunction::Failure(const std::string& error) {
    129   error_ = error;
    130   SendResponse(false);
    131 }
    132 
    133 ////////////////////////////////////////////////////////////////////////////////
    134 // NetworkingPrivateSetPropertiesFunction
    135 
    136 NetworkingPrivateSetPropertiesFunction::
    137     ~NetworkingPrivateSetPropertiesFunction() {
    138 }
    139 
    140 bool NetworkingPrivateSetPropertiesFunction::RunAsync() {
    141   scoped_ptr<private_api::SetProperties::Params> params =
    142       private_api::SetProperties::Params::Create(*args_);
    143   EXTENSION_FUNCTION_VALIDATE(params);
    144 
    145   scoped_ptr<base::DictionaryValue> properties_dict(
    146       params->properties.ToValue());
    147 
    148   GetDelegate(browser_context())->SetProperties(
    149       params->network_guid,
    150       properties_dict.Pass(),
    151       base::Bind(&NetworkingPrivateSetPropertiesFunction::Success, this),
    152       base::Bind(&NetworkingPrivateSetPropertiesFunction::Failure, this));
    153   return true;
    154 }
    155 
    156 void NetworkingPrivateSetPropertiesFunction::Success() {
    157   SendResponse(true);
    158 }
    159 
    160 void NetworkingPrivateSetPropertiesFunction::Failure(const std::string& error) {
    161   error_ = error;
    162   SendResponse(false);
    163 }
    164 
    165 ////////////////////////////////////////////////////////////////////////////////
    166 // NetworkingPrivateCreateNetworkFunction
    167 
    168 NetworkingPrivateCreateNetworkFunction::
    169     ~NetworkingPrivateCreateNetworkFunction() {
    170 }
    171 
    172 bool NetworkingPrivateCreateNetworkFunction::RunAsync() {
    173   scoped_ptr<private_api::CreateNetwork::Params> params =
    174       private_api::CreateNetwork::Params::Create(*args_);
    175   EXTENSION_FUNCTION_VALIDATE(params);
    176 
    177   scoped_ptr<base::DictionaryValue> properties_dict(
    178       params->properties.ToValue());
    179 
    180   GetDelegate(browser_context())->CreateNetwork(
    181       params->shared,
    182       properties_dict.Pass(),
    183       base::Bind(&NetworkingPrivateCreateNetworkFunction::Success, this),
    184       base::Bind(&NetworkingPrivateCreateNetworkFunction::Failure, this));
    185   return true;
    186 }
    187 
    188 void NetworkingPrivateCreateNetworkFunction::Success(const std::string& guid) {
    189   results_ = private_api::CreateNetwork::Results::Create(guid);
    190   SendResponse(true);
    191 }
    192 
    193 void NetworkingPrivateCreateNetworkFunction::Failure(const std::string& error) {
    194   error_ = error;
    195   SendResponse(false);
    196 }
    197 
    198 ////////////////////////////////////////////////////////////////////////////////
    199 // NetworkingPrivateGetNetworksFunction
    200 
    201 NetworkingPrivateGetNetworksFunction::~NetworkingPrivateGetNetworksFunction() {
    202 }
    203 
    204 bool NetworkingPrivateGetNetworksFunction::RunAsync() {
    205   scoped_ptr<private_api::GetNetworks::Params> params =
    206       private_api::GetNetworks::Params::Create(*args_);
    207   EXTENSION_FUNCTION_VALIDATE(params);
    208 
    209   std::string network_type = private_api::ToString(params->filter.network_type);
    210   const bool configured_only =
    211       params->filter.configured ? *params->filter.configured : false;
    212   const bool visible_only =
    213       params->filter.visible ? *params->filter.visible : false;
    214   const int limit =
    215       params->filter.limit ? *params->filter.limit : kDefaultNetworkListLimit;
    216 
    217   GetDelegate(browser_context())->GetNetworks(
    218       network_type,
    219       configured_only,
    220       visible_only,
    221       limit,
    222       base::Bind(&NetworkingPrivateGetNetworksFunction::Success, this),
    223       base::Bind(&NetworkingPrivateGetNetworksFunction::Failure, this));
    224   return true;
    225 }
    226 
    227 void NetworkingPrivateGetNetworksFunction::Success(
    228     scoped_ptr<base::ListValue> network_list) {
    229   SetResult(network_list.release());
    230   SendResponse(true);
    231 }
    232 
    233 void NetworkingPrivateGetNetworksFunction::Failure(const std::string& error) {
    234   error_ = error;
    235   SendResponse(false);
    236 }
    237 
    238 ////////////////////////////////////////////////////////////////////////////////
    239 // NetworkingPrivateGetVisibleNetworksFunction
    240 
    241 NetworkingPrivateGetVisibleNetworksFunction::
    242     ~NetworkingPrivateGetVisibleNetworksFunction() {
    243 }
    244 
    245 bool NetworkingPrivateGetVisibleNetworksFunction::RunAsync() {
    246   scoped_ptr<private_api::GetVisibleNetworks::Params> params =
    247       private_api::GetVisibleNetworks::Params::Create(*args_);
    248   EXTENSION_FUNCTION_VALIDATE(params);
    249 
    250   std::string network_type = private_api::ToString(params->network_type);
    251   const bool configured_only = false;
    252   const bool visible_only = true;
    253 
    254   GetDelegate(browser_context())->GetNetworks(
    255       network_type,
    256       configured_only,
    257       visible_only,
    258       kDefaultNetworkListLimit,
    259       base::Bind(&NetworkingPrivateGetVisibleNetworksFunction::Success, this),
    260       base::Bind(&NetworkingPrivateGetVisibleNetworksFunction::Failure, this));
    261   return true;
    262 }
    263 
    264 void NetworkingPrivateGetVisibleNetworksFunction::Success(
    265     scoped_ptr<base::ListValue> network_properties_list) {
    266   SetResult(network_properties_list.release());
    267   SendResponse(true);
    268 }
    269 
    270 void NetworkingPrivateGetVisibleNetworksFunction::Failure(
    271     const std::string& error) {
    272   error_ = error;
    273   SendResponse(false);
    274 }
    275 
    276 ////////////////////////////////////////////////////////////////////////////////
    277 // NetworkingPrivateGetEnabledNetworkTypesFunction
    278 
    279 NetworkingPrivateGetEnabledNetworkTypesFunction::
    280     ~NetworkingPrivateGetEnabledNetworkTypesFunction() {
    281 }
    282 
    283 bool NetworkingPrivateGetEnabledNetworkTypesFunction::RunSync() {
    284   scoped_ptr<base::ListValue> enabled_networks_onc_types(
    285       GetDelegate(browser_context())->GetEnabledNetworkTypes());
    286   if (!enabled_networks_onc_types) {
    287     error_ = networking_private::kErrorNotSupported;
    288     return false;
    289   }
    290   scoped_ptr<base::ListValue> enabled_networks_list(new base::ListValue);
    291   for (base::ListValue::iterator iter = enabled_networks_onc_types->begin();
    292        iter != enabled_networks_onc_types->end(); ++iter) {
    293     std::string type;
    294     if (!(*iter)->GetAsString(&type))
    295       NOTREACHED();
    296     if (type == ::onc::network_type::kEthernet) {
    297       enabled_networks_list->AppendString(api::networking_private::ToString(
    298           api::networking_private::NETWORK_TYPE_ETHERNET));
    299     } else if (type == ::onc::network_type::kWiFi) {
    300       enabled_networks_list->AppendString(api::networking_private::ToString(
    301           api::networking_private::NETWORK_TYPE_WIFI));
    302     } else if (type == ::onc::network_type::kWimax) {
    303       enabled_networks_list->AppendString(api::networking_private::ToString(
    304           api::networking_private::NETWORK_TYPE_WIMAX));
    305     } else if (type == ::onc::network_type::kCellular) {
    306       enabled_networks_list->AppendString(api::networking_private::ToString(
    307           api::networking_private::NETWORK_TYPE_CELLULAR));
    308     } else {
    309       LOG(ERROR) << "networkingPrivate: Unexpected type: " << type;
    310     }
    311   }
    312   SetResult(enabled_networks_list.release());
    313   return true;
    314 }
    315 
    316 ////////////////////////////////////////////////////////////////////////////////
    317 // NetworkingPrivateEnableNetworkTypeFunction
    318 
    319 NetworkingPrivateEnableNetworkTypeFunction::
    320     ~NetworkingPrivateEnableNetworkTypeFunction() {
    321 }
    322 
    323 bool NetworkingPrivateEnableNetworkTypeFunction::RunSync() {
    324   scoped_ptr<private_api::EnableNetworkType::Params> params =
    325       private_api::EnableNetworkType::Params::Create(*args_);
    326   EXTENSION_FUNCTION_VALIDATE(params);
    327 
    328   return GetDelegate(browser_context())->EnableNetworkType(
    329       private_api::ToString(params->network_type));
    330 }
    331 
    332 ////////////////////////////////////////////////////////////////////////////////
    333 // NetworkingPrivateDisableNetworkTypeFunction
    334 
    335 NetworkingPrivateDisableNetworkTypeFunction::
    336     ~NetworkingPrivateDisableNetworkTypeFunction() {
    337 }
    338 
    339 bool NetworkingPrivateDisableNetworkTypeFunction::RunSync() {
    340   scoped_ptr<private_api::DisableNetworkType::Params> params =
    341       private_api::DisableNetworkType::Params::Create(*args_);
    342 
    343   return GetDelegate(browser_context())->DisableNetworkType(
    344       private_api::ToString(params->network_type));
    345 }
    346 
    347 ////////////////////////////////////////////////////////////////////////////////
    348 // NetworkingPrivateRequestNetworkScanFunction
    349 
    350 NetworkingPrivateRequestNetworkScanFunction::
    351     ~NetworkingPrivateRequestNetworkScanFunction() {
    352 }
    353 
    354 bool NetworkingPrivateRequestNetworkScanFunction::RunSync() {
    355   return GetDelegate(browser_context())->RequestScan();
    356 }
    357 
    358 ////////////////////////////////////////////////////////////////////////////////
    359 // NetworkingPrivateStartConnectFunction
    360 
    361 NetworkingPrivateStartConnectFunction::
    362     ~NetworkingPrivateStartConnectFunction() {
    363 }
    364 
    365 bool NetworkingPrivateStartConnectFunction::RunAsync() {
    366   scoped_ptr<private_api::StartConnect::Params> params =
    367       private_api::StartConnect::Params::Create(*args_);
    368   EXTENSION_FUNCTION_VALIDATE(params);
    369 
    370   GetDelegate(browser_context())->StartConnect(
    371       params->network_guid,
    372       base::Bind(&NetworkingPrivateStartConnectFunction::Success, this),
    373       base::Bind(&NetworkingPrivateStartConnectFunction::Failure, this));
    374   return true;
    375 }
    376 
    377 void NetworkingPrivateStartConnectFunction::Success() {
    378   SendResponse(true);
    379 }
    380 
    381 void NetworkingPrivateStartConnectFunction::Failure(const std::string& error) {
    382   error_ = error;
    383   SendResponse(false);
    384 }
    385 
    386 ////////////////////////////////////////////////////////////////////////////////
    387 // NetworkingPrivateStartDisconnectFunction
    388 
    389 NetworkingPrivateStartDisconnectFunction::
    390     ~NetworkingPrivateStartDisconnectFunction() {
    391 }
    392 
    393 bool NetworkingPrivateStartDisconnectFunction::RunAsync() {
    394   scoped_ptr<private_api::StartDisconnect::Params> params =
    395       private_api::StartDisconnect::Params::Create(*args_);
    396   EXTENSION_FUNCTION_VALIDATE(params);
    397 
    398   GetDelegate(browser_context())->StartDisconnect(
    399       params->network_guid,
    400       base::Bind(&NetworkingPrivateStartDisconnectFunction::Success, this),
    401       base::Bind(&NetworkingPrivateStartDisconnectFunction::Failure, this));
    402   return true;
    403 }
    404 
    405 void NetworkingPrivateStartDisconnectFunction::Success() {
    406   SendResponse(true);
    407 }
    408 
    409 void NetworkingPrivateStartDisconnectFunction::Failure(
    410     const std::string& error) {
    411   error_ = error;
    412   SendResponse(false);
    413 }
    414 
    415 ////////////////////////////////////////////////////////////////////////////////
    416 // NetworkingPrivateVerifyDestinationFunction
    417 
    418 NetworkingPrivateVerifyDestinationFunction::
    419     ~NetworkingPrivateVerifyDestinationFunction() {
    420 }
    421 
    422 bool NetworkingPrivateVerifyDestinationFunction::RunAsync() {
    423   scoped_ptr<private_api::VerifyDestination::Params> params =
    424       private_api::VerifyDestination::Params::Create(*args_);
    425   EXTENSION_FUNCTION_VALIDATE(params);
    426 
    427   GetDelegate(browser_context())->VerifyDestination(
    428       params->properties,
    429       base::Bind(&NetworkingPrivateVerifyDestinationFunction::Success, this),
    430       base::Bind(&NetworkingPrivateVerifyDestinationFunction::Failure, this));
    431   return true;
    432 }
    433 
    434 void NetworkingPrivateVerifyDestinationFunction::Success(bool result) {
    435   results_ = private_api::VerifyDestination::Results::Create(result);
    436   SendResponse(true);
    437 }
    438 
    439 void NetworkingPrivateVerifyDestinationFunction::Failure(
    440     const std::string& error) {
    441   error_ = error;
    442   SendResponse(false);
    443 }
    444 
    445 ////////////////////////////////////////////////////////////////////////////////
    446 // NetworkingPrivateVerifyAndEncryptCredentialsFunction
    447 
    448 NetworkingPrivateVerifyAndEncryptCredentialsFunction::
    449     ~NetworkingPrivateVerifyAndEncryptCredentialsFunction() {
    450 }
    451 
    452 bool NetworkingPrivateVerifyAndEncryptCredentialsFunction::RunAsync() {
    453   scoped_ptr<private_api::VerifyAndEncryptCredentials::Params> params =
    454       private_api::VerifyAndEncryptCredentials::Params::Create(*args_);
    455   EXTENSION_FUNCTION_VALIDATE(params);
    456 
    457   GetDelegate(browser_context())->VerifyAndEncryptCredentials(
    458       params->network_guid,
    459       params->properties,
    460       base::Bind(&NetworkingPrivateVerifyAndEncryptCredentialsFunction::Success,
    461                  this),
    462       base::Bind(&NetworkingPrivateVerifyAndEncryptCredentialsFunction::Failure,
    463                  this));
    464   return true;
    465 }
    466 
    467 void NetworkingPrivateVerifyAndEncryptCredentialsFunction::Success(
    468     const std::string& result) {
    469   results_ = private_api::VerifyAndEncryptCredentials::Results::Create(result);
    470   SendResponse(true);
    471 }
    472 
    473 void NetworkingPrivateVerifyAndEncryptCredentialsFunction::Failure(
    474     const std::string& error) {
    475   error_ = error;
    476   SendResponse(false);
    477 }
    478 
    479 ////////////////////////////////////////////////////////////////////////////////
    480 // NetworkingPrivateVerifyAndEncryptDataFunction
    481 
    482 NetworkingPrivateVerifyAndEncryptDataFunction::
    483     ~NetworkingPrivateVerifyAndEncryptDataFunction() {
    484 }
    485 
    486 bool NetworkingPrivateVerifyAndEncryptDataFunction::RunAsync() {
    487   scoped_ptr<private_api::VerifyAndEncryptData::Params> params =
    488       private_api::VerifyAndEncryptData::Params::Create(*args_);
    489   EXTENSION_FUNCTION_VALIDATE(params);
    490 
    491   GetDelegate(browser_context())->VerifyAndEncryptData(
    492       params->properties,
    493       params->data,
    494       base::Bind(&NetworkingPrivateVerifyAndEncryptDataFunction::Success, this),
    495       base::Bind(&NetworkingPrivateVerifyAndEncryptDataFunction::Failure,
    496                  this));
    497   return true;
    498 }
    499 
    500 void NetworkingPrivateVerifyAndEncryptDataFunction::Success(
    501     const std::string& result) {
    502   results_ = private_api::VerifyAndEncryptData::Results::Create(result);
    503   SendResponse(true);
    504 }
    505 
    506 void NetworkingPrivateVerifyAndEncryptDataFunction::Failure(
    507     const std::string& error) {
    508   error_ = error;
    509   SendResponse(false);
    510 }
    511 
    512 ////////////////////////////////////////////////////////////////////////////////
    513 // NetworkingPrivateSetWifiTDLSEnabledStateFunction
    514 
    515 NetworkingPrivateSetWifiTDLSEnabledStateFunction::
    516     ~NetworkingPrivateSetWifiTDLSEnabledStateFunction() {
    517 }
    518 
    519 bool NetworkingPrivateSetWifiTDLSEnabledStateFunction::RunAsync() {
    520   scoped_ptr<private_api::SetWifiTDLSEnabledState::Params> params =
    521       private_api::SetWifiTDLSEnabledState::Params::Create(*args_);
    522   EXTENSION_FUNCTION_VALIDATE(params);
    523 
    524   GetDelegate(browser_context())->SetWifiTDLSEnabledState(
    525       params->ip_or_mac_address,
    526       params->enabled,
    527       base::Bind(&NetworkingPrivateSetWifiTDLSEnabledStateFunction::Success,
    528                  this),
    529       base::Bind(&NetworkingPrivateSetWifiTDLSEnabledStateFunction::Failure,
    530                  this));
    531 
    532   return true;
    533 }
    534 
    535 void NetworkingPrivateSetWifiTDLSEnabledStateFunction::Success(
    536     const std::string& result) {
    537   results_ = private_api::SetWifiTDLSEnabledState::Results::Create(result);
    538   SendResponse(true);
    539 }
    540 
    541 void NetworkingPrivateSetWifiTDLSEnabledStateFunction::Failure(
    542     const std::string& error) {
    543   error_ = error;
    544   SendResponse(false);
    545 }
    546 
    547 ////////////////////////////////////////////////////////////////////////////////
    548 // NetworkingPrivateGetWifiTDLSStatusFunction
    549 
    550 NetworkingPrivateGetWifiTDLSStatusFunction::
    551     ~NetworkingPrivateGetWifiTDLSStatusFunction() {
    552 }
    553 
    554 bool NetworkingPrivateGetWifiTDLSStatusFunction::RunAsync() {
    555   scoped_ptr<private_api::GetWifiTDLSStatus::Params> params =
    556       private_api::GetWifiTDLSStatus::Params::Create(*args_);
    557   EXTENSION_FUNCTION_VALIDATE(params);
    558 
    559   GetDelegate(browser_context())->GetWifiTDLSStatus(
    560       params->ip_or_mac_address,
    561       base::Bind(&NetworkingPrivateGetWifiTDLSStatusFunction::Success, this),
    562       base::Bind(&NetworkingPrivateGetWifiTDLSStatusFunction::Failure, this));
    563 
    564   return true;
    565 }
    566 
    567 void NetworkingPrivateGetWifiTDLSStatusFunction::Success(
    568     const std::string& result) {
    569   results_ = private_api::GetWifiTDLSStatus::Results::Create(result);
    570   SendResponse(true);
    571 }
    572 
    573 void NetworkingPrivateGetWifiTDLSStatusFunction::Failure(
    574     const std::string& error) {
    575   error_ = error;
    576   SendResponse(false);
    577 }
    578 
    579 ////////////////////////////////////////////////////////////////////////////////
    580 // NetworkingPrivateGetCaptivePortalStatusFunction
    581 
    582 NetworkingPrivateGetCaptivePortalStatusFunction::
    583     ~NetworkingPrivateGetCaptivePortalStatusFunction() {
    584 }
    585 
    586 bool NetworkingPrivateGetCaptivePortalStatusFunction::RunAsync() {
    587   scoped_ptr<private_api::GetCaptivePortalStatus::Params> params =
    588       private_api::GetCaptivePortalStatus::Params::Create(*args_);
    589   EXTENSION_FUNCTION_VALIDATE(params);
    590 
    591   GetDelegate(browser_context())->GetCaptivePortalStatus(
    592       params->network_guid,
    593       base::Bind(&NetworkingPrivateGetCaptivePortalStatusFunction::Success,
    594                  this),
    595       base::Bind(&NetworkingPrivateGetCaptivePortalStatusFunction::Failure,
    596                  this));
    597   return true;
    598 }
    599 
    600 void NetworkingPrivateGetCaptivePortalStatusFunction::Success(
    601     const std::string& result) {
    602   results_ = private_api::GetCaptivePortalStatus::Results::Create(
    603       private_api::ParseCaptivePortalStatus(result));
    604   SendResponse(true);
    605 }
    606 
    607 void NetworkingPrivateGetCaptivePortalStatusFunction::Failure(
    608     const std::string& error) {
    609   error_ = error;
    610   SendResponse(false);
    611 }
    612 
    613 }  // namespace extensions
    614