Web MIDI: MidiManager crashes if a session is ended while initializing

If a MidiManagerClient was destructed while an asynchronous MidiManager
initialization performs, the browser process crashes when the
initilization is finished. On EndSession(), MidiManager should remove
the client even from |pending_clients_|.

Also, this change fixes a problem that CompleteStartSession() may not be
invoked on a MidiManagerClient if its |client_id| is confclicting with
another MidiManagerClient.

BUG=382522
TEST=media_unittests --gtest_filter='Midi*'

Review URL: https://codereview.chromium.org/323323002

Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 8b055378f2640dfc13f42d1d4edbe80f5aa771d8
diff --git a/midi_manager.cc b/midi_manager.cc
index aba8441..c53eef4 100644
--- a/midi_manager.cc
+++ b/midi_manager.cc
@@ -43,8 +43,7 @@
       if (!too_many_pending_clients_exist) {
         // Call StartInitialization() only for the first request.
         session_needs_initialization = pending_clients_.empty();
-        pending_clients_.insert(
-            std::pair<int, MidiManagerClient*>(client_id, client));
+        pending_clients_.insert(std::make_pair(client, client_id));
       }
     }
   }
@@ -81,9 +80,8 @@
 
 void MidiManager::EndSession(MidiManagerClient* client) {
   base::AutoLock auto_lock(lock_);
-  ClientList::iterator i = clients_.find(client);
-  if (i != clients_.end())
-    clients_.erase(i);
+  clients_.erase(client);
+  pending_clients_.erase(client);
 }
 
 void MidiManager::DispatchSendMidiData(MidiManagerClient* client,
@@ -132,7 +130,6 @@
 
   base::AutoLock auto_lock(lock_);
   DCHECK(clients_.empty());
-  DCHECK(!pending_clients_.empty());
   DCHECK(!initialized_);
   initialized_ = true;
   result_ = result;
@@ -141,8 +138,8 @@
        it != pending_clients_.end();
        ++it) {
     if (result_ == MIDI_OK)
-      clients_.insert(it->second);
-    it->second->CompleteStartSession(it->first, result_);
+      clients_.insert(it->first);
+    it->first->CompleteStartSession(it->second, result_);
   }
   pending_clients_.clear();
 }