Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(473)

Unified Diff: ui/message_center/views/message_center_view.cc

Issue 2833403002: [Notifications] Fix crash in AddNotification. (Closed)
Patch Set: Add TODO Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/message_center/views/message_center_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/message_center/views/message_center_view.cc
diff --git a/ui/message_center/views/message_center_view.cc b/ui/message_center/views/message_center_view.cc
index 05db825efbcc0b17a0a7ff65d1165fc37a1c5907..e3327a567f756a6b0134769fc5c0b8a2f178da29 100644
--- a/ui/message_center/views/message_center_view.cc
+++ b/ui/message_center/views/message_center_view.cc
@@ -407,6 +407,8 @@ bool MessageCenterView::SetRepositionTarget() {
}
void MessageCenterView::OnNotificationUpdated(const std::string& id) {
+ // TODO(edcourtney): We may be able to remove this, since |UpdateNotification|
+ // checks it anyway.
NotificationViewsMap::const_iterator view_iter = notification_views_.find(id);
if (view_iter == notification_views_.end())
return;
@@ -416,30 +418,7 @@ void MessageCenterView::OnNotificationUpdated(const std::string& id) {
if (!SetRepositionTarget())
message_list_view_->ResetRepositionSession();
- // TODO(dimich): add MessageCenter::GetVisibleNotificationById(id)
- MessageView* view = view_iter->second;
- const NotificationList::Notifications& notifications =
- message_center_->GetVisibleNotifications();
- for (NotificationList::Notifications::const_iterator iter =
- notifications.begin(); iter != notifications.end(); ++iter) {
- if ((*iter)->id() == id) {
- int old_width = view->width();
- int old_height = view->height();
- bool old_pinned = view->IsPinned();
- message_list_view_->UpdateNotification(view, **iter);
- if (view->GetHeightForWidth(old_width) != old_height) {
- Update(true /* animate */);
- } else if (view->IsPinned() != old_pinned) {
- // Animate flag is false, since the pinned flag transition doesn't need
- // animation.
- Update(false /* animate */);
- }
- break;
- }
- }
-
- // Notify accessibility that the contents have changed.
- view->NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, false);
+ UpdateNotification(id);
}
void MessageCenterView::OnLockedStateChanged(bool locked) {
@@ -481,7 +460,14 @@ void MessageCenterView::ClickOnSettingsButton(
void MessageCenterView::UpdateNotificationSize(
const std::string& notification_id) {
- OnNotificationUpdated(notification_id);
+ // TODO(edcourtney, yoshiki): We don't call OnNotificationUpdated directly
+ // because it resets the reposition session, which can end up deleting
+ // notification items when it cancels animations. This causes problems for
+ // ARC notifications. See crbug.com/714493. OnNotificationUpdated should not
+ // have to consider the reposition session, but OnMouseEntered and
+ // OnMouseExited don't work properly for ARC notifications at the moment.
+ // See crbug.com/714587.
+ UpdateNotification(notification_id);
}
void MessageCenterView::AnimationEnded(const gfx::Animation* animation) {
@@ -673,4 +659,38 @@ void MessageCenterView::SetNotificationViewForTest(MessageView* view) {
message_list_view_->AddNotificationAt(view, 0);
}
+void MessageCenterView::UpdateNotification(const std::string& id) {
+ // TODO(edcourtney, yoshiki): This check seems like it should not be needed.
+ // Investigate what circumstances (if any) trigger it.
+ NotificationViewsMap::const_iterator view_iter = notification_views_.find(id);
+ if (view_iter == notification_views_.end())
+ return;
+
+ // TODO(dimich): add MessageCenter::GetVisibleNotificationById(id)
+ MessageView* view = view_iter->second;
+ const NotificationList::Notifications& notifications =
+ message_center_->GetVisibleNotifications();
+ for (NotificationList::Notifications::const_iterator iter =
+ notifications.begin();
+ iter != notifications.end(); ++iter) {
+ if ((*iter)->id() == id) {
+ int old_width = view->width();
+ int old_height = view->height();
+ bool old_pinned = view->IsPinned();
+ message_list_view_->UpdateNotification(view, **iter);
+ if (view->GetHeightForWidth(old_width) != old_height) {
+ Update(true /* animate */);
+ } else if (view->IsPinned() != old_pinned) {
+ // Animate flag is false, since the pinned flag transition doesn't need
+ // animation.
+ Update(false /* animate */);
+ }
+ break;
+ }
+ }
+
+ // Notify accessibility that the contents have changed.
+ view->NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, false);
+}
+
} // namespace message_center
« no previous file with comments | « ui/message_center/views/message_center_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698