Chromium Code Reviews| Index: chrome/browser/ui/webui/chromeos/network_ui.cc |
| diff --git a/chrome/browser/ui/webui/chromeos/network_ui.cc b/chrome/browser/ui/webui/chromeos/network_ui.cc |
| index 7c1b4825c43c1e6059fc15e1e271e44a2e9e7524..883cf95a47bf71d127fa3f2befc617749ec48e0c 100644 |
| --- a/chrome/browser/ui/webui/chromeos/network_ui.cc |
| +++ b/chrome/browser/ui/webui/chromeos/network_ui.cc |
| @@ -6,21 +6,141 @@ |
| #include <string> |
| +#include "base/memory/weak_ptr.h" |
| #include "base/values.h" |
| -#include "chrome/browser/ui/webui/chromeos/network_config_message_handler.h" |
| +#include "chrome/browser/extensions/tab_helper.h" |
| #include "chrome/common/url_constants.h" |
| #include "chrome/grit/generated_resources.h" |
| +#include "chromeos/device_event_log.h" |
| +#include "chromeos/network/device_state.h" |
| +#include "chromeos/network/network_configuration_handler.h" |
| +#include "chromeos/network/network_state.h" |
| +#include "chromeos/network/network_state_handler.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/browser/web_ui.h" |
| #include "content/public/browser/web_ui_data_source.h" |
| +#include "content/public/browser/web_ui_message_handler.h" |
| #include "grit/browser_resources.h" |
| +#include "third_party/cros_system_api/dbus/service_constants.h" |
| namespace chromeos { |
| +namespace { |
| + |
| +bool GetServicePathFromGuid(const std::string& guid, |
| + std::string* service_path) { |
| + const NetworkState* network = |
| + NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid( |
| + guid); |
| + if (!network) |
| + return false; |
| + *service_path = network->path(); |
| + return true; |
| +} |
| + |
| +void SetDeviceProperties(base::DictionaryValue* dictionary) { |
| + std::string device; |
| + dictionary->GetStringWithoutPathExpansion(shill::kDeviceProperty, &device); |
| + const DeviceState* device_state = |
| + NetworkHandler::Get()->network_state_handler()->GetDeviceState(device); |
| + if (!device_state) |
| + return; |
| + |
| + scoped_ptr<base::DictionaryValue> device_dictionary( |
| + device_state->properties().DeepCopy()); |
| + |
| + if (!device_state->ip_configs().empty()) { |
| + // Convert IPConfig dictionary to a ListValue. |
| + scoped_ptr<base::ListValue> ip_configs(new base::ListValue); |
| + for (base::DictionaryValue::Iterator iter(device_state->ip_configs()); |
| + !iter.IsAtEnd(); iter.Advance()) { |
| + ip_configs->Append(iter.value().DeepCopy()); |
| + } |
| + device_dictionary->SetWithoutPathExpansion(shill::kIPConfigsProperty, |
| + ip_configs.release()); |
| + } |
| + if (!device_dictionary->empty()) |
| + dictionary->Set(shill::kDeviceProperty, device_dictionary.release()); |
| +} |
| + |
| +class NetworkConfigMessageHandler : public content::WebUIMessageHandler { |
| + public: |
| + NetworkConfigMessageHandler() : weak_ptr_factory_(this) {} |
| + ~NetworkConfigMessageHandler() override {} |
| + |
| + // WebUIMessageHandler implementation. |
| + void RegisterMessages() override { |
| + web_ui()->RegisterMessageCallback( |
| + "getShillProperties", |
| + base::Bind(&NetworkConfigMessageHandler::GetShillProperties, |
| + base::Unretained(this))); |
| + } |
| + |
| + private: |
| + void GetShillProperties(const base::ListValue* arg_list) { |
| + std::string guid; |
| + if (!arg_list->GetString(0, &guid)) { |
| + NOTREACHED(); |
| + ErrorCallback(guid, "Missing GUID in arg list", nullptr); |
| + return; |
| + } |
| + std::string service_path; |
| + if (!GetServicePathFromGuid(guid, &service_path)) { |
| + ErrorCallback(guid, "Error.InvalidNetworkGuid", nullptr); |
| + return; |
| + } |
| + NetworkHandler::Get()->network_configuration_handler()->GetProperties( |
| + service_path, |
| + base::Bind(&NetworkConfigMessageHandler::GetShillPropertiesSuccess, |
| + weak_ptr_factory_.GetWeakPtr()), |
| + base::Bind(&NetworkConfigMessageHandler::ErrorCallback, |
| + weak_ptr_factory_.GetWeakPtr(), guid)); |
| + } |
| + |
| + void GetShillPropertiesSuccess( |
| + const std::string& service_path, |
| + const base::DictionaryValue& dictionary) const { |
| + scoped_ptr<base::DictionaryValue> dictionary_copy(dictionary.DeepCopy()); |
| + |
| + // Set the 'ServicePath' property for debugging. |
| + dictionary_copy->SetStringWithoutPathExpansion("ServicePath", service_path); |
| + // Set the device properties for debugging. |
| + SetDeviceProperties(dictionary_copy.get()); |
| + |
| + base::ListValue return_arg_list; |
| + return_arg_list.Append(dictionary_copy.release()); |
| + web_ui()->CallJavascriptFunction("NetworkUI.getShillPropertiesResult", |
| + return_arg_list); |
| + } |
| + |
| + void ErrorCallback( |
| + const std::string& guid, |
| + const std::string& error_name, |
| + scoped_ptr<base::DictionaryValue> unused_error_data) const { |
|
pneubeck (no reviews)
2015/02/06 08:55:19
nit: unused_error_data -> /* error_data */
|
| + NET_LOG(ERROR) << "Shill Error: " << error_name << " guid=" << guid; |
| + base::ListValue return_arg_list; |
| + scoped_ptr<base::DictionaryValue> dictionary; |
| + dictionary->SetStringWithoutPathExpansion(shill::kGuidProperty, guid); |
| + dictionary->SetStringWithoutPathExpansion("ShillError", error_name); |
| + return_arg_list.Append(dictionary.release()); |
| + web_ui()->CallJavascriptFunction("NetworkUI.getShillPropertiesResult", |
| + return_arg_list); |
| + } |
| + |
| + base::WeakPtrFactory<NetworkConfigMessageHandler> weak_ptr_factory_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(NetworkConfigMessageHandler); |
| +}; |
| + |
| +} // namespace |
| + |
| NetworkUI::NetworkUI(content::WebUI* web_ui) |
| : content::WebUIController(web_ui) { |
| web_ui->AddMessageHandler(new NetworkConfigMessageHandler()); |
| + // Enable extension API calls in the WebUI. |
| + extensions::TabHelper::CreateForWebContents(web_ui->GetWebContents()); |
| + |
| content::WebUIDataSource* html = |
| content::WebUIDataSource::Create(chrome::kChromeUINetworkHost); |
| @@ -43,7 +163,6 @@ NetworkUI::NetworkUI(content::WebUI* web_ui) |
| IDS_NETWORK_UI_FAVORITE_NETWORKS); |
| html->SetJsonPath("strings.js"); |
| - html->AddResourcePath("network_config.js", IDR_NETWORK_CONFIG_JS); |
| html->AddResourcePath("network_ui.css", IDR_NETWORK_UI_CSS); |
| html->AddResourcePath("network_ui.js", IDR_NETWORK_UI_JS); |
| html->SetDefaultResource(IDR_NETWORK_UI_HTML); |