Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / options / chromeos / internet_options_handler.cc
index 9254eb7..cba0211 100644 (file)
 #include "chrome/browser/chromeos/ui/mobile_config_ui.h"
 #include "chrome/browser/chromeos/ui_proxy_config_service.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/chromeos/mobile_setup_dialog.h"
 #include "chrome/browser/ui/webui/options/chromeos/internet_options_handler_strings.h"
 #include "chromeos/chromeos_switches.h"
+#include "chromeos/login/login_state.h"
 #include "chromeos/network/device_state.h"
 #include "chromeos/network/managed_network_configuration_handler.h"
 #include "chromeos/network/network_configuration_handler.h"
 #include "chromeos/network/network_state_handler.h"
 #include "chromeos/network/network_util.h"
 #include "chromeos/network/onc/onc_signature.h"
+#include "chromeos/network/onc/onc_translation_tables.h"
 #include "chromeos/network/onc/onc_translator.h"
 #include "chromeos/network/onc/onc_utils.h"
 #include "components/onc/onc_constants.h"
-#include "content/public/browser/user_metrics.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
-#include "grit/ash_resources.h"
 #include "grit/ui_chromeos_resources.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -65,27 +66,11 @@ namespace {
 // Keys for the network description dictionary passed to the web ui. Make sure
 // to keep the strings in sync with what the JavaScript side uses.
 const char kNetworkInfoKeyIconURL[] = "iconURL";
-const char kNetworkInfoKeyServicePath[] = "servicePath";
 const char kNetworkInfoKeyPolicyManaged[] = "policyManaged";
 
-// These are keys for getting IP information from the web ui.
-const char kIpConfigAddress[] = "address";
-const char kIpConfigPrefixLength[] = "prefixLength";
-const char kIpConfigNetmask[] = "netmask";
-const char kIpConfigGateway[] = "gateway";
-const char kIpConfigNameServers[] = "nameServers";
-const char kIpConfigAutoConfig[] = "ipAutoConfig";
-const char kIpConfigWebProxyAutoDiscoveryUrl[] = "webProxyAutoDiscoveryUrl";
-
 // These are types of name server selections from the web ui.
 const char kNameServerTypeAutomatic[] = "automatic";
 const char kNameServerTypeGoogle[] = "google";
-const char kNameServerTypeUser[] = "user";
-
-// These are dictionary names used to send data to the web ui.
-const char kDictionaryIpConfig[] = "ipconfig";
-const char kDictionaryStaticIp[] = "staticIP";
-const char kDictionarySavedIp[] = "savedIP";
 
 // Google public name servers (DNS).
 const char kGoogleNameServers[] = "8.8.4.4,8.8.8.8";
@@ -95,6 +80,8 @@ const char kRefreshNetworkDataFunction[] =
     "options.network.NetworkList.refreshNetworkData";
 const char kSetDefaultNetworkIconsFunction[] =
     "options.network.NetworkList.setDefaultNetworkIcons";
+const char kSendNetworkDetailsFunction[] =
+    "options.internet.DetailsInternetPage.sendNetworkDetails";
 const char kShowDetailedInfoFunction[] =
     "options.internet.DetailsInternetPage.showDetailedInfo";
 const char kUpdateConnectionDataFunction[] =
@@ -103,74 +90,45 @@ const char kUpdateCarrierFunction[] =
     "options.internet.DetailsInternetPage.updateCarrier";
 
 // These are used to register message handlers with JavaScript.
-const char kBuyDataPlanMessage[] = "buyDataPlan";
-const char kChangePinMessage[] = "changePin";
-const char kDisableCellularMessage[] = "disableCellular";
-const char kDisableWifiMessage[] = "disableWifi";
-const char kDisableWimaxMessage[] = "disableWimax";
-const char kEnableCellularMessage[] = "enableCellular";
-const char kEnableWifiMessage[] = "enableWifi";
-const char kEnableWimaxMessage[] = "enableWimax";
 const char kNetworkCommandMessage[] = "networkCommand";
-const char kRefreshNetworksMessage[] = "refreshNetworks";
 const char kSetApnMessage[] = "setApn";
 const char kSetAutoConnectMessage[] = "setAutoConnect";
 const char kSetCarrierMessage[] = "setCarrier";
 const char kSetIPConfigMessage[] = "setIPConfig";
 const char kSetPreferNetworkMessage[] = "setPreferNetwork";
 const char kSetServerHostname[] = "setServerHostname";
-const char kSetSimCardLockMessage[] = "setSimCardLock";
 const char kShowMorePlanInfoMessage[] = "showMorePlanInfo";
+const char kSimOperationMessage[] = "simOperation";
+
+// TODO(stevenjb): Replace these with the matching networkingPrivate methods.
+// crbug.com/279351.
+const char kDisableNetworkTypeMessage[] = "disableNetworkType";
+const char kEnableNetworkTypeMessage[] = "enableNetworkType";
+const char kGetManagedPropertiesMessage[] = "getManagedProperties";
+const char kRequestNetworkScanMessage[] = "requestNetworkScan";
+const char kStartConnectMessage[] = "startConnect";
+const char kStartDisconnectMessage[] = "startDisconnect";
 
 // These are strings used to communicate with JavaScript.
 const char kTagActivate[] = "activate";
-const char kTagActivationState[] = "activationState";
 const char kTagAddConnection[] = "add";
-const char kTagApn[] = "apn";
 const char kTagCarrierSelectFlag[] = "showCarrierSelect";
-const char kTagCarrierUrl[] = "carrierUrl";
 const char kTagCellularAvailable[] = "cellularAvailable";
 const char kTagCellularEnabled[] = "cellularEnabled";
+const char kTagCellularSimAbsent[] = "cellularSimAbsent";
+const char kTagCellularSimLockType[] = "cellularSimLockType";
 const char kTagCellularSupportsScan[] = "cellularSupportsScan";
 const char kTagConfigure[] = "configure";
-const char kTagConnect[] = "connect";
-const char kTagControlledBy[] = "controlledBy";
-const char kTagDeviceConnected[] = "deviceConnected";
-const char kTagDisconnect[] = "disconnect";
-const char kTagErrorMessage[] = "errorMessage";
 const char kTagForget[] = "forget";
-const char kTagIdentity[] = "identity";
-const char kTagLanguage[] = "language";
-const char kTagLastGoodApn[] = "lastGoodApn";
-const char kTagLocalizedName[] = "localizedName";
-const char kTagName[] = "name";
-const char kTagNameServersGoogle[] = "nameServersGoogle";
-const char kTagNameServerType[] = "nameServerType";
-const char kTagNetworkId[] = "networkId";
-const char kTagOptions[] = "options";
-const char kTagPassword[] = "password";
-const char kTagPolicy[] = "policy";
-const char kTagPreferred[] = "preferred";
-const char kTagProviderType[] = "providerType";
-const char kTagProviderApnList[] = "providerApnList";
-const char kTagRecommended[] = "recommended";
-const char kTagRecommendedValue[] = "recommendedValue";
-const char kTagRemembered[] = "remembered";
 const char kTagRememberedList[] = "rememberedList";
-const char kTagRestrictedPool[] = "restrictedPool";
-const char kTagRoamingState[] = "roamingState";
-const char kTagServerHostname[] = "serverHostname";
-const char kTagStrength[] = "strength";
-const char kTagCarriers[] = "carriers";
-const char kTagCurrentCarrierIndex[] = "currentCarrierIndex";
-const char kTagShared[] = "shared";
-const char kTagShowActivateButton[] = "showActivateButton";
+const char kTagShowDetails[] = "showDetails";
 const char kTagShowViewAccountButton[] = "showViewAccountButton";
-const char kTagSimCardLockEnabled[] = "simCardLockEnabled";
-const char kTagSupportUrl[] = "supportUrl";
+const char kTagSimOpChangePin[] = "changePin";
+const char kTagSimOpConfigure[] = "configure";
+const char kTagSimOpSetLocked[] = "setLocked";
+const char kTagSimOpSetUnlocked[] = "setUnlocked";
+const char kTagSimOpUnlock[] = "unlock";
 const char kTagTrue[] = "true";
-const char kTagUsername[] = "username";
-const char kTagValue[] = "value";
 const char kTagVpnList[] = "vpnList";
 const char kTagWifiAvailable[] = "wifiAvailable";
 const char kTagWifiEnabled[] = "wifiEnabled";
@@ -179,6 +137,11 @@ const char kTagWimaxEnabled[] = "wimaxEnabled";
 const char kTagWiredList[] = "wiredList";
 const char kTagWirelessList[] = "wirelessList";
 
+// Pseudo-ONC chrome specific properties appended to the ONC dictionary.
+const char kTagErrorMessage[] = "errorMessage";
+const char kNetworkInfoKeyServicePath[] = "servicePath";
+const char kNetworkInfoKeyGUID[] = "GUID";
+
 const int kPreferredPriority = 1;
 
 void ShillError(const std::string& function,
@@ -233,457 +196,60 @@ base::DictionaryValue* BuildNetworkDictionary(
   return network_info.release();
 }
 
-// Pulls IP information out of a shill service properties dictionary. If
-// |static_ip| is true, then it fetches "StaticIP.*" properties. If not, then it
-// fetches "SavedIP.*" properties. Caller must take ownership of returned
-// dictionary.  If non-NULL, |ip_parameters_set| returns a count of the number
-// of IP routing parameters that get set.
-base::DictionaryValue* BuildIPInfoDictionary(
-    const base::DictionaryValue& shill_properties,
-    bool static_ip,
-    int* routing_parameters_set) {
-  std::string address_key;
-  std::string prefix_len_key;
-  std::string gateway_key;
-  std::string name_servers_key;
-  if (static_ip) {
-    address_key = shill::kStaticIPAddressProperty;
-    prefix_len_key = shill::kStaticIPPrefixlenProperty;
-    gateway_key = shill::kStaticIPGatewayProperty;
-    name_servers_key = shill::kStaticIPNameServersProperty;
-  } else {
-    address_key = shill::kSavedIPAddressProperty;
-    prefix_len_key = shill::kSavedIPPrefixlenProperty;
-    gateway_key = shill::kSavedIPGatewayProperty;
-    name_servers_key = shill::kSavedIPNameServersProperty;
-  }
-
-  scoped_ptr<base::DictionaryValue> ip_info_dict(new base::DictionaryValue);
-  std::string address;
-  int routing_parameters = 0;
-  if (shill_properties.GetStringWithoutPathExpansion(address_key, &address)) {
-    ip_info_dict->SetString(kIpConfigAddress, address);
-    VLOG(2) << "Found " << address_key << ": " << address;
-    routing_parameters++;
-  }
-  int prefix_len = -1;
-  if (shill_properties.GetIntegerWithoutPathExpansion(
-      prefix_len_key, &prefix_len)) {
-    ip_info_dict->SetInteger(kIpConfigPrefixLength, prefix_len);
-    std::string netmask = network_util::PrefixLengthToNetmask(prefix_len);
-    ip_info_dict->SetString(kIpConfigNetmask, netmask);
-    VLOG(2) << "Found " << prefix_len_key << ": "
-            <<  prefix_len << " (" << netmask << ")";
-    routing_parameters++;
-  }
-  std::string gateway;
-  if (shill_properties.GetStringWithoutPathExpansion(gateway_key, &gateway)) {
-    ip_info_dict->SetString(kIpConfigGateway, gateway);
-    VLOG(2) << "Found " << gateway_key << ": " << gateway;
-    routing_parameters++;
-  }
-  if (routing_parameters_set)
-    *routing_parameters_set = routing_parameters;
-
-  std::string name_servers;
-  if (shill_properties.GetStringWithoutPathExpansion(
-      name_servers_key, &name_servers)) {
-    ip_info_dict->SetString(kIpConfigNameServers, name_servers);
-    VLOG(2) << "Found " << name_servers_key << ": " << name_servers;
-  }
-
-  return ip_info_dict.release();
-}
-
-// Decorate pref value as CoreOptionsHandler::CreateValueForPref() does and
-// store it under |key| in |settings|. Takes ownership of |value|.
-void SetValueDictionary(const char* key,
-                        base::Value* value,
-                        const NetworkPropertyUIData& ui_data,
-                        base::DictionaryValue* settings) {
-  base::DictionaryValue* dict = new base::DictionaryValue();
-  // DictionaryValue::Set() takes ownership of |value|.
-  dict->Set(kTagValue, value);
-  settings->Set(key, dict);
-
-  const base::Value* recommended_value = ui_data.default_value();
-  if (ui_data.IsManaged())
-    dict->SetString(kTagControlledBy, kTagPolicy);
-  else if (recommended_value && recommended_value->Equals(value))
-    dict->SetString(kTagControlledBy, kTagRecommended);
-
-  if (recommended_value)
-    dict->Set(kTagRecommendedValue, recommended_value->DeepCopy());
-}
-
-const char* GetOncPolicyString(::onc::ONCSource onc_source) {
-  if (onc_source == ::onc::ONC_SOURCE_DEVICE_POLICY)
-    return ::onc::kAugmentationDevicePolicy;
-  return ::onc::kAugmentationUserPolicy;
-}
-
-const char* GetOncEditableString(::onc::ONCSource onc_source) {
-  if (onc_source == ::onc::ONC_SOURCE_DEVICE_POLICY)
-    return ::onc::kAugmentationDeviceEditable;
-  return ::onc::kAugmentationUserEditable;
-}
-
-const char* GetOncSettingString(::onc::ONCSource onc_source) {
-  if (onc_source == ::onc::ONC_SOURCE_DEVICE_POLICY)
-    return ::onc::kAugmentationSharedSetting;
-  return ::onc::kAugmentationUserSetting;
-}
-
-// Creates a GetManagedProperties style dictionary and adds it to |settings|.
-// |default_value| represents either the recommended value if |recommended|
-// is true, or the enforced value if |recommended| is false.
-// Note(stevenjb): This is bridge code until we use GetManagedProperties to
-// retrieve Shill properties.
-void SetManagedValueDictionary(const char* key,
-                               const base::Value* value,
-                               ::onc::ONCSource onc_source,
-                               bool recommended,
-                               const base::Value* default_value,
-                               base::DictionaryValue* settings) {
-  base::DictionaryValue* dict = new base::DictionaryValue();
-  settings->Set(key, dict);
-
-  DCHECK(value);
-  dict->Set(::onc::kAugmentationActiveSetting, value->DeepCopy());
-
-  if (onc_source == ::onc::ONC_SOURCE_NONE)
-    return;
-
-  if (recommended) {
-    // If an ONC property is 'Recommended' it can be edited by the user.
-    std::string editable = GetOncEditableString(onc_source);
-    dict->Set(editable, new base::FundamentalValue(true));
-  }
-  if (default_value) {
-    std::string policy_source = GetOncPolicyString(onc_source);
-    dict->Set(policy_source, default_value->DeepCopy());
-    if (recommended && !value->Equals(default_value)) {
-      std::string setting_source = GetOncSettingString(onc_source);
-      dict->Set(setting_source, value->DeepCopy());
-      dict->SetString(::onc::kAugmentationEffectiveSetting, setting_source);
-    } else {
-      dict->SetString(::onc::kAugmentationEffectiveSetting, policy_source);
-    }
-  }
-}
-
-std::string CopyStringFromDictionary(const base::DictionaryValue& source,
-                                     const std::string& src_key,
-                                     const std::string& dest_key,
-                                     base::DictionaryValue* dest) {
-  std::string string_value;
-  if (source.GetStringWithoutPathExpansion(src_key, &string_value))
-    dest->SetStringWithoutPathExpansion(dest_key, string_value);
-  return string_value;
-}
-
-// Fills |dictionary| with the configuration details of |vpn|. |onc| is required
-// for augmenting the policy-managed information.
-void PopulateVPNDetails(const NetworkState* vpn,
-                        const base::DictionaryValue& shill_properties,
-                        base::DictionaryValue* dictionary) {
-  // Name and Remembered are set in PopulateConnectionDetails().
-  // Provider properties are stored in the "Provider" dictionary.
-  const base::DictionaryValue* provider_properties = NULL;
-  if (!shill_properties.GetDictionaryWithoutPathExpansion(
-          shill::kProviderProperty, &provider_properties)) {
-    LOG(ERROR) << "No provider properties for VPN: " << vpn->path();
-    return;
-  }
-  std::string provider_type;
-  provider_properties->GetStringWithoutPathExpansion(
-      shill::kTypeProperty, &provider_type);
-  dictionary->SetString(kTagProviderType,
-                        internet_options_strings::ProviderTypeString(
-                            provider_type,
-                            *provider_properties));
-
-  std::string username;
-  if (provider_type == shill::kProviderOpenVpn) {
-    provider_properties->GetStringWithoutPathExpansion(
-        shill::kOpenVPNUserProperty, &username);
-  } else {
-    provider_properties->GetStringWithoutPathExpansion(
-        shill::kL2tpIpsecUserProperty, &username);
-  }
-  dictionary->SetString(kTagUsername, username);
-
-  ::onc::ONCSource onc_source = ::onc::ONC_SOURCE_NONE;
-  const base::DictionaryValue* onc =
-      onc::FindPolicyForActiveUser(vpn->guid(), &onc_source);
-
-  NetworkPropertyUIData hostname_ui_data;
-  hostname_ui_data.ParseOncProperty(
-      onc_source,
-      onc,
-      ::onc::network_config::VpnProperty(::onc::vpn::kHost));
-  std::string provider_host;
-  provider_properties->GetStringWithoutPathExpansion(
-      shill::kHostProperty, &provider_host);
-  SetValueDictionary(kTagServerHostname,
-                     new base::StringValue(provider_host),
-                     hostname_ui_data,
-                     dictionary);
-}
-
-// Given a list of supported carrier's by the device, return the index of
-// the carrier the device is currently using.
-int FindCurrentCarrierIndex(const base::ListValue* carriers,
-                            const DeviceState* device) {
-  DCHECK(carriers);
-  DCHECK(device);
-  bool gsm = (device->technology_family() == shill::kTechnologyFamilyGsm);
-  int index = 0;
-  for (base::ListValue::const_iterator it = carriers->begin();
-       it != carriers->end(); ++it, ++index) {
-    std::string value;
-    if (!(*it)->GetAsString(&value))
-      continue;
-    // For GSM devices the device name will be empty, so simply select
-    // the Generic UMTS carrier option if present.
-    if (gsm && (value == shill::kCarrierGenericUMTS))
-      return index;
-    // For other carriers, the service name will match the carrier name.
-    if (value == device->carrier())
-      return index;
-  }
-  return -1;
-}
-
-void PopulateWimaxDetails(const NetworkState* wimax,
-                          const base::DictionaryValue& shill_properties,
-                          base::DictionaryValue* dictionary) {
-  dictionary->SetInteger(kTagStrength, wimax->signal_strength());
-  CopyStringFromDictionary(
-      shill_properties, shill::kEapIdentityProperty, kTagIdentity, dictionary);
-}
-
-void CreateDictionaryFromCellularApn(const base::DictionaryValue* apn,
-                                     base::DictionaryValue* dictionary) {
-  CopyStringFromDictionary(*apn, shill::kApnProperty, kTagApn, dictionary);
-  CopyStringFromDictionary(
-      *apn, shill::kApnNetworkIdProperty, kTagNetworkId, dictionary);
-  CopyStringFromDictionary(
-      *apn, shill::kApnUsernameProperty, kTagUsername, dictionary);
-  CopyStringFromDictionary(
-      *apn, shill::kApnPasswordProperty, kTagPassword, dictionary);
-  CopyStringFromDictionary(*apn, shill::kApnNameProperty, kTagName, dictionary);
-  CopyStringFromDictionary(
-      *apn, shill::kApnLocalizedNameProperty, kTagLocalizedName, dictionary);
-  CopyStringFromDictionary(
-      *apn, shill::kApnLanguageProperty, kTagLanguage, dictionary);
-}
-
-void PopulateCellularDetails(const NetworkState* cellular,
-                             const base::DictionaryValue& shill_properties,
-                             base::DictionaryValue* dictionary) {
-  dictionary->SetBoolean(kTagCarrierSelectFlag,
-                         CommandLine::ForCurrentProcess()->HasSwitch(
-                             chromeos::switches::kEnableCarrierSwitching));
-  // Cellular network / connection settings.
-  dictionary->SetString(kTagActivationState,
-                        internet_options_strings::ActivationStateString(
-                            cellular->activation_state()));
-  dictionary->SetString(kTagRoamingState,
-                        internet_options_strings::RoamingStateString(
-                            cellular->roaming()));
-  dictionary->SetString(kTagRestrictedPool,
-                        internet_options_strings::RestrictedStateString(
-                            cellular->connection_state()));
-
-  const base::DictionaryValue* olp = NULL;
-  if (shill_properties.GetDictionaryWithoutPathExpansion(
-          shill::kPaymentPortalProperty, &olp)) {
-    std::string url;
-    olp->GetStringWithoutPathExpansion(shill::kPaymentPortalURL, &url);
-    dictionary->SetString(kTagSupportUrl, url);
-  }
-
-  base::DictionaryValue* apn = new base::DictionaryValue;
-  const base::DictionaryValue* source_apn = NULL;
-  if (shill_properties.GetDictionaryWithoutPathExpansion(
-          shill::kCellularApnProperty, &source_apn)) {
-    CreateDictionaryFromCellularApn(source_apn, apn);
-  }
-  dictionary->Set(kTagApn, apn);
-
-  base::DictionaryValue* last_good_apn = new base::DictionaryValue;
-  if (shill_properties.GetDictionaryWithoutPathExpansion(
-          shill::kCellularLastGoodApnProperty, &source_apn)) {
-    CreateDictionaryFromCellularApn(source_apn, last_good_apn);
-  }
-  dictionary->Set(kTagLastGoodApn, last_good_apn);
-
-  // These default to empty and are only set if device != NULL.
-  std::string carrier_id;
-  std::string mdn;
+bool ShowViewAccountButton(const NetworkState* cellular) {
+  if (cellular->activation_state() != shill::kActivationStateActivating &&
+      cellular->activation_state() != shill::kActivationStateActivated)
+    return false;
 
-  // Device settings.
   const DeviceState* device =
       NetworkHandler::Get()->network_state_handler()->GetDeviceState(
           cellular->device_path());
-  if (device) {
-    const base::DictionaryValue& device_properties = device->properties();
-    ::onc::ONCSource onc_source;
-    NetworkHandler::Get()->managed_network_configuration_handler()->
-        FindPolicyByGUID(LoginState::Get()->primary_user_hash(),
-                         cellular->guid(), &onc_source);
-    const NetworkPropertyUIData cellular_property_ui_data(onc_source);
-    SetValueDictionary(kTagSimCardLockEnabled,
-                       new base::FundamentalValue(device->sim_lock_enabled()),
-                       cellular_property_ui_data,
-                       dictionary);
-
-    carrier_id = device->home_provider_id();
-    device_properties.GetStringWithoutPathExpansion(shill::kMdnProperty, &mdn);
-
-    MobileConfig* config = MobileConfig::GetInstance();
-    if (config->IsReady()) {
-      const MobileConfig::Carrier* carrier = config->GetCarrier(carrier_id);
-      if (carrier && !carrier->top_up_url().empty())
-        dictionary->SetString(kTagCarrierUrl, carrier->top_up_url());
-    }
-
-    base::ListValue* apn_list_value = new base::ListValue();
-    const base::ListValue* apn_list;
-    if (device_properties.GetListWithoutPathExpansion(
-            shill::kCellularApnListProperty, &apn_list)) {
-      for (base::ListValue::const_iterator iter = apn_list->begin();
-           iter != apn_list->end();
-           ++iter) {
-        const base::DictionaryValue* dict;
-        if ((*iter)->GetAsDictionary(&dict)) {
-          base::DictionaryValue* apn = new base::DictionaryValue;
-          CreateDictionaryFromCellularApn(dict, apn);
-          apn_list_value->Append(apn);
-        }
-      }
-    }
-    SetValueDictionary(kTagProviderApnList,
-                       apn_list_value,
-                       cellular_property_ui_data,
-                       dictionary);
-    const base::ListValue* supported_carriers;
-    if (device_properties.GetListWithoutPathExpansion(
-            shill::kSupportedCarriersProperty, &supported_carriers)) {
-      dictionary->Set(kTagCarriers, supported_carriers->DeepCopy());
-      dictionary->SetInteger(
-          kTagCurrentCarrierIndex,
-          FindCurrentCarrierIndex(supported_carriers, device));
-    } else {
-      // In case of any error, set the current carrier tag to -1 indicating
-      // to the JS code to fallback to a single carrier.
-      dictionary->SetInteger(kTagCurrentCarrierIndex, -1);
-    }
-  }
 
-  // Don't show any account management related buttons if the activation
-  // state is unknown or no payment portal URL is available.
-  std::string support_url;
-  if (cellular->activation_state() == shill::kActivationStateUnknown ||
-      !dictionary->GetString(kTagSupportUrl, &support_url) ||
-      support_url.empty()) {
-    VLOG(2) << "No support URL is available. Don't display buttons.";
-    return;
+  // If no online payment URL was provided by shill, Check to see if the
+  // MobileConfig carrier indicates that "View Account" should be shown.
+  if (cellular->payment_url().empty()) {
+    if (!device || !MobileConfig::GetInstance()->IsReady())
+      return false;
+    const MobileConfig::Carrier* carrier =
+        MobileConfig::GetInstance()->GetCarrier(device->home_provider_id());
+    if (!carrier || !carrier->show_portal_button())
+      return false;
   }
 
-  if (cellular->activation_state() != shill::kActivationStateActivating &&
-      cellular->activation_state() != shill::kActivationStateActivated) {
-    dictionary->SetBoolean(kTagShowActivateButton, true);
-  } else {
-    bool may_show_portal_button = false;
-
-    // If an online payment URL was provided by shill, then this means that the
-    // "View Account" button should be shown for the current carrier.
-    if (olp) {
-      std::string url;
-      olp->GetStringWithoutPathExpansion(shill::kPaymentPortalURL, &url);
-      may_show_portal_button = !url.empty();
-    }
-    // If no online payment URL was provided by shill, fall back to
-    // MobileConfig to determine if the "View Account" should be shown.
-    if (!may_show_portal_button && MobileConfig::GetInstance()->IsReady()) {
-      const MobileConfig::Carrier* carrier =
-          MobileConfig::GetInstance()->GetCarrier(carrier_id);
-      may_show_portal_button = carrier && carrier->show_portal_button();
-    }
-    if (may_show_portal_button) {
-      // The button should be shown for a LTE network even when the LTE network
-      // is not connected, but CrOS is online. This is done to enable users to
-      // update their plan even if they are out of credits.
-      // The button should not be shown when the device's mdn is not set,
-      // because the network's proper portal url cannot be generated without it
-      const NetworkState* default_network =
-          NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
-      const std::string& technology = cellular->network_technology();
-      bool force_show_view_account_button =
-          (technology == shill::kNetworkTechnologyLte ||
-           technology == shill::kNetworkTechnologyLteAdvanced) &&
-          default_network && !mdn.empty();
-
-      // The button will trigger ShowMorePlanInfoCallback() which will open
-      // carrier specific portal.
-      if (cellular->IsConnectedState() || force_show_view_account_button)
-        dictionary->SetBoolean(kTagShowViewAccountButton, true);
+  if (!cellular->IsConnectedState()) {
+    // Disconnected LTE networks should show the button if we are online and
+    // the device's MDN is set. This is to enable users to update their plan
+    // if they are out of credits.
+    if (!NetworkHandler::Get()->network_state_handler()->DefaultNetwork())
+      return false;
+    const std::string& technology = cellular->network_technology();
+    if (technology != shill::kNetworkTechnologyLte &&
+        technology != shill::kNetworkTechnologyLteAdvanced)
+      return false;
+    std::string mdn;
+    if (device) {
+      device->properties().GetStringWithoutPathExpansion(shill::kMdnProperty,
+                                                         &mdn);
     }
+    if (mdn.empty())
+      return false;
   }
+
+  return true;
 }
 
 scoped_ptr<base::DictionaryValue> PopulateConnectionDetails(
     const NetworkState* network,
-    const base::DictionaryValue& shill_properties) {
-  // TODO(stevenjb): Once we eliminate all references to Shill properties,
-  // we can switch to using managed_network_configuration_handler which
-  // includes Device properties for Cellular (and skip the call to
-  // onc::TranslateShillServiceToONCPart). For now we copy them over here.
-  scoped_ptr<base::DictionaryValue> shill_properties_with_device(
-      shill_properties.DeepCopy());
-  const DeviceState* device =
-      NetworkHandler::Get()->network_state_handler()->GetDeviceState(
-          network->device_path());
-  if (device) {
-    shill_properties_with_device->SetWithoutPathExpansion(
-        shill::kDeviceProperty, device->properties().DeepCopy());
-    // Get the hardware MAC address from the DeviceState.
-    // (Note: this is done in ManagedNetworkConfigurationHandler but not
-    //  in NetworkConfigurationHandler).
-    if (!device->mac_address().empty()) {
-      shill_properties_with_device->SetStringWithoutPathExpansion(
-          shill::kAddressProperty, device->mac_address());
-    }
-  }
-  scoped_ptr<base::DictionaryValue> dictionary =
-      onc::TranslateShillServiceToONCPart(
-          *shill_properties_with_device, &onc::kNetworkWithStateSignature);
+    const base::DictionaryValue& onc_properties) {
+  scoped_ptr<base::DictionaryValue> dictionary(onc_properties.DeepCopy());
 
+  // Append Service Path for now.
   dictionary->SetString(kNetworkInfoKeyServicePath, network->path());
+  // Append a Chrome specific translated error message.
   dictionary->SetString(
       kTagErrorMessage,
       ash::network_connect::ErrorString(network->error(), network->path()));
 
-  dictionary->SetBoolean(kTagRemembered, !network->profile_path().empty());
-  bool shared = !network->IsPrivate();
-  dictionary->SetBoolean(kTagShared, shared);
-
-  const std::string& type = network->type();
-
-  const NetworkState* connected_network =
-      NetworkHandler::Get()->network_state_handler()->ConnectedNetworkByType(
-          NetworkTypePattern::Primitive(type));
-  dictionary->SetBoolean(kTagDeviceConnected, connected_network != NULL);
-
-  if (type == shill::kTypeCellular)
-    PopulateCellularDetails(network, shill_properties, dictionary.get());
-  else if (type == shill::kTypeWimax)
-    PopulateWimaxDetails(network, shill_properties, dictionary.get());
-  else if (type == shill::kTypeVPN)
-    PopulateVPNDetails(network, shill_properties, dictionary.get());
-
   return dictionary.Pass();
 }
 
@@ -724,12 +290,10 @@ bool AddIntegerPropertyIfChanged(const std::string& key,
   return false;
 }
 
-void RequestReconnect(const std::string& service_path,
-                      gfx::NativeWindow owning_window) {
+void RequestReconnect(const std::string& service_path) {
   NetworkHandler::Get()->network_connection_handler()->DisconnectNetwork(
       service_path,
-      base::Bind(&ash::network_connect::ConnectToNetwork,
-                 service_path, owning_window),
+      base::Bind(&ash::network_connect::ConnectToNetwork, service_path),
       base::Bind(&ShillError, "RequestReconnect"));
 }
 
@@ -785,9 +349,6 @@ void InternetOptionsHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(kNetworkCommandMessage,
       base::Bind(&InternetOptionsHandler::NetworkCommandCallback,
                  base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kRefreshNetworksMessage,
-      base::Bind(&InternetOptionsHandler::RefreshNetworksCallback,
-                 base::Unretained(this)));
   web_ui()->RegisterMessageCallback(kSetPreferNetworkMessage,
       base::Bind(&InternetOptionsHandler::SetPreferNetworkCallback,
                  base::Unretained(this)));
@@ -797,27 +358,6 @@ void InternetOptionsHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(kSetIPConfigMessage,
       base::Bind(&InternetOptionsHandler::SetIPConfigCallback,
                  base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kEnableWifiMessage,
-      base::Bind(&InternetOptionsHandler::EnableWifiCallback,
-                 base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kDisableWifiMessage,
-      base::Bind(&InternetOptionsHandler::DisableWifiCallback,
-                 base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kEnableCellularMessage,
-      base::Bind(&InternetOptionsHandler::EnableCellularCallback,
-                 base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kDisableCellularMessage,
-      base::Bind(&InternetOptionsHandler::DisableCellularCallback,
-                 base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kEnableWimaxMessage,
-      base::Bind(&InternetOptionsHandler::EnableWimaxCallback,
-                 base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kDisableWimaxMessage,
-      base::Bind(&InternetOptionsHandler::DisableWimaxCallback,
-                 base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kBuyDataPlanMessage,
-      base::Bind(&InternetOptionsHandler::BuyDataPlanCallback,
-                 base::Unretained(this)));
   web_ui()->RegisterMessageCallback(kShowMorePlanInfoMessage,
       base::Bind(&InternetOptionsHandler::ShowMorePlanInfoCallback,
                  base::Unretained(this)));
@@ -827,75 +367,32 @@ void InternetOptionsHandler::RegisterMessages() {
   web_ui()->RegisterMessageCallback(kSetCarrierMessage,
       base::Bind(&InternetOptionsHandler::SetCarrierCallback,
                  base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kSetSimCardLockMessage,
-      base::Bind(&InternetOptionsHandler::SetSimCardLockCallback,
-                 base::Unretained(this)));
-  web_ui()->RegisterMessageCallback(kChangePinMessage,
-      base::Bind(&InternetOptionsHandler::ChangePinCallback,
+  web_ui()->RegisterMessageCallback(kSimOperationMessage,
+      base::Bind(&InternetOptionsHandler::SimOperationCallback,
                  base::Unretained(this)));
   web_ui()->RegisterMessageCallback(kSetServerHostname,
       base::Bind(&InternetOptionsHandler::SetServerHostnameCallback,
                  base::Unretained(this)));
-}
-
-void InternetOptionsHandler::EnableWifiCallback(const base::ListValue* args) {
-  content::RecordAction(base::UserMetricsAction("Options_NetworkWifiToggle"));
-  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
-      NetworkTypePattern::WiFi(), true,
-      base::Bind(&ShillError, "EnableWifiCallback"));
-}
-
-void InternetOptionsHandler::DisableWifiCallback(const base::ListValue* args) {
-  content::RecordAction(base::UserMetricsAction("Options_NetworkWifiToggle"));
-  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
-      NetworkTypePattern::WiFi(), false,
-      base::Bind(&ShillError, "DisableWifiCallback"));
-}
-
-void InternetOptionsHandler::EnableCellularCallback(
-    const base::ListValue* args) {
-  NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler();
-  const DeviceState* device =
-      handler->GetDeviceStateByType(NetworkTypePattern::Cellular());
-  if (!device) {
-    LOG(ERROR) << "Mobile device not found.";
-    return;
-  }
-  if (!device->sim_lock_type().empty()) {
-    SimDialogDelegate::ShowDialog(GetNativeWindow(),
-                                  SimDialogDelegate::SIM_DIALOG_UNLOCK);
-    return;
-  }
-  if (!handler->IsTechnologyEnabled(NetworkTypePattern::Cellular())) {
-    handler->SetTechnologyEnabled(
-        NetworkTypePattern::Cellular(), true,
-        base::Bind(&ShillError, "EnableCellularCallback"));
-    return;
-  }
-  if (device->IsSimAbsent()) {
-    mobile_config_ui::DisplayConfigDialog();
-    return;
-  }
-  LOG(ERROR) << "EnableCellularCallback called for enabled mobile device";
-}
-
-void InternetOptionsHandler::DisableCellularCallback(
-    const base::ListValue* args) {
-  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
-      NetworkTypePattern::Mobile(), false,
-      base::Bind(&ShillError, "DisableCellularCallback"));
-}
 
-void InternetOptionsHandler::EnableWimaxCallback(const base::ListValue* args) {
-  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
-      NetworkTypePattern::Wimax(), true,
-      base::Bind(&ShillError, "EnableWimaxCallback"));
-}
-
-void InternetOptionsHandler::DisableWimaxCallback(const base::ListValue* args) {
-  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
-      NetworkTypePattern::Wimax(), false,
-      base::Bind(&ShillError, "DisableWimaxCallback"));
+  // networkingPrivate methods
+  web_ui()->RegisterMessageCallback(kDisableNetworkTypeMessage,
+      base::Bind(&InternetOptionsHandler::DisableNetworkTypeCallback,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(kEnableNetworkTypeMessage,
+      base::Bind(&InternetOptionsHandler::EnableNetworkTypeCallback,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(kGetManagedPropertiesMessage,
+      base::Bind(&InternetOptionsHandler::GetManagedPropertiesCallback,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(kRequestNetworkScanMessage,
+      base::Bind(&InternetOptionsHandler::RequestNetworkScanCallback,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(kStartConnectMessage,
+      base::Bind(&InternetOptionsHandler::StartConnectCallback,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(kStartDisconnectMessage,
+      base::Bind(&InternetOptionsHandler::StartDisconnectCallback,
+                 base::Unretained(this)));
 }
 
 void InternetOptionsHandler::ShowMorePlanInfoCallback(
@@ -910,17 +407,6 @@ void InternetOptionsHandler::ShowMorePlanInfoCallback(
   ash::network_connect::ShowMobileSetup(service_path);
 }
 
-void InternetOptionsHandler::BuyDataPlanCallback(const base::ListValue* args) {
-  if (!web_ui())
-    return;
-  std::string service_path;
-  if (args->GetSize() != 1 || !args->GetString(0, &service_path)) {
-    NOTREACHED();
-    return;
-  }
-  ash::network_connect::ShowMobileSetup(service_path);
-}
-
 void InternetOptionsHandler::SetApnCallback(const base::ListValue* args) {
   std::string service_path;
   if (!args->GetString(0, &service_path)) {
@@ -987,7 +473,7 @@ void InternetOptionsHandler::CarrierStatusCallback() {
   if (device && (device->carrier() == shill::kCarrierSprint)) {
     const NetworkState* network =
         handler->FirstNetworkByType(NetworkTypePattern::Cellular());
-    if (network) {
+    if (network && network->path() == details_path_) {
       ash::network_connect::ActivateCellular(network->path());
       UpdateConnectionData(network->path());
     }
@@ -1018,13 +504,16 @@ void InternetOptionsHandler::SetCarrierCallback(const base::ListValue* args) {
       base::Bind(&ShillError, "SetCarrierCallback"));
 }
 
-void InternetOptionsHandler::SetSimCardLockCallback(
-    const base::ListValue* args) {
-  bool require_pin_new_value;
-  if (!args->GetBoolean(0, &require_pin_new_value)) {
+void InternetOptionsHandler::SimOperationCallback(const base::ListValue* args) {
+  std::string operation;
+  if (args->GetSize() != 1 || !args->GetString(0, &operation)) {
     NOTREACHED();
     return;
   }
+  if (operation == kTagSimOpConfigure) {
+    mobile_config_ui::DisplayConfigDialog();
+    return;
+  }
   // 1. Bring up SIM unlock dialog, pass new RequirePin setting in URL.
   // 2. Dialog will ask for current PIN in any case.
   // 3. If card is locked it will first call PIN unlock operation
@@ -1032,23 +521,96 @@ void InternetOptionsHandler::SetSimCardLockCallback(
   // 5. The dialog may change device properties, in which case
   //    DevicePropertiesUpdated() will get called which will update the UI.
   SimDialogDelegate::SimDialogMode mode;
-  if (require_pin_new_value)
+  if (operation == kTagSimOpSetLocked) {
     mode = SimDialogDelegate::SIM_DIALOG_SET_LOCK_ON;
-  else
+  } else if (operation == kTagSimOpSetUnlocked) {
     mode = SimDialogDelegate::SIM_DIALOG_SET_LOCK_OFF;
+  } else if (operation == kTagSimOpUnlock) {
+    mode = SimDialogDelegate::SIM_DIALOG_UNLOCK;
+  } else if (operation == kTagSimOpChangePin) {
+    mode = SimDialogDelegate::SIM_DIALOG_CHANGE_PIN;
+  } else {
+    NOTREACHED();
+    return;
+  }
   SimDialogDelegate::ShowDialog(GetNativeWindow(), mode);
 }
 
-void InternetOptionsHandler::ChangePinCallback(const base::ListValue* args) {
-  SimDialogDelegate::ShowDialog(GetNativeWindow(),
-                                SimDialogDelegate::SIM_DIALOG_CHANGE_PIN);
+////////////////////////////////////////////////////////////////////////////////
+// networkingPrivate implementation methods. TODO(stevenjb): Use the
+// networkingPrivate API directly in the settings JS and deprecate these
+// methods. crbug.com/279351.
+
+void InternetOptionsHandler::DisableNetworkTypeCallback(
+    const base::ListValue* args) {
+  std::string type;
+  if (!args->GetString(0, &type)) {
+    NOTREACHED();
+    return;
+  }
+  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
+      chromeos::onc::NetworkTypePatternFromOncType(type), false,
+      base::Bind(&ShillError, "DisableNetworkType"));
 }
 
-void InternetOptionsHandler::RefreshNetworksCallback(
+void InternetOptionsHandler::EnableNetworkTypeCallback(
+    const base::ListValue* args) {
+  std::string type;
+  if (!args->GetString(0, &type)) {
+    NOTREACHED();
+    return;
+  }
+  NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
+      chromeos::onc::NetworkTypePatternFromOncType(type), true,
+      base::Bind(&ShillError, "EnableNetworkType"));
+}
+
+void InternetOptionsHandler::GetManagedPropertiesCallback(
+    const base::ListValue* args) {
+  std::string service_path;
+  if (!args->GetString(0, &service_path)) {
+    NOTREACHED();
+    return;
+  }
+  NetworkHandler::Get()->managed_network_configuration_handler()
+      ->GetManagedProperties(
+          LoginState::Get()->primary_user_hash(),
+          service_path,
+          base::Bind(
+              &InternetOptionsHandler::PopulateDictionaryDetailsCallback,
+              weak_factory_.GetWeakPtr()),
+          base::Bind(&ShillError, "GetManagedProperties"));
+}
+
+void InternetOptionsHandler::RequestNetworkScanCallback(
     const base::ListValue* args) {
   NetworkHandler::Get()->network_state_handler()->RequestScan();
 }
 
+void InternetOptionsHandler::StartConnectCallback(const base::ListValue* args) {
+  std::string service_path;
+  if (!args->GetString(0, &service_path)) {
+    NOTREACHED();
+    return;
+  }
+  ash::network_connect::ConnectToNetwork(service_path);
+}
+
+void InternetOptionsHandler::StartDisconnectCallback(
+    const base::ListValue* args) {
+  std::string service_path;
+  if (!args->GetString(0, &service_path)) {
+    NOTREACHED();
+    return;
+  }
+  NetworkHandler::Get()->network_connection_handler()->DisconnectNetwork(
+      service_path,
+      base::Bind(&base::DoNothing),
+      base::Bind(&ShillError, "StartDisconnectCallback"));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
 std::string InternetOptionsHandler::GetIconDataUrl(int resource_id) const {
   gfx::ImageSkia* icon =
       ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
@@ -1065,21 +627,24 @@ void InternetOptionsHandler::RefreshNetworkData() {
 
 void InternetOptionsHandler::UpdateConnectionData(
     const std::string& service_path) {
-  NetworkHandler::Get()->network_configuration_handler()->GetProperties(
-      service_path,
-      base::Bind(&InternetOptionsHandler::UpdateConnectionDataCallback,
-                 weak_factory_.GetWeakPtr()),
-      base::Bind(&ShillError, "UpdateConnectionData"));
+  NetworkHandler::Get()
+      ->managed_network_configuration_handler()
+      ->GetManagedProperties(
+          LoginState::Get()->primary_user_hash(),
+          service_path,
+          base::Bind(&InternetOptionsHandler::UpdateConnectionDataCallback,
+                     weak_factory_.GetWeakPtr()),
+          base::Bind(&ShillError, "UpdateConnectionData"));
 }
 
 void InternetOptionsHandler::UpdateConnectionDataCallback(
     const std::string& service_path,
-    const base::DictionaryValue& shill_properties) {
+    const base::DictionaryValue& onc_properties) {
   const NetworkState* network = GetNetworkState(service_path);
   if (!network)
     return;
   scoped_ptr<base::DictionaryValue> dictionary =
-      PopulateConnectionDetails(network, shill_properties);
+      PopulateConnectionDetails(network, onc_properties);
   web_ui()->CallJavascriptFunction(kUpdateConnectionDataFunction, *dictionary);
 }
 
@@ -1103,10 +668,8 @@ void InternetOptionsHandler::NetworkConnectionStateChanged(
     const NetworkState* network) {
   if (!web_ui())
     return;
-  // Update the connection data for the detailed view when the connection state
-  // of any network changes.
-  if (!details_path_.empty())
-    UpdateConnectionData(details_path_);
+  if (network->path() == details_path_)
+    UpdateConnectionData(network->path());
 }
 
 void InternetOptionsHandler::NetworkPropertiesUpdated(
@@ -1114,7 +677,8 @@ void InternetOptionsHandler::NetworkPropertiesUpdated(
   if (!web_ui())
     return;
   RefreshNetworkData();
-  UpdateConnectionData(network->path());
+  if (network->path() == details_path_)
+    UpdateConnectionData(network->path());
 }
 
 void InternetOptionsHandler::DevicePropertiesUpdated(
@@ -1126,8 +690,8 @@ void InternetOptionsHandler::DevicePropertiesUpdated(
   const NetworkState* network =
       NetworkHandler::Get()->network_state_handler()->FirstNetworkByType(
           NetworkTypePattern::Cellular());
-  if (network)
-    UpdateConnectionData(network->path());  // Update sim lock status.
+  if (network && network->path() == details_path_)
+    UpdateConnectionData(network->path());
 }
 
 void InternetOptionsHandler::SetServerHostnameCallback(
@@ -1153,7 +717,6 @@ void InternetOptionsHandler::SetPreferNetworkCallback(
     NOTREACHED();
     return;
   }
-  content::RecordAction(base::UserMetricsAction("Options_NetworkSetPrefer"));
   int priority = (prefer_network_str == kTagTrue) ? kPreferredPriority : 0;
   SetNetworkProperty(service_path,
                      shill::kPriorityProperty,
@@ -1169,7 +732,6 @@ void InternetOptionsHandler::SetAutoConnectCallback(
     NOTREACHED();
     return;
   }
-  content::RecordAction(base::UserMetricsAction("Options_NetworkAutoConnect"));
   bool auto_connect = auto_connect_str == kTagTrue;
   SetNetworkProperty(service_path,
                      shill::kAutoConnectProperty,
@@ -1269,7 +831,7 @@ void InternetOptionsHandler::SetIPConfigProperties(
     // If auto config or a static IP property changed, we need to reconnect
     // to the network.
     if (request_reconnect)
-      callback = base::Bind(&RequestReconnect, service_path, GetNativeWindow());
+      callback = base::Bind(&RequestReconnect, service_path);
     NetworkHandler::Get()->network_device_handler()->RequestRefreshIPConfigs(
         device_path,
         callback,
@@ -1279,156 +841,17 @@ void InternetOptionsHandler::SetIPConfigProperties(
 
 void InternetOptionsHandler::PopulateDictionaryDetailsCallback(
     const std::string& service_path,
-    const base::DictionaryValue& shill_properties) {
+    const base::DictionaryValue& onc_properties) {
   const NetworkState* network = GetNetworkState(service_path);
   if (!network) {
     LOG(ERROR) << "Network properties not found: " << service_path;
     return;
   }
-
-  details_path_ = service_path;
-
   scoped_ptr<base::DictionaryValue> dictionary =
-      PopulateConnectionDetails(network, shill_properties);
-
-  ::onc::ONCSource onc_source = ::onc::ONC_SOURCE_NONE;
-  const base::DictionaryValue* onc =
-      onc::FindPolicyForActiveUser(network->guid(), &onc_source);
-  const NetworkPropertyUIData property_ui_data(onc_source);
-
-  // IP config
-  scoped_ptr<base::DictionaryValue> ipconfig_dhcp(new base::DictionaryValue);
-  ipconfig_dhcp->SetString(kIpConfigAddress, network->ip_address());
-  ipconfig_dhcp->SetString(kIpConfigNetmask, network->GetNetmask());
-  ipconfig_dhcp->SetString(kIpConfigGateway, network->gateway());
-  std::string ipconfig_name_servers = network->GetDnsServersAsString();
-  ipconfig_dhcp->SetString(kIpConfigNameServers, ipconfig_name_servers);
-  ipconfig_dhcp->SetString(kIpConfigWebProxyAutoDiscoveryUrl,
-                           network->web_proxy_auto_discovery_url().spec());
-  SetValueDictionary(kDictionaryIpConfig,
-                     ipconfig_dhcp.release(),
-                     property_ui_data,
-                     dictionary.get());
-
-  std::string name_server_type = kNameServerTypeAutomatic;
-  int automatic_ip_config = 0;
-  scoped_ptr<base::DictionaryValue> static_ip_dict(
-      BuildIPInfoDictionary(shill_properties, true, &automatic_ip_config));
-  dictionary->SetBoolean(kIpConfigAutoConfig, automatic_ip_config == 0);
-  DCHECK(automatic_ip_config == 3 || automatic_ip_config == 0)
-      << "UI doesn't support automatic specification of individual "
-      << "static IP parameters.";
-  scoped_ptr<base::DictionaryValue> saved_ip_dict(
-      BuildIPInfoDictionary(shill_properties, false, NULL));
-  dictionary->Set(kDictionarySavedIp, saved_ip_dict.release());
-
-  // Determine what kind of name server setting we have by comparing the
-  // StaticIP and Google values with the ipconfig values.
-  std::string static_ip_nameservers;
-  static_ip_dict->GetString(kIpConfigNameServers, &static_ip_nameservers);
-  if (!static_ip_nameservers.empty() &&
-      static_ip_nameservers == ipconfig_name_servers) {
-    name_server_type = kNameServerTypeUser;
-  }
-  if (ipconfig_name_servers == kGoogleNameServers) {
-    name_server_type = kNameServerTypeGoogle;
-  }
-  SetValueDictionary(kDictionaryStaticIp,
-                     static_ip_dict.release(),
-                     property_ui_data,
-                     dictionary.get());
-
-  dictionary->SetString(kTagNameServerType, name_server_type);
-  dictionary->SetString(kTagNameServersGoogle, kGoogleNameServers);
-
-  int priority = 0;
-  shill_properties.GetIntegerWithoutPathExpansion(
-      shill::kPriorityProperty, &priority);
-  bool preferred = priority > 0;
-  SetValueDictionary(kTagPreferred,
-                     new base::FundamentalValue(preferred),
-                     property_ui_data,
-                     dictionary.get());
-
-  std::string onc_path_to_auto_connect;
-  if (network->Matches(NetworkTypePattern::WiFi())) {
-    content::RecordAction(
-        base::UserMetricsAction("Options_NetworkShowDetailsWifi"));
-    if (network->IsConnectedState()) {
-      content::RecordAction(
-          base::UserMetricsAction("Options_NetworkShowDetailsWifiConnected"));
-    }
-    onc_path_to_auto_connect =
-        ::onc::network_config::WifiProperty(::onc::wifi::kAutoConnect);
-  } else if (network->Matches(NetworkTypePattern::VPN())) {
-    content::RecordAction(
-        base::UserMetricsAction("Options_NetworkShowDetailsVPN"));
-    if (network->IsConnectedState()) {
-      content::RecordAction(
-          base::UserMetricsAction("Options_NetworkShowDetailsVPNConnected"));
-    }
-    onc_path_to_auto_connect = ::onc::network_config::VpnProperty(
-        ::onc::vpn::kAutoConnect);
-  } else if (network->Matches(NetworkTypePattern::Cellular())) {
-    content::RecordAction(
-        base::UserMetricsAction("Options_NetworkShowDetailsCellular"));
-    if (network->IsConnectedState()) {
-      content::RecordAction(base::UserMetricsAction(
-          "Options_NetworkShowDetailsCellularConnected"));
-    }
-  }
-
-  if (!onc_path_to_auto_connect.empty()) {
-    bool auto_connect = false;
-    shill_properties.GetBooleanWithoutPathExpansion(
-        shill::kAutoConnectProperty, &auto_connect);
-
-    scoped_ptr<base::Value> auto_connect_value(
-        new base::FundamentalValue(auto_connect));
-    ::onc::ONCSource auto_connect_onc_source = onc_source;
-
-    DCHECK_EQ(onc == NULL, onc_source == ::onc::ONC_SOURCE_NONE);
-    bool auto_connect_recommended =
-        auto_connect_onc_source != ::onc::ONC_SOURCE_NONE &&
-        onc::IsRecommendedValue(onc, onc_path_to_auto_connect);
-    // If a policy exists, |auto_connect_default_value| will contain either a
-    // recommended value (if |auto_connect_recommended| is true) or an enforced
-    // value (if |auto_connect_recommended| is false).
-    const base::Value* auto_connect_default_value = NULL;
-    if (onc)
-      onc->Get(onc_path_to_auto_connect, &auto_connect_default_value);
-
-    // Autoconnect can be controlled by the GlobalNetworkConfiguration of the
-    // ONC policy.
-    if (auto_connect_onc_source == ::onc::ONC_SOURCE_NONE &&
-        onc::PolicyAllowsOnlyPolicyNetworksToAutoconnect(
-            network->IsPrivate())) {
-      auto_connect_recommended = false;
-      auto_connect_onc_source = network->IsPrivate()
-                                    ? ::onc::ONC_SOURCE_USER_POLICY
-                                    : ::onc::ONC_SOURCE_DEVICE_POLICY;
-      if (auto_connect) {
-        LOG(WARNING) << "Policy prevents autoconnect, but value is True.";
-        auto_connect_value.reset(new base::FundamentalValue(false));
-      }
-      auto_connect_default_value = auto_connect_value.get();
-    }
-    SetManagedValueDictionary(shill::kAutoConnectProperty,
-                              auto_connect_value.get(),
-                              auto_connect_onc_source,
-                              auto_connect_recommended,
-                              auto_connect_default_value,
-                              dictionary.get());
-  } else {
-    // Set AutoConnect property for unmanaged types (Cellular, Wimax).
-    bool auto_connect = false;
-    shill_properties.GetBooleanWithoutPathExpansion(
-        shill::kAutoConnectProperty, &auto_connect);
-    dictionary->SetBoolean(shill::kAutoConnectProperty, auto_connect);
-  }
+      PopulateConnectionDetails(network, onc_properties);
 
   // Show details dialog
-  web_ui()->CallJavascriptFunction(kShowDetailedInfoFunction, *dictionary);
+  web_ui()->CallJavascriptFunction(kSendNetworkDetailsFunction, *dictionary);
 }
 
 gfx::NativeWindow InternetOptionsHandler::GetNativeWindow() const {
@@ -1470,33 +893,8 @@ void InternetOptionsHandler::NetworkCommandCallback(
             service_path,
             base::Bind(&base::DoNothing),
             base::Bind(&ShillError, "NetworkCommand: " + command));
-  } else if (command == kTagOptions) {
-    NetworkHandler::Get()->network_configuration_handler()->GetProperties(
-        service_path,
-        base::Bind(&InternetOptionsHandler::PopulateDictionaryDetailsCallback,
-                   weak_factory_.GetWeakPtr()),
-        base::Bind(&ShillError, "NetworkCommand: " + command));
-  } else if (command == kTagConnect) {
-    const NetworkState* network = GetNetworkState(service_path);
-    if (network && network->type() == shill::kTypeWifi)
-      content::RecordAction(
-          base::UserMetricsAction("Options_NetworkConnectToWifi"));
-    else if (network && network->type() == shill::kTypeVPN)
-      content::RecordAction(
-          base::UserMetricsAction("Options_NetworkConnectToVPN"));
-    ash::network_connect::ConnectToNetwork(service_path, GetNativeWindow());
-  } else if (command == kTagDisconnect) {
-    const NetworkState* network = GetNetworkState(service_path);
-    if (network && network->type() == shill::kTypeWifi)
-      content::RecordAction(
-          base::UserMetricsAction("Options_NetworkDisconnectWifi"));
-    else if (network && network->type() == shill::kTypeVPN)
-      content::RecordAction(
-          base::UserMetricsAction("Options_NetworkDisconnectVPN"));
-    NetworkHandler::Get()->network_connection_handler()->DisconnectNetwork(
-        service_path,
-        base::Bind(&base::DoNothing),
-        base::Bind(&ShillError, "NetworkCommand: " + command));
+  } else if (command == kTagShowDetails) {
+    SendShowDetailedInfo(service_path);
   } else if (command == kTagConfigure) {
     NetworkConfigView::Show(service_path, GetNativeWindow());
   } else if (command == kTagActivate && type == shill::kTypeCellular) {
@@ -1505,19 +903,15 @@ void InternetOptionsHandler::NetworkCommandCallback(
     // request them here in case they change.
     UpdateConnectionData(service_path);
   } else {
-    VLOG(1) << "Unknown command: " << command;
+    LOG(ERROR) << "Unknown internet options command: " << command;
     NOTREACHED();
   }
 }
 
 void InternetOptionsHandler::AddConnection(const std::string& type) {
   if (type == shill::kTypeWifi) {
-    content::RecordAction(
-        base::UserMetricsAction("Options_NetworkJoinOtherWifi"));
     NetworkConfigView::ShowForType(shill::kTypeWifi, GetNativeWindow());
   } else if (type == shill::kTypeVPN) {
-    content::RecordAction(
-        base::UserMetricsAction("Options_NetworkJoinOtherVPN"));
     NetworkConfigView::ShowForType(shill::kTypeVPN, GetNativeWindow());
   } else if (type == shill::kTypeCellular) {
     ChooseMobileNetworkDialog::ShowDialog(GetNativeWindow());
@@ -1526,6 +920,27 @@ void InternetOptionsHandler::AddConnection(const std::string& type) {
   }
 }
 
+void InternetOptionsHandler::SendShowDetailedInfo(
+    const std::string& service_path) {
+  details_path_ = service_path;
+
+  scoped_ptr<base::DictionaryValue> dictionary(new base::DictionaryValue);
+  const NetworkState* network = GetNetworkState(service_path);
+  if (network) {
+    dictionary->SetString(kNetworkInfoKeyServicePath, service_path);
+    dictionary->SetString(kNetworkInfoKeyGUID, network->guid());
+    if (network->type() == shill::kTypeCellular) {
+      dictionary->SetBoolean(
+          kTagCarrierSelectFlag,
+          CommandLine::ForCurrentProcess()
+          ->HasSwitch(chromeos::switches::kEnableCarrierSwitching));
+      dictionary->SetBoolean(kTagShowViewAccountButton,
+                             ShowViewAccountButton(network));
+    }
+  }
+  web_ui()->CallJavascriptFunction(kShowDetailedInfoFunction, *dictionary);
+}
+
 base::ListValue* InternetOptionsHandler::GetWiredList() {
   base::ListValue* list = new base::ListValue();
   const NetworkState* network = NetworkHandler::Get()->network_state_handler()->
@@ -1604,17 +1019,20 @@ void InternetOptionsHandler::FillNetworkInfo(
       kTagWifiEnabled,
       handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()));
 
+  const DeviceState* cellular =
+      handler->GetDeviceStateByType(NetworkTypePattern::Mobile());
   dictionary->SetBoolean(
       kTagCellularAvailable,
       handler->IsTechnologyAvailable(NetworkTypePattern::Mobile()));
   dictionary->SetBoolean(
       kTagCellularEnabled,
       handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()));
-  const DeviceState* cellular =
-      handler->GetDeviceStateByType(NetworkTypePattern::Mobile());
-  dictionary->SetBoolean(
-      kTagCellularSupportsScan,
-      cellular && cellular->support_network_scan());
+  dictionary->SetBoolean(kTagCellularSupportsScan,
+                         cellular && cellular->support_network_scan());
+  dictionary->SetBoolean(kTagCellularSimAbsent,
+                         cellular && cellular->IsSimAbsent());
+  dictionary->SetString(kTagCellularSimLockType,
+                        cellular ? cellular->sim_lock_type() : "");
 
   dictionary->SetBoolean(
       kTagWimaxAvailable,