| 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..6cfb6a7d25f45cede106d4966b6aa49707848351 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> /* error_data */) const {
|
| + 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);
|
|
|