Use LifecycleUnits for tab discarding (reland).

This CL previously landed as
https://chromium-review.googlesource.com/c/chromium/src/+/842306
It was reverted because TabLifecycleUnits were not always
destroyed when tabs were closed, which caused invalid memory
accesses. This was solved by
https://chromium-review.googlesource.com/c/chromium/src/+/980587

TabManager discards tabs, but also ARC processes.
LifecycleUnit is an abstraction to help us having one
code path for all discards.

[email protected],[email protected]

Bug: 775644
Change-Id: Ib7f3dfd8b7e9b43ad75020c65e12d94229ba1a07
Reviewed-on: https://chromium-review.googlesource.com/980742
Reviewed-by: François Doray <[email protected]>
Reviewed-by: Sébastien Marchand <[email protected]>
Commit-Queue: François Doray <[email protected]>
Cr-Commit-Position: refs/heads/master@{#547769}
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index 6609cd1..b447597 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -70,6 +70,7 @@
 #include "chrome/browser/printing/print_job_manager.h"
 #include "chrome/browser/printing/print_preview_dialog_controller.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/resource_coordinator/tab_lifecycle_unit_source.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
 #include "chrome/browser/shell_integration.h"
 #include "chrome/browser/status_icons/status_tray.h"
@@ -849,8 +850,12 @@
 resource_coordinator::TabManager* BrowserProcessImpl::GetTabManager() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
-  if (!tab_manager_)
+  if (!tab_manager_) {
     tab_manager_ = std::make_unique<resource_coordinator::TabManager>();
+    tab_lifecycle_unit_source_ =
+        std::make_unique<resource_coordinator::TabLifecycleUnitSource>();
+    tab_lifecycle_unit_source_->AddObserver(tab_manager_.get());
+  }
   return tab_manager_.get();
 #else
   return nullptr;