| Index: ash/display/multi_display_manager.cc | 
| diff --git a/ash/display/multi_display_manager.cc b/ash/display/multi_display_manager.cc | 
| index 246e0b844c0b2f79da0f93d02772126ff3e92422..45bdd135b1e9dc325acf2e21865c9c5800ade5e8 100644 | 
| --- a/ash/display/multi_display_manager.cc | 
| +++ b/ash/display/multi_display_manager.cc | 
| @@ -21,7 +21,7 @@ | 
| #include "ui/aura/root_window.h" | 
| #include "ui/aura/root_window_host.h" | 
| #include "ui/aura/window_property.h" | 
| -#include "ui/base/resource/resource_bundle.h" | 
| +#include "ui/base/l10n/l10n_util.h" | 
| #include "ui/gfx/display.h" | 
| #include "ui/gfx/screen.h" | 
| #include "ui/gfx/rect.h" | 
| @@ -283,6 +283,8 @@ void MultiDisplayManager::OnNativeDisplaysChanged( | 
| } | 
|  | 
| displays_ = new_displays; | 
| +  RefreshDisplayNames(); | 
| + | 
| // Temporarily add displays to be removed because display object | 
| // being removed are accessed during shutting down the root. | 
| displays_.insert(displays_.end(), removed_displays.begin(), | 
| @@ -373,29 +375,14 @@ const gfx::Display& MultiDisplayManager::GetDisplayMatching( | 
|  | 
| std::string MultiDisplayManager::GetDisplayNameFor( | 
| const gfx::Display& display) { | 
| -  if (HasInternalDisplay() && IsInternalDisplayId(display.id())) { | 
| -    ui::ResourceBundle& bundle = ui::ResourceBundle::GetSharedInstance(); | 
| -    return UTF16ToUTF8( | 
| -        bundle.GetLocalizedString(IDS_ASH_INTERNAL_DISPLAY_NAME)); | 
| -  } | 
| +  if (!display.is_valid()) | 
| +    return l10n_util::GetStringUTF8(IDS_ASH_STATUS_TRAY_UNKNOWN_DISPLAY_NAME); | 
| + | 
| +  std::map<int64, std::string>::const_iterator iter = | 
| +      display_names_.find(display.id()); | 
| +  if (iter != display_names_.end()) | 
| +    return iter->second; | 
|  | 
| -#if defined(USE_X11) | 
| -  std::vector<XID> outputs; | 
| -  if (display.id() != gfx::Display::kInvalidDisplayID && | 
| -      ui::GetOutputDeviceHandles(&outputs)) { | 
| -    for (size_t i = 0; i < outputs.size(); ++i) { | 
| -      uint16 manufacturer_id = 0; | 
| -      uint32 serial_number = 0; | 
| -      std::string name; | 
| -      if (ui::GetOutputDeviceData( | 
| -              outputs[i], &manufacturer_id, &serial_number, &name) && | 
| -          display.id() == | 
| -          gfx::Display::GetID(manufacturer_id, serial_number)) { | 
| -        return name; | 
| -      } | 
| -    } | 
| -  } | 
| -#endif | 
| return base::StringPrintf("Display %d", static_cast<int>(display.id())); | 
| } | 
|  | 
| @@ -426,6 +413,8 @@ void MultiDisplayManager::Init() { | 
| } | 
| #endif | 
|  | 
| +  RefreshDisplayNames(); | 
| + | 
| #if defined(OS_WIN) | 
| if (base::win::GetVersion() >= base::win::VERSION_WIN8) | 
| set_use_fullscreen_host_window(true); | 
| @@ -543,6 +532,35 @@ void MultiDisplayManager::EnsurePointerInDisplays() { | 
| root_window->MoveCursorTo(target_location); | 
| } | 
|  | 
| +void MultiDisplayManager::RefreshDisplayNames() { | 
| +  display_names_.clear(); | 
| + | 
| +  if (!base::chromeos::IsRunningOnChromeOS()) | 
| +    return; | 
| + | 
| +#if defined(USE_X11) | 
| +  std::vector<XID> outputs; | 
| +  if (!ui::GetOutputDeviceHandles(&outputs)) | 
| +    return; | 
| + | 
| +  for (size_t i = 0; i < outputs.size(); ++i) { | 
| +    uint16 manufacturer_id = 0; | 
| +    uint32 serial_number = 0; | 
| +    std::string name; | 
| +    if (ui::GetOutputDeviceData( | 
| +            outputs[i], &manufacturer_id, &serial_number, &name)) { | 
| +      int64 id = gfx::Display::GetID(manufacturer_id, serial_number); | 
| +      if (IsInternalDisplayId(id)) { | 
| +        display_names_[id] = | 
| +            l10n_util::GetStringUTF8(IDS_ASH_INTERNAL_DISPLAY_NAME); | 
| +      } else { | 
| +        display_names_[id] = name; | 
| +      } | 
| +    } | 
| +  } | 
| +#endif | 
| +} | 
| + | 
| void MultiDisplayManager::SetDisplayIdsForTest(DisplayList* to_update) const { | 
| DisplayList::iterator iter_to_update = to_update->begin(); | 
| DisplayList::const_iterator iter = displays_.begin(); | 
|  |