| Index: ash/system/audio/tray_volume.cc
 | 
| diff --git a/ash/system/audio/tray_volume.cc b/ash/system/audio/tray_volume.cc
 | 
| index f395be6d67e46a6f932f76363ffcdfac71e25b9b..0d63a8e50d8ca0508ccc51608040b0058ae08dab 100644
 | 
| --- a/ash/system/audio/tray_volume.cc
 | 
| +++ b/ash/system/audio/tray_volume.cc
 | 
| @@ -63,8 +63,8 @@ class VolumeButton : public views::ToggleImageButton {
 | 
|      float level = delegate->GetVolumeLevel();
 | 
|      int image_index = delegate->IsAudioMuted() ?
 | 
|          0 : (level == 1.0 ?
 | 
| -             kVolumeLevels : std::ceil(level * (kVolumeLevels - 1)));
 | 
| -
 | 
| +             kVolumeLevels :
 | 
| +             std::max(1, int(std::ceil(level * (kVolumeLevels - 1)))));
 | 
|      if (image_index != image_index_) {
 | 
|        gfx::Rect region(0, image_index * kVolumeImageHeight,
 | 
|                         kVolumeImageWidth, kVolumeImageHeight);
 | 
| @@ -110,6 +110,26 @@ class MuteButton : public ash::internal::TrayBarButtonWithTitle {
 | 
|    DISALLOW_COPY_AND_ASSIGN(MuteButton);
 | 
|  };
 | 
|  
 | 
| +class VolumeSlider : public views::Slider {
 | 
| + public:
 | 
| +  explicit VolumeSlider(views::SliderListener* listener)
 | 
| +      : views::Slider(listener, views::Slider::HORIZONTAL) {
 | 
| +    set_focus_border_color(kFocusBorderColor);
 | 
| +    SetValue(ash::Shell::GetInstance()->tray_delegate()->GetVolumeLevel());
 | 
| +    SetAccessibleName(
 | 
| +            ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
 | 
| +                IDS_ASH_STATUS_TRAY_VOLUME));
 | 
| +    Update();
 | 
| +  }
 | 
| +  virtual ~VolumeSlider() {}
 | 
| +
 | 
| +  void Update() {
 | 
| +    UpdateState(!ash::Shell::GetInstance()->tray_delegate()->IsAudioMuted());
 | 
| +  }
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(VolumeSlider);
 | 
| +};
 | 
| +
 | 
|  class VolumeView : public views::View,
 | 
|                     public views::ButtonListener,
 | 
|                     public views::SliderListener {
 | 
| @@ -124,20 +144,18 @@ class VolumeView : public views::View,
 | 
|      mute_ = new MuteButton(this);
 | 
|      AddChildView(mute_);
 | 
|  
 | 
| -    ash::SystemTrayDelegate* delegate =
 | 
| -        ash::Shell::GetInstance()->tray_delegate();
 | 
| -    slider_ = new views::Slider(this, views::Slider::HORIZONTAL);
 | 
| -    slider_->set_focus_border_color(kFocusBorderColor);
 | 
| -    slider_->SetValue(
 | 
| -        delegate->IsAudioMuted() ? 0.0 : delegate->GetVolumeLevel());
 | 
| -    slider_->SetAccessibleName(
 | 
| -        ui::ResourceBundle::GetSharedInstance().GetLocalizedString(
 | 
| -            IDS_ASH_STATUS_TRAY_VOLUME));
 | 
| +    slider_ = new VolumeSlider(this);
 | 
|      AddChildView(slider_);
 | 
|    }
 | 
|  
 | 
|    virtual ~VolumeView() {}
 | 
|  
 | 
| +  void Update() {
 | 
| +    icon_->Update();
 | 
| +    mute_->Update();
 | 
| +    slider_->Update();
 | 
| +  }
 | 
| +
 | 
|    void SetVolumeLevel(float percent) {
 | 
|      // The change in volume will be reflected via accessibility system events,
 | 
|      // so we prevent the UI event from being sent here.
 | 
| @@ -146,8 +164,7 @@ class VolumeView : public views::View,
 | 
|      // It is possible that the volume was (un)muted, but the actual volume level
 | 
|      // did not change. In that case, setting the value of the slider won't
 | 
|      // trigger an update. So explicitly trigger an update.
 | 
| -    icon_->Update();
 | 
| -    mute_->Update();
 | 
| +    Update();
 | 
|      slider_->set_enable_accessibility_events(true);
 | 
|    }
 | 
|  
 | 
| @@ -182,7 +199,7 @@ class VolumeView : public views::View,
 | 
|  
 | 
|    VolumeButton* icon_;
 | 
|    MuteButton* mute_;
 | 
| -  views::Slider* slider_;
 | 
| +  VolumeSlider* slider_;
 | 
|  
 | 
|    DISALLOW_COPY_AND_ASSIGN(VolumeView);
 | 
|  };
 | 
| @@ -201,7 +218,7 @@ TrayVolume::~TrayVolume() {
 | 
|  bool TrayVolume::GetInitialVisibility() {
 | 
|    ash::SystemTrayDelegate* delegate =
 | 
|        ash::Shell::GetInstance()->tray_delegate();
 | 
| -  return delegate->GetVolumeLevel() == 0.0 || delegate->IsAudioMuted();
 | 
| +  return delegate->IsAudioMuted();
 | 
|  }
 | 
|  
 | 
|  views::View* TrayVolume::CreateDefaultView(user::LoginStatus status) {
 | 
| @@ -240,5 +257,13 @@ void TrayVolume::OnVolumeChanged(float percent) {
 | 
|    PopupDetailedView(kTrayPopupAutoCloseDelayInSeconds, false);
 | 
|  }
 | 
|  
 | 
| +void TrayVolume::OnMuteToggled() {
 | 
| +  if (tray_view())
 | 
| +      tray_view()->SetVisible(GetInitialVisibility());
 | 
| +
 | 
| +  if (volume_view_)
 | 
| +    volume_view_->Update();
 | 
| +}
 | 
| +
 | 
|  }  // namespace internal
 | 
|  }  // namespace ash
 | 
| 
 |