Bug 1423515 - register callback while creating the real backend. r?pehrsons draft
authorMunro Mengjue Chiang <mchiang@mozilla.com>
Wed, 06 Dec 2017 19:09:40 +0800
changeset 708751 096ace0c85f6596a4c2813b9b71877f1bbf86981
parent 707249 f2cf6d1473808039be5ecd8727cc3791d5d7d2d4
child 709558 9a89935989a67318404d8f06a3d4e827eaf7bb18
push id92433
push userbmo:mchiang@mozilla.com
push dateThu, 07 Dec 2017 02:28:30 +0000
reviewerspehrsons
bugs1423515
milestone59.0a1
Bug 1423515 - register callback while creating the real backend. r?pehrsons MozReview-Commit-ID: 2uVZ9VBAut0
dom/media/MediaManager.cpp
--- a/dom/media/MediaManager.cpp
+++ b/dom/media/MediaManager.cpp
@@ -1714,18 +1714,16 @@ MediaManager::EnumerateRawDevices(uint64
     RefPtr<MediaEngine> fakeBackend, realBackend;
     if (fakeCams || fakeMics) {
       fakeBackend = new MediaEngineDefault();
     }
     if ((!fakeCams && hasVideo) || (!fakeMics && hasAudio)) {
       MediaManager* manager = MediaManager::GetIfExists();
       MOZ_RELEASE_ASSERT(manager); // Must exist while media thread is alive
       realBackend = manager->GetBackend(aWindowId);
-      // We need to listen to this event even JS didn't listen to it.
-      realBackend->AddDeviceChangeCallback(manager);
     }
 
     auto result = MakeUnique<SourceSet>();
 
     if (hasVideo) {
       nsTArray<RefPtr<VideoDevice>> videos;
       GetSources(fakeCams? fakeBackend : realBackend, aVideoType,
                  &MediaEngine::EnumerateVideoDevices, videos,
@@ -2020,16 +2018,19 @@ MediaManager::NotifyRecordingStatusChang
 }
 
 int MediaManager::AddDeviceChangeCallback(DeviceChangeCallback* aCallback)
 {
   bool fakeDeviceChangeEventOn = mPrefs.mFakeDeviceChangeEventOn;
   MediaManager::PostTask(NewTaskFrom([fakeDeviceChangeEventOn]() {
     MediaManager* manager = MediaManager::GetIfExists();
     MOZ_RELEASE_ASSERT(manager); // Must exist while media thread is alive
+    // this is needed in case persistent permission is given but no gUM()
+    // or enumeration() has created the real backend yet
+    manager->GetBackend(0);
     if (fakeDeviceChangeEventOn)
       manager->GetBackend(0)->SetFakeDeviceChangeEvents();
   }));
 
   return DeviceChangeCallback::AddDeviceChangeCallback(aCallback);
 }
 
 static void
@@ -2905,16 +2906,17 @@ MediaManager::GetBackend(uint64_t aWindo
   // This IS called off main-thread.
   if (!mBackend) {
     MOZ_RELEASE_ASSERT(!sHasShutdown);  // we should never create a new backend in shutdown
 #if defined(MOZ_WEBRTC)
     mBackend = new MediaEngineWebRTC(mPrefs);
 #else
     mBackend = new MediaEngineDefault();
 #endif
+    mBackend->AddDeviceChangeCallback(this);
   }
   return mBackend;
 }
 
 static void
 StopSharingCallback(MediaManager *aThis,
                     uint64_t aWindowID,
                     GetUserMediaWindowListener *aListener,