summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchocobo@chromium.org <chocobo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-18 00:52:29 +0000
committerchocobo@chromium.org <chocobo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-18 00:52:29 +0000
commit9e320296cc530b4f2be86be9b26047d504372920 (patch)
treec3807248852b1442aaa4e49c5039c7f341f29eaa
parent599490bc824bbff9968067dac44a4347122da9c2 (diff)
downloadchromium_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.cc104
-rw-r--r--chrome/browser/chromeos/cros/network_library.h3
-rw-r--r--chrome/browser/chromeos/status/network_menu_button.cc31
-rw-r--r--chrome/browser/chromeos/status/network_menu_button.h4
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/&lt;secs&gt;)");
}
- 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_;