| Index: ash/common/system/tray/system_tray.cc
 | 
| diff --git a/ash/common/system/tray/system_tray.cc b/ash/common/system/tray/system_tray.cc
 | 
| index fae5c963e3f98c78e69bf913cda44aaf9c45f85c..82eab0abd14a61d4494025e200181727544570bd 100644
 | 
| --- a/ash/common/system/tray/system_tray.cc
 | 
| +++ b/ash/common/system/tray/system_tray.cc
 | 
| @@ -21,7 +21,6 @@
 | 
|  #include "ash/common/system/chromeos/enterprise/tray_enterprise.h"
 | 
|  #include "ash/common/system/chromeos/media_security/multi_profile_media_tray_item.h"
 | 
|  #include "ash/common/system/chromeos/network/tray_network.h"
 | 
| -#include "ash/common/system/chromeos/network/tray_sms.h"
 | 
|  #include "ash/common/system/chromeos/network/tray_vpn.h"
 | 
|  #include "ash/common/system/chromeos/power/power_status.h"
 | 
|  #include "ash/common/system/chromeos/power/tray_power.h"
 | 
| @@ -207,7 +206,6 @@ SystemTray::SystemTray(WmShelf* wm_shelf)
 | 
|        web_notification_tray_(nullptr),
 | 
|        detailed_item_(nullptr),
 | 
|        default_bubble_height_(0),
 | 
| -      hide_notifications_(false),
 | 
|        full_system_tray_menu_(false),
 | 
|        tray_accessibility_(nullptr),
 | 
|        tray_audio_(nullptr),
 | 
| @@ -236,7 +234,6 @@ SystemTray::~SystemTray() {
 | 
|    activation_observer_.reset();
 | 
|    key_event_watcher_.reset();
 | 
|    system_bubble_.reset();
 | 
| -  notification_bubble_.reset();
 | 
|    for (const auto& item : items_)
 | 
|      item->DestroyTrayView();
 | 
|  }
 | 
| @@ -292,7 +289,6 @@ void SystemTray::CreateItems(SystemTrayDelegate* delegate) {
 | 
|    tray_network_ = new TrayNetwork(this);
 | 
|    AddTrayItem(base::WrapUnique(tray_network_));
 | 
|    AddTrayItem(base::MakeUnique<TrayVPN>(this));
 | 
| -  AddTrayItem(base::MakeUnique<TraySms>(this));
 | 
|    AddTrayItem(base::MakeUnique<TrayBluetooth>(this));
 | 
|    tray_cast_ = new TrayCast(this);
 | 
|    AddTrayItem(base::WrapUnique(tray_cast_));
 | 
| @@ -396,31 +392,10 @@ void SystemTray::HideDetailedView(SystemTrayItem* item, bool animate) {
 | 
|    }
 | 
|  
 | 
|    DestroySystemBubble();
 | 
| -  UpdateNotificationBubble();
 | 
| -}
 | 
| -
 | 
| -void SystemTray::ShowNotificationView(SystemTrayItem* item) {
 | 
| -  if (std::find(notification_items_.begin(), notification_items_.end(), item) !=
 | 
| -      notification_items_.end())
 | 
| -    return;
 | 
| -  notification_items_.push_back(item);
 | 
| -  UpdateNotificationBubble();
 | 
| -}
 | 
| -
 | 
| -void SystemTray::HideNotificationView(SystemTrayItem* item) {
 | 
| -  auto found_iter =
 | 
| -      std::find(notification_items_.begin(), notification_items_.end(), item);
 | 
| -  if (found_iter == notification_items_.end())
 | 
| -    return;
 | 
| -  notification_items_.erase(found_iter);
 | 
| -  // Only update the notification bubble if visible (i.e. don't create one).
 | 
| -  if (notification_bubble_)
 | 
| -    UpdateNotificationBubble();
 | 
|  }
 | 
|  
 | 
|  void SystemTray::UpdateAfterLoginStatusChange(LoginStatus login_status) {
 | 
|    DestroySystemBubble();
 | 
| -  UpdateNotificationBubble();
 | 
|  
 | 
|    for (const auto& item : items_)
 | 
|      item->UpdateAfterLoginStatusChange(login_status);
 | 
| @@ -439,12 +414,6 @@ void SystemTray::UpdateAfterShelfAlignmentChange(ShelfAlignment alignment) {
 | 
|      item->UpdateAfterShelfAlignmentChange(alignment);
 | 
|  }
 | 
|  
 | 
| -void SystemTray::SetHideNotifications(bool hide_notifications) {
 | 
| -  if (notification_bubble_)
 | 
| -    notification_bubble_->bubble()->SetVisible(!hide_notifications);
 | 
| -  hide_notifications_ = hide_notifications;
 | 
| -}
 | 
| -
 | 
|  bool SystemTray::ShouldShowShelf() const {
 | 
|    return system_bubble_.get() && system_bubble_->bubble()->ShouldShowShelf();
 | 
|  }
 | 
| @@ -453,27 +422,14 @@ bool SystemTray::HasSystemBubble() const {
 | 
|    return system_bubble_.get() != NULL;
 | 
|  }
 | 
|  
 | 
| -bool SystemTray::HasNotificationBubble() const {
 | 
| -  return notification_bubble_.get() != NULL;
 | 
| -}
 | 
| -
 | 
|  SystemTrayBubble* SystemTray::GetSystemBubble() {
 | 
|    if (!system_bubble_)
 | 
|      return NULL;
 | 
|    return system_bubble_->bubble();
 | 
|  }
 | 
|  
 | 
| -bool SystemTray::IsAnyBubbleVisible() const {
 | 
| -  return ((system_bubble_.get() && system_bubble_->bubble()->IsVisible()) ||
 | 
| -          (notification_bubble_.get() &&
 | 
| -           notification_bubble_->bubble()->IsVisible()));
 | 
| -}
 | 
| -
 | 
| -bool SystemTray::IsMouseInNotificationBubble() const {
 | 
| -  if (!notification_bubble_)
 | 
| -    return false;
 | 
| -  return notification_bubble_->bubble_view()->GetBoundsInScreen().Contains(
 | 
| -      display::Screen::GetScreen()->GetCursorScreenPoint());
 | 
| +bool SystemTray::IsSystemBubbleVisible() const {
 | 
| +  return HasSystemBubble() && system_bubble_->bubble()->IsVisible();
 | 
|  }
 | 
|  
 | 
|  bool SystemTray::CloseSystemBubble() const {
 | 
| @@ -497,7 +453,6 @@ TrayAudio* SystemTray::GetTrayAudio() const {
 | 
|  // Private methods.
 | 
|  
 | 
|  bool SystemTray::HasSystemBubbleType(SystemTrayBubble::BubbleType type) {
 | 
| -  DCHECK(type != SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION);
 | 
|    return system_bubble_.get() && system_bubble_->bubble_type() == type;
 | 
|  }
 | 
|  
 | 
| @@ -507,13 +462,6 @@ void SystemTray::DestroySystemBubble() {
 | 
|    UpdateWebNotifications();
 | 
|  }
 | 
|  
 | 
| -void SystemTray::DestroyNotificationBubble() {
 | 
| -  if (notification_bubble_) {
 | 
| -    notification_bubble_.reset();
 | 
| -    UpdateWebNotifications();
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  base::string16 SystemTray::GetAccessibleNameForTray() {
 | 
|    base::string16 time = GetAccessibleTimeString(base::Time::Now());
 | 
|    base::string16 battery = PowerStatus::Get()->GetAccessibleNameString(false);
 | 
| @@ -540,9 +488,6 @@ void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items,
 | 
|        detailed ? SystemTrayBubble::BUBBLE_TYPE_DETAILED
 | 
|                 : SystemTrayBubble::BUBBLE_TYPE_DEFAULT;
 | 
|  
 | 
| -  // Destroy the notification bubble here so that it doesn't get rebuilt
 | 
| -  // while we add items to the main bubble_ (e.g. in HideNotificationView).
 | 
| -  notification_bubble_.reset();
 | 
|    if (system_bubble_.get() && creation_type == BUBBLE_USE_EXISTING) {
 | 
|      system_bubble_->bubble()->UpdateView(items, bubble_type);
 | 
|      // If ChromeVox is enabled, focus the default item if no item is focused.
 | 
| @@ -610,9 +555,7 @@ void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items,
 | 
|    else
 | 
|      detailed_item_ = NULL;
 | 
|  
 | 
| -  UpdateNotificationBubble();  // State changed, re-create notifications.
 | 
| -  if (!notification_bubble_)
 | 
| -    UpdateWebNotifications();
 | 
| +  UpdateWebNotifications();
 | 
|    shelf()->UpdateAutoHideState();
 | 
|  
 | 
|    // When we show the system menu in our alternate shelf layout, we need to
 | 
| @@ -621,56 +564,9 @@ void SystemTray::ShowItems(const std::vector<SystemTrayItem*>& items,
 | 
|      SetIsActive(true);
 | 
|  }
 | 
|  
 | 
| -// TODO(estade): there's only one thing that triggers a notification bubble,
 | 
| -// and that's TraySms. We could delete a lot of code in SystemTray if that
 | 
| -// used the message center notifications instead. See crbug.com/630641
 | 
| -void SystemTray::UpdateNotificationBubble() {
 | 
| -  // Only show the notification bubble if we have notifications.
 | 
| -  if (notification_items_.empty()) {
 | 
| -    DestroyNotificationBubble();
 | 
| -    return;
 | 
| -  }
 | 
| -  // Destroy the existing bubble before constructing a new one.
 | 
| -  notification_bubble_.reset();
 | 
| -  SystemTrayBubble* notification_bubble;
 | 
| -  notification_bubble = new SystemTrayBubble(
 | 
| -      this, notification_items_, SystemTrayBubble::BUBBLE_TYPE_NOTIFICATION);
 | 
| -  // Tray items might want to show notifications while we are creating and
 | 
| -  // initializing the |system_bubble_| - but it might not be fully initialized
 | 
| -  // when coming here - this would produce a crashed like crbug.com/247416.
 | 
| -  // As such we check the existence of the widget here.
 | 
| -  TrayBubbleView::InitParams init_params(
 | 
| -      GetAnchorAlignment(), kTrayPopupMinWidth, kTrayPopupMaxWidth);
 | 
| -  views::View* anchor = GetBubbleAnchor();
 | 
| -  gfx::Insets anchor_insets = GetBubbleAnchorInsets();
 | 
| -  // If there's already a system menu bubble, stack this one on top.
 | 
| -  if (system_bubble_.get() && system_bubble_->bubble_view() &&
 | 
| -      system_bubble_->bubble_view()->GetWidget()) {
 | 
| -    anchor = system_bubble_->bubble_view();
 | 
| -    anchor_insets.Set(-message_center::kMarginBetweenItems, 0, 0, 0);
 | 
| -    init_params.anchor_alignment = TrayBubbleView::ANCHOR_ALIGNMENT_BOTTOM;
 | 
| -  }
 | 
| -  init_params.bg_color = kBackgroundColor;
 | 
| -  notification_bubble_.reset(new SystemBubbleWrapper(notification_bubble));
 | 
| -  notification_bubble_->InitView(this, anchor, anchor_insets, &init_params,
 | 
| -                                 false);
 | 
| -
 | 
| -  if (notification_bubble->bubble_view()->child_count() == 0) {
 | 
| -    // It is possible that none of the items generated actual notifications.
 | 
| -    DestroyNotificationBubble();
 | 
| -    return;
 | 
| -  }
 | 
| -  if (hide_notifications_)
 | 
| -    notification_bubble->SetVisible(false);
 | 
| -  else
 | 
| -    UpdateWebNotifications();
 | 
| -}
 | 
| -
 | 
|  void SystemTray::UpdateWebNotifications() {
 | 
|    TrayBubbleView* bubble_view = NULL;
 | 
| -  if (notification_bubble_)
 | 
| -    bubble_view = notification_bubble_->bubble_view();
 | 
| -  else if (system_bubble_)
 | 
| +  if (system_bubble_)
 | 
|      bubble_view = system_bubble_->bubble_view();
 | 
|  
 | 
|    int height = 0;
 | 
| @@ -702,22 +598,10 @@ void SystemTray::SetShelfAlignment(ShelfAlignment alignment) {
 | 
|    // Destroy any existing bubble so that it is rebuilt correctly.
 | 
|    CloseSystemBubbleAndDeactivateSystemTray();
 | 
|    // Rebuild any notification bubble.
 | 
| -  if (notification_bubble_) {
 | 
| -    notification_bubble_.reset();
 | 
| -    UpdateNotificationBubble();
 | 
| -    // UpdateWebNotifications() should be called in UpdateNotificationBubble().
 | 
| -  } else if (!hide_notifications_) {
 | 
| -    UpdateWebNotifications();
 | 
| -  }
 | 
| +  UpdateWebNotifications();
 | 
|  }
 | 
|  
 | 
|  void SystemTray::AnchorUpdated() {
 | 
| -  if (notification_bubble_) {
 | 
| -    notification_bubble_->bubble_view()->UpdateBubble();
 | 
| -    // Ensure that the notification buble is above the shelf/status area.
 | 
| -    notification_bubble_->bubble_view()->GetWidget()->StackAtTop();
 | 
| -    UpdateBubbleViewArrow(notification_bubble_->bubble_view());
 | 
| -  }
 | 
|    if (system_bubble_) {
 | 
|      system_bubble_->bubble_view()->UpdateBubble();
 | 
|      UpdateBubbleViewArrow(system_bubble_->bubble_view());
 | 
| @@ -731,11 +615,7 @@ void SystemTray::BubbleResized(const TrayBubbleView* bubble_view) {
 | 
|  void SystemTray::HideBubbleWithView(const TrayBubbleView* bubble_view) {
 | 
|    if (system_bubble_.get() && bubble_view == system_bubble_->bubble_view()) {
 | 
|      DestroySystemBubble();
 | 
| -    UpdateNotificationBubble();  // State changed, re-create notifications.
 | 
|      shelf()->UpdateAutoHideState();
 | 
| -  } else if (notification_bubble_.get() &&
 | 
| -             bubble_view == notification_bubble_->bubble_view()) {
 | 
| -    DestroyNotificationBubble();
 | 
|    }
 | 
|  }
 | 
|  
 | 
| 
 |