15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/choose_mobile_network_ui.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
12bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/location.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chromeos/network/device_state.h"
21bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chromeos/network/network_device_handler.h"
22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chromeos/network/network_event_log.h"
23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chromeos/network/network_state_handler.h"
24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "chromeos/network/network_state_handler_observer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h"
30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "third_party/cros_system_api/dbus/service_constants.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// JS API callbacks names.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiCancel[] = "cancel";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiConnect[] = "connect";
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiPageReady[] = "pageReady";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Page JS API function names.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kJsApiShowNetworks[] = "mobile.ChooseNetwork.showNetworks";
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)const char kJsApiShowScanning[] = "mobile.ChooseNetwork.showScanning";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Network properties.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kNetworkIdProperty[] = "networkId";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kOperatorNameProperty[] = "operatorName";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStatusProperty[] = "status";
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTechnologyProperty[] = "technology";
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebUIDataSource* CreateChooseMobileNetworkUIHTMLSource() {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource* source = content::WebUIDataSource::Create(
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::kChromeUIChooseMobileNetworkHost);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source->AddLocalizedString("chooseNetworkTitle",
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             IDS_NETWORK_CHOOSE_MOBILE_NETWORK);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source->AddLocalizedString("scanningMsgLine1",
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             IDS_NETWORK_SCANNING_FOR_MOBILE_NETWORKS);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source->AddLocalizedString("scanningMsgLine2",
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             IDS_NETWORK_SCANNING_THIS_MAY_TAKE_A_MINUTE);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source->AddLocalizedString("noMobileNetworks",
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             IDS_NETWORK_NO_MOBILE_NETWORKS);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source->AddLocalizedString("connect", IDS_OPTIONS_SETTINGS_CONNECT);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  source->AddLocalizedString("cancel", IDS_CANCEL);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  source->SetUseJsonJSFormatV2();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetJsonPath("strings.js");
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->AddResourcePath("choose_mobile_network.js",
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          IDR_CHOOSE_MOBILE_NETWORK_JS);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetDefaultResource(IDR_CHOOSE_MOBILE_NETWORK_HTML);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return source;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochchromeos::NetworkDeviceHandler* GetNetworkDeviceHandler() {
78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return chromeos::NetworkHandler::Get()->network_device_handler();
79bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
80bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
81bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochchromeos::NetworkStateHandler* GetNetworkStateHandler() {
82bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return chromeos::NetworkHandler::Get()->network_state_handler();
83bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
84bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid NetworkOperationErrorCallback(
86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const std::string& operation_name,
87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    const std::string& error_name,
88bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    scoped_ptr<base::DictionaryValue> error_data) {
89bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  NET_LOG_ERROR("Operation failed: " + error_name, operation_name);
90bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
91bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChooseMobileNetworkHandler
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public WebUIMessageHandler,
94bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      public NetworkStateHandlerObserver {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChooseMobileNetworkHandler();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ChooseMobileNetworkHandler();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebUIMessageHandler implementation.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RegisterMessages() OVERRIDE;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // NetworkStateHandlerObserver implementation.
103bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  virtual void DeviceListChanged() OVERRIDE;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handlers for JS WebUI messages.
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void HandleCancel(const base::ListValue* args);
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void HandleConnect(const base::ListValue* args);
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void HandlePageReady(const base::ListValue* args);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string device_path_;
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue networks_list_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_page_ready_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool has_pending_results_;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChooseMobileNetworkHandler);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ChooseMobileNetworkHandler implementation.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChooseMobileNetworkHandler::ChooseMobileNetworkHandler()
122bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    : is_page_ready_(false),
123bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      has_pending_results_(false) {
124bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  NetworkStateHandler* handler = GetNetworkStateHandler();
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const DeviceState* cellular =
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      handler->GetDeviceStateByType(NetworkTypePattern::Cellular());
127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (!cellular) {
128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    NET_LOG_ERROR(
129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        "A cellular device is not available.",
130bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        "Cannot initiate a cellular network scan without a cellular device.");
131bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  handler->AddObserver(this, FROM_HERE);
134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  device_path_ = cellular->path();
135bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  GetNetworkDeviceHandler()->ProposeScan(
136bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      device_path_,
137bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      base::Bind(&base::DoNothing),
138bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      base::Bind(&NetworkOperationErrorCallback, "ProposeScan"));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChooseMobileNetworkHandler::~ChooseMobileNetworkHandler() {
142bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  GetNetworkStateHandler()->RemoveObserver(this, FROM_HERE);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChooseMobileNetworkHandler::RegisterMessages() {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kJsApiCancel,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ChooseMobileNetworkHandler::HandleCancel,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kJsApiConnect,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ChooseMobileNetworkHandler::HandleConnect,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kJsApiPageReady,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&ChooseMobileNetworkHandler::HandlePageReady,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid ChooseMobileNetworkHandler::DeviceListChanged() {
161bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  const DeviceState* cellular = GetNetworkStateHandler()->GetDeviceState(
162bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      device_path_);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  networks_list_.Clear();
164bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (!cellular) {
165bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    LOG(WARNING) << "Cellular device with path '" << device_path_
166bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                 << "' disappeared.";
167bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return;
168bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (cellular->scanning()) {
170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    NET_LOG_EVENT("ChooseMobileNetwork", "Device is scanning for networks.");
171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    web_ui()->CallJavascriptFunction(kJsApiShowScanning);
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return;
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
174bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  const DeviceState::CellularScanResults& scan_results =
175bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      cellular->scan_results();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> network_ids;
177bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  for (DeviceState::CellularScanResults::const_iterator it =
178bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      scan_results.begin(); it != scan_results.end(); ++it) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We need to remove duplicates from the list because same network with
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // different technologies are listed multiple times. But ModemManager
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Register API doesn't allow technology to be specified so just show unique
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // network in UI.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (network_ids.insert(it->network_id).second) {
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::DictionaryValue* network = new base::DictionaryValue();
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network->SetString(kNetworkIdProperty, it->network_id);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!it->long_name.empty())
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        network->SetString(kOperatorNameProperty, it->long_name);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else if (!it->short_name.empty())
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        network->SetString(kOperatorNameProperty, it->short_name);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        network->SetString(kOperatorNameProperty, it->network_id);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network->SetString(kStatusProperty, it->status);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      network->SetString(kTechnologyProperty, it->technology);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      networks_list_.Append(network);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_page_ready_) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction(kJsApiShowNetworks, networks_list_);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    networks_list_.Clear();
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    has_pending_results_ = false;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    has_pending_results_ = true;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChooseMobileNetworkHandler::HandleCancel(const base::ListValue* args) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kConnectParamCount = 0;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetSize() != kConnectParamCount) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch to automatic mode.
214bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  GetNetworkDeviceHandler()->RegisterCellularNetwork(
215bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      device_path_,
216bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      "",  // An empty string is for registration with the home network.
217bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      base::Bind(&base::DoNothing),
218bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      base::Bind(&NetworkOperationErrorCallback,
219bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                 "Register in automatic mode."));
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChooseMobileNetworkHandler::HandleConnect(const base::ListValue* args) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string network_id;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kConnectParamCount = 1;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetSize() != kConnectParamCount ||
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !args->GetString(0, &network_id)) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  GetNetworkDeviceHandler()->RegisterCellularNetwork(
232bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      device_path_,
233bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      network_id,
234bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      base::Bind(&base::DoNothing),
235bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      base::Bind(&NetworkOperationErrorCallback,
236bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                 std::string("Register to network: ") + network_id));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ChooseMobileNetworkHandler::HandlePageReady(const base::ListValue* args) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t kConnectParamCount = 0;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (args->GetSize() != kConnectParamCount) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (has_pending_results_) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction(kJsApiShowNetworks, networks_list_);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    networks_list_.Clear();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    has_pending_results_ = false;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  is_page_ready_ = true;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChooseMobileNetworkUI::ChooseMobileNetworkUI(content::WebUI* web_ui)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : WebUIController(web_ui) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChooseMobileNetworkHandler* handler = new ChooseMobileNetworkHandler();
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui->AddMessageHandler(handler);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up the "chrome://choose-mobile-network" source.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui);
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource::Add(
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      profile, CreateChooseMobileNetworkUIHTMLSource());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
267