Lazy initialize PeerConnectionTracker

This CL changes the ownership of PeerConnectionTracker, as a preparation
to Onion souping it.

Reason: when in Blink, there is not a class corresponding to RenderThreadImpl.

BUG=787254
R=guidou@chromium.org, haraken@chromium.org

Change-Id: Ieff1e622d0226547632a1616c3e6c088961d91fa
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1845802
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Commit-Queue: Antonio Gomes <tonikitoo@igalia.com>
Cr-Commit-Position: refs/heads/master@{#707339}
diff --git a/content/renderer/media/webrtc/peer_connection_tracker.cc b/content/renderer/media/webrtc/peer_connection_tracker.cc
index ccb773f..dcaa305 100644
--- a/content/renderer/media/webrtc/peer_connection_tracker.cc
+++ b/content/renderer/media/webrtc/peer_connection_tracker.cc
@@ -13,12 +13,12 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/lazy_instance.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
-#include "content/child/child_thread_impl.h"
 #include "content/common/media/peer_connection_tracker_messages.h"
 #include "content/renderer/media/webrtc/rtc_peer_connection_handler.h"
 #include "content/renderer/render_thread_impl.h"
@@ -604,6 +604,24 @@
   const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
 };
 
+struct PeerConnectionTrackerLazyInstanceTraits
+    : public base::internal::DestructorAtExitLazyInstanceTraits<
+          PeerConnectionTracker> {
+  static PeerConnectionTracker* New(void* instance) {
+    return new (instance) PeerConnectionTracker(
+        RenderThreadImpl::current()->main_thread_runner());
+  }
+};
+
+base::LazyInstance<PeerConnectionTracker,
+                   PeerConnectionTrackerLazyInstanceTraits>
+    g_peer_connection_tracker = LAZY_INSTANCE_INITIALIZER;
+
+// static
+PeerConnectionTracker* PeerConnectionTracker::GetInstance() {
+  return &g_peer_connection_tracker.Get();
+}
+
 PeerConnectionTracker::PeerConnectionTracker(
     scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner)
     : next_local_id_(1),
diff --git a/content/renderer/media/webrtc/peer_connection_tracker.h b/content/renderer/media/webrtc/peer_connection_tracker.h
index 3d81e5f1..29af0f4 100644
--- a/content/renderer/media/webrtc/peer_connection_tracker.h
+++ b/content/renderer/media/webrtc/peer_connection_tracker.h
@@ -45,6 +45,8 @@
     : public RenderThreadObserver,
       public base::SupportsWeakPtr<PeerConnectionTracker> {
  public:
+  static PeerConnectionTracker* GetInstance();
+
   explicit PeerConnectionTracker(
       scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner);
   PeerConnectionTracker(
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
index 799dcc81..c8f2fcd1 100644
--- a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
+++ b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
@@ -1015,8 +1015,9 @@
   CHECK(!initialize_called_);
   initialize_called_ = true;
 
-  peer_connection_tracker_ =
-      RenderThreadImpl::current()->peer_connection_tracker()->AsWeakPtr();
+  // TODO(crbug.com/787254): Evaluate the need for passing weak ptr since
+  // PeerConnectionTracker is now leaky with base::LazyInstance.
+  peer_connection_tracker_ = PeerConnectionTracker::GetInstance()->AsWeakPtr();
 
   configuration_ = server_configuration;
 
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index aaf5a4487..a77b6dd 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -753,9 +753,7 @@
   browser_plugin_manager_.reset(new BrowserPluginManager());
   AddObserver(browser_plugin_manager_.get());
 
-  peer_connection_tracker_.reset(
-      new PeerConnectionTracker(main_thread_runner()));
-  AddObserver(peer_connection_tracker_.get());
+  AddObserver(PeerConnectionTracker::GetInstance());
 
   unfreezable_message_filter_ = new UnfreezableMessageFilter(this);
   AddFilter(unfreezable_message_filter_.get());
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index 16def76..b9ad30f 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -103,7 +103,6 @@
 class CategorizedWorkerPool;
 class GpuVideoAcceleratorFactoriesImpl;
 class LowMemoryModeController;
-class PeerConnectionTracker;
 class RenderThreadObserver;
 class RendererBlinkPlatformImpl;
 class ResourceDispatcher;
@@ -291,10 +290,6 @@
     return browser_plugin_manager_.get();
   }
 
-  PeerConnectionTracker* peer_connection_tracker() {
-    return peer_connection_tracker_.get();
-  }
-
   blink::WebVideoCaptureImplManager* video_capture_impl_manager() const {
     return vc_manager_.get();
   }
@@ -553,10 +548,6 @@
 
   std::unique_ptr<BrowserPluginManager> browser_plugin_manager_;
 
-  // This is used to communicate to the browser process the status
-  // of all the peer connections created in the renderer.
-  std::unique_ptr<PeerConnectionTracker> peer_connection_tracker_;
-
   // Filter out unfreezable messages and pass it to unfreezable task runners.
   scoped_refptr<UnfreezableMessageFilter> unfreezable_message_filter_;
 
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 541268de..0721224 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -699,8 +699,7 @@
 
 void RendererBlinkPlatformImpl::TrackGetUserMedia(
     const blink::WebUserMediaRequest& web_request) {
-  RenderThreadImpl::current()->peer_connection_tracker()->TrackGetUserMedia(
-      web_request);
+  PeerConnectionTracker::GetInstance()->TrackGetUserMedia(web_request);
 }
 
 bool RendererBlinkPlatformImpl::IsWebRtcHWH264DecodingEnabled(