[Media Notification] Handle null session info

Since ash::MediaNotificationItem is a media controller
we should be able to handle a null media session info.
This fixes a segfault caused by not handling this
scenario.

BUG=897836

Change-Id: I7869e14de9fd3d9d094f21d3daa5ff3260c3e3f8
Reviewed-on: https://chromium-review.googlesource.com/c/1457198
Commit-Queue: Becca Hughes <beccahughes@chromium.org>
Reviewed-by: Tommy Steimel <steimel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#630373}
diff --git a/ash/media/media_notification_controller_unittest.cc b/ash/media/media_notification_controller_unittest.cc
index 4d2d475..1493ff3 100644
--- a/ash/media/media_notification_controller_unittest.cc
+++ b/ash/media/media_notification_controller_unittest.cc
@@ -191,4 +191,24 @@
             notification->custom_view_type());
 }
 
+// Test that if we recieve a null media session info that we hide the
+// notification.
+TEST_F(MediaNotificationControllerTest, HandleNullMediaSessionInfo) {
+  ExpectNotificationCount(0);
+
+  base::UnguessableToken id = base::UnguessableToken::Create();
+
+  Shell::Get()->media_notification_controller()->OnFocusGained(
+      GetRequestStateWithId(id));
+
+  ExpectNotificationCount(1);
+
+  Shell::Get()
+      ->media_notification_controller()
+      ->GetItem(id.ToString())
+      ->MediaSessionInfoChanged(nullptr);
+
+  ExpectNotificationCount(0);
+}
+
 }  // namespace ash
diff --git a/ash/media/media_notification_item.cc b/ash/media/media_notification_item.cc
index f044267b..22e6803e 100644
--- a/ash/media/media_notification_item.cc
+++ b/ash/media/media_notification_item.cc
@@ -85,7 +85,6 @@
   view_ = view;
 
   if (view) {
-    DCHECK(!session_info_.is_null());
     view_->UpdateWithMediaSessionInfo(session_info_);
     view_->UpdateWithMediaMetadata(session_metadata_);
     view_->UpdateWithMediaActions(session_actions_);
@@ -99,7 +98,7 @@
 void MediaNotificationItem::MaybeHideOrShowNotification() {
   // If the |is_controllable| bit is set in MediaSessionInfo then we should show
   // a media notification.
-  if (!session_info_->is_controllable) {
+  if (!session_info_ || !session_info_->is_controllable) {
     HideNotification();
     return;
   }
diff --git a/ash/media/media_notification_view.cc b/ash/media/media_notification_view.cc
index 0c434927..93a1a3b7 100644
--- a/ash/media/media_notification_view.cc
+++ b/ash/media/media_notification_view.cc
@@ -205,8 +205,9 @@
 
 void MediaNotificationView::UpdateWithMediaSessionInfo(
     const media_session::mojom::MediaSessionInfoPtr& session_info) {
-  bool playing = session_info->playback_state ==
-                 media_session::mojom::MediaPlaybackState::kPlaying;
+  bool playing =
+      session_info && session_info->playback_state ==
+                          media_session::mojom::MediaPlaybackState::kPlaying;
   play_pause_button_->SetToggled(playing);
 
   MediaSessionAction action =