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); |