diff options
author | chocobo@chromium.org <chocobo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-18 00:52:29 +0000 |
---|---|---|
committer | chocobo@chromium.org <chocobo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-18 00:52:29 +0000 |
commit | 9e320296cc530b4f2be86be9b26047d504372920 (patch) | |
tree | c3807248852b1442aaa4e49c5039c7f341f29eaa | |
parent | 599490bc824bbff9968067dac44a4347122da9c2 (diff) | |
download | chromium_src-9e320296cc530b4f2be86be9b26047d504372920.zip chromium_src-9e320296cc530b4f2be86be9b26047d504372920.tar.gz chromium_src-9e320296cc530b4f2be86be9b26047d504372920.tar.bz2 |
Workaround bug in flimflam to fix active_network not being reported propertly causing ethernet icon to get stuck.
BUG=chromium-os:8785
TEST=manual. connect to both ethernet and wifi. unplug ethernet usb dongle. verify that the network icon when from wired to wireless.
Review URL: http://codereview.chromium.org/5194002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@66558 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/cros/network_library.cc | 104 | ||||
-rw-r--r-- | chrome/browser/chromeos/cros/network_library.h | 3 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/network_menu_button.cc | 31 | ||||
-rw-r--r-- | chrome/browser/chromeos/status/network_menu_button.h | 4 |
4 files changed, 94 insertions, 48 deletions
diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc index ec0b3f8..75ccbc4 100644 --- a/chrome/browser/chromeos/cros/network_library.cc +++ b/chrome/browser/chromeos/cros/network_library.cc @@ -160,9 +160,11 @@ static std::string WrapWithTD(std::string text) { // Helper function to create an Html table header for a Network. static std::string ToHtmlTableHeader(Network* network) { std::string str; - if (network->type() == TYPE_WIFI || network->type() == TYPE_CELLULAR) { - str += WrapWithTH("Name") + WrapWithTH("Auto-Connect") + - WrapWithTH("Strength"); + if (network->type() == TYPE_ETHERNET) { + str += WrapWithTH("Active"); + } else if (network->type() == TYPE_WIFI || network->type() == TYPE_CELLULAR) { + str += WrapWithTH("Name") + WrapWithTH("Active") + + WrapWithTH("Auto-Connect") + WrapWithTH("Strength"); if (network->type() == TYPE_WIFI) str += WrapWithTH("Encryption") + WrapWithTH("Passphrase") + WrapWithTH("Identity") + WrapWithTH("Certificate"); @@ -174,9 +176,12 @@ static std::string ToHtmlTableHeader(Network* network) { // Helper function to create an Html table row for a Network. static std::string ToHtmlTableRow(Network* network) { std::string str; - if (network->type() == TYPE_WIFI || network->type() == TYPE_CELLULAR) { + if (network->type() == TYPE_ETHERNET) { + str += WrapWithTD(base::IntToString(network->is_active())); + } else if (network->type() == TYPE_WIFI || network->type() == TYPE_CELLULAR) { WirelessNetwork* wireless = static_cast<WirelessNetwork*>(network); str += WrapWithTD(wireless->name()) + + WrapWithTD(base::IntToString(network->is_active())) + WrapWithTD(base::IntToString(wireless->auto_connect())) + WrapWithTD(base::IntToString(wireless->strength())); if (network->type() == TYPE_WIFI) { @@ -243,19 +248,7 @@ Network::Network(const ServiceInfo* service) { device_path_ = SafeString(service->device_path); connectable_ = service->connectable; is_active_ = service->is_active; - ip_address_.clear(); - // If connected, get ip config. - if (EnsureCrosLoaded() && connected() && service->device_path) { - IPConfigStatus* ipconfig_status = ListIPConfigs(service->device_path); - if (ipconfig_status) { - for (int i = 0; i < ipconfig_status->size; i++) { - IPConfig ipconfig = ipconfig_status->ips[i]; - if (strlen(ipconfig.address) > 0) - ip_address_ = ipconfig.address; - } - FreeIPConfigStatus(ipconfig_status); - } - } + InitIPAddress(); } // Used by GetHtmlInfo() which is called from the about:network handler. @@ -324,6 +317,24 @@ std::string Network::GetErrorString() const { return l10n_util::GetStringUTF8(IDS_CHROMEOS_NETWORK_STATE_UNRECOGNIZED); } +void Network::InitIPAddress() { + ip_address_.clear(); + // If connected, get ip config. + if (EnsureCrosLoaded() && connected()) { + IPConfigStatus* ipconfig_status = ListIPConfigs(device_path_.c_str()); + if (ipconfig_status) { + for (int i = 0; i < ipconfig_status->size; i++) { + IPConfig ipconfig = ipconfig_status->ips[i]; + if (strlen(ipconfig.address) > 0) { + ip_address_ = ipconfig.address; + break; + } + } + FreeIPConfigStatus(ipconfig_status); + } + } +} + //////////////////////////////////////////////////////////////////////////////// // WirelessNetwork WirelessNetwork::WirelessNetwork(const WirelessNetwork& network) @@ -1174,6 +1185,23 @@ class NetworkLibraryImpl : public NetworkLibrary { return wifi_; if (cellular_ && cellular_->is_active()) return cellular_; + // Due to bug chromium-os:9310, if no active network is found, + // use the first connected. + // TODO(chocobo): Remove when bug 9310 is fixed. + // START BUG 9310 WORKAROUND + if (ethernet_ && ethernet_->connected()) { + ethernet_->set_active(true); + return ethernet_; + } + if (wifi_ && wifi_->connected()) { + wifi_->set_active(true); + return wifi_; + } + if (cellular_ && cellular_->connected()) { + cellular_->set_active(true); + return cellular_; + } + // END BUG 9310 WORKAROUND return NULL; } @@ -1245,25 +1273,32 @@ class NetworkLibraryImpl : public NetworkLibrary { output.append("(To auto-refresh this page: about:network/<secs>)"); } - output.append("<h3>Ethernet:</h3><table border=1>"); - if (ethernet_ && ethernet_enabled()) { - output.append("<tr>" + ToHtmlTableHeader(ethernet_) + "</tr>"); - output.append("<tr>" + ToHtmlTableRow(ethernet_) + "</tr>"); + if (ethernet_enabled()) { + output.append("<h3>Ethernet:</h3><table border=1>"); + if (ethernet_) { + output.append("<tr>" + ToHtmlTableHeader(ethernet_) + "</tr>"); + output.append("<tr>" + ToHtmlTableRow(ethernet_) + "</tr>"); + } } - output.append("</table><h3>Wifi:</h3><table border=1>"); - for (size_t i = 0; i < wifi_networks_.size(); ++i) { - if (i == 0) - output.append("<tr>" + ToHtmlTableHeader(wifi_networks_[i]) + "</tr>"); - output.append("<tr>" + ToHtmlTableRow(wifi_networks_[i]) + "</tr>"); + if (wifi_enabled()) { + output.append("</table><h3>Wifi:</h3><table border=1>"); + for (size_t i = 0; i < wifi_networks_.size(); ++i) { + if (i == 0) + output.append("<tr>" + ToHtmlTableHeader(wifi_networks_[i]) + + "</tr>"); + output.append("<tr>" + ToHtmlTableRow(wifi_networks_[i]) + "</tr>"); + } } - output.append("</table><h3>Cellular:</h3><table border=1>"); - for (size_t i = 0; i < cellular_networks_.size(); ++i) { - if (i == 0) - output.append("<tr>" + ToHtmlTableHeader(cellular_networks_[i]) + - "</tr>"); - output.append("<tr>" + ToHtmlTableRow(cellular_networks_[i]) + "</tr>"); + if (cellular_enabled()) { + output.append("</table><h3>Cellular:</h3><table border=1>"); + for (size_t i = 0; i < cellular_networks_.size(); ++i) { + if (i == 0) + output.append("<tr>" + ToHtmlTableHeader(cellular_networks_[i]) + + "</tr>"); + output.append("<tr>" + ToHtmlTableRow(cellular_networks_[i]) + "</tr>"); + } } output.append("</table><h3>Remembered Wifi:</h3><table border=1>"); @@ -1656,8 +1691,11 @@ class NetworkLibraryImpl : public NetworkLibrary { if (value->GetAsBoolean(&boolval)) network->set_active(boolval); } else if (strcmp(key, kStateProperty) == 0) { - if (value->GetAsString(&stringval)) + if (value->GetAsString(&stringval)) { network->set_state(ParseState(stringval)); + // State changed, so refresh IP address. + network->InitIPAddress(); + } } NotifyNetworkChanged(network); } diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h index 9c49a12..4d52f88 100644 --- a/chrome/browser/chromeos/cros/network_library.h +++ b/chrome/browser/chromeos/cros/network_library.h @@ -98,6 +98,9 @@ class Network { void set_connectable(bool connectable) { connectable_ = connectable; } void set_active(bool is_active) { is_active_ = is_active; } + // Initialize the IP address field + void InitIPAddress(); + friend class NetworkLibraryImpl; }; diff --git a/chrome/browser/chromeos/status/network_menu_button.cc b/chrome/browser/chromeos/status/network_menu_button.cc index 89bc0a1..2a422d3 100644 --- a/chrome/browser/chromeos/status/network_menu_button.cc +++ b/chrome/browser/chromeos/status/network_menu_button.cc @@ -73,22 +73,7 @@ void NetworkMenuButton::DrawIcon(gfx::Canvas* canvas) { void NetworkMenuButton::OnNetworkManagerChanged(NetworkLibrary* cros) { ResourceBundle& rb = ResourceBundle::GetSharedInstance(); if (CrosLibrary::Get()->EnsureLoaded()) { - // Add an observer for the active network, if any const Network* network = cros->active_network(); - if (active_network_.empty() || network == NULL || - active_network_ != network->service_path()) { - if (!active_network_.empty()) { - cros->RemoveNetworkObserver(active_network_, this); - } - if (network != NULL) { - cros->AddNetworkObserver(network->service_path(), this); - } - } - if (network) - active_network_ = network->service_path(); - else - active_network_ = ""; - if (cros->wifi_connecting() || cros->cellular_connecting()) { // Start the connecting animation if not running. if (!animation_connecting_.is_animating()) { @@ -125,6 +110,7 @@ void NetworkMenuButton::OnNetworkManagerChanged(NetworkLibrary* cros) { IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP)); } + RefreshNetworkObserver(cros); SchedulePaint(); UpdateMenu(); } @@ -145,6 +131,7 @@ void NetworkMenuButton::OnNetworkChanged(NetworkLibrary* cros, IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP)); } + RefreshNetworkObserver(cros); SchedulePaint(); UpdateMenu(); } @@ -223,4 +210,18 @@ void NetworkMenuButton::SetNetworkBadge(NetworkLibrary* cros, } } +void NetworkMenuButton::RefreshNetworkObserver(NetworkLibrary* cros) { + const Network* network = cros->active_network(); + std::string new_network = network ? network->service_path() : std::string(); + if (active_network_ != new_network) { + if (!active_network_.empty()) { + cros->RemoveNetworkObserver(active_network_, this); + } + if (!new_network.empty()) { + cros->AddNetworkObserver(new_network, this); + } + active_network_ = new_network; + } +} + } // namespace chromeos diff --git a/chrome/browser/chromeos/status/network_menu_button.h b/chrome/browser/chromeos/status/network_menu_button.h index 208efe2..3dfe007 100644 --- a/chrome/browser/chromeos/status/network_menu_button.h +++ b/chrome/browser/chromeos/status/network_menu_button.h @@ -83,6 +83,10 @@ class NetworkMenuButton : public StatusAreaButton, void SetNetworkIcon(const Network* network); void SetNetworkBadge(NetworkLibrary* cros, const Network* network); + // Called when the active network has possibly changed. This will remove + // old network observer and add a network observer for the active network. + void RefreshNetworkObserver(NetworkLibrary* cros); + // The status area host, StatusAreaHost* host_; |