| Index: chrome/browser/chromeos/network_message_observer.cc | 
| =================================================================== | 
| --- chrome/browser/chromeos/network_message_observer.cc	(revision 64441) | 
| +++ chrome/browser/chromeos/network_message_observer.cc	(working copy) | 
| @@ -6,6 +6,7 @@ | 
|  | 
| #include "app/l10n_util.h" | 
| #include "base/callback.h" | 
| +#include "base/stl_util-inl.h" | 
| #include "base/string_number_conversions.h" | 
| #include "base/utf_string_conversions.h" | 
| #include "chrome/browser/browser.h" | 
| @@ -42,6 +43,8 @@ | 
| notification_connection_error_.Hide(); | 
| notification_low_data_.Hide(); | 
| notification_no_data_.Hide(); | 
| +  STLDeleteValues(&cellular_networks_); | 
| +  STLDeleteValues(&wifi_networks_); | 
| } | 
|  | 
| void NetworkMessageObserver::CreateModalPopup(views::WindowDelegate* view) { | 
| @@ -71,24 +74,24 @@ | 
| // Check to see if we have any newly failed wifi network. | 
| for (WifiNetworkVector::const_iterator it = wifi_networks.begin(); | 
| it < wifi_networks.end(); it++) { | 
| -    const WifiNetwork& wifi = *it; | 
| -    if (wifi.failed()) { | 
| +    const WifiNetwork* wifi = *it; | 
| +    if (wifi->failed()) { | 
| ServicePathWifiMap::iterator iter = | 
| -          wifi_networks_.find(wifi.service_path()); | 
| +          wifi_networks_.find(wifi->service_path()); | 
| // If the network did not previously exist, then don't do anything. | 
| // For example, if the user travels to a location and finds a service | 
| // that has previously failed, we don't want to show a notification. | 
| if (iter == wifi_networks_.end()) | 
| continue; | 
|  | 
| -      const WifiNetwork& wifi_old = iter->second; | 
| +      const WifiNetwork* wifi_old = iter->second; | 
| // If this network was in a failed state previously, then it's not new. | 
| -      if (wifi_old.failed()) | 
| +      if (wifi_old->failed()) | 
| continue; | 
|  | 
| // Display login box again for bad_passphrase and bad_wepkey errors. | 
| -      if (wifi.error() == ERROR_BAD_PASSPHRASE || | 
| -          wifi.error() == ERROR_BAD_WEPKEY) { | 
| +      if (wifi->error() == ERROR_BAD_PASSPHRASE || | 
| +          wifi->error() == ERROR_BAD_WEPKEY) { | 
| // The NetworkConfigView will show the appropriate error message. | 
| view = new NetworkConfigView(wifi, true); | 
| // There should only be one wifi network that failed to connect. | 
| @@ -101,31 +104,35 @@ | 
| // We only do this if we were trying to make a new connection. | 
| // So if a previously connected network got disconnected for any reason, | 
| // we don't display notification. | 
| -      if (wifi_old.connecting()) { | 
| -        new_failed_network = wifi.name(); | 
| +      if (wifi_old->connecting()) { | 
| +        new_failed_network = wifi->name(); | 
| // Like above, there should only be one newly failed network. | 
| break; | 
| } | 
| } | 
|  | 
| // If we find any network connecting, we hide the error notification. | 
| -    if (wifi.connecting()) { | 
| +    if (wifi->connecting()) { | 
| notification_connection_error_.Hide(); | 
| } | 
| } | 
|  | 
| // Refresh stored networks. | 
| +  STLDeleteValues(&wifi_networks_); | 
| wifi_networks_.clear(); | 
| for (WifiNetworkVector::const_iterator it = wifi_networks.begin(); | 
| it < wifi_networks.end(); it++) { | 
| -    const WifiNetwork& wifi = *it; | 
| -    wifi_networks_[wifi.service_path()] = wifi; | 
| +    const WifiNetwork* wifi = *it; | 
| +    wifi_networks_[wifi->service_path()] = new WifiNetwork(*wifi); | 
| } | 
| + | 
| +  STLDeleteValues(&cellular_networks_); | 
| cellular_networks_.clear(); | 
| for (CellularNetworkVector::const_iterator it = cellular_networks.begin(); | 
| it < cellular_networks.end(); it++) { | 
| -    const CellularNetwork& cellular = *it; | 
| -    cellular_networks_[cellular.service_path()] = cellular; | 
| +    const CellularNetwork* cellular = *it; | 
| +    cellular_networks_[cellular->service_path()] = | 
| +        new CellularNetwork(*cellular); | 
| } | 
|  | 
| // Show connection error notification if necessary. | 
| @@ -144,15 +151,17 @@ | 
| } | 
|  | 
| void NetworkMessageObserver::CellularDataPlanChanged(NetworkLibrary* obj) { | 
| -  const CellularNetwork& cellular = obj->cellular_network(); | 
| +  const CellularNetwork* cellular = obj->cellular_network(); | 
| +  if (!cellular) | 
| +    return; | 
| // Active plan is the first one in the list. Use empty one if none found. | 
| -  const CellularDataPlanList& plans = cellular.GetDataPlans(); | 
| +  const CellularDataPlanList& plans = cellular->GetDataPlans(); | 
| CellularDataPlan plan = plans.empty() ? CellularDataPlan() : plans[0]; | 
| // If connected cellular network changed, or data plan is different, then | 
| // it's a new network. Then hide all previous notifications. | 
| bool new_plan = false; | 
| -  if (cellular.service_path() != cellular_service_path_) { | 
| -    cellular_service_path_ = cellular.service_path(); | 
| +  if (cellular->service_path() != cellular_service_path_) { | 
| +    cellular_service_path_ = cellular->service_path(); | 
| new_plan = true; | 
| } else if (plan.plan_name != cellular_data_plan_.plan_name || | 
| plan.plan_type != cellular_data_plan_.plan_type) { | 
| @@ -180,7 +189,7 @@ | 
| } | 
|  | 
| if (plan.plan_type != CELLULAR_DATA_PLAN_UNKNOWN) { | 
| -    if (cellular.data_left() == CellularNetwork::DATA_NONE) { | 
| +    if (cellular->data_left() == CellularNetwork::DATA_NONE) { | 
| notification_low_data_.Hide(); | 
| int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? | 
| IDS_NETWORK_MINUTES_REMAINING_MESSAGE : | 
| @@ -190,7 +199,7 @@ | 
| l10n_util::GetStringUTF16(IDS_NETWORK_PURCHASE_MORE_MESSAGE), | 
| NewCallback(this, &NetworkMessageObserver::MobileSetup), | 
| false, false); | 
| -    } else if (cellular.data_left() == CellularNetwork::DATA_VERY_LOW) { | 
| +    } else if (cellular->data_left() == CellularNetwork::DATA_VERY_LOW) { | 
| notification_no_data_.Hide(); | 
| int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? | 
| IDS_NETWORK_MINUTES_REMAINING_MESSAGE : | 
|  |